YITH WooCommerce Catalog Mode - Version 2.17.0

Version Description

Last Stable Tag 2.17.0

Download this release

Release Info

Developer yithemes
Plugin Icon 128x128 YITH WooCommerce Catalog Mode
Version 2.17.0
Comparing to
See all releases

Code changes from version 2.16.1 to 2.17.0

Files changed (145) hide show
  1. assets/css/admin 2.css +22 -0
  2. assets/css/admin.min 2.css +1 -0
  3. assets/css/frontend 2.css +1 -0
  4. assets/images/get-premium-catalog-mode 2.jpg +0 -0
  5. includes/actions/update-2.0.0/ywctm-install 2.php +25 -0
  6. init.php +19 -4
  7. languages/yith-woocommerce-catalog-mode 2.pot +164 -0
  8. languages/yith-woocommerce-catalog-mode.pot +2 -2
  9. plugin-fw/Gruntfile 2.js +198 -0
  10. plugin-fw/Gruntfile.js +198 -0
  11. plugin-fw/assets/css/admin 2.css +345 -0
  12. plugin-fw/assets/css/codemirror/codemirror 2.css +260 -0
  13. plugin-fw/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100 2.png +0 -0
  14. plugin-fw/assets/css/scss/welcome-modal 2.scss +77 -0
  15. plugin-fw/assets/css/scss/welcome-modal.scss +77 -0
  16. plugin-fw/assets/css/scss/yith-plugin-ui.scss +8 -0
  17. plugin-fw/assets/css/scss/yith-plugin-ui/_animations 2.scss +92 -0
  18. plugin-fw/assets/css/scss/yith-plugin-ui/_animations.scss +92 -0
  19. plugin-fw/assets/css/scss/yith-plugin-ui/_components.scss +13 -0
  20. plugin-fw/assets/css/scss/yith-plugin-ui/_head_comment.scss +6 -0
  21. plugin-fw/assets/css/scss/yith-plugin-ui/_tables.scss +56 -0
  22. plugin-fw/assets/css/scss/yith-plugin-ui/_taxonomy.scss +52 -0
  23. plugin-fw/assets/css/scss/yith-plugin-ui/_variables.scss +121 -0
  24. plugin-fw/assets/css/scss/yith-plugin-ui/_wp-pages.scss +88 -0
  25. plugin-fw/assets/css/scss/yith-plugin-ui/components/_action-button 2.scss +80 -0
  26. plugin-fw/assets/css/scss/yith-plugin-ui/components/_action-button.scss +80 -0
  27. plugin-fw/assets/css/scss/yith-plugin-ui/components/_boxed-row.scss +14 -0
  28. plugin-fw/assets/css/scss/yith-plugin-ui/components/_buttons.scss +224 -0
  29. plugin-fw/assets/css/scss/yith-plugin-ui/components/_confirm.scss +41 -0
  30. plugin-fw/assets/css/scss/yith-plugin-ui/components/_list-items.scss +78 -0
  31. plugin-fw/assets/css/scss/yith-plugin-ui/components/_list-table-blank-state.scss +25 -0
  32. plugin-fw/assets/css/scss/yith-plugin-ui/components/_modal.scss +128 -0
  33. plugin-fw/assets/css/scss/yith-plugin-ui/components/_tabs.scss +51 -0
  34. plugin-fw/assets/css/scss/yith-plugin-ui/components/_tip-tip.scss +80 -0
  35. plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_buttons 2.scss +124 -0
  36. plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_buttons.scss +124 -0
  37. plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_tables.scss +159 -0
  38. plugin-fw/assets/css/yith-icon.css +8 -4
  39. plugin-fw/assets/fonts/font-awesome/font-awesome.min 2.css +4 -0
  40. plugin-fw/assets/fonts/yith-icon.eot +0 -0
  41. plugin-fw/assets/fonts/yith-icon.ttf +0 -0
  42. plugin-fw/assets/fonts/yith-icon.woff2 +0 -0
  43. plugin-fw/assets/images/arrow 2.svg +11 -0
  44. plugin-fw/assets/images/bh-onboarding/check 2.svg +16 -0
  45. plugin-fw/assets/images/colorbox/border1 2.png +0 -0
  46. plugin-fw/assets/images/help-tab/documentation 2.svg +176 -0
  47. plugin-fw/assets/js/codemirror/codemirror 2.js +5806 -0
  48. plugin-fw/assets/js/jquery-tiptip/jquery.tipTip 2.js +191 -0
  49. plugin-fw/assets/js/select2/select2.min 2.js +13 -0
  50. plugin-fw/assets/js/yith-enhanced-select.js +224 -195
  51. plugin-fw/bin/clean-language-files 2.js +36 -0
  52. plugin-fw/bin/clean-language-files.js +36 -0
  53. plugin-fw/bin/download-translations-config.json +37 -0
  54. plugin-fw/bin/download-translations.js +57 -0
  55. plugin-fw/composer 2.json +24 -0
  56. plugin-fw/composer.json +29 -0
  57. plugin-fw/dist/gutenberg/index.asset 2.php +1 -0
  58. plugin-fw/dist/gutenberg/style-index 2.css +3 -0
  59. plugin-fw/docker-compose 2.yml +76 -0
  60. plugin-fw/docker-compose.yml +76 -0
  61. plugin-fw/includes/builders/elementor/class-yith-elementor 2.php +128 -0
  62. plugin-fw/includes/builders/elementor/class-yith-elementor-widget 2.php +480 -0
  63. plugin-fw/includes/builders/gutenberg/class-yith-gutenberg 2.php +360 -0
  64. plugin-fw/includes/builders/gutenberg/src/common/actions-to-jquery-events 2.js +32 -0
  65. plugin-fw/includes/builders/gutenberg/src/common/actions-to-jquery-events.js +32 -0
  66. plugin-fw/includes/builders/gutenberg/src/common/ajaxFetch 2.js +43 -0
  67. plugin-fw/includes/builders/gutenberg/src/common/ajaxFetch.js +43 -0
  68. plugin-fw/includes/builders/gutenberg/src/common/checkForDeps 2.js +46 -0
  69. plugin-fw/includes/builders/gutenberg/src/common/checkForDeps.js +46 -0
  70. plugin-fw/includes/builders/gutenberg/src/common/generateShortcode 2.js +42 -0
  71. plugin-fw/includes/builders/gutenberg/src/common/generateShortcode.js +42 -0
  72. plugin-fw/includes/builders/gutenberg/src/common/icons 2.js +12 -0
  73. plugin-fw/includes/builders/gutenberg/src/common/icons.js +12 -0
  74. plugin-fw/includes/builders/gutenberg/src/common/index 2.js +4 -0
  75. plugin-fw/includes/builders/gutenberg/src/common/index.js +4 -0
  76. plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/index 2.js +96 -0
  77. plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/index.js +96 -0
  78. plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/style 2.scss +9 -0
  79. plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/style.scss +9 -0
  80. plugin-fw/includes/builders/gutenberg/src/components/color-picker-control/index 2.js +53 -0
  81. plugin-fw/includes/builders/gutenberg/src/components/color-picker-control/index.js +53 -0
  82. plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/index 2.js +56 -0
  83. plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/index.js +56 -0
  84. plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/multiple-select.js +186 -0
  85. plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/style.scss +135 -0
  86. plugin-fw/includes/builders/gutenberg/src/components/shortcode/index 2.js +153 -0
  87. plugin-fw/includes/builders/gutenberg/src/components/shortcode/index.js +153 -0
  88. plugin-fw/includes/builders/gutenberg/src/components/shortcode/style 2.scss +64 -0
  89. plugin-fw/includes/builders/gutenberg/src/components/shortcode/style.scss +64 -0
  90. plugin-fw/includes/builders/gutenberg/src/edit 2.js +234 -0
  91. plugin-fw/includes/builders/gutenberg/src/edit.js +234 -0
  92. plugin-fw/includes/builders/gutenberg/src/index 2.js +56 -0
  93. plugin-fw/includes/builders/gutenberg/src/index.js +56 -0
  94. plugin-fw/includes/class-yit-assets.php +7 -0
  95. plugin-fw/includes/class-yit-cpt-unlimited 2.php +54 -0
  96. plugin-fw/includes/class-yit-icons 2.php +1237 -0
  97. plugin-fw/includes/class-yit-plugin-licence 2.php +94 -0
  98. plugin-fw/includes/class-yit-plugin-subpanel 2.php +153 -0
  99. plugin-fw/includes/class-yit-pointers 2.php +380 -0
  100. plugin-fw/includes/class-yit-theme-licence 2.php +74 -0
  101. plugin-fw/includes/class-yit-upgrade 2.php +70 -0
  102. plugin-fw/includes/class-yit-video 2.php +192 -0
  103. plugin-fw/includes/class-yith-bh-onboarding 2.php +110 -0
  104. plugin-fw/includes/class-yith-dashboard 2.php +149 -0
  105. plugin-fw/includes/class-yith-debug 2.php +154 -0
  106. plugin-fw/includes/class-yith-post-type-admin 2.php +474 -0
  107. plugin-fw/includes/class-yith-system-status 2.php +821 -0
  108. plugin-fw/includes/privacy/class-yith-privacy 2.php +114 -0
  109. plugin-fw/includes/privacy/class-yith-privacy-plugin-abstract 2.php +72 -0
  110. plugin-fw/init 2.php +108 -0
  111. plugin-fw/languages/yith-plugin-fw 2.pot +1119 -0
  112. plugin-fw/languages/yith-plugin-fw-el 2.mo +0 -0
  113. plugin-fw/languages/yith-plugin-fw-el 2.po +1143 -0
  114. plugin-fw/languages/yith-plugin-fw-es_ES 2.mo +0 -0
  115. plugin-fw/languages/yith-plugin-fw-es_ES 2.po +1162 -0
  116. plugin-fw/languages/yith-plugin-fw-it_IT 2.mo +0 -0
  117. plugin-fw/languages/yith-plugin-fw-it_IT 2.po +1163 -0
  118. plugin-fw/languages/yith-plugin-fw-nl_NL 2.mo +0 -0
  119. plugin-fw/languages/yith-plugin-fw-nl_NL 2.po +1151 -0
  120. plugin-fw/languages/yith-plugin-fw-ru_RU 2.mo +0 -0
  121. plugin-fw/languages/yith-plugin-fw-ru_RU 2.po +1157 -0
  122. plugin-fw/languages/yith-plugin-fw-zh_CN 2.mo +0 -0
  123. plugin-fw/languages/yith-plugin-fw-zh_CN 2.po +1129 -0
  124. plugin-fw/lib/privacy/yit-privacy 2.php +11 -0
  125. plugin-fw/lib/privacy/yit-privacy-plugin-abstract 2.php +11 -0
  126. plugin-fw/lib/yit-ajax 2.php +11 -0
  127. plugin-fw/lib/yit-assets 2.php +11 -0
  128. plugin-fw/lib/yit-cpt-unlimited 2.php +11 -0
  129. plugin-fw/lib/yit-debug 2.php +11 -0
  130. plugin-fw/lib/yit-icons 2.php +11 -0
  131. plugin-fw/lib/yit-metabox 2.php +11 -0
  132. plugin-fw/lib/yit-plugin-common 2.php +11 -0
  133. plugin-fw/lib/yit-plugin-gradients 2.php +11 -0
  134. plugin-fw/lib/yit-plugin-licence 2.php +11 -0
  135. plugin-fw/lib/yit-plugin-panel 2.php +11 -0
  136. plugin-fw/lib/yit-plugin-panel-wc 2.php +11 -0
  137. plugin-fw/lib/yit-plugin-subpanel 2.php +11 -0
  138. plugin-fw/lib/yit-pointers 2.php +11 -0
  139. plugin-fw/lib/yit-theme-licence 2.php +11 -0
  140. plugin-fw/lib/yit-upgrade 2.php +11 -0
  141. plugin-fw/lib/yit-video 2.php +11 -0
  142. plugin-fw/lib/yith-dashboard 2.php +11 -0
  143. plugin-fw/lib/yith-gutenberg 2.php +11 -0
  144. plugin-fw/lib/yith-system-status 2.php +11 -0
  145. plugin-fw/license 2.txt +280 -0
assets/css/admin 2.css ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .ywctm-inline-selects .option-element {
2
+ height: 100%;
3
+ display: inline-flex;
4
+ align-items: center;
5
+ padding: 0 10px 0 0;
6
+ vertical-align: top;
7
+ }
8
+
9
+ .ywctm-inline-selects .option-element.hidden {
10
+ padding: 0;
11
+ }
12
+
13
+ .ywctm-inline-selects .option-element > span {
14
+ display: flex;
15
+ min-height: 38px;
16
+ align-items: center;
17
+ }
18
+
19
+ .woocommerce table.form-table .ywctm-inline-selects .option-element > .yith-plugin-fw-select-field-wrapper > .select2 {
20
+ width: 220px !important;
21
+ min-width: 220px !important;
22
+ }
assets/css/admin.min 2.css ADDED
@@ -0,0 +1 @@
 
1
+ .ywctm-inline-selects .option-element{height:100%;display:inline-flex;align-items:center;padding:0 10px 0 0;vertical-align:top}.ywctm-inline-selects .option-element.hidden{padding:0}.ywctm-inline-selects .option-element>span{display:flex;min-height:38px;align-items:center}.woocommerce table.form-table .ywctm-inline-selects .option-element>.yith-plugin-fw-select-field-wrapper>.select2{width:220px!important;min-width:220px!important}
assets/css/frontend 2.css ADDED
@@ -0,0 +1 @@
 
1
+ /* Silence is golden */
assets/images/get-premium-catalog-mode 2.jpg ADDED
Binary file
includes/actions/update-2.0.0/ywctm-install 2.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin installation functions
4
+ *
5
+ * @package YITH\CatalogMode
6
+ */
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) {
9
+ exit; // Exit if accessed directly.
10
+ }
11
+
12
+ if ( defined( 'YWCTM_PREMIUM' ) && YWCTM_PREMIUM ) {
13
+
14
+ if ( '' !== (string) get_option( 'ywctm_enable_plugin' ) ) {
15
+ include_once YWCTM_DIR . 'includes/actions/update-2.0.0/ywctm-update-premium.php';
16
+ } else {
17
+ include_once YWCTM_DIR . 'includes/actions/update-2.0.0/ywctm-default-buttons.php';
18
+ }
19
+ } else {
20
+ if ( '' !== get_option( 'ywctm_enable_plugin' ) ) {
21
+ include_once YWCTM_DIR . 'includes/actions/update-2.0.0/ywctm-update.php';
22
+ } else {
23
+ update_option( 'ywctm_update_version', YWCTM_VERSION );
24
+ }
25
+ }
init.php CHANGED
@@ -5,10 +5,10 @@
5
  * Description: <code><strong>YITH WooCommerce Catalog Mode</strong></code> allows hiding product prices, cart and checkout from your store and turning it into a performing product catalogue. You will be able to adjust your catalogue settings as you prefer based on your requirements. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>
6
  * Author: YITH
7
  * Text Domain: yith-woocommerce-catalog-mode
8
- * Version: 2.16.1
9
  * Author URI: https://yithemes.com/
10
- * WC requires at least: 6.9.0
11
- * WC tested up to: 7.1.x
12
  *
13
  * @package YITH WooCommerce Catalog Mode
14
  */
@@ -61,7 +61,7 @@ function ywctm_install_free_admin_notice() {
61
  <?php
62
  }
63
 
64
- ! defined( 'YWCTM_VERSION' ) && define( 'YWCTM_VERSION', '2.16.1' );
65
  ! defined( 'YWCTM_FREE_INIT' ) && define( 'YWCTM_FREE_INIT', plugin_basename( __FILE__ ) );
66
  ! defined( 'YWCTM_SLUG' ) && define( 'YWCTM_SLUG', 'yith-woocommerce-catalog-mode' );
67
  ! defined( 'YWCTM_FILE' ) && define( 'YWCTM_FILE', __FILE__ );
@@ -142,3 +142,18 @@ if ( ! function_exists( 'YITH_WCTM' ) ) {
142
 
143
  }
144
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  * Description: <code><strong>YITH WooCommerce Catalog Mode</strong></code> allows hiding product prices, cart and checkout from your store and turning it into a performing product catalogue. You will be able to adjust your catalogue settings as you prefer based on your requirements. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>
6
  * Author: YITH
7
  * Text Domain: yith-woocommerce-catalog-mode
8
+ * Version: 2.17.0
9
  * Author URI: https://yithemes.com/
10
+ * WC requires at least: 7.0.0
11
+ * WC tested up to: 7.2.x
12
  *
13
  * @package YITH WooCommerce Catalog Mode
14
  */
61
  <?php
62
  }
63
 
64
+ ! defined( 'YWCTM_VERSION' ) && define( 'YWCTM_VERSION', '2.17.0' );
65
  ! defined( 'YWCTM_FREE_INIT' ) && define( 'YWCTM_FREE_INIT', plugin_basename( __FILE__ ) );
66
  ! defined( 'YWCTM_SLUG' ) && define( 'YWCTM_SLUG', 'yith-woocommerce-catalog-mode' );
67
  ! defined( 'YWCTM_FILE' ) && define( 'YWCTM_FILE', __FILE__ );
142
 
143
  }
144
  }
145
+
146
+ add_action( 'before_woocommerce_init', 'ywctm_free_declare_hpos_compatibility' );
147
+
148
+ /**
149
+ * Declare HPOS compatibility
150
+ *
151
+ * @return void
152
+ * @since 2.17.0
153
+ * @author Alberto Ruggiero <alberto.ruggiero@yithemes.com>
154
+ */
155
+ function ywctm_free_declare_hpos_compatibility() {
156
+ if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
157
+ \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
158
+ }
159
+ }
languages/yith-woocommerce-catalog-mode 2.pot ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2022 YITH
2
+ # This file is distributed under the same license as the YITH WooCommerce Catalog Mode package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH WooCommerce Catalog Mode 2.16.1\n"
6
+ "Report-Msgid-Bugs-To: "
7
+ "https://wordpress.org/support/plugin/yith-woocommerce-catalog-mode\n"
8
+ "POT-Creation-Date: 2022-11-17 16:12:32+00:00\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=utf-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2022-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "X-Generator: grunt-wp-i18n 1.0.3\n"
16
+
17
+ #: class-yith-woocommerce-catalog-mode.php:193
18
+ #: plugin-options/settings-options.php:15
19
+ msgid "Settings"
20
+ msgstr ""
21
+
22
+ #: class-yith-woocommerce-catalog-mode.php:218
23
+ #. translators: %1$s opening B tag, %2$s closing B tag
24
+ msgid ""
25
+ "Enable the catalog mode rules %1$s only for guest %2$s or for %1$s users "
26
+ "from specific countries %2$s (Example: hide prices or add to cart buttons "
27
+ "only to users from USA)"
28
+ msgstr ""
29
+
30
+ #: class-yith-woocommerce-catalog-mode.php:220
31
+ #. translators: %1$s opening B tag, %2$s closing B tag
32
+ msgid ""
33
+ "Enable the catalog mode on %1$s specific time ranges and/or dates only %2$s "
34
+ "(Example: prevent new orders on Sunday or in December during Christmas "
35
+ "holidays)"
36
+ msgstr ""
37
+
38
+ #: class-yith-woocommerce-catalog-mode.php:222
39
+ #. translators: %1$s opening B tag, %2$s closing B tag
40
+ msgid ""
41
+ "Use the %1$s Exclusion List %2$s to enable or disable the catalog mode %1$s "
42
+ "only on specific products, categories or tag of your shop %2$s"
43
+ msgstr ""
44
+
45
+ #: class-yith-woocommerce-catalog-mode.php:223
46
+ msgid ""
47
+ "Hide the Add to Cart button only on specific products and the product "
48
+ "prices to all users or to guest users only"
49
+ msgstr ""
50
+
51
+ #: class-yith-woocommerce-catalog-mode.php:225
52
+ #. translators: %1$s opening B tag, %2$s closing B tag
53
+ msgid ""
54
+ "Use the Advanced Builder to %1$s create and design custom buttons or labels "
55
+ "%2$s to replace add to cart and price in shop page and product page"
56
+ msgstr ""
57
+
58
+ #: class-yith-woocommerce-catalog-mode.php:227
59
+ #. translators: %1$s opening B tag, %2$s closing B tag
60
+ msgid ""
61
+ "%1$s Add a custom inquiry form on the product page %2$s using the default "
62
+ "form or choosing a plugin between Contact Form 7, Gravity Form, Ninja "
63
+ "Forms, Formidable Forms or WP Forms"
64
+ msgstr ""
65
+
66
+ #: class-yith-woocommerce-catalog-mode.php:228
67
+ msgid "Regular updates, Translations and Premium Support"
68
+ msgstr ""
69
+
70
+ #: init.php:37
71
+ #. translators: %s name of the plugin
72
+ msgid "%s is enabled but not effective. In order to work, it requires WooCommerce."
73
+ msgstr ""
74
+
75
+ #: init.php:57
76
+ #. translators: %s name of the plugin
77
+ msgid ""
78
+ "You can't activate the free version of %s while you are using the premium "
79
+ "one."
80
+ msgstr ""
81
+
82
+ #: plugin-options/settings-options.php:19
83
+ msgid "Catalog mode for administrators"
84
+ msgstr ""
85
+
86
+ #: plugin-options/settings-options.php:22
87
+ msgid "If enabled, the Catalog Mode rules will also work for admin users."
88
+ msgstr ""
89
+
90
+ #: plugin-options/settings-options.php:27
91
+ msgid "Disable shop"
92
+ msgstr ""
93
+
94
+ #: plugin-options/settings-options.php:30
95
+ msgid ""
96
+ "Use this option to hide the \"Cart\" page, \"Checkout\" page and all the "
97
+ "\"Add to Cart\" buttons in the shop."
98
+ msgstr ""
99
+
100
+ #: plugin-options/settings-options.php:37
101
+ msgid "\"Add to Cart\" settings in Catalog Mode"
102
+ msgstr ""
103
+
104
+ #: plugin-options/settings-options.php:38
105
+ msgid "Choose where to hide \"Add to Cart\"."
106
+ msgstr ""
107
+
108
+ #: plugin-options/settings-options.php:47
109
+ msgid "All pages"
110
+ msgstr ""
111
+
112
+ #: plugin-options/settings-options.php:48
113
+ msgid "Shop page"
114
+ msgstr ""
115
+
116
+ #: plugin-options/settings-options.php:49
117
+ msgid "Product page"
118
+ msgstr ""
119
+
120
+ #: plugin-options/settings-options.php:67
121
+ msgid "Hide product variations"
122
+ msgstr ""
123
+
124
+ #: plugin-options/settings-options.php:70
125
+ msgid "Use this option to hide product variations where \"Add to cart\" is hidden."
126
+ msgstr ""
127
+
128
+ #. Description of the plugin/theme
129
+ msgid ""
130
+ "<code><strong>YITH WooCommerce Catalog Mode</strong></code> allows hiding "
131
+ "product prices, cart and checkout from your store and turning it into a "
132
+ "performing product catalogue. You will be able to adjust your catalogue "
133
+ "settings as you prefer based on your requirements. <a "
134
+ "href=\"https://yithemes.com/\" target=\"_blank\">Get more plugins for your "
135
+ "e-commerce shop on <strong>YITH</strong></a>"
136
+ msgstr ""
137
+
138
+ #: class-yith-woocommerce-catalog-mode.php:169
139
+ msgctxt "general settings tab name"
140
+ msgid "Settings"
141
+ msgstr ""
142
+
143
+ #: class-yith-woocommerce-catalog-mode.php:170
144
+ msgctxt "exclusion settings tab name"
145
+ msgid "Exclusion List"
146
+ msgstr ""
147
+
148
+ #: class-yith-woocommerce-catalog-mode.php:171
149
+ msgctxt "inquiry form settings tab name"
150
+ msgid "Inquiry Form"
151
+ msgstr ""
152
+
153
+ #: class-yith-woocommerce-catalog-mode.php:172
154
+ msgctxt "buttons & labels settings tab name"
155
+ msgid "Buttons & Labels"
156
+ msgstr ""
157
+
158
+ #: class-yith-woocommerce-catalog-mode.php:177
159
+ #. translators: %1$s opening B tag - %2$s closing B tag
160
+ msgctxt "[HELP TAB] Video title"
161
+ msgid ""
162
+ "Check this video to learn how to %1$sconvert your shop into a product "
163
+ "catalog%2$s"
164
+ msgstr ""
languages/yith-woocommerce-catalog-mode.pot CHANGED
@@ -2,10 +2,10 @@
2
  # This file is distributed under the same license as the YITH WooCommerce Catalog Mode package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: YITH WooCommerce Catalog Mode 2.16.1\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/yith-woocommerce-catalog-mode\n"
8
- "POT-Creation-Date: 2022-11-11 12:53:36+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
2
  # This file is distributed under the same license as the YITH WooCommerce Catalog Mode package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: YITH WooCommerce Catalog Mode 2.17.0\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/yith-woocommerce-catalog-mode\n"
8
+ "POT-Creation-Date: 2022-12-13 13:56:26+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
plugin-fw/Gruntfile 2.js ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const potInfo = {
2
+ languageFolderPath: './languages/',
3
+ filename : 'yith-plugin-fw.pot',
4
+ headers : {
5
+ poedit : true, // Includes common Poedit headers.
6
+ 'x-poedit-keywordslist': true, // Include a list of all possible gettext functions.
7
+ 'report-msgid-bugs-to' : 'YITH <plugins@yithemes.com>',
8
+ 'language-team' : 'YITH <info@yithemes.com>'
9
+ }
10
+ };
11
+
12
+ module.exports = function ( grunt ) {
13
+ 'use strict';
14
+
15
+ var sass = require( 'node-sass' );
16
+
17
+ grunt.initConfig( {
18
+ dirs: {
19
+ css : 'assets/css',
20
+ scss: 'assets/css/scss',
21
+ js : 'assets/js'
22
+ },
23
+
24
+ uglify: {
25
+ options: {
26
+ ie8 : true,
27
+ parse : {
28
+ strict: false
29
+ },
30
+ output: {
31
+ comments: /@license|@preserve|^!/
32
+ }
33
+ },
34
+ common : {
35
+ files: [{
36
+ expand: true,
37
+ cwd : '<%= dirs.js %>/',
38
+ src : ['*.js', '!*.min.js'],
39
+ dest : '<%= dirs.js %>/',
40
+ rename: function ( dst, src ) {
41
+ // To keep the source js files and make new files as `*.min.js`:
42
+ return dst + '/' + src.replace( '.js', '.min.js' );
43
+ }
44
+ }]
45
+ }
46
+ },
47
+
48
+ // Compile all .scss files.
49
+ sass: {
50
+ compile: {
51
+ options: {
52
+ implementation: sass,
53
+ outputStyle: 'expanded'
54
+ },
55
+ files : [{
56
+ expand: true,
57
+ cwd : '<%= dirs.scss %>/',
58
+ src : ['*.scss'],
59
+ dest : '<%= dirs.css %>/',
60
+ ext : '.css'
61
+ }]
62
+ }
63
+ },
64
+
65
+ jshint: {
66
+ options: {
67
+ jshintrc: '.jshintrc'
68
+ },
69
+ all : [
70
+ '<%= dirs.js %>/*.js',
71
+ '!<%= dirs.js %>/*.min.js'
72
+ ]
73
+ },
74
+
75
+
76
+ // Watch changes for assets.
77
+ watch: {
78
+ css: {
79
+ files: ['<%= dirs.scss %>/**/*.scss'],
80
+ tasks: ['sass']
81
+ }
82
+ },
83
+
84
+ makepot : {
85
+ options: {
86
+ type : 'wp-plugin',
87
+ domainPath : 'languages',
88
+ domain : 'yith-plugin-fw',
89
+ potHeaders : potInfo.headers,
90
+ updatePoFiles: false
91
+ },
92
+ dist : {
93
+ options: {
94
+ potFilename: potInfo.filename,
95
+ exclude : [
96
+ 'bin/.*',
97
+ 'dist/.*',
98
+ 'node_modules/.*',
99
+ 'tests/.*',
100
+ 'tmp/.*',
101
+ 'vendor/.*'
102
+ ]
103
+ }
104
+ }
105
+ },
106
+ update_po: {
107
+ options: {
108
+ template: potInfo.languageFolderPath + potInfo.filename
109
+ },
110
+ build : {
111
+ src: potInfo.languageFolderPath + '*.po'
112
+ }
113
+ },
114
+
115
+ // PHP Code Sniffer.
116
+ phpcs: {
117
+ options: {
118
+ bin: 'vendor/bin/phpcs'
119
+ },
120
+ dist : {
121
+ src: [
122
+ '**/*.php', // Include all php files.
123
+ '!bin/**',
124
+ '!dist/**',
125
+ '!node_modules/**',
126
+ '!tests/**',
127
+ '!tools/**',
128
+ '!tmp/**',
129
+ '!vendor/**'
130
+ ]
131
+ }
132
+ }
133
+
134
+ } );
135
+
136
+ grunt.registerMultiTask( 'update_po', 'This task update .po strings by .pot', function () {
137
+ grunt.log.writeln( 'Updating .po files.' );
138
+
139
+ var done = this.async(),
140
+ options = this.options(),
141
+ template = options.template;
142
+ this.files.forEach( function ( file ) {
143
+ if ( file.src.length ) {
144
+ var counter = file.src.length;
145
+
146
+ grunt.log.writeln( 'Processing ' + file.src.length + ' files.' );
147
+
148
+ file.src.forEach( function ( fileSrc ) {
149
+ grunt.util.spawn( {
150
+ cmd : 'msgmerge',
151
+ args: ['-U', fileSrc, template]
152
+ }, function ( error, result, code ) {
153
+ const output = fileSrc.replace( '.po', '.mo' );
154
+ grunt.log.writeln( 'Updating: ' + fileSrc + ' ...' );
155
+
156
+ if ( error ) {
157
+ grunt.verbose.error();
158
+ } else {
159
+ grunt.verbose.ok();
160
+ }
161
+
162
+ // Updating also the .mo files
163
+ grunt.util.spawn( {
164
+ cmd : 'msgfmt',
165
+ args: [fileSrc, '-o', output]
166
+ }, function ( moError, moResult, moCode ) {
167
+ grunt.log.writeln( 'Updating MO for: ' + fileSrc + ' ...' );
168
+ counter--;
169
+ if ( moError || counter === 0 ) {
170
+ done( moError );
171
+ }
172
+ } );
173
+ if ( error ) {
174
+ done( error );
175
+ }
176
+ } );
177
+ } );
178
+ } else {
179
+ grunt.log.writeln( 'No file to process.' );
180
+ }
181
+ } );
182
+ } );
183
+
184
+ // Load NPM tasks to be used here.
185
+ grunt.loadNpmTasks( 'grunt-wp-i18n' );
186
+ grunt.loadNpmTasks( 'grunt-phpcs' );
187
+ grunt.loadNpmTasks( 'grunt-sass' );
188
+ grunt.loadNpmTasks( 'grunt-contrib-watch' );
189
+
190
+ // Use uglify-es (instead of uglify) to uglify also JS for ES6.
191
+ grunt.loadNpmTasks( 'grunt-contrib-uglify-es' );
192
+
193
+ // Register tasks.
194
+ grunt.registerTask( 'js', ['uglify'] );
195
+
196
+ grunt.registerTask( 'css', ['sass'] );
197
+ grunt.registerTask( 'assets', ['js', 'css'] );
198
+ };
plugin-fw/Gruntfile.js ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const potInfo = {
2
+ languageFolderPath: './languages/',
3
+ filename : 'yith-plugin-fw.pot',
4
+ headers : {
5
+ poedit : true, // Includes common Poedit headers.
6
+ 'x-poedit-keywordslist': true, // Include a list of all possible gettext functions.
7
+ 'report-msgid-bugs-to' : 'YITH <plugins@yithemes.com>',
8
+ 'language-team' : 'YITH <info@yithemes.com>'
9
+ }
10
+ };
11
+
12
+ module.exports = function ( grunt ) {
13
+ 'use strict';
14
+
15
+ var sass = require( 'node-sass' );
16
+
17
+ grunt.initConfig( {
18
+ dirs: {
19
+ css : 'assets/css',
20
+ scss: 'assets/css/scss',
21
+ js : 'assets/js'
22
+ },
23
+
24
+ uglify: {
25
+ options: {
26
+ ie8 : true,
27
+ parse : {
28
+ strict: false
29
+ },
30
+ output: {
31
+ comments: /@license|@preserve|^!/
32
+ }
33
+ },
34
+ common : {
35
+ files: [{
36
+ expand: true,
37
+ cwd : '<%= dirs.js %>/',
38
+ src : ['*.js', '!*.min.js'],
39
+ dest : '<%= dirs.js %>/',
40
+ rename: function ( dst, src ) {
41
+ // To keep the source js files and make new files as `*.min.js`:
42
+ return dst + '/' + src.replace( '.js', '.min.js' );
43
+ }
44
+ }]
45
+ }
46
+ },
47
+
48
+ // Compile all .scss files.
49
+ sass: {
50
+ compile: {
51
+ options: {
52
+ implementation: sass,
53
+ outputStyle: 'expanded'
54
+ },
55
+ files : [{
56
+ expand: true,
57
+ cwd : '<%= dirs.scss %>/',
58
+ src : ['*.scss'],
59
+ dest : '<%= dirs.css %>/',
60
+ ext : '.css'
61
+ }]
62
+ }
63
+ },
64
+
65
+ jshint: {
66
+ options: {
67
+ jshintrc: '.jshintrc'
68
+ },
69
+ all : [
70
+ '<%= dirs.js %>/*.js',
71
+ '!<%= dirs.js %>/*.min.js'
72
+ ]
73
+ },
74
+
75
+
76
+ // Watch changes for assets.
77
+ watch: {
78
+ css: {
79
+ files: ['<%= dirs.scss %>/**/*.scss'],
80
+ tasks: ['sass']
81
+ }
82
+ },
83
+
84
+ makepot : {
85
+ options: {
86
+ type : 'wp-plugin',
87
+ domainPath : 'languages',
88
+ domain : 'yith-plugin-fw',
89
+ potHeaders : potInfo.headers,
90
+ updatePoFiles: false
91
+ },
92
+ dist : {
93
+ options: {
94
+ potFilename: potInfo.filename,
95
+ exclude : [
96
+ 'bin/.*',
97
+ 'dist/.*',
98
+ 'node_modules/.*',
99
+ 'tests/.*',
100
+ 'tmp/.*',
101
+ 'vendor/.*'
102
+ ]
103
+ }
104
+ }
105
+ },
106
+ update_po: {
107
+ options: {
108
+ template: potInfo.languageFolderPath + potInfo.filename
109
+ },
110
+ build : {
111
+ src: potInfo.languageFolderPath + '*.po'
112
+ }
113
+ },
114
+
115
+ // PHP Code Sniffer.
116
+ phpcs: {
117
+ options: {
118
+ bin: 'vendor/bin/phpcs'
119
+ },
120
+ dist : {
121
+ src: [
122
+ '**/*.php', // Include all php files.
123
+ '!bin/**',
124
+ '!dist/**',
125
+ '!node_modules/**',
126
+ '!tests/**',
127
+ '!tools/**',
128
+ '!tmp/**',
129
+ '!vendor/**'
130
+ ]
131
+ }
132
+ }
133
+
134
+ } );
135
+
136
+ grunt.registerMultiTask( 'update_po', 'This task update .po strings by .pot', function () {
137
+ grunt.log.writeln( 'Updating .po files.' );
138
+
139
+ var done = this.async(),
140
+ options = this.options(),
141
+ template = options.template;
142
+ this.files.forEach( function ( file ) {
143
+ if ( file.src.length ) {
144
+ var counter = file.src.length;
145
+
146
+ grunt.log.writeln( 'Processing ' + file.src.length + ' files.' );
147
+
148
+ file.src.forEach( function ( fileSrc ) {
149
+ grunt.util.spawn( {
150
+ cmd : 'msgmerge',
151
+ args: ['-U', fileSrc, template]
152
+ }, function ( error, result, code ) {
153
+ const output = fileSrc.replace( '.po', '.mo' );
154
+ grunt.log.writeln( 'Updating: ' + fileSrc + ' ...' );
155
+
156
+ if ( error ) {
157
+ grunt.verbose.error();
158
+ } else {
159
+ grunt.verbose.ok();
160
+ }
161
+
162
+ // Updating also the .mo files
163
+ grunt.util.spawn( {
164
+ cmd : 'msgfmt',
165
+ args: [fileSrc, '-o', output]
166
+ }, function ( moError, moResult, moCode ) {
167
+ grunt.log.writeln( 'Updating MO for: ' + fileSrc + ' ...' );
168
+ counter--;
169
+ if ( moError || counter === 0 ) {
170
+ done( moError );
171
+ }
172
+ } );
173
+ if ( error ) {
174
+ done( error );
175
+ }
176
+ } );
177
+ } );
178
+ } else {
179
+ grunt.log.writeln( 'No file to process.' );
180
+ }
181
+ } );
182
+ } );
183
+
184
+ // Load NPM tasks to be used here.
185
+ grunt.loadNpmTasks( 'grunt-wp-i18n' );
186
+ grunt.loadNpmTasks( 'grunt-phpcs' );
187
+ grunt.loadNpmTasks( 'grunt-sass' );
188
+ grunt.loadNpmTasks( 'grunt-contrib-watch' );
189
+
190
+ // Use uglify-es (instead of uglify) to uglify also JS for ES6.
191
+ grunt.loadNpmTasks( 'grunt-contrib-uglify-es' );
192
+
193
+ // Register tasks.
194
+ grunt.registerTask( 'js', ['uglify'] );
195
+
196
+ grunt.registerTask( 'css', ['sass'] );
197
+ grunt.registerTask( 'assets', ['js', 'css'] );
198
+ };
plugin-fw/assets/css/admin 2.css ADDED
@@ -0,0 +1,345 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*-----------------------
2
+ YITH Debug
3
+ ------------------------*/
4
+ #wpadminbar .yith-debug-admin-bar div,
5
+ #wpadminbar .yith-debug-admin-bar:hover div {
6
+ background: #05789c !important;
7
+ color: #fff !important;
8
+ }
9
+
10
+ #wpadminbar .yith-debug-admin-bar a,
11
+ #wpadminbar .yith-debug-admin-bar strong {
12
+ color: #fff !important;
13
+ }
14
+
15
+ #wpadminbar .yith-debug-admin-bar strong {
16
+ font-weight: 600;
17
+ }
18
+
19
+ #wpadminbar .yith-debug-admin-bar-post-meta .ab-empty-item,
20
+ #wpadminbar .yith-debug-admin-bar-option .ab-empty-item {
21
+ display: none;
22
+ }
23
+
24
+ #wpadminbar #wp-admin-bar-yith-debug-admin-bar-post-meta-default,
25
+ #wpadminbar #wp-admin-bar-yith-debug-admin-bar-option-default {
26
+ padding: 0;
27
+ max-height: 500px;
28
+ overflow-y: auto;
29
+ }
30
+
31
+ #wpadminbar .yith-debug-admin-bar pre {
32
+ padding: 10px;
33
+ line-height: 1.5em;
34
+ }
35
+
36
+ .notice-yith {
37
+ margin-left: 0;
38
+ border-left-color: #acc327;
39
+ }
40
+
41
+ .notice-yith.notice-alt {
42
+ background-color: #ecf7ed;
43
+ }
44
+
45
+ .yith-promo-banner-image-link {
46
+ display: block;
47
+ margin-bottom: 15px;
48
+ }
49
+
50
+ .yith-promo-banner-image {
51
+ max-width: 100%;
52
+ margin: 0 auto;
53
+ display: block;
54
+ }
55
+
56
+ /*-----------------------
57
+ YITH FEEDS
58
+ ------------------------*/
59
+ .yith-feeds-wrapper{
60
+ display: none;
61
+ }
62
+
63
+ .yith-feeds-changelog-plugin-name{
64
+ display: table;
65
+ }
66
+
67
+ .yith-feeds-logo {
68
+ display: table-cell !important;
69
+ background: #005b7c;
70
+ padding: 5px;
71
+ border-radius: 50%;
72
+ margin-right: 10px;
73
+ vertical-align: text-bottom;
74
+ width: 18px;
75
+ height: auto;
76
+ vertical-align: middle;
77
+ }
78
+
79
+ .yith-feeds-plugin-name {
80
+ display: table-cell;
81
+ vertical-align: middle;
82
+ }
83
+
84
+ /*-----------------------
85
+ YITH Plugins Columns
86
+ ------------------------*/
87
+ @media screen and (min-width: 783px) {
88
+
89
+ .auto-fold #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu-head {
90
+ width: 100%;
91
+ }
92
+
93
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu {
94
+ min-width: 320px;
95
+ display: flex;
96
+ flex-flow: row wrap;
97
+ }
98
+
99
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
100
+ width: 50%;
101
+ border-left: 1px solid #555;
102
+ box-sizing: border-box;
103
+ }
104
+
105
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(2n) {
106
+ border-left: none;
107
+ }
108
+
109
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu {
110
+ min-width: 480px;
111
+ display: flex;
112
+ flex-flow: row wrap;
113
+ }
114
+
115
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
116
+ width: calc(100% / 3);
117
+ border-left: 1px solid #555;
118
+ box-sizing: border-box;
119
+ }
120
+
121
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(3n + 2) {
122
+ border-left: none;
123
+ }
124
+ }
125
+
126
+ /*---------------------------
127
+ YITH System Information
128
+ ----------------------------*/
129
+
130
+ .yith-system-info-wrap table.form-table {
131
+ margin: 0;
132
+ background: #fff;
133
+ }
134
+
135
+ .yith-system-info-wrap table.form-table th, .yith-system-info-wrap table.form-table td {
136
+ padding: 30px 20px !important;
137
+ }
138
+
139
+ .yith-system-info-wrap table.form-table th {
140
+ min-width: 200px;
141
+ width: auto !important;
142
+ }
143
+
144
+ .yith-system-info-wrap table.form-table textarea.yith-system-info-debug {
145
+ width: 100%;
146
+ height: 400px !important;
147
+ }
148
+
149
+ .yith-phpinfo-wrap div table.form-table {
150
+ border-bottom: none;
151
+ margin-bottom: 0;
152
+ }
153
+
154
+ .yith-phpinfo-wrap div h2 {
155
+ border-top: 1px solid #d8d8d8 !important;
156
+ }
157
+
158
+ .yith-phpinfo-wrap div {
159
+ margin-bottom: 40px;
160
+ border-bottom: 1px solid #d8d8d8;
161
+ }
162
+
163
+ .yith-phpinfo-wrap div:last-child {
164
+ margin-bottom: 0;
165
+ }
166
+
167
+ .yith-phpinfo-wrap table.form-table h1.p {
168
+ color: #2a8db0;
169
+ text-transform: uppercase;
170
+ padding: 0;
171
+ line-height: 64px;
172
+ }
173
+
174
+
175
+ .yith-phpinfo-wrap table.form-table img {
176
+ float: right;
177
+ border: 0;
178
+ }
179
+
180
+ .yith-system-info-wrap .yith-plugin-fw-field-wrapper.progress:after {
181
+ color: #336374;
182
+ display: inline-block;
183
+ font: 400 20px/1 dashicons;
184
+ speak: none;
185
+ -webkit-font-smoothing: antialiased;
186
+ -moz-osx-font-smoothing: grayscale;
187
+ vertical-align: top;
188
+ line-height: 28px;
189
+ content: '\f463';
190
+ -webkit-animation: rotation 2s infinite linear;
191
+ animation: rotation 2s infinite linear
192
+ }
193
+
194
+ .yith-system-info h2.yith-sysinfo-title {
195
+ color: #00729f;
196
+ font-size: 25px;
197
+ text-transform: uppercase;
198
+ font-weight: 800;
199
+ line-height: 25px;
200
+ padding: 20px 0;
201
+ background: none;
202
+ border: none;
203
+ }
204
+
205
+ #yith-system-alert span.yith-logo,
206
+ .yith-system-info h2 span.yith-logo {
207
+ border-radius: 50%;
208
+ background: #265b7a;
209
+ height: 30px;
210
+ width: 30px;
211
+ display: flex;
212
+ text-align: center;
213
+ margin: 0 10px 0 0;
214
+ float: left;
215
+ align-items: center;
216
+ justify-content: center;
217
+ }
218
+
219
+
220
+ .yith-system-info table td {
221
+ word-break: break-all;
222
+ padding: 20px 12px;
223
+ }
224
+
225
+ .yith-system-info table td.requirement-value,
226
+ .yith-system-info table td.info-value {
227
+ font-size: 14px;
228
+ vertical-align: middle;
229
+ text-align: left;
230
+ color: #5da726;
231
+ line-height: 19px;
232
+ }
233
+
234
+ .yith-system-info table td.requirement-value {
235
+ width: 120px;
236
+ }
237
+
238
+ .yith-system-info table td.requirement-value.has-errors {
239
+ color: #a00;
240
+ }
241
+
242
+ .yith-system-info table td.requirement-value.has-warnings {
243
+ color: #ffa200;
244
+ }
245
+
246
+ .yith-system-info table td.requirement-messages ul {
247
+ margin: 0;
248
+ padding: 0 0 10px 0;
249
+ list-style: none !important;
250
+ }
251
+
252
+ .yith-system-info table td.requirement-messages ul li {
253
+ margin-bottom: 3px;
254
+ }
255
+
256
+ .yith-system-info table td.requirement-messages span.error {
257
+ color: #a00;
258
+ font-weight: bold;
259
+ }
260
+
261
+ .yith-system-info table td.requirement-messages span.warning {
262
+ color: #a00;
263
+ font-weight: bold;
264
+ }
265
+
266
+ .yith-system-info .debug-code {
267
+ font-family: monospace;
268
+ padding: 15px;
269
+ display: inline-block;
270
+ background: #f2f3f4;
271
+ line-height: 22px;
272
+ border: 2px solid #dfe3e6;
273
+ border-radius: 5px;
274
+ margin-right: 20px;
275
+ }
276
+
277
+ .yith-system-info .copy-link {
278
+ font-size: 11px;
279
+ font-weight: 600;
280
+ padding-left: 1.7em;
281
+ position: relative;
282
+ text-decoration: none;
283
+ color: #3889d3;
284
+ }
285
+
286
+ .yith-system-info .copy-link:hover {
287
+ color: #004b91;
288
+ }
289
+
290
+ .yith-system-info .copy-link:before {
291
+ background-color: #ffffff;
292
+ border: 1px solid;
293
+ bottom: 2px;
294
+ content: '';
295
+ display: inline-block;
296
+ height: 0.9em;
297
+ left: 0;
298
+ position: absolute;
299
+ width: 0.9em;
300
+ z-index: 2;
301
+ }
302
+
303
+ .yith-system-info .copy-link:after {
304
+ background-color: #ffffff;
305
+ border: 1px solid;
306
+ bottom: 5px;
307
+ content: '';
308
+ display: inline-block;
309
+ height: 0.9em;
310
+ left: 3px;
311
+ position: absolute;
312
+ width: 0.9em;
313
+ z-index: 1;
314
+ }
315
+
316
+ .yith-system-info .copy-link .copied-tooltip {
317
+ width: 140px;
318
+ background-color: #555;
319
+ color: #fff;
320
+ text-align: center;
321
+ border-radius: 6px;
322
+ padding: 5px;
323
+ position: absolute;
324
+ z-index: 1;
325
+ bottom: 150%;
326
+ left: 50%;
327
+ margin-left: -75px;
328
+ transition: all ease .3s;
329
+ }
330
+
331
+ .yith-system-info .copy-link .copied-tooltip:after {
332
+ content: "";
333
+ position: absolute;
334
+ top: 100%;
335
+ left: 50%;
336
+ margin-left: -5px;
337
+ border-width: 5px;
338
+ border-style: solid;
339
+ border-color: #555 transparent transparent transparent;
340
+ }
341
+
342
+ .yith-system-info-menu {
343
+ font-weight: bold;
344
+ font-size: 11px !important;
345
+ }
plugin-fw/assets/css/codemirror/codemirror 2.css ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* BASICS */
2
+
3
+ .CodeMirror {
4
+ /* Set height, width, borders, and global font properties here */
5
+ font-family: monospace;
6
+ height: 400px;
7
+ clear: both;
8
+ padding: 0;
9
+ }
10
+ .CodeMirror-scroll {
11
+ /* Set scrolling behaviour here */
12
+ overflow: auto;
13
+ }
14
+
15
+ /* PADDING */
16
+
17
+ .CodeMirror-lines {
18
+ padding: 4px 0; /* Vertical padding around content */
19
+ }
20
+ .CodeMirror pre {
21
+ padding: 0 4px; /* Horizontal padding of content */
22
+ }
23
+
24
+ .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
25
+ background-color: white; /* The little square between H and V scrollbars */
26
+ }
27
+
28
+ /* GUTTER */
29
+
30
+ .CodeMirror-gutters {
31
+ border-right: 1px solid #ddd;
32
+ background-color: #f7f7f7;
33
+ white-space: nowrap;
34
+ }
35
+ .CodeMirror-linenumbers {}
36
+ .CodeMirror-linenumber {
37
+ padding: 0 3px 0 5px;
38
+ min-width: 20px;
39
+ text-align: right;
40
+ color: #999;
41
+ }
42
+
43
+ /* CURSOR */
44
+
45
+ .CodeMirror div.CodeMirror-cursor {
46
+ border-left: 1px solid black;
47
+ z-index: 3;
48
+ }
49
+ /* Shown when moving in bi-directional text */
50
+ .CodeMirror div.CodeMirror-secondarycursor {
51
+ border-left: 1px solid silver;
52
+ }
53
+ .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
54
+ width: auto;
55
+ border: 0;
56
+ background: #7e7;
57
+ z-index: 1;
58
+ }
59
+ /* Can style cursor different in overwrite (non-insert) mode */
60
+ .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
61
+
62
+ .cm-tab { display: inline-block; }
63
+
64
+ /* DEFAULT THEME */
65
+
66
+ .cm-s-default .cm-keyword {color: #708;}
67
+ .cm-s-default .cm-atom {color: #219;}
68
+ .cm-s-default .cm-number {color: #164;}
69
+ .cm-s-default .cm-def {color: #00f;}
70
+ .cm-s-default .cm-variable {color: black;}
71
+ .cm-s-default .cm-variable-2 {color: #05a;}
72
+ .cm-s-default .cm-variable-3 {color: #085;}
73
+ .cm-s-default .cm-property {color: black;}
74
+ .cm-s-default .cm-operator {color: black;}
75
+ .cm-s-default .cm-comment {color: #a50;}
76
+ .cm-s-default .cm-string {color: #a11;}
77
+ .cm-s-default .cm-string-2 {color: #f50;}
78
+ .cm-s-default .cm-meta {color: #555;}
79
+ .cm-s-default .cm-error {color: #f00;}
80
+ .cm-s-default .cm-qualifier {color: #555;}
81
+ .cm-s-default .cm-builtin {color: #30a;}
82
+ .cm-s-default .cm-bracket {color: #997;}
83
+ .cm-s-default .cm-tag {color: #170;}
84
+ .cm-s-default .cm-attribute {color: #00c;}
85
+ .cm-s-default .cm-header {color: blue;}
86
+ .cm-s-default .cm-quote {color: #090;}
87
+ .cm-s-default .cm-hr {color: #999;}
88
+ .cm-s-default .cm-link {color: #00c;}
89
+
90
+ .cm-negative {color: #d44;}
91
+ .cm-positive {color: #292;}
92
+ .cm-header, .cm-strong {font-weight: bold;}
93
+ .cm-em {font-style: italic;}
94
+ .cm-link {text-decoration: underline;}
95
+
96
+ .cm-invalidchar {color: #f00;}
97
+
98
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
99
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
100
+
101
+ /* STOP */
102
+
103
+ /* The rest of this file contains styles related to the mechanics of
104
+ the editor. You probably shouldn't touch them. */
105
+
106
+ .CodeMirror {
107
+ line-height: 1;
108
+ position: relative;
109
+ overflow: hidden;
110
+ background: #fafafa;
111
+ color: black;
112
+ }
113
+
114
+ .CodeMirror-scroll {
115
+ /* 30px is the magic margin used to hide the element's real scrollbars */
116
+ /* See overflow: hidden in .CodeMirror */
117
+ margin-bottom: -30px; margin-right: -30px;
118
+ padding-bottom: 30px; padding-right: 30px;
119
+ height: 100%;
120
+ outline: none; /* Prevent dragging from highlighting the element */
121
+ position: relative;
122
+ }
123
+ .CodeMirror-sizer {
124
+ position: relative;
125
+ }
126
+
127
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
128
+ before actuall scrolling happens, thus preventing shaking and
129
+ flickering artifacts. */
130
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
131
+ position: absolute;
132
+ z-index: 6;
133
+ display: none;
134
+ }
135
+ .CodeMirror-vscrollbar {
136
+ right: 0; top: 0;
137
+ overflow-x: hidden;
138
+ overflow-y: scroll;
139
+ }
140
+ .CodeMirror-hscrollbar {
141
+ bottom: 0; left: 0;
142
+ overflow-y: hidden;
143
+ overflow-x: scroll;
144
+ }
145
+ .CodeMirror-scrollbar-filler {
146
+ right: 0; bottom: 0;
147
+ }
148
+ .CodeMirror-gutter-filler {
149
+ left: 0; bottom: 0;
150
+ }
151
+
152
+ .CodeMirror-gutters {
153
+ position: absolute; left: 0; top: 0;
154
+ padding-bottom: 30px;
155
+ z-index: 3;
156
+ }
157
+ .CodeMirror-gutter {
158
+ white-space: normal;
159
+ height: 100%;
160
+ padding-bottom: 30px;
161
+ margin-bottom: -32px;
162
+ display: inline-block;
163
+ /* Hack to make IE7 behave */
164
+ *zoom:1;
165
+ *display:inline;
166
+ }
167
+ .CodeMirror-gutter-elt {
168
+ position: absolute;
169
+ cursor: default;
170
+ z-index: 4;
171
+ }
172
+
173
+ .CodeMirror-lines {
174
+ cursor: text;
175
+ }
176
+ .CodeMirror pre {
177
+ /* Reset some styles that the rest of the page might have set */
178
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
179
+ border-width: 0;
180
+ background: transparent;
181
+ font-family: inherit;
182
+ font-size: inherit;
183
+ margin: 0;
184
+ white-space: pre;
185
+ word-wrap: normal;
186
+ line-height: inherit;
187
+ color: inherit;
188
+ z-index: 2;
189
+ position: relative;
190
+ overflow: visible;
191
+ }
192
+ .CodeMirror-wrap pre {
193
+ word-wrap: break-word;
194
+ white-space: pre-wrap;
195
+ word-break: normal;
196
+ }
197
+ .CodeMirror-code pre {
198
+ border-right: 30px solid transparent;
199
+ width: -webkit-fit-content;
200
+ width: -moz-fit-content;
201
+ width: fit-content;
202
+ }
203
+ .CodeMirror-wrap .CodeMirror-code pre {
204
+ border-right: none;
205
+ width: auto;
206
+ }
207
+ .CodeMirror-linebackground {
208
+ position: absolute;
209
+ left: 0; right: 0; top: 0; bottom: 0;
210
+ z-index: 0;
211
+ }
212
+
213
+ .CodeMirror-linewidget {
214
+ position: relative;
215
+ z-index: 2;
216
+ overflow: auto;
217
+ }
218
+
219
+ .CodeMirror-widget {
220
+ }
221
+
222
+ .CodeMirror-wrap .CodeMirror-scroll {
223
+ overflow-x: hidden;
224
+ }
225
+
226
+ .CodeMirror-measure {
227
+ position: absolute;
228
+ width: 100%; height: 0px;
229
+ overflow: hidden;
230
+ visibility: hidden;
231
+ }
232
+ .CodeMirror-measure pre { position: static; }
233
+
234
+ .CodeMirror div.CodeMirror-cursor {
235
+ position: absolute;
236
+ visibility: hidden;
237
+ border-right: none;
238
+ width: 0;
239
+ }
240
+ .CodeMirror-focused div.CodeMirror-cursor {
241
+ visibility: visible;
242
+ }
243
+
244
+ .CodeMirror-selected { background: #d9d9d9; }
245
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
246
+
247
+ .cm-searching {
248
+ background: #ffa;
249
+ background: rgba(255, 255, 0, .4);
250
+ }
251
+
252
+ /* IE7 hack to prevent it from returning funny offsetTops on the spans */
253
+ .CodeMirror span { *vertical-align: text-bottom; }
254
+
255
+ @media print {
256
+ /* Hide the cursor when printing */
257
+ .CodeMirror div.CodeMirror-cursor {
258
+ visibility: hidden;
259
+ }
260
+ }
plugin-fw/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100 2.png ADDED
Binary file
plugin-fw/assets/css/scss/welcome-modal 2.scss ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Welcome Modal.
3
+ */
4
+ .yith-plugin-fw-welcome-modal {
5
+ .yith-plugin-fw__modal__content {
6
+ padding-bottom : 0;
7
+ }
8
+
9
+ .yith-plugin-fw__modal__footer {
10
+ background : transparent;
11
+ text-align : center;
12
+ }
13
+
14
+ }
15
+
16
+ .yith-plugin-fw-welcome {
17
+ line-height : 1.5em;
18
+
19
+ a {
20
+ color : var(--yith-link);
21
+ }
22
+
23
+ .yith-plugin-fw-welcome__head {
24
+ text-align : center;
25
+ }
26
+
27
+ .yith-plugin-fw-welcome__icon {
28
+ width : 60px;
29
+ }
30
+
31
+ .yith-plugin-fw-welcome__title {
32
+ color : #03689f;
33
+ font-size : 18px;
34
+ line-height : 2em;
35
+ }
36
+
37
+ .yith-plugin-fw-welcome__description {
38
+ margin : 15px 0 25px;
39
+ }
40
+
41
+ .yith-plugin-fw-welcome__title__plugin-name {
42
+ font-weight : 700;
43
+ }
44
+
45
+ .yith-plugin-fw-welcome__list-head {
46
+ display : flex;
47
+ align-items : center;
48
+ }
49
+
50
+ .yith-plugin-fw-welcome__list-head__title {
51
+ font-size : 1.2em;
52
+ font-weight : 700;
53
+ flex : 1;
54
+ }
55
+
56
+ .yith-plugin-fw-welcome__list-head__changelog {
57
+ font-size : .85em;
58
+ text-decoration : none;
59
+ font-weight : 500;
60
+ }
61
+
62
+ &.yith-plugin-fw-welcome--update {
63
+ .yith-plugin-fw-welcome__list-head {
64
+ margin-top : 30px;
65
+ }
66
+ }
67
+ }
68
+
69
+ .yith-plugin-fw-welcome__close {
70
+ color : var(--yith-link);
71
+ cursor : pointer;
72
+ font-size : .9em;
73
+ display : inline-block;
74
+ padding : 5px 10px;
75
+ text-decoration : none;
76
+ font-weight : 500;
77
+ }
plugin-fw/assets/css/scss/welcome-modal.scss ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Welcome Modal.
3
+ */
4
+ .yith-plugin-fw-welcome-modal {
5
+ .yith-plugin-fw__modal__content {
6
+ padding-bottom : 0;
7
+ }
8
+
9
+ .yith-plugin-fw__modal__footer {
10
+ background : transparent;
11
+ text-align : center;
12
+ }
13
+
14
+ }
15
+
16
+ .yith-plugin-fw-welcome {
17
+ line-height : 1.5em;
18
+
19
+ a {
20
+ color : var(--yith-link);
21
+ }
22
+
23
+ .yith-plugin-fw-welcome__head {
24
+ text-align : center;
25
+ }
26
+
27
+ .yith-plugin-fw-welcome__icon {
28
+ width : 60px;
29
+ }
30
+
31
+ .yith-plugin-fw-welcome__title {
32
+ color : #03689f;
33
+ font-size : 18px;
34
+ line-height : 2em;
35
+ }
36
+
37
+ .yith-plugin-fw-welcome__description {
38
+ margin : 15px 0 25px;
39
+ }
40
+
41
+ .yith-plugin-fw-welcome__title__plugin-name {
42
+ font-weight : 700;
43
+ }
44
+
45
+ .yith-plugin-fw-welcome__list-head {
46
+ display : flex;
47
+ align-items : center;
48
+ }
49
+
50
+ .yith-plugin-fw-welcome__list-head__title {
51
+ font-size : 1.2em;
52
+ font-weight : 700;
53
+ flex : 1;
54
+ }
55
+
56
+ .yith-plugin-fw-welcome__list-head__changelog {
57
+ font-size : .85em;
58
+ text-decoration : none;
59
+ font-weight : 500;
60
+ }
61
+
62
+ &.yith-plugin-fw-welcome--update {
63
+ .yith-plugin-fw-welcome__list-head {
64
+ margin-top : 30px;
65
+ }
66
+ }
67
+ }
68
+
69
+ .yith-plugin-fw-welcome__close {
70
+ color : var(--yith-link);
71
+ cursor : pointer;
72
+ font-size : .9em;
73
+ display : inline-block;
74
+ padding : 5px 10px;
75
+ text-decoration : none;
76
+ font-weight : 500;
77
+ }
plugin-fw/assets/css/scss/yith-plugin-ui.scss ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ @import "yith-plugin-ui/head_comment";
2
+
3
+ @import "yith-plugin-ui/variables";
4
+ @import "yith-plugin-ui/wp-pages";
5
+ @import "yith-plugin-ui/taxonomy";
6
+ @import "yith-plugin-ui/components";
7
+ @import "yith-plugin-ui/tables";
8
+ @import "yith-plugin-ui/animations";
plugin-fw/assets/css/scss/yith-plugin-ui/_animations 2.scss ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Animations
3
+ */
4
+
5
+ .yith-plugin-fw-animate__appear-from-bottom{
6
+ animation: yith-plugin-fw-appear-from-bottom .3s forwards;
7
+ }
8
+
9
+ .yith-plugin-fw-animate__appear-from-top{
10
+ animation: yith-plugin-fw-appear-from-top .3s forwards;
11
+ }
12
+
13
+ .yith-plugin-fw-animate__fade-in{
14
+ animation: yith-plugin-fw-fade-in .3s forwards;
15
+ }
16
+
17
+
18
+ @-webkit-keyframes yith-plugin-fw-appear-from-top {
19
+ from {
20
+ opacity: 0;
21
+ transform: translateY(-30%);
22
+ -webkit-transform: translateY(-30%);
23
+ }
24
+
25
+ to {
26
+ opacity: 1;
27
+ transform: translateY(0);
28
+ -webkit-transform: translateY(0);
29
+ }
30
+ }
31
+
32
+ @keyframes yith-plugin-fw-appear-from-top {
33
+ from {
34
+ opacity: 0;
35
+ transform: translateY(-30%);
36
+ -webkit-transform: translateY(-30%);
37
+ }
38
+
39
+ to {
40
+ opacity: 1;
41
+ transform: translateY(0);
42
+ -webkit-transform: translateY(0);
43
+ }
44
+ }
45
+
46
+ @-webkit-keyframes yith-plugin-fw-appear-from-bottom {
47
+ from {
48
+ opacity: 0;
49
+ transform: translateY(+30%);
50
+ -webkit-transform: translateY(+30%);
51
+ }
52
+
53
+ to {
54
+ opacity: 1;
55
+ transform: translateY(0);
56
+ -webkit-transform: translateY(0);
57
+ }
58
+ }
59
+
60
+ @keyframes yith-plugin-fw-appear-from-bottom {
61
+ from {
62
+ opacity: 0;
63
+ transform: translateY(+30%);
64
+ -webkit-transform: translateY(+30%);
65
+ }
66
+
67
+ to {
68
+ opacity: 1;
69
+ transform: translateY(0);
70
+ -webkit-transform: translateY(0);
71
+ }
72
+ }
73
+
74
+ @-webkit-keyframes yith-plugin-fw-fade-in {
75
+ from {
76
+ opacity: 0;
77
+ }
78
+
79
+ to {
80
+ opacity: 1;
81
+ }
82
+ }
83
+
84
+ @keyframes yith-plugin-fw-fade-in {
85
+ from {
86
+ opacity: 0;
87
+ }
88
+
89
+ to {
90
+ opacity: 1;
91
+ }
92
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/_animations.scss ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Animations
3
+ */
4
+
5
+ .yith-plugin-fw-animate__appear-from-bottom{
6
+ animation: yith-plugin-fw-appear-from-bottom .3s forwards;
7
+ }
8
+
9
+ .yith-plugin-fw-animate__appear-from-top{
10
+ animation: yith-plugin-fw-appear-from-top .3s forwards;
11
+ }
12
+
13
+ .yith-plugin-fw-animate__fade-in{
14
+ animation: yith-plugin-fw-fade-in .3s forwards;
15
+ }
16
+
17
+
18
+ @-webkit-keyframes yith-plugin-fw-appear-from-top {
19
+ from {
20
+ opacity: 0;
21
+ transform: translateY(-30%);
22
+ -webkit-transform: translateY(-30%);
23
+ }
24
+
25
+ to {
26
+ opacity: 1;
27
+ transform: translateY(0);
28
+ -webkit-transform: translateY(0);
29
+ }
30
+ }
31
+
32
+ @keyframes yith-plugin-fw-appear-from-top {
33
+ from {
34
+ opacity: 0;
35
+ transform: translateY(-30%);
36
+ -webkit-transform: translateY(-30%);
37
+ }
38
+
39
+ to {
40
+ opacity: 1;
41
+ transform: translateY(0);
42
+ -webkit-transform: translateY(0);
43
+ }
44
+ }
45
+
46
+ @-webkit-keyframes yith-plugin-fw-appear-from-bottom {
47
+ from {
48
+ opacity: 0;
49
+ transform: translateY(+30%);
50
+ -webkit-transform: translateY(+30%);
51
+ }
52
+
53
+ to {
54
+ opacity: 1;
55
+ transform: translateY(0);
56
+ -webkit-transform: translateY(0);
57
+ }
58
+ }
59
+
60
+ @keyframes yith-plugin-fw-appear-from-bottom {
61
+ from {
62
+ opacity: 0;
63
+ transform: translateY(+30%);
64
+ -webkit-transform: translateY(+30%);
65
+ }
66
+
67
+ to {
68
+ opacity: 1;
69
+ transform: translateY(0);
70
+ -webkit-transform: translateY(0);
71
+ }
72
+ }
73
+
74
+ @-webkit-keyframes yith-plugin-fw-fade-in {
75
+ from {
76
+ opacity: 0;
77
+ }
78
+
79
+ to {
80
+ opacity: 1;
81
+ }
82
+ }
83
+
84
+ @keyframes yith-plugin-fw-fade-in {
85
+ from {
86
+ opacity: 0;
87
+ }
88
+
89
+ to {
90
+ opacity: 1;
91
+ }
92
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/_components.scss ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Plugin UI - Components
3
+ */
4
+
5
+ @import "components/action-button";
6
+ @import "components/buttons";
7
+ @import "components/boxed-row";
8
+ @import "components/confirm";
9
+ @import "components/list-items";
10
+ @import "components/list-table-blank-state";
11
+ @import "components/modal";
12
+ @import "components/tip-tip";
13
+ @import "components/tabs";
plugin-fw/assets/css/scss/yith-plugin-ui/_head_comment.scss ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /**
2
+ * YITH Plugin UI style
3
+ *
4
+ * IMPORTANT: This file is automatically generated through SCSS files.
5
+ * Please don't edit it manually!
6
+ */
plugin-fw/assets/css/scss/yith-plugin-ui/_tables.scss ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Plugin UI - Post Type Style
3
+ */
4
+
5
+ @import "mixins/tables";
6
+
7
+ table.yith-plugin-fw__classic-table {
8
+ @include classic-table;
9
+
10
+ &.wp-list-table{
11
+ @include wp-table-commons;
12
+ }
13
+ }
14
+
15
+ table.yith-plugin-fw__boxed-table {
16
+ @include boxed-table;
17
+
18
+ &.wp-list-table{
19
+ @include wp-table-commons;
20
+ }
21
+ }
22
+
23
+ // WP List Tables
24
+ .yith-plugin-ui--classic-wp-list-style, .yith-plugin-ui #plugin-fw-wc .yith-plugin-ui--classic-wp-list-style {
25
+
26
+ table.wp-list-table {
27
+ @include classic-table;
28
+
29
+ @include wp-table-commons;
30
+ }
31
+
32
+ .tablenav.bottom {
33
+ display: none;
34
+
35
+ .yith-plugin-fw__list-table-blank-state {
36
+ display: flex;
37
+ }
38
+ }
39
+ }
40
+
41
+ .yith-plugin-ui--boxed-wp-list-style, .yith-plugin-ui #plugin-fw-wc .yith-plugin-ui--boxed-wp-list-style {
42
+
43
+ table.wp-list-table {
44
+ @include boxed-table;
45
+
46
+ @include wp-table-commons;
47
+ }
48
+
49
+ .tablenav.bottom {
50
+ display: none;
51
+
52
+ .yith-plugin-fw__list-table-blank-state {
53
+ display: flex;
54
+ }
55
+ }
56
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/_taxonomy.scss ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Plugin UI - Taxonomy Style
3
+ */
4
+
5
+ .yith-plugin-ui.yith-plugin-ui--taxonomy-type, .yith-plugin-ui--taxonomy-type {
6
+
7
+ // List
8
+
9
+ #col-container {
10
+ display: flex;
11
+ }
12
+
13
+ #col-left {
14
+ padding: 20px;
15
+ background: #f1f1f1;
16
+ border-radius: 8px;
17
+ box-sizing: border-box;
18
+ margin-right: 15px;
19
+ }
20
+
21
+ #col-right {
22
+ flex: 1;
23
+ }
24
+
25
+ h2 {
26
+ border: none;
27
+ padding: 0;
28
+ font-size: 14px;
29
+ background: transparent;
30
+ }
31
+
32
+ // Edit Tax
33
+ .wrap h1 {
34
+ color: #2a8db0;
35
+ font-size: 16px;
36
+ font-weight: 600;
37
+ }
38
+ }
39
+
40
+ @media screen and (max-width: 782px) {
41
+ .yith-plugin-ui.yith-plugin-ui--taxonomy-type {
42
+ #col-container {
43
+ display: block;
44
+ }
45
+
46
+ #col-left, #col-right {
47
+ float: none;
48
+ width: 100%;
49
+ }
50
+ }
51
+ }
52
+
plugin-fw/assets/css/scss/yith-plugin-ui/_variables.scss ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH CSS Variables
3
+ */
4
+
5
+ $content_bg: #ffffff; // Content Background.
6
+ $content_text: #3c434a; // Content Text.
7
+
8
+ $primary: #00799f; // Primary color, for buttons
9
+ $primary_hover: #0094c4; // Primary hover color, for buttons
10
+ $primary_focus: #bddce6; // Primary focus color, for buttons
11
+ $primary_text: #ffffff; // Text on primary color bg
12
+
13
+ $delete: #c41d04; // color for delete buttons
14
+ $delete_hover: lighten($delete, 5%); // color for delete buttons - hover
15
+ $delete_text: #ffffff; // Text on delete buttons
16
+ $delete_focus: #f0d2cd; // Delete focus color, for buttons
17
+
18
+ // Outline is used to stylize Secondary buttons.
19
+ $outline_text: #0087b3; // outline button - text color
20
+ $outline_border: #0094c4; // outline button - border color
21
+ $outline_bg: rgba(255, 255, 255, 0); // outline button - background color
22
+ $outline_bg_hover: rgba(157, 198, 205, .2); // outline button - background color on hover
23
+ $outline_border_hover: #007ba3; // outline button - border color on hover
24
+ $outline_focus: #dfeef2; // Outline focus color, for buttons
25
+
26
+ $delete_outline_text: $delete; // Delete-outline button - text color
27
+ $delete_outline_border: $delete; // Delete-outline button - border color
28
+ $delete_outline_bg: rgba(205, 157, 157, 0); // Delete-outline button - background color
29
+ $delete_outline_bg_hover: rgba(232, 184, 184, 0.15); // Delete-outline button - background color on hover
30
+ $delete_outline_border_hover: #db2b11; // Delete-outline button - border color on hover
31
+ $delete_outline_focus: #ffe9e7; // Delete-outline focus color, for buttons
32
+
33
+ $update: #94aa09; // Update button - background
34
+ $update_hover: darken($update, 5%); // Update button - hover
35
+ $update_text: #ffffff; // Text on update button background
36
+ $update_focus: #e7eccc; // Text on update button background
37
+
38
+ $accent: #98aa36;
39
+
40
+ $light_bg: #f5fafc;
41
+ $light_border_color: #d7e3e7;
42
+ $light_shadow: rgba(145, 191, 227, 0.11);
43
+ $light_accent: #0073aa;
44
+
45
+ $success: #98aa36;
46
+ $success_light: lighten($success, 30%);
47
+ $success_lighter: lighten($success, 43%);
48
+ $success_lightest: lighten($success, 50%);
49
+
50
+
51
+ $table_row_highlight: #f0f6fb;
52
+ $table_row_striped: #f6f7f7;
53
+ $table_border_light: #eff0f0;
54
+
55
+ $field_border_color: #d8d8d8;
56
+ $field_border_weight: 1px;
57
+ $field_border: $field_border_weight solid $field_border_color;
58
+
59
+ $link: #0079b0; // Link Color.
60
+
61
+ // Extra variables: these will be not converted to CSS Variables
62
+ $wp_menu_size: 160px;
63
+ $wp_menu_folded_size: 36px;
64
+ $wp_menu_mobile_size: 190px;
65
+ $wp_top_bar_size: 32px;
66
+ $wp_top_bar_mobile_size: 46px;
67
+
68
+ // export vars as CSS vars
69
+ :root {
70
+ --yith-content-bg: #{$content_bg};
71
+ --yith-content-text: #{$content_text};
72
+ --yith-primary: #{$primary};
73
+ --yith-primary-hover: #{$primary_hover};
74
+ --yith-primary-focus: #{$primary_focus};
75
+ --yith-primary-text: #{$primary_text};
76
+
77
+ --yith-delete: #{$delete};
78
+ --yith-delete-hover: #{$delete_hover};
79
+ --yith-delete-text: #{$delete_text};
80
+ --yith-delete-focus: #{$delete_focus};
81
+
82
+ --yith-update: #{$update};
83
+ --yith-update-hover: #{$update_hover};
84
+ --yith-update-text: #{$update_text};
85
+ --yith-update-focus: #{$update_focus};
86
+
87
+ --yith-outline-text: #{$outline_text};
88
+ --yith-outline-border: #{$outline_border};
89
+ --yith-outline-bg: #{$outline_bg};
90
+ --yith-outline-bg-hover: #{$outline_bg_hover};
91
+ --yith-outline-border-hover: #{$outline_border_hover};
92
+ --yith-outline-focus: #{$outline_focus};
93
+
94
+ --yith-delete-outline-text: #{$delete_outline_text};
95
+ --yith-delete-outline-border: #{$delete_outline_border};
96
+ --yith-delete-outline-bg: #{$delete_outline_bg};
97
+ --yith-delete-outline-bg-hover: #{$delete_outline_bg_hover};
98
+ --yith-delete-outline-border-hover: #{$delete_outline_border_hover};
99
+ --yith-delete-outline-focus: #{$delete_outline_focus};
100
+
101
+ --yith-accent: #{$accent};
102
+
103
+ --yith-light-bg: #{$light_bg};
104
+ --yith-light-border-color: #{$light_border_color};
105
+ --yith-light-shadow: #{$light_shadow};
106
+ --yith-light-accent: #{$light_accent};
107
+
108
+ --yith-success: #{$success};
109
+ --yith-success-light: #{$success_light};
110
+ --yith-success-lighter: #{$success_lighter};
111
+ --yith-success-lightest: #{$success_lightest};
112
+
113
+ --yith-table-row-highlight: #{$table_row_highlight};
114
+ --yith-table-row-striped: #{$table_row_striped};
115
+ --yith-table-border-light: #{$table_border_light};
116
+
117
+ --yith-field-border-color: #{$field_border_color};
118
+ --yith-field-border-weight: #{$field_border_color};
119
+ --yith-field-border: #{$field_border};
120
+ --yith-link: #{$link};
121
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/_wp-pages.scss ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * YITH Plugin UI - WP Pages
3
+ */
4
+
5
+ .yith-plugin-fw-wp-page-wrapper {
6
+
7
+ .yith-plugin-fw__back-to-wp-list__wrapper {
8
+ margin: -5px 0 15px;
9
+
10
+ .yith-plugin-fw__back-to-wp-list {
11
+ text-decoration: none;
12
+ font-weight: 600;
13
+ text-transform: uppercase;
14
+ color: var(--yith-link);
15
+ vertical-align: middle;
16
+
17
+ &:before {
18
+ content: "\e901";
19
+ font-family: yith-icon;
20
+ margin-right: 5px;
21
+ font-size: .8em;
22
+ vertical-align: middle;
23
+ }
24
+ }
25
+ }
26
+
27
+ .wrap div#message.updated {
28
+ display: none;
29
+ padding: 15px 40px 15px 45px;
30
+ margin: 15px 0 20px;
31
+ border-radius: 5px;
32
+ background: var(--yith-success-lightest);
33
+ border: 1px solid var(--yith-success-light);
34
+ font-weight: 600;
35
+ font-size: 14px;
36
+ text-align: left;
37
+ color: var(--yith-content-text);
38
+ box-shadow: 1px 1px 2px var(--yith-success-lighter);
39
+
40
+
41
+ &:before {
42
+ font-family: yith-icon;
43
+ content: "\e921";
44
+ position: absolute;
45
+ top: 50%;
46
+ left: 13px;
47
+ font-size: 21px;
48
+ font-weight: 400;
49
+ transform: translateY(-50%);
50
+ color: var(--yith-success);
51
+ }
52
+
53
+ p {
54
+ padding: 0;
55
+ margin: 0;
56
+ }
57
+
58
+ .notice-dismiss {
59
+ position: absolute;
60
+ top: 50%;
61
+ right: 10px;
62
+ transform: translateY(-50%);
63
+ border-radius: 50%;
64
+ color: var(--yith-success);
65
+ padding: 7px;
66
+ background: transparent;
67
+ box-shadow: 0 0 0 5px rgba(0, 0, 0, 0);
68
+ transition: all .3s ease-in-out;
69
+
70
+ &:before {
71
+ font-family: yith-icon;
72
+ content: "\e906";
73
+ font-weight: 600;
74
+ font-size: 12px;
75
+ color: inherit;
76
+ }
77
+
78
+ &:hover {
79
+ box-shadow: 0 0 0 0 var(--yith-success-lighter);
80
+ background: var(--yith-success-lighter);
81
+ }
82
+
83
+ &:hover:before, &:active:before, &:focus:before {
84
+ color: inherit;
85
+ }
86
+ }
87
+ }
88
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_action-button 2.scss ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-ui .yith-plugin-fw__action-button, .yith-plugin-fw__action-button {
2
+ height: 35px;
3
+ width: 35px;
4
+ background-color: var(--yith-content-bg);
5
+ display: inline-block;
6
+ border: 0;
7
+ border-radius: 50%;
8
+ transition: .3s;
9
+ cursor: pointer;
10
+ box-shadow: 0 2px 7px rgba(170, 198, 222, .5);
11
+ outline: none;
12
+ position: relative;
13
+ margin: 0 5px 5px 0;
14
+ vertical-align: middle;
15
+
16
+ .yith-plugin-fw__action-button__link {
17
+ height: 100%;
18
+ width: 100%;
19
+ display: inline-block;
20
+ }
21
+
22
+ .yith-plugin-fw__action-button__icon {
23
+ position: absolute;
24
+ color: var(--yith-link);
25
+ font-size: 17px;
26
+ top: 50%;
27
+ left: 50%;
28
+ transform: translateX(-50%) translateY(-50%);
29
+ }
30
+
31
+ &.yith-plugin-fw__action-button--trash-action .yith-plugin-fw__action-button__icon,
32
+ &.yith-plugin-fw__action-button--delete-action .yith-plugin-fw__action-button__icon {
33
+ color: #a10000;
34
+ }
35
+
36
+ .yith-plugin-fw__action-button__menu {
37
+ position: absolute;
38
+ display: none;
39
+ flex-direction: column;
40
+ width: max-content;
41
+ right: 0;
42
+ margin: 5px 0 0 0;
43
+ padding: 8px 0;
44
+ background: var(--yith-content-bg);
45
+ border-radius: 5px;
46
+ box-shadow: 0 2px 7px rgba(170, 198, 222, .5);
47
+ z-index: 10;
48
+ animation: yith-plugin-fw-appear-from-top .3s forwards;
49
+ }
50
+
51
+ .yith-plugin-fw__action-button__menu__item {
52
+ margin: 0;
53
+ display: block;
54
+ padding: 7px 25px;
55
+ color: var(--yith-content-text);
56
+ cursor: pointer;
57
+ text-decoration: none;
58
+ text-align: right;
59
+
60
+ &:hover {
61
+ color: var(--yith-link);
62
+ }
63
+ }
64
+
65
+ &.yith-plugin-fw__action-button--has-menu {
66
+ .yith-plugin-fw__action-button__icon {
67
+ color: var(--yith-content-text);
68
+ }
69
+
70
+ &.yith-plugin-fw__action-button--opened {
71
+ .yith-plugin-fw__action-button__icon {
72
+ color: var(--yith-link);
73
+ }
74
+
75
+ .yith-plugin-fw__action-button__menu {
76
+ display: flex;
77
+ }
78
+ }
79
+ }
80
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_action-button.scss ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-ui .yith-plugin-fw__action-button, .yith-plugin-fw__action-button {
2
+ height: 35px;
3
+ width: 35px;
4
+ background-color: var(--yith-content-bg);
5
+ display: inline-block;
6
+ border: 0;
7
+ border-radius: 50%;
8
+ transition: .3s;
9
+ cursor: pointer;
10
+ box-shadow: 0 2px 7px rgba(170, 198, 222, .5);
11
+ outline: none;
12
+ position: relative;
13
+ margin: 0 5px 5px 0;
14
+ vertical-align: middle;
15
+
16
+ .yith-plugin-fw__action-button__link {
17
+ height: 100%;
18
+ width: 100%;
19
+ display: inline-block;
20
+ }
21
+
22
+ .yith-plugin-fw__action-button__icon {
23
+ position: absolute;
24
+ color: var(--yith-link);
25
+ font-size: 17px;
26
+ top: 50%;
27
+ left: 50%;
28
+ transform: translateX(-50%) translateY(-50%);
29
+ }
30
+
31
+ &.yith-plugin-fw__action-button--trash-action .yith-plugin-fw__action-button__icon,
32
+ &.yith-plugin-fw__action-button--delete-action .yith-plugin-fw__action-button__icon {
33
+ color: #a10000;
34
+ }
35
+
36
+ .yith-plugin-fw__action-button__menu {
37
+ position: absolute;
38
+ display: none;
39
+ flex-direction: column;
40
+ width: max-content;
41
+ right: 0;
42
+ margin: 5px 0 0 0;
43
+ padding: 8px 0;
44
+ background: var(--yith-content-bg);
45
+ border-radius: 5px;
46
+ box-shadow: 0 2px 7px rgba(170, 198, 222, .5);
47
+ z-index: 10;
48
+ animation: yith-plugin-fw-appear-from-top .3s forwards;
49
+ }
50
+
51
+ .yith-plugin-fw__action-button__menu__item {
52
+ margin: 0;
53
+ display: block;
54
+ padding: 7px 25px;
55
+ color: var(--yith-content-text);
56
+ cursor: pointer;
57
+ text-decoration: none;
58
+ text-align: right;
59
+
60
+ &:hover {
61
+ color: var(--yith-link);
62
+ }
63
+ }
64
+
65
+ &.yith-plugin-fw__action-button--has-menu {
66
+ .yith-plugin-fw__action-button__icon {
67
+ color: var(--yith-content-text);
68
+ }
69
+
70
+ &.yith-plugin-fw__action-button--opened {
71
+ .yith-plugin-fw__action-button__icon {
72
+ color: var(--yith-link);
73
+ }
74
+
75
+ .yith-plugin-fw__action-button__menu {
76
+ display: flex;
77
+ }
78
+ }
79
+ }
80
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_boxed-row.scss ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .yith-plugin-fw__boxed-row, .yith-plugin-fw__boxed-row--hover-highlight {
3
+ background: var(--yith-content-bg);
4
+ border-radius: 5px;
5
+ box-shadow: 0 0 0 1px var(--yith-light-border-color), 0 3px 11px 6px var(--yith-light-shadow);
6
+ transition: background-color .2s ease-in-out;
7
+ padding: 25px;
8
+ margin-bottom: 25px;
9
+ margin-top: 25px;
10
+ }
11
+
12
+ .yith-plugin-fw__boxed-row--hover-highlight:hover {
13
+ background: var(--yith-table-row-highlight);
14
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_buttons.scss ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "../mixins/buttons";
2
+
3
+ .yith-plugin-ui, .wp-core-ui .yith-plugin-ui {
4
+
5
+ // WordPress Buttons.
6
+ .button-primary, .button-secondary {
7
+ border-radius : 3px;
8
+ text-transform : none;
9
+ box-shadow : none;
10
+ border : 1px solid;
11
+ font-weight : 600;
12
+ padding : 0 12px;
13
+ outline : none;
14
+ height : auto;
15
+ transition : all ease 0.3s;
16
+ text-shadow : none;
17
+ display : inline-block;
18
+ text-decoration : none;
19
+ cursor : pointer;
20
+ white-space : nowrap;
21
+
22
+ &:focus {
23
+ outline : none;
24
+ box-shadow : none;
25
+ }
26
+
27
+ &.button-small {
28
+ padding : 0 8px;
29
+ }
30
+ }
31
+
32
+ .button-secondary {
33
+ @include button-secondary;
34
+ }
35
+
36
+ .button-primary {
37
+ @include button-primary;
38
+ }
39
+
40
+ .button.action,
41
+ #doaction,
42
+ #doaction2,
43
+ #post-query-submit,
44
+ #posts-filter #delete_all,
45
+ #search-submit,
46
+ .button.filter-button {
47
+ @include button;
48
+ @include button-secondary;
49
+ height : auto;
50
+ line-height : 33px;
51
+ border-radius : 8px;
52
+ padding : 0 15px;
53
+ font-weight : 600;
54
+ }
55
+
56
+ #posts-filter #delete_all {
57
+ @include button-delete-outline;
58
+ }
59
+
60
+ .tablenav .tablenav-pages .button,
61
+ .tablenav .tablenav-pages .tablenav-pages-navspan {
62
+ @include button-secondary;
63
+ }
64
+
65
+ @media screen and (max-width : 782px) {
66
+ .tablenav .tablenav-pages .button, .tablenav .tablenav-pages .tablenav-pages-navspan {
67
+ min-width : 44px;
68
+ padding : 12px 8px;
69
+ font-size : 18px;
70
+ line-height : 1;
71
+ }
72
+ }
73
+
74
+ // YITH Buttons.
75
+ .yith-plugin-fw__button, [class^="yith-plugin-fw__button--"], [class*=" yith-plugin-fw__button--"],
76
+ .yith-add-button, .yith-edit-button, .yith-update-button, .yith-remove-button, .yith-plugin-fw-upload-button, .yith-save-button, .yith-plugin-fw-select-all, .yith-plugin-fw-deselect-all, .yith-plugin-fw-upload-button-reset // Old buttons.
77
+ {
78
+ @include button;
79
+ }
80
+
81
+ .yith-plugin-fw__button--primary {
82
+ @include button-primary;
83
+ }
84
+
85
+ .yith-plugin-fw__button--secondary {
86
+ @include button-secondary;
87
+ }
88
+
89
+ .yith-plugin-fw__button--delete {
90
+ @include button-delete;
91
+ }
92
+
93
+ .yith-plugin-fw__button--add, .yith-add-button {
94
+ @include button-primary;
95
+
96
+ @include button-with-icon("\f115");
97
+
98
+ &:before {
99
+ display : inline-block;
100
+ margin : 0 10px 0 -5px;
101
+ font-size : .95em;
102
+ transition : transform .2s, margin .2s, font-size .2s;
103
+ transition-timing-function : ease-in-out;
104
+ }
105
+
106
+ &.closed {
107
+ @include button-secondary;
108
+
109
+ &:before {
110
+ font-size : 1.15em;
111
+ margin : 0 8px 0 -5px;
112
+ transform : rotate(-45deg);
113
+ }
114
+ }
115
+ }
116
+
117
+ .yith-plugin-fw__button--close {
118
+ @include button-secondary;
119
+
120
+ @include button-with-icon("\f117");
121
+ }
122
+
123
+ .yith-plugin-fw__button--edit, .yith-edit-button {
124
+ @include button-secondary;
125
+
126
+ @include button-with-icon("\e907");
127
+ }
128
+
129
+ .yith-plugin-fw__button--update, .yith-update-button {
130
+ @include button-update;
131
+
132
+ @include button-with-icon("\e90b");
133
+ }
134
+
135
+ .yith-plugin-fw__button--trash, .yith-remove-button {
136
+ @include button-delete;
137
+
138
+ @include button-with-icon("\e90d");
139
+ }
140
+
141
+ .yith-plugin-fw__button--upload, .yith-plugin-fw-upload-button {
142
+ @include button-primary;
143
+
144
+ @include button-with-icon("\e90c");
145
+ }
146
+
147
+ // Old buttons.
148
+ .yith-save-button {
149
+ @include button-primary;
150
+ }
151
+
152
+ .yith-plugin-fw-select-all,
153
+ .yith-plugin-fw-deselect-all,
154
+ .yith-plugin-fw-upload-button-reset {
155
+ @include button-secondary;
156
+ }
157
+
158
+ // with icons.
159
+ .button-secondary span.yith-icon {
160
+ margin-left : 0;
161
+ margin-right : 10px;
162
+ line-height : normal;
163
+
164
+ &:before {
165
+ color : inherit;
166
+ font-size : 15px;
167
+ font-weight : 400;
168
+ }
169
+ }
170
+
171
+ // With icon
172
+ .yith-plugin-fw__button--with-icon {
173
+ position : relative;
174
+ padding-left : 30px;
175
+
176
+ i {
177
+ position : absolute;
178
+ top : 50%;
179
+ left : 10px;
180
+ transform : translateY(-50%);
181
+ font-size : 1em;
182
+ font-weight : 400;
183
+ }
184
+ }
185
+
186
+
187
+ // Button Sizes
188
+ .yith-plugin-fw__button--xl, .button-xl {
189
+ padding : 0 20px;
190
+ font-size : 14px;
191
+ line-height : 38px;
192
+
193
+ &::before {
194
+ margin : 0 10px 0 -5px;
195
+ }
196
+
197
+ &.yith-plugin-fw__button--with-icon {
198
+ padding-left : 40px;
199
+
200
+ i {
201
+ left : 14px;
202
+ }
203
+ }
204
+ }
205
+
206
+ .yith-plugin-fw__button--xxl {
207
+ padding : 0 28px;
208
+ font-size : 16px;
209
+ line-height : 45px;
210
+
211
+ &::before {
212
+ margin : 0 15px 0 -10px;
213
+ }
214
+
215
+ &.yith-plugin-fw__button--with-icon {
216
+ padding-left : 45px;
217
+
218
+ i {
219
+ left : 15px;
220
+ }
221
+ }
222
+ }
223
+ }
224
+
plugin-fw/assets/css/scss/yith-plugin-ui/components/_confirm.scss ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "../mixins/buttons";
2
+
3
+ .yith-plugin-fw__confirm__wrap {
4
+
5
+ .yith-plugin-fw__confirm__message {
6
+ margin-bottom: 20px;
7
+ }
8
+
9
+ .yith-plugin-fw__confirm__footer {
10
+ text-align: right;
11
+ }
12
+
13
+
14
+ .yith-plugin-fw__confirm__button {
15
+ height: auto;
16
+ line-height: 33px;
17
+ border-radius: 4px;
18
+ padding: 0 20px;
19
+ font-weight: 600;
20
+ cursor: pointer;
21
+ display: inline-block;
22
+ margin-right: 10px;
23
+ white-space: nowrap;
24
+
25
+ &:last-child {
26
+ margin-right: 0;
27
+ }
28
+
29
+ &.yith-plugin-fw__confirm__button--cancel {
30
+ @include button-secondary;
31
+ }
32
+
33
+ &.yith-plugin-fw__confirm__button--confirm {
34
+ @include button-primary;
35
+ }
36
+
37
+ &.yith-plugin-fw__confirm__button--delete {
38
+ @include button-delete;
39
+ }
40
+ }
41
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_list-items.scss ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-fw__list-items {
2
+ display : grid;
3
+ grid-gap : 13px;
4
+ margin : 15px 0 0;
5
+ }
6
+
7
+ .yith-plugin-fw__list-item {
8
+ .yith-plugin-fw__list-item__wrap {
9
+ padding : 12px 18px;
10
+ border : 1px solid #e6e6e6;
11
+ background : #f5f5f5;
12
+ display : flex;
13
+ align-items : center;
14
+ text-decoration : none;
15
+ color : inherit;
16
+ }
17
+
18
+ &:not(.yith-plugin-fw__list-item--no-link) {
19
+ .yith-plugin-fw__list-item__wrap:hover {
20
+ border-color : #bcd9f6;
21
+ background : #e5eef7;
22
+
23
+ .yith-plugin-fw__list-item__step,
24
+ .yith-plugin-fw__list-item__arrow {
25
+ color : var(--yith-link);
26
+ }
27
+ }
28
+ }
29
+
30
+ mark {
31
+ background : transparent;
32
+ color : var(--yith-link);
33
+ }
34
+
35
+ .yith-plugin-fw__list-item__step {
36
+ font-size : 30px;
37
+ font-weight : 700;
38
+ text-align : center;
39
+ width : 60px;
40
+ margin-left : -14px;
41
+ color : #717171;
42
+ opacity : .36;
43
+ }
44
+
45
+ .yith-plugin-fw__list-item__content {
46
+ font-weight : 500;
47
+ flex : 1;
48
+ }
49
+
50
+ .yith-plugin-fw__list-item__title {
51
+ font-size : 1.1em;
52
+ }
53
+
54
+ .yith-plugin-fw__list-item__description {
55
+ font-size : .85em;
56
+ margin-top : .5em;
57
+ }
58
+
59
+ .yith-plugin-fw__list-item__cta {
60
+ margin-top : .7em;
61
+ color : var(--yith-link);
62
+ font-size : .85em;
63
+ font-weight : 500;
64
+ }
65
+
66
+ .yith-plugin-fw__list-item__arrow {
67
+ color : #717171;
68
+ margin-left : 10px;
69
+ font-size : 12px;
70
+ font-weight : 800;
71
+ }
72
+ }
73
+
74
+ .yith-plugin-fw__list-items--list {
75
+ .yith-plugin-fw__list-item__title {
76
+ font-style : italic;
77
+ }
78
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_list-table-blank-state.scss ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-fw__list-table-blank-state {
2
+ padding: 30px 30px 0;
3
+ text-align: center;
4
+ display: flex;
5
+ flex-direction: column;
6
+
7
+ & > * {
8
+ margin-bottom: 30px;
9
+ }
10
+
11
+ img.yith-plugin-fw__list-table-blank-state__icon {
12
+ width: 100px;
13
+ margin: 0 auto 30px;
14
+ }
15
+
16
+ i.yith-plugin-fw__list-table-blank-state__icon {
17
+ font-size: 65px;
18
+ margin: 0 auto 30px;
19
+ }
20
+
21
+ .yith-plugin-fw__list-table-blank-state__message {
22
+ font-size: 1.4em;
23
+ line-height: 1.5;
24
+ }
25
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_modal.scss ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-fw__modal__wrap {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ position: fixed;
6
+ top: 0;
7
+ left: 0;
8
+ width: 100%;
9
+ height: 100%;
10
+ z-index: 999999;
11
+ background: rgba(34, 59, 80, 0.7);
12
+ animation: yith-plugin-fw-fade-in .3s forwards;
13
+ box-sizing: border-box;
14
+
15
+ .yith-plugin-fw__modal__main {
16
+ position: relative;
17
+ background: #fff;
18
+ border-radius: 10px;
19
+ box-shadow: 1px 3px 16px rgba(0, 22, 59, .4);
20
+ animation: yith-plugin-fw-appear-from-top .3s forwards;
21
+ overflow: hidden;
22
+ max-width: calc(100% - 20px);
23
+ max-height: calc(100% - 20px);
24
+ display: flex;
25
+ flex-direction: column;
26
+ }
27
+
28
+ .yith-plugin-fw__modal__close {
29
+ position: absolute;
30
+ top: 0;
31
+ right: 0;
32
+ padding: 8px;
33
+ font-size: 14px;
34
+ font-weight: 600;
35
+ color: #aaa;
36
+ cursor: pointer;
37
+
38
+ &:hover {
39
+ color: #444;
40
+ }
41
+ }
42
+
43
+ .yith-plugin-fw__modal__title {
44
+ padding: 20px 25px;
45
+ font-size: 1.5em;
46
+ font-weight: 600;
47
+ line-height: 1.5em;
48
+ color: var(--yith-primary);
49
+ }
50
+
51
+ .yith-plugin-fw__modal__content {
52
+ padding: 0 25px 25px;
53
+ }
54
+
55
+ .yith-plugin-fw__modal__footer {
56
+ padding: 25px;
57
+ background: #f7f7f7;
58
+ }
59
+
60
+ &.yith-plugin-fw__modal__wrap--scroll-content {
61
+ .yith-plugin-fw__modal__content {
62
+ overflow-y: auto;
63
+ }
64
+ }
65
+ }
66
+
67
+ .yith-plugin-fw__modal--opened {
68
+ overflow: hidden;
69
+ }
70
+
71
+ // Allow seeing WP Menu.
72
+
73
+ .yith-plugin-fw__modal--allow-wp-menu {
74
+ .yith-plugin-fw__modal__wrap {
75
+ z-index: 99;
76
+ padding-left: $wp_menu_size;
77
+ padding-top: $wp_top_bar_size;
78
+ }
79
+
80
+ #adminmenuback {
81
+ z-index: 100;
82
+ }
83
+ }
84
+
85
+ @media only screen and (max-width: 960px) {
86
+ .folded {
87
+ .yith-plugin-fw__modal__wrap {
88
+ padding-left: $wp_menu_folded_size;
89
+ }
90
+ }
91
+
92
+ .auto-fold {
93
+ .yith-plugin-fw__modal--allow-wp-menu {
94
+ .yith-plugin-fw__modal__wrap {
95
+ padding-left: $wp_menu_folded_size;
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+ @media screen and (max-width: 782px) {
102
+ .auto-fold {
103
+ .yith-plugin-fw__modal--allow-wp-menu {
104
+ .yith-plugin-fw__modal__wrap {
105
+ z-index: 999999;
106
+ width: 100%;
107
+ height: 100%;
108
+ padding-left: 0;
109
+ padding-top: 0;
110
+ }
111
+ }
112
+
113
+ .yith-plugin-fw__modal--allow-wp-menu-in-mobile {
114
+ .yith-plugin-fw__modal__wrap {
115
+ z-index: 99;
116
+ padding-top: $wp_top_bar_mobile_size;
117
+ }
118
+
119
+ &.wp-responsive-open {
120
+ .yith-plugin-fw__modal__wrap {
121
+ padding-left: $wp_menu_mobile_size;
122
+ }
123
+ }
124
+ }
125
+
126
+
127
+ }
128
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_tabs.scss ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-plugin-ui .yith-plugin-fw__tabs {
2
+ background : transparent;
3
+ padding : 0;
4
+ margin : 0;
5
+ display : flex;
6
+ align-items : center;
7
+ border-bottom : 1px solid var(--yith-light-border-color);
8
+ flex-wrap : wrap;
9
+
10
+ .yith-plugin-fw__tab {
11
+ border : 0;
12
+ margin : 0;
13
+ display : block;
14
+ }
15
+
16
+ .yith-plugin-fw__tab__handler, a.yith-plugin-fw__tab__handler {
17
+ background : var(--yith-content-bg);
18
+ border : 0;
19
+ border-bottom : 3px solid transparent;
20
+ padding : 17px 20px 15px;
21
+ font-weight : 600;
22
+ color : inherit;
23
+ text-decoration : none;
24
+ display : block;
25
+ transition : all .2s ease-in-out;
26
+ opacity : .55;
27
+
28
+ &:hover {
29
+ opacity : 1;
30
+ background : var(--yith-light-bg);
31
+ color : var(--yith-light-accent);
32
+ }
33
+ }
34
+
35
+ .yith-plugin-fw__tab.yith-plugin-fw__tab--active .yith-plugin-fw__tab__handler,
36
+ .yith-plugin-fw__tab__handler.yith-plugin-fw__tab__handler--enabled {
37
+ opacity : 1;
38
+ color : var(--yith-light-accent);
39
+ border-color : var(--yith-light-accent);
40
+ }
41
+ }
42
+
43
+ .yith-plugin-ui .yith-plugin-fw__tab-panel {
44
+ padding : 20px;
45
+
46
+ &.yith-plugin-fw__tab-panel--outlined {
47
+ border-width : 0 1px 1px 1px;
48
+ border-style : solid;
49
+ border-color : var(--yith-light-border-color);
50
+ }
51
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/components/_tip-tip.scss ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import "../mixins/buttons";
2
+
3
+ #tiptip_holder {
4
+ display: none;
5
+ pointer-events: none; /* Fix tip flashing when hover the edge */
6
+ z-index: 8675309;
7
+ position: absolute;
8
+ top: 0;
9
+
10
+ /*rtl:ignore*/
11
+ left: 0;
12
+
13
+
14
+ &.tip_top {
15
+ padding-bottom: 5px;
16
+
17
+ #tiptip_arrow_inner {
18
+ margin-top: -7px;
19
+ margin-left: -6px;
20
+ border-top-color: #333;
21
+ }
22
+ }
23
+
24
+ &.tip_bottom {
25
+ padding-top: 5px;
26
+
27
+ #tiptip_arrow_inner {
28
+ margin-top: -5px;
29
+ margin-left: -6px;
30
+ border-bottom-color: #333;
31
+ }
32
+ }
33
+
34
+ &.tip_right {
35
+ padding-left: 5px;
36
+
37
+ #tiptip_arrow_inner {
38
+ margin-top: -6px;
39
+ margin-left: -5px;
40
+ border-right-color: #333;
41
+ }
42
+ }
43
+
44
+ &.tip_left {
45
+ padding-right: 5px;
46
+
47
+ #tiptip_arrow_inner {
48
+ margin-top: -6px;
49
+ margin-left: -7px;
50
+ border-left-color: #333;
51
+ }
52
+ }
53
+
54
+
55
+ #tiptip_content {
56
+ color: #fff;
57
+ font-size: 0.8em;
58
+ max-width: 150px;
59
+ background: #333;
60
+ text-align: center;
61
+ border-radius: 3px;
62
+ padding: 0.618em 1em;
63
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
64
+
65
+ code {
66
+ padding: 1px;
67
+ background: #888;
68
+ }
69
+ }
70
+
71
+ #tiptip_arrow,
72
+ #tiptip_arrow_inner {
73
+ position: absolute;
74
+ border-color: transparent;
75
+ border-style: solid;
76
+ border-width: 6px;
77
+ height: 0;
78
+ width: 0;
79
+ }
80
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_buttons 2.scss ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @mixin button {
2
+ display: inline-block;
3
+ height: auto;
4
+ line-height: 30px;
5
+ border-radius: 4px;
6
+ padding: 0 17px;
7
+ font-weight: 600;
8
+ cursor: pointer;
9
+ transition: all .3s ease-in-out;
10
+ text-decoration: none;
11
+ white-space: nowrap;
12
+
13
+ &:focus {
14
+ outline: none;
15
+ box-shadow: none;
16
+ }
17
+ }
18
+
19
+ @mixin button-primary {
20
+ background: var(--yith-primary);
21
+ color: var(--yith-primary-text);
22
+ border: 1px solid var(--yith-primary);
23
+
24
+ &:focus {
25
+ background: var(--yith-primary);
26
+ color: var(--yith-primary-text);
27
+ border: 1px solid var(--yith-primary);
28
+ box-shadow: 0 0 0 3px var(--yith-primary-focus);
29
+ }
30
+
31
+ &:hover, &:active {
32
+ background: var(--yith-primary-hover);
33
+ color: var(--yith-primary-text);
34
+ border: 1px solid var(--yith-primary-hover);
35
+ }
36
+ }
37
+
38
+ @mixin button-secondary {
39
+ background: var(--yith-outline-bg);
40
+ border: 1px solid var(--yith-outline-border);
41
+ color: var(--yith-outline-text);
42
+
43
+ &:focus {
44
+ background: var(--yith-outline-bg);
45
+ border: 1px solid var(--yith-outline-border);
46
+ color: var(--yith-outline-text);
47
+ box-shadow: 0 0 0 3px var(--yith-outline-focus);
48
+ }
49
+
50
+ &:hover, &:active {
51
+ background: var(--yith-outline-bg-hover);
52
+ border-color: var(--yith-outline-border-hover);
53
+ color: var(--yith-outline-text);
54
+ }
55
+ }
56
+
57
+ @mixin button-update {
58
+ background: var(--yith-update);
59
+ color: var(--yith-update-text);
60
+ border: 1px solid var(--yith-update);
61
+
62
+ &:focus {
63
+ background: var(--yith-update);
64
+ color: var(--yith-update-text);
65
+ border: 1px solid var(--yith-update);
66
+ box-shadow: 0 0 0 3px var(--yith-update-focus);
67
+ }
68
+
69
+ &:hover, &:active {
70
+ background: var(--yith-update-hover);
71
+ color: var(--yith-update-text);
72
+ border: 1px solid var(--yith-update-hover);
73
+ }
74
+ }
75
+
76
+ @mixin button-delete {
77
+ background: var(--yith-delete);
78
+ color: var(--yith-delete-text);
79
+ border: 1px solid var(--yith-delete);
80
+
81
+ &:focus {
82
+ background: var(--yith-delete);
83
+ color: var(--yith-delete-text);
84
+ border: 1px solid var(--yith-delete);
85
+ box-shadow: 0 0 0 3px var(--yith-delete-focus);
86
+ }
87
+
88
+ &:hover, &:active {
89
+ background: var(--yith-delete-hover);
90
+ color: var(--yith-delete-text);
91
+ border: 1px solid var(--yith-delete-hover);
92
+ }
93
+ }
94
+
95
+ @mixin button-delete-outline {
96
+ background: var(--yith-delete-outline-bg);
97
+ border: 1px solid var(--yith-delete-outline-border);
98
+ color: var(--yith-delete-outline-text);
99
+
100
+ &:focus {
101
+ background: var(--yith-delete-outline-bg);
102
+ border: 1px solid var(--yith-delete-outline-border);
103
+ color: var(--yith-delete-outline-text);
104
+ box-shadow: 0 0 0 3px var(--yith-delete-outline-focus);
105
+ }
106
+
107
+ &:hover, &:active {
108
+ background: var(--yith-delete-outline-bg-hover);
109
+ border-color: var(--yith-delete-outline-border-hover);
110
+ color: var(--yith-delete-outline-text);
111
+ }
112
+ }
113
+
114
+ @mixin button-with-icon($icon) {
115
+
116
+ &:before {
117
+ font-family: yith-icon;
118
+ content: $icon;
119
+ margin: 0 8px 0 -5px;
120
+ font-size: 1.15em;
121
+ font-weight: 400;
122
+ vertical-align: top;
123
+ }
124
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_buttons.scss ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @mixin button {
2
+ display: inline-block;
3
+ height: auto;
4
+ line-height: 30px;
5
+ border-radius: 4px;
6
+ padding: 0 17px;
7
+ font-weight: 600;
8
+ cursor: pointer;
9
+ transition: all .3s ease-in-out;
10
+ text-decoration: none;
11
+ white-space: nowrap;
12
+
13
+ &:focus {
14
+ outline: none;
15
+ box-shadow: none;
16
+ }
17
+ }
18
+
19
+ @mixin button-primary {
20
+ background: var(--yith-primary);
21
+ color: var(--yith-primary-text);
22
+ border: 1px solid var(--yith-primary);
23
+
24
+ &:focus {
25
+ background: var(--yith-primary);
26
+ color: var(--yith-primary-text);
27
+ border: 1px solid var(--yith-primary);
28
+ box-shadow: 0 0 0 3px var(--yith-primary-focus);
29
+ }
30
+
31
+ &:hover, &:active {
32
+ background: var(--yith-primary-hover);
33
+ color: var(--yith-primary-text);
34
+ border: 1px solid var(--yith-primary-hover);
35
+ }
36
+ }
37
+
38
+ @mixin button-secondary {
39
+ background: var(--yith-outline-bg);
40
+ border: 1px solid var(--yith-outline-border);
41
+ color: var(--yith-outline-text);
42
+
43
+ &:focus {
44
+ background: var(--yith-outline-bg);
45
+ border: 1px solid var(--yith-outline-border);
46
+ color: var(--yith-outline-text);
47
+ box-shadow: 0 0 0 3px var(--yith-outline-focus);
48
+ }
49
+
50
+ &:hover, &:active {
51
+ background: var(--yith-outline-bg-hover);
52
+ border-color: var(--yith-outline-border-hover);
53
+ color: var(--yith-outline-text);
54
+ }
55
+ }
56
+
57
+ @mixin button-update {
58
+ background: var(--yith-update);
59
+ color: var(--yith-update-text);
60
+ border: 1px solid var(--yith-update);
61
+
62
+ &:focus {
63
+ background: var(--yith-update);
64
+ color: var(--yith-update-text);
65
+ border: 1px solid var(--yith-update);
66
+ box-shadow: 0 0 0 3px var(--yith-update-focus);
67
+ }
68
+
69
+ &:hover, &:active {
70
+ background: var(--yith-update-hover);
71
+ color: var(--yith-update-text);
72
+ border: 1px solid var(--yith-update-hover);
73
+ }
74
+ }
75
+
76
+ @mixin button-delete {
77
+ background: var(--yith-delete);
78
+ color: var(--yith-delete-text);
79
+ border: 1px solid var(--yith-delete);
80
+
81
+ &:focus {
82
+ background: var(--yith-delete);
83
+ color: var(--yith-delete-text);
84
+ border: 1px solid var(--yith-delete);
85
+ box-shadow: 0 0 0 3px var(--yith-delete-focus);
86
+ }
87
+
88
+ &:hover, &:active {
89
+ background: var(--yith-delete-hover);
90
+ color: var(--yith-delete-text);
91
+ border: 1px solid var(--yith-delete-hover);
92
+ }
93
+ }
94
+
95
+ @mixin button-delete-outline {
96
+ background: var(--yith-delete-outline-bg);
97
+ border: 1px solid var(--yith-delete-outline-border);
98
+ color: var(--yith-delete-outline-text);
99
+
100
+ &:focus {
101
+ background: var(--yith-delete-outline-bg);
102
+ border: 1px solid var(--yith-delete-outline-border);
103
+ color: var(--yith-delete-outline-text);
104
+ box-shadow: 0 0 0 3px var(--yith-delete-outline-focus);
105
+ }
106
+
107
+ &:hover, &:active {
108
+ background: var(--yith-delete-outline-bg-hover);
109
+ border-color: var(--yith-delete-outline-border-hover);
110
+ color: var(--yith-delete-outline-text);
111
+ }
112
+ }
113
+
114
+ @mixin button-with-icon($icon) {
115
+
116
+ &:before {
117
+ font-family: yith-icon;
118
+ content: $icon;
119
+ margin: 0 8px 0 -5px;
120
+ font-size: 1.15em;
121
+ font-weight: 400;
122
+ vertical-align: top;
123
+ }
124
+ }
plugin-fw/assets/css/scss/yith-plugin-ui/mixins/_tables.scss ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @mixin table-action-buttons {
2
+
3
+ thead th.column-actions, tfoot th.column-actions {
4
+ visibility: hidden;
5
+ }
6
+
7
+ th.column-actions, td.column-actions {
8
+ text-align: right;
9
+ }
10
+
11
+ .yith-plugin-fw__action-button:not(.yith-plugin-fw__action-button--visible) {
12
+ opacity: 0;
13
+ transition: .3s;
14
+ }
15
+
16
+ tbody tr:hover .yith-plugin-fw__action-button:not(.yith-plugin-fw__action-button--visible) {
17
+ opacity: 1;
18
+ }
19
+ }
20
+
21
+ @mixin wp-table-commons {
22
+
23
+ tfoot {
24
+ display: none;
25
+ }
26
+
27
+ .check-column {
28
+ width: 2em;
29
+ }
30
+
31
+ th.sortable a, th.sorted a {
32
+ padding: 0 8px 0 0;
33
+ color: inherit;
34
+
35
+ &:hover {
36
+ color: var(--yith-link);
37
+ }
38
+ }
39
+
40
+ .sorting-indicator {
41
+ visibility: visible;
42
+
43
+ &:before {
44
+ font-family: yith-icon;
45
+ content: "\f116";
46
+ color: inherit;
47
+ font-size: 10px;
48
+ top: 0;
49
+ left: 0;
50
+ }
51
+ }
52
+
53
+ th.sorted.asc .sorting-indicator:before,
54
+ th.desc:hover span.sorting-indicator:before,
55
+ th.desc a:focus span.sorting-indicator:before {
56
+ content: "\f113";
57
+ font-weight: 600;
58
+ }
59
+
60
+ th.sorted.desc .sorting-indicator:before,
61
+ th.asc:hover span.sorting-indicator:before,
62
+ th.asc a:focus span.sorting-indicator:before {
63
+ content: "\f110";
64
+ font-weight: 600;
65
+ }
66
+ @include table-action-buttons;
67
+ }
68
+
69
+ @mixin classic-table {
70
+ border: 2px solid var(--yith-table-border-light);
71
+ background: var(--yith-content-bg);
72
+ box-shadow: none;
73
+ border-spacing: 0;
74
+
75
+ th, thead td, tfoot td {
76
+ text-align: left;
77
+ line-height: 1.3em;
78
+ font-size: 14px;
79
+ }
80
+
81
+ thead th, thead td {
82
+ border-bottom: 0;
83
+ }
84
+
85
+ tfoot th, tfoot td {
86
+ border-top: 0;
87
+ }
88
+
89
+ tbody tr th, tbody tr td {
90
+ vertical-align: middle;
91
+ padding: 15px;
92
+ }
93
+
94
+ tbody tr:hover {
95
+ background: var(--yith-table-row-highlight);
96
+ }
97
+
98
+ thead td, thead th, tfoot td, tfoot th {
99
+ padding: 15px;
100
+ font-weight: 600;
101
+ }
102
+
103
+ tbody > :nth-child(odd) {
104
+ background-color: var(--yith-table-row-striped);
105
+ }
106
+ }
107
+
108
+
109
+ @mixin boxed-table {
110
+ border: 0;
111
+ border-spacing: 0 20px;
112
+ box-shadow: none;
113
+ background: transparent;
114
+
115
+ th, thead td, tfoot td {
116
+ text-align: left;
117
+ line-height: 1.3em;
118
+ font-size: 14px;
119
+ }
120
+
121
+ thead th, thead td {
122
+ border-bottom: 0;
123
+ padding: 0 0 0 25px;
124
+ font-weight: 600;
125
+ }
126
+
127
+ tbody tr {
128
+ background: var(--yith-content-bg);
129
+ border-radius: 5px;
130
+ box-shadow: 0 0 0 1px var(--yith-light-border-color), 0 3px 11px 6px var(--yith-light-shadow);
131
+ transition: background-color .2s ease-in-out;
132
+ }
133
+
134
+ tbody tr th, tbody tr td {
135
+ background: transparent;
136
+ vertical-align: middle;
137
+ padding: 25px 0 25px 25px;
138
+ }
139
+
140
+ tbody tr td:last-child {
141
+ padding-right: 25px;
142
+ }
143
+
144
+ tbody tr th:first-child,
145
+ tbody tr td:first-child {
146
+ border-radius: 5px 0 0 5px;
147
+ }
148
+
149
+ tbody tr th:last-child,
150
+ tbody tr td:last-child {
151
+ padding-right: 25px;
152
+ border-radius: 0 5px 5px 0;
153
+ }
154
+
155
+
156
+ tbody tr:hover {
157
+ background: var(--yith-table-row-highlight);
158
+ }
159
+ }
plugin-fw/assets/css/yith-icon.css CHANGED
@@ -6,10 +6,10 @@
6
  /* stylelint-disable function-url-quotes, declaration-colon-newline-after */
7
  @font-face {
8
  font-family: yith-icon;
9
- src: url("../fonts/yith-icon.eot?3c67f638ae05de262cf047afbdfecfb1");
10
- src: url("../fonts/yith-icon.eot?3c67f638ae05de262cf047afbdfecfb1#iefix") format("embedded-opentype"),
11
- url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAACcsAAsAAAAARSAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFY4xkshY21hcAAAAXwAAAIiAAAF6M2rEU5nbHlmAAADoAAAHvQAADWMtjZQA2hlYWQAACKUAAAAMAAAADYes3AcaGhlYQAAIsQAAAAeAAAAJAQ1AkVobXR4AAAi5AAAADAAAAE8m+b/52xvY2EAACMUAAAAoAAAAKDOIdsKbWF4cAAAI7QAAAAfAAAAIAFtAVZuYW1lAAAj1AAAATAAAAIiyMcJZnBvc3QAACUEAAACJgAAA9UaoPw+eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mk4gYGVgYNBjDGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHF4yfNRnAnH1mNgYeIE0I4gDAJG7CGV4nO3Ud25aURDF4R/VGIONjbtxwWDHnfTee5cSZVlZYZQNzJ+zAudcDssI0oceV3DffcycARpATS6kDtUOFV1RaWq1Ml2v0Z6u1/mjz21aVKnGOKs5zMn1NQRZyUaOyvXsVdH3fvKL35Q7zNNlmQ12OeCYm/KEF3ziPZcc6eqUE1ZZ0zce8pp3fOM59+lrlxW2OGRHp/jKd4bcY4+3POAztzjnJWdc8YU7OlFTd1xkm8e8YZ/bTLjLiHUGPOMjH3jKKzYZc4NHeqI6c3qOBTos0Zs+7f9Xp7zV/s4+/Sh1tdIjUTHVkqiaqkrUTPUl6qY6Eg1TzYmmqfrEnKkHiJapI4h5m663TV1CLJi6hOiYOofomnqIWDR1E7Fk6iuiZ9PfLpt6jVgxdR3RN/UfMaNOJGamz7Ju6k5iw9SnxKapY4ktU+8S26YuJnZM/UwMjHLPXSsZiz2jnGvfKPsdmBJADI2y36GVzMbIlA9ibEqKEmnKDFk1pYdsmHJENk2JIudM2SJbppSR86a8kW1T8sgFUwbJjimNZNeUS3LRlFByyZRVsmeUcy0b5SwrVuZN9o2yx6op3eSaKefkuinx5IYp++SmaQqQW6Z5QG6bJgO5Y5oR5MAo++0aZW3PNEHIfdMsIQ9MU4UcmuYLOTJNGnJslLMcGWXt2DSHyBlNJPLEyizOUyvzOM+MUp9zo9Tnwih1uLSS4Lwyyv89MXr/ACJFzQ8AAHic7Xp7mBzVdWedet16d1V3Vdd0d1U/p7vmoel5dPe0hpnRSAMjISEkJDRCPAXSgMFrYpDBGIFtgXexMWBix4kMkjHxE2ycXX9ObIjzgTYfTyefH2EhNv5wEiNnncTBRLC2E4uaPbeqex4CY/v79q/dlWpO3Xfde+655/zOuc3YDP6D51mGSTEuk2MGmWFmhjmdOZc5j3kb85+Ym5j3M3czf8B8inmIeZh5nPkOtq60Sk6lLDqWnW6UxsZbVrNWbTgVzipZHJb7YKcnYWx8Gpo10mo45E3KWm9S1v4ty4I3KaPfjUuatcaKdGVlZhDevBE8MhgeH9RMU4MDSMNnjh/fBAc2HacllLxy/Cmfpn3Vsvr8Fcn9nmZZGiV93gItUmllv7+wovwiwvE8R0mg0pTCCQK3K6IK5oeUuJDnz15qCEcXFkwtPEoHhAXNPPPM8BAshEdhIv4w/cqE7x+11ATNIRlMJA6ZmkG/amjmgGEMnJpboC1xrEMLC4Or+sGNvMi/xUPFYzFkGBbgA4zAMFVou20XmHAx/9KPCgsA+ZdeymObSI7+M7zGSNgmaLtWw8Jm/K35bYNbC8othW1wOHz7tnzULCIH4We0bbvbdvG99oXeHse8ybkAHgj3XGh32p3sfDeIv3vS/slP7HdFtDPW4iJ8iAXaRpDBJS68PVyMpgX0H76Xv/lLOES/OYPNSk7JJcYt+bPjeYW35rcPbC102r0MN61ud7N9Pp3UBanX34ezPL87tw/Aye7c8LvvPEmnxUd0eW6fiOfmBrhS+CPKrXhW+XDx1HkBCdqlVgnb/eKW/LbwSji8LQ9MZ2bM6rktt/3Xm+0LwvPggQtsYGIeLrW9K55fm37b/Sjl2Uk+orini9GefiKePwlkgJfiucF7onc0vdX7iuwIrIpFApSF/PbBrXl49VChM89T9zXVbXsSOebvseHlpWkuj3sS7up+H/f2J3RmJ98bUVqtUcIy8AtGRd1UQc00yWxCzbSXWWCuZK5m7sKV/ZpzvzLtrlQHK7QB+5u7QkAcKgQBaeEOtyukMYZar1Iqo86bhPYpSvA6g55qA0/weIIVBDYRpeippiSgiajFYJxC8tJb9gBt68e37vBM79p93mUfrxlNlg2nWPaftZ9ryaQGjyN9/I0H9uy3Ps9wzvDLu3p/YeWS/6PwyeTRHT4bhiwLLOsn9TCMBmb1JKPH8oF2ocIEzBpmlGkxU8x6ZmOH9+9Gu8BAI9LAw1BLQEclOx3lTHlClfMgUG1PaRVZ6BCn1CLlCcz6bKUljFRKbaFK0q7TaK2DZlALWmm3jbTiGGC7WF5rp20SNNuYoNtCN4WUa83xsbQtwnFDlKR/I+TfJEk0geo7eBKpOl0sQDGcP378/PCnk1AswoMQTgA8Fb6qmJ5lO7qcMnTZSNOkZNtVXc/rup3MZnuz2SSRZUOWYY0kjkv8IY67hZebovSspRXoB5AUi1OHvfyN7yl4zz57+PBhr1i8qAiXOxqbslm7IIt8niWOzKZSrIM5wWddwWJnFS7D/ziHH+jNTdMPGDKV/BU8HmTmmB2RdY0tlb8ytVrQArS29A/sSjXVcLqm0F1KNUjFqTgN5GqjVYGX5iO7cSAyHPNLbLrX95/yfdhNebOyxe4feBMT+MATBWomCjG1tPCGqOvtmlVYWFgIP4Wa4sP91Bj2Qx999d1Le3kMoy+ti2MsphCtroWYYhNzFnM5cxtzB/P7uE7cYxLJD04V03a6TefbXfEkGy9xVWHDjVvGi+zWV9q4VCtiResURnE4dB2Cdtpt1YJaqzneRmlMu6QWIE07thi0RMd2m4EzDhMHJpAFnu8hK7yIEZj2JjzvpaiIVnXLJ6Lya+dj1i1z9G/TpidrVo+rmtmedNZSTdNVzEzdbKGdfcD35pBX+A+tcIepnudNdpJzfTET/ehfeAPlrreS6eGDPT0gk6zOVkSi2skM1+Oyak5me4Uoe1Ge1+QJWcxTk82Ise7EPZhiNuCpPZe5lDmA+tJaFpeVKWRQdFZ/rehNQi1ItajcUeKW8XjmYQzPbB24ch2a62AsD7YBbbFSRn3QatMj6oObB39dQnGVxK6EmlYT06ZuKuuj5K6oeL2aSKhf4tl507zPsk70b+zr27hzrr9/rr80USpNzFJS4WWObxOQNGlE4D4AYz7t5Mf0eo5/n2o6SiKhODE11fCbqmkkYGx4c3Z489WdAXdu7Atf7oyIZBdhi7w0jApEDDxOpewyV8gtQZuT6GDiQud8Dkeo+ELmerRuXdHr/Am/IZ/6P3KqD3jevO/js9vzFplfl7n2dzzu4HX+DZ7yhnN/RwWA7FMiu/4r+DnTy9RR9rYye9BiXMPczHyI+Tha+lrHKHR5YIAPIqF02WagWUlHfBon+IelmLPd0jjYIppeOkJU6FQby6jeXWG1gxXlKwGC2zjVC4jT8IKTTX44Y+22MkaSyxmpTBLuS2aS4Rd2i9IBuV8m0CfKdni7B++VxXCfKMsi3CfK4VcWqPgsCLL8QJxC8nVCqwmm9mm0jJJZHZsIlFxAK6LaY9dJlUT69FQul5rjUnpZv4ZzE/usTMbaZ7jgq+T004n6yQrFBxVy3bvDkHbcR8c5LKsyPo/gccDngKTJsib5Ms3JfpyLKd0K0sFQz6E053BPhlAPn8/swz0qnaIqO7AG8w55g6ntstFZYmfkeVVaSyztemS4fW4jqAMRGvCjcGoJqSgRdoHH2eM95fJIudyDspSxrBsLlF2WTVdXxuQrtkWTUWkZU8Bn8z6XVsMvXQxbkloY6smkDqyWDP8+Qi3sFjrYSHlPsieJzwIu+0zKAPFyUb78TMoHTFF+wNDOC1SVuzryZyi24eBvqAWWgUJPlgu/86z/X8GBR8J9x4r3ww0M1QJdHaoxGdQCTGmlpuNW6cCOdzL37rm5d3+Ykrl1V65bd+XNlOzYbc+8Pd0pRwLHOxVIwmPbnIlbk12sG/kKDpNn2qizt+PZ2c/8HnOQuRU98MhTaruBk2fx6xUn/jAJRMRexB2fgWC0Mkr/KqME/yOlxY0xLl2AUXfUHRmlyIoETgEijNUOyETUs1obhtHACRCGReOMtsfbgUjKWEAxLqbbWMwGYgobOgF+I8BEA5v/a7Swq6bpWqbnrp+bu/4Zk5BkQnfTzwhJWSEKcTghlVJ6a/bDiuZwXI/S66d2ypKkuI4i5ngFPIC/YwVeEzJJkswSAViR9fkfKgory3oeMiQ3bxi64jvZMseLiIp1IwV62ftsxLe/9GAa2TjtR4zd2COIZiJpFaY8DoAFXszp4R5Z0llQskYmfSubSyUSZrF6u6JVqhBwhqHlQTXK1Q9pRoKXbIerfQFnxAk5UshIiuyl8vA2jiPAcZwiqVkrt+y7hPC9jm/lgvvdv079GWTckW84n4f3WUuyQ20JjalMYrtYceERQW22DGnooWkJlZWVtsitDnBUNiTS6cRfJdJeLfdXuVotNw/90ZuSf+zUpRPf7rzn5zt13rc77ZHAaKcWyfIavgHfQDsX+XUkiOUL8kfzR7sPMCsy9CBg26/B1yL7iL0gSAEB+GM7/KJtw258wZ/RNOyOyLL+oXyg9jQTWdIZlGwmRZcbh4EaBK1eNcJ5AcmDgH9RVY1aWYFCvqgZBbTLTEnZInJwiW2Ol05IEq6Z2q1RL98j6Mnwpx7f29PTY9iX7t0L6w9407lab2/ME2WZHfBYxFnS3vtJbNzLe6zzQ8EteEkoeIdp+2nvQIeL4WtL3MZlSR3dej+uzI1QQtdDfYN2FUpjPpRaTSyfhpJjR7b+twhNrXJGV6rTcARVabgWnkStCk9fUSw+bXS9yqml1DuXUuNLjiZ8imrR2M/Tkh7bbrPhf7D33svuL7pvEQNiO/GCI4gsEd9XSwHKSlsotankwMPhrad94rJLHgx3wI6hW+b3XHfFa1d/+Uu3/uxz+48cObcjN6/Bq8ix7HJ0qAAOtTnUAejafmA+Zr3Le5e1iQ13AqJf+BPNuuNqdzdMhE/tdkePsOyRI3TqR1CH/8fiq6gqGKqXgaBj4KJCc9sIt+gL+Ru9SKuBL/hzu/+/D9pnbbcH/3LI3r51VQ7w/Uhc+vCAsxVz34xzz2Cuc44JKzI8zl6n9oK0oYKnhb5dOBK+3zgIt/Svn50Jf7hVgtQsK4bvv9GAQ+vPWB+eJ50FyTNiMaE8eBVew/kiTgKri2VQpnHtKCOYjUEPxTYQrabklOAEbtd1dKPgTnT/rwcfN+4ONH+L7tXImPApmIC/DXdSYHbxxQjI/oRl9+7FXHhP8mMfsw749LPC4q9wAgL8GKU0YE5DL2wbzgAdIqryEYxUqKpvjKHaR+0vlAeB5sZbzYCgh5QitUoZTQmaGfTHqYkAARs2xlxaQb0nUmuTcTipO/1rnMlmcXDjtlLRHRzatKEeOCoJT+KsXF3PVkXXfvCqvtr0+voa15CIYveuudqGr4a7a0ObT8/6Afo2VW7d5AMpEVVysuKm/bHe3IDUoxfdasqUK67Qm9V1lzNsEK/SCulqKiHLiWSv+w4c5TvV3KAUcNUskaf9c1KRC8p31n07k46QzzjKXhlXjdaLrnXMRctIV0bEKq6Mrh/rcK1uF/UEXRwETGc1UmHogocuqOclojpBfUP4QnHN3NGNg0Vcwm2bhx7JVqvNajVr2LZn2wdx3rYpy6XC1HShJMtmquoWP1jNDg7kequ5NYO5/b3YuNl7KW3s2R2/Gb4Mv4yiLeeh7X8n4ubbmcPMZ5mvME8y32F+TBF0NOVRhAC4BurWEvRiV2OwaehsZ3sdtGqoQRuuGMVW2uOuAYi23VEx3cBce5Q2ajg4IkfXjNDAgHKAL1ukbhwWkTQFGMiRGRgfa8evuChAH68xiqqX2JXRMsFMewy7V4JyDZF5J4WlxBFRbuIJBS2Uqxqy1aXam/qSdoAj2HRNkfQHsZ8On1NShqkkbUWzCQ9Kz0W5SUM1VSMi81Mlu9qfTnAshA8axve800eGZ/JzaXnAFdAeEWHWU3oSkiGTpFP6AS+pfB8PROUfCmiakrt4wDJV4vt59SBPqRQV7ARJEAno+r2SMCFKQCkBey0miTghSJJwNyhqmk2pIiKMntp4bRsngQmFhOlKgsQVOFGU3Ls1lpV4TQNJEYgmJV3CCYphKDdTkrBEzUvonCSq+95zkUx4ZYwllihoPP22rPBsQuZxFQnDgct4ldDJEf6G/m5S4+MlIPnAcnJwrUhkcVy9UhBZ9Ao4kpdUiSUqma3oig4aVnI1rwftWGsTp7Ac/1/SpqQrEifmegSeKAnFTK+OGyQYjymirhpFjfEGe0YsPCkJiEgG2tAPzVE8Va7D0eMSOV70ANH9h+Ph2ugm42lKN/Eav+cIrwpXXAtieDvcx75r246/6OntHa1UMojts6kUy1jqchcv/JuNgrDnMM9fAYnwmWvCRWCv3XbOAUjRLqO9F6WytFd03pfmTvEJ9dwjP92h/vcp8werZJ2gWOHEismFQ/A0HBoc+ALcvHIGoQdPh2tXjU/9AZ8pvZVHQDpf/jU+wVb68Td3CRZwBhRbLJ5EbPE6YkyVsZgq7sQss5u5EJGkS6PlLWrfhllq5FA08bCSklVyETrhYXLTNtcIUmKAJ79GSXO8jdQZd1uIpqzSDEtVB06SKnA3j4p93EXE795hD1cQIKcqw7YXUbhakVzpTAhvhd6LoScnb5Oeq9fbQXBh3ZUSmmONLfRW5k/AnEREQ5LdgUytBVyhJ9V/xyaOn/tvdj2f1i/RncKwPWuk83U7/C5i/zNvYZnL91gNP+1sk1w4dzT8rGH4PSUvs8b0QdbqC+HEDYKgmSmnpz/TqqqZQJb45iZB2BjvATwJYYQlG8z6OGJahzKNIZwSfK7GW4PlwimhA2KLxKm0qKpBY3sE+s4454w+SGbQ8x9AGv5Dsb2hXXoFcpIYPh/5+wOi9CGJZHUzbUIw23dGHz6zmeS3aB8ks8V2qdQuzv47bfwt6sJulnRuZkYyVdOMZWdxMZKdNM57LbOF4iDUzvHMUWrQ4rZdamyW5Qllq0r3CBV2HqjJRSvVQOlyo8XRrUO9STUrWt+DWX/q8huumJy8YrL/rPxBXpNCr7nnqj2NBpImTDkbavWagApBKFQLLVMggsTaLHrK6CYRkRWlnoP5s/on6QA3XD7lZw/ykgZmc0+zM8gHC5Usr6LiSHtZUVQXNFWmCofgahUgS74ynEDJDXBfmBS9EwuQx0IH6uCxG48CCD6Cm/F2q0kvBcbSXCuS3ggFHbN373SGPdAQ80RQ9/OfZ//leY5nP/MZREDP8TL3Eo0gwB3Ozt2pkSee+ehyOMBjc/fdy4LHesnwxBP3cOy9T7DLfs4JSNMZglNqwQk8z87AwIq6BK1LIdgyUFd5YHhLZ536LeuZS5mr0Adn2i0EDtQ8NZwGhQV074ahzjXXsXFYOU0BxSAE8bnCPS1AnrMNljguYqyuosDzmXbHV258e/luw42YUQdqihGh5OFnss6aApdHhZUSFSGQE6pItJRaUHVFFDiWOrpJw0qKklhVTU0kRkobL1W6ikbVZaurfIbWaNurzeaWZlMd5iUuz4Eoc+k+DoX7Th/9OCklS6yua6ooCazCSmrCTmiELRZZUVAlWeYV3HQi8azKSYphm7rM+perHb21rlKWtTX1rq4zlU83NzfxObPBc1lOJlxqkBfljpzAIzCIcmJRbyAVL7yM6PDUxKZMJYPPRzK9GXzujnPAJGkuk1z16oyLGhNx3jnMOzDdQRUBRa8JNgKwge3SkAbFuVQDTkI6wiQ1QFCzIhsgmIpAFoc7tbIDwqdol8lohBqD0VrQbI/CC4aUe8fE2byOxpxzcLGytJETjA2SIipsmuNFRefPnnhHTuG48E6H44kc51VerNYv/qgsE4XbC8CL6qyEnSdslqdt0pZakXgOUW9gG4go4AvZUjZzftFCgCORSxKSiP6YhMcPT6+xl0gIfazi+cXCQHhsKddbGs5Vogbh5bh1hCbDc0WCtQieWDGf0KtJnWNZXiPRdVTk08Lz8CKTQk1VYAbwLE8xc9RjR7GsnGJGA1JpoWRGbrkVpKlL7tCYIIlcWgdFOypbVRKbRWwGR4clEv5T93cXgta7JnwWTEnc9bripPV0JS3wqqol1JuMnF8q51jJtDQj8d76mjVp+NywZGrhoahzjUdQtCY8AofmRTk8/oJUtbz9I4JFSoFez+0/U/LNqe2pdCrYH8WnUQ8DHO/IX4VZg1h7O/rse5hLUBrfAF/abyhx31iyKqa/0gIJlXYDV5xyUyOUDbtTvh/4vi2pqqWqX/WCYG0QeKbrFl33z23f7/M8W47qNtxoafdo1o1RxP0J6vA/cBBu/PoRuPeP4MaDINOmff6cZmr4JOgwa4O302GK7qOr6i6e1i1Ln7b0r9OhHtas5x72n4MUhC8/vLTfUdzRR709yZyNGGMvcyVzHfXxY/SwHKrvbv00iKS6FKSvoh5DCXBjGxbbtBSi/3INNWGrY81EoXuql7nWdbNSsTyg4LQacHv4Bw+JXJBOtBOOYiAC+z3VMhLhV9ucsEmAkf6NfaKYPKtuFoy+sf45Wy+a5QmTyNGdTjm8e2hDvb5haJudz/f7/mdkDU2JtmH9eg+femgkTGquTVaXwl8ouq58WuQ/L4mmKUr39M/1R2MSMbmljplwUZLLnlEwo3uo09fuK+LA9brl47j9/nt0S8cHTDrw+hW25ASNp1WXluM04MSLAy/i8y+UvNiJA9B2UQyNWp1Uw6pElue4R40PMKHXHe+v4XmGZtDy02u3VoOalshqRJY0MimgDG7zB9852LOht76tjg8hp+2bmNgHzxX9vhsGs359+0Xb6wMT+67bN9Ed93H49m8xbn1n3rtyMrNlYGTn8PDOEULWXrJ27SXwrVpl8hq/WB3ZeenOEa+995q97c64rArfjcYtxUGYUgS+aLQal4nAZZoCY7g5fLKeQkPfhA3FZqHQLIb3wf7abBDMwt1DaNnt8UKrsB6r/GA2WB/M1pawPbwO34ri4zSm2omHkwrOlUIjEq9BiH5LQlD42lQgURwbOIGzNjmNlj3rjV/cnlrIZJ3zGsPnDMMfNlv2lk2vRyW7m1iC9f+82UaWDLUvRgCo1tcOn3MTDrBpy70bxrXhtcM7hrGiM5/FX0Z4jo/0ZIXGQ9GpqC5rSIrYHCtYukxp03DOR3aHa+F94a2xcyGgDidvu6c0PDw7PDwT/ghx3vHd4UfgaS92QFjk6P1v+5+0dnb40+cu4UiIfBCHuQ3yKEOr3I6lG5typUZqwTiaNvoDjTK9JcDscqhAdLGgU2MXAM1jN4CAvKQl6TFqFtOuuHwDOR5gQaeGjkqz7UbnMohqejS3caSIhhBokAAboWuCRU4U2Y5DtrV2K+gUx2EGHG4G4qIVQV230e4Ux2EHHJOiohlorYiWpxFddYqjFvSr8QQacWA4rExWKpNzlJQHTjvt3MnJL7G8gc66KPOGYeiBLsiCmQTIpexUDiBl8rKApVhnyqJLL+hcUTY7TSXBTC01TZpCtykvI2qSdILNQSWSKSURAQga4m0B3wlBVAVNSWdUrLSJCqyaS6uyoAlYZWATlShiQuR0IptEjfrrHBYoy/01XlHSueX+mbSireyv4ZtLigr2h0PlyY2T5Ygcn9w5ic9RAMsUFEGv4TJ0nCxCd41ONiVqBGdOBB1XUUNTkYwXl0KjEbelnBLjttgFO8p83BaHM60OL2Y7c5L1VXMSDZEzJYt01pTgRP3UNblZne0sCnmiKKt5ootcYrm/yeGAK3iKDJBjnsa/pYEX4d8j3bCV2YF2DD2s2nK4bwZigB5H/AhHkdx4HPND3xeF/Lf/qQgjOl6rNp5ktWBoj6vr9uZGQ2OT47WW5xxzNw+MjAxsdocHTs/nTx/4RNrKK3oym1GTXjbtJVUrmVGt3IjVRrPDye7gzPnX67zqBP2u29ubSfD69efPDKYVOOe2C1u5XOvC2xJOsbe3aD+Z6QGFeAZbw61zUjkuk2FVT2EDQVLTydxlRV5XJmWxwHdszDH0kYXIGkV6MooXuACP5f/4/vyjlLKP5u+/P//+xx7DV6fPY/iK+sTemxVp8fPsRx+1v/hFSmHQPnbMfijc8WXn2DFnKa4d6UGVmaeWj+ofeu6QYQTZZgDpeKv0Dr/OBssXHiRAzd2OdE6kQYJ8dA/lpgKyZI6o/m7CD3167+3Te1yndNrCFPqmEr9275TA87RQ9AUeTts3SX8gAsFG73C/s+5X9lTlvJGuO/KP8V35Z+zxmakr1nG80O3GtS9sc3Q0dvKKdTzHxh9iOTafOTKUOgM4e12x3HWgttBYesSnF6L4WBwD6qf2jv4AiboKqPRbVoOLFV3LKpHObzo4+jMmBL7wQri1YluZExnLrszYxgnDhvEbff8y3yd3+k/68EEv/OlAj+P0DIAd/jRXLObAnvz+978Pd02edx5zCi5IlUVCR21VqAmMYgYRxo4swc9/F1iwGhe89bgrYMHIyG+ABR1cQOUjvxxFRGehe1uDJhM/1AnKdSKF/6tOUUDze/D0kSOY78YDwRm153c6YydpOM6LY3Pd3zdE9rAXvZURpsnM0LMPK60iRBiBQoQOVkVKc1UbbUWb0BBYJViHbmCEWKNIC0cRRGkGRTcK01A0QaUZmI30nvtOSsLn0e89a3ogMTbZzNvJ6hBofhHaGcfbsq1UG+H+zhcHi47hZEbLPX3Klv6t+SyIBqypJW2hUaquu5JlOiMhWWRwsHo9nfVGPLc/kZzrM4zC9pvTVUXbuVtR271KYURFQ1RNF4bcVPhFP+tBsm8umeh3DaNdmB/G7kvxWwW+F3k3Y8x0fNvTLkWS2ax1PDg3nWq2SmgvnZJQQq6IpHPRiBwbx8Z4QgUK0qNbErtNDf46QDtMTytqhhr8qS0Jth5u1SxBMuFPgYNwEzwXPi54vT6/gQbBZoVcxRNgGk9a+EmS1nmSJXyTk7izCYjbSMKrVu9TRBk49Ev08HW0K5Cjvz4OFyzXtfBMWrZNX55sJkRVFRN/wbJDnMmvFSR5v7wj5zD84utLWCj+rRZT5WplwomRl9Ks5iCI0K1Tgddf4ZP8CU6S4Dh6wNUf/OCfaADWhX8gJPQlXVJl+Fq45bzBv/8wPdkxxgIcN4mjZlB2e5la9CvYBrOWWcesZ74Cm09FXhQrVaYRPVEQRKER/V1rZRzxCb1gqbkOliGkoVdu9CeuDbHd+v8g7Y0gzS7lbGHetqwSa9hWMjXlFXfxAuwqevY5qaRVBiy17KlcaRcvXvP/EJLbxdlu/rQcp6gZj1MVrmhz+fwgq+ex3HtDcfv/dsC3dKf+TZZjpphZTIkkCt8Rqr8JDUC0o2uOWiTsWEiD/qIbBfnaMQgUO9ek9rhAG4vwdG/b47jpLWnNUBMA0z24XlnOZaxyI5kWEvTXSroVDNVTSVGer43zZH5ta6h0WiCHr+jAzvXChkz2kh0bWHaXkNTym/xEfTCRLbJsfihtOXBpTzHpcFxBNwvpwKutOXtucr+fE8ZeUO3yBuZ/AxT64pV4nGNgZGBgAOL5Ga+54vltvjJwMzGAwL3j0yfD6P+//n9m4mZiA3I5GMDSAGjSDVN4nGNgZGBgYgACPSaG/7/+f2XiZmBkQAX+AF9PBH4AAHicY2BgYGAC4///mOBsYvD//8SJESOHrub/LySx3yDMeI8Ut9ES//8LYwMAxf4TWAAAAAABEgEkAToBTgFgAXQBiAGcAa4BwAHWAewB/AIQAiYCPAJOAwwDvgQqBOwFhgYoBvAHegeOB8QImgisCPwJFgkwCZ4KFAoyClwKkAq0CvILbgvGDQgNZg2WDcwOWA60DyQPcA9+D4wQOBBkEQgReBIAEqQSuBLMEvgTJBNUE5wT2BVkFeoWBBYgFpgW2BcEFzAXYBfoGF4YihpeGsZ4nGNgZGBg8Gf0YhBhAAEmIOYCQgaG/2A+AwAZvwHFAHicbY89bsJAEIWf+YsCUoQSKVK6VYo0EeanoOAA0FPQG7P+QbbXWhYkLpAT5Aw5Q06QMmfIUfJsRi4SdqXV99682dEAGOILHqrj4bZ+q9PCDdWF26ShcIf8JNzFAM/CPfoj4T5eMRce4AEBf/A61W/3cMIt3OFNuE3/XbhD/hDu4hGfwj3638J9bPAjPMCLNz+nLhmloSnWOj5mgW10AxttD6kp1NSfNN5KF9oGTu/U9qwOp3jmXKQia3K1NIXTWWZUac1eh85PnCsX43Ekvh+aHGek3Cbh1ilCGBRYQyPGERk3tlfq/50NOywO1JVSmMLH5EpuxVxRZwNWNHbMbplT7D1x5oyuQ0QdMWOQk5Z1Z5XOeA2dsq7t6YT0fU6oukosMOaN/uT9enb+C6sEYKp4nG1S13LbMBDU2qRCUbRsx3Z6743pvfeeOL+AgCcSYwhgANIa/X0AUpIVT/CA2V1g724W6Cx12hV2/r+2sYRlBAjRxQFE6CFGHwlWMMAq1rCOg9jAJrZwCIdxBEdxDMdxAidxCqdxBmdxDudxARdxCZdxBVdxDddxAylu4hZu4w7u4h7u4wEe4hEe4wme4hme4wVe4hVe4w3e4h3e4wM+4hM+4wu+4hu+4wd+Yhu/OjHjXNeqEiofMGP0OM30WKVMVhsLVGqVe211nxbv8alb0rBacDd0n3uuxXt8emREXjT2zUU+86/tF/sLQtLiuvQ31+dk5l35R4lmLP7N1E7KC+I7gYcJZ5JUxkzKsmwwJyOtaLI+p9YZslpSNFNWOLNFaigXtiITeNZrivrWSYu4MFzSVktKo3ND1k7VsFFD7majntsteWPYoIDrctLnhjJRpZyZLORudhX50KVmWZAZlgf+NCTlusc0obRxZssOJgXJ0r1uWjCVhWLEckqEGurU/qmZKxp40pdu8NQSM7wIpOY7PXdPiaEgE42YkKmuq95IqNo2czWo34QyzW6kDXVLNimZXC6zYbckXUrqlYWutI8yKmXrDTyIXF/dMA9CQ6WcuN1SFVi2S5ED/kPaxBaCZNbGH1ltmr8ReBBXYkRt87AyLu+oVtOaHnTr0mcT1ZZMqofDcFdkpNfGzCifRWUEU7mkwVgbV3/WL5iIquh0/gJ5RisiAAA=") format("woff"),
12
- url("../fonts/yith-icon.ttf?3c67f638ae05de262cf047afbdfecfb1") format("truetype");
13
  font-weight: 400;
14
  font-style: normal;
15
  }
@@ -139,6 +139,10 @@
139
  content: "\e91f";
140
  }
141
 
 
 
 
 
142
  .yith-icon-check-alt:before {
143
  content: "\f114";
144
  }
6
  /* stylelint-disable function-url-quotes, declaration-colon-newline-after */
7
  @font-face {
8
  font-family: yith-icon;
9
+ src: url("../fonts/yith-icon.eot?6c9fac5a69711520a55f03f0159e3932");
10
+ src: url("../fonts/yith-icon.eot?6c9fac5a69711520a55f03f0159e3932#iefix") format("embedded-opentype"),
11
+ url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAACgEAAsAAAAARnAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQAAAAFY4xksiY21hcAAAAXwAAAInAAAF9v9BwjlnbHlmAAADpAAAH7wAADa8WxqYn2hlYWQAACNgAAAAMAAAADYgbllqaGhlYQAAI5AAAAAeAAAAJAQ1AkZobXR4AAAjsAAAADAAAAFAneb/52xvY2EAACPgAAAAogAAAKLvYeFUbWF4cAAAJIQAAAAfAAAAIAFuAVZuYW1lAAAkpAAAATAAAAIiyMcJZnBvc3QAACXUAAACLQAAA96XfaIgeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/Mk4gYGVgYNBjDGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHF4yfDRgAnH1mNgYeIE0I4gDAJHOCGZ4nO3UZ3IaURCF0Y+MEEI5oYhAOTpnyzmHKpWX5SV6Ae6fvQL5Pi7LMFUHhqnhzRu6bwMNoCZnUodqj4qOqLR1tjI+X6MzPl/nj753aFOlGqOs5iCvbm8hyEo2cliOJ6+KrrvhF78pd5hihnlW2WbAIXfkOa/4wkcuONDRCccssawrnvCWD/zgmkcsapUF1hmyyTnf+ckeD9nhPY/5yl3t7DWnXPKN+9pRU3fsscEz3rHLPa54wIgVtnjJZz7xgjessc8RT/VEdVp6jmm6zDJHXxtu8v/VLW+1v5NvN6WyVrokKqZqElVTXYmaqcJE3VRJomGqOtE01Z9ombqAaJt6gpiy8fmOqU+IaVOfEF1T7xAzpi4ieqZ+ImZNnUXM2fi386ZuIxZMfUcsmjqQmFAvEhPjZ1kx9SexaupUYs3Us8S6qXuJvqmPiQ1TRxObRrnnlpWUxbZR9rVjlPV2TRkgBkZZY8+UC2JoSggxMmVFmTSlhqya8kM2TEkim6ZMkS1Tusi2KWfklClxZMfKtMhpUwrJrimP5IwpmWTPlFFy1pRWcs4o+5o3yl4WrEycXDTKGkumfJPLpqSTK6bMk6um9JNrpjlArpsmAtk3zQZywzQlyE2jrLdllM9t0wwhd0zThNw1zRVyYJow5NA0a8iRUfayb5TPA9MkIg9NM4k8sjKN89jKRM4To9Tn1Cj1OTNKHc6tJDgvjPJ/Xxrl/74y+v8Af23QCQB4nO16eZgcV3Vvndpu7V3VXct0d1Wv012zaHqW7p7WeGY00tgjWbIsWbIkS95kpLExPAxG2BgLA7LJMxgDDsuLsGWMw2IbMOHxkYAd8oEenzE2yccSnh0wHyRgkUcCASJ4LEGueedWdc8ig4Hve3+9F6nn1N3r3nPPPed3zi3GZvAfPM0yTIbxmDwzzIwyc8y5zMXMJcyLmf/CvJZ5A3MX8y7mfczDzCPMY8xXsXW1XXaqFdGxbLdZnphsW616relUOatscVgegO1Ow8TkLLTqpN10yG8pa/+Wss4fWBb+ljL63qSkVW+uSldXZ4bhtzeCR4ejU8OaaWpwBGn05KlTW+DIllO0hJKfnvpiQNOBalkDwarkYV+zLI2SAX+RFqm0cjBYXFV+OeF4nqMkVGlK4QSB2xNTBfMjSlLI8xcuN4R7FxdNLbqXDgiLmnn++dExWIzuhankxfQtU0Fwr6WmaA7JcCp1zNQM+lZDM4cMY+js3CJtiWMdW1wcXtMPbuZF/gV+VDyWIoZhAd7ICAxTg47X8YCJlgrPfq+4CFB49tkCtonl6E/g54yEbcKOZzUtbMbfVtgxvL2o3FrcAcejl+4oxM1ichR+Qtt2em2XXmdf5u93zNc6l8JD0f7L7G67M933hsl7z9g/+IH9qph2x1pagjezQNsIMnjEg5dGS/G0gP7D58o7fwXH6DvnsFnZKXvEuLVwYTKv6LbCzqHtxW67H8Nr17a7xT5AJ3Vp5rnX4ywP9Ob2RjjTmxu+9xVn6LT4mK7M7T3J3LwQVwp/RrmVzKoQLZ09LyBhp9wuY7tf3lrYEV0Lx3cUgOnOjFk7t5W2/3aLfWl0CTx0qQ1MwsPltm9L5teh7/beQXl2ho8p7ulSvKfvSeZPQhng2WRu8Jr4GU9v7b4iO0KrapEQZaGwc3h7AX52rNid59n7mum1PYMcC/bb8OPlaa6Mewbe1ns/7u0P6MzOvC6mtFqjhGXgl4yKuqmKmmma2YKa6SCzyFzLXMe8DVf2O8796rS3Wh2s0gbs7+8KIXGoEISkjTvcqZLmBGq9armCOm8aOmcpwRsMeqoNPMGTKVYQ2FScoqeakpAm4hbDSQrJsy/YA7Tt796+yzf9Vx7yX/TuutFi2WiGZf9V+4WWTmvwGNLHnn9gL3zh8wwXjf54T/8vrXz6fxbfm753V8BGEcsCywZpPYrigVk9zeiJfKBdqDIhs44ZZ9rMDLOR2dzl/avRLjDQjDXwKNRT0FXJTlc5U55Q5TwMVNtTWkMWOsQpt0llCrMBW20LY9VyR6gR13Oa7Q3QCuth2/U6SKuOAbaH5fWOa5Ow1cEE3Ra6KaRSb01OuLYIpwxRkv6dkH+XJNEEqu/gcaTqbKkIpWjvqVMHoh9NQ6kEH4ZoCuCL0c8U07dsR5czhi4bLk1Ktl3T9YKu2+lcrj+XSxNZNmQZ1knipMQf47hbebklSl+3tCJ9AZJSaea4X7j5NUX/618/fvy4XypdXoKrHY3N2KxdlEW+wBJHZjMZ1sGcELCeYLHzCpflv5/HF/TnZ+kLDJlK/ioeDzMLzK7YuiaWKlidWitoIVpb+gd2tZZpOj1T6C2nmqTqVJ0mcrXZrsKze2O7cSQ2HHuX2XRPEHwxCGAf5c3qFvu+5U9N4Q++UKRmophQS4tuirveoVnFxcXF6H2oKd4ySI3hIAzQx8A9tJfPMPryujjGYorx6tqIKbYwFzBXM7czdzJ/iuvEPSax/OBUMW27HTrf3oqn2WSJawqbXtIyWWSvvtrBpVoxK9pnMYrDoRsQdlyvXQ/r7dZkB6XR9Ug9ROo6thi2Rcf2WqEzCVNHppAFfuAjK/yYEZj2p3z/2biIVvXKp+LyV+5NWLfC0X9wTV/WrD5PNXN9bs5STdNTzGzDbKOdfSjwF5BX+A+tcJepvu9Pd5MLAwkTg/hfdBPlrr+a6dGH+/pAJjmdrYpEtdNZrs9j1bzM9gtx9vICr8lTsligJpsRE92JezDDbMJTezFzFXME9aW1Ii6rU8ig+Kz+TtGbhnqYaVO5o8Sr4PEswASe2QZwlQa0NsBEAWwDOmK1gvqg3aFHNACvAMGGlOIpqT0p1VVTs6ZuKhvj5J64eKOaSqkf5dm9pnmfZZ0e3DwwsHn3wuDgwmB5qlyemqekyssc3yEgadKYwL0RJgLaKUjojRz/etV0lFRKcRJqqtGXVNNIwcTo1tzo1uu6A+7ePBD9uDsikj2ELfHSKCoQMfQ5lbLLXCW3BG1OqouJi93zORqj4suYG9G69USv+yf8nnzm/8qpPuL7e4MAf/t8f4n5XZlX/pHHHfzuv+GznnDxH6kAkH1KbNd/A79g+pkGyt52Zj9ajOuZW5g3M+9GS1/vGoUeDwwIQCSUrtgMNCtuzKdJgn9YijnbK0+CLaLppSPEhU6tuYLqvVVWO1xVvhogeM2zvYAkDc84ufRbstY+K2ukubyRyabhvnQ2HT24T5SOyIMygQFRtqM7fHidLEaHRFkW4T5Rjj6xSMVnUZDlh5IUkk8TWk0wdUijZZTM69hEoORSWhHXnrxBqqbcczP5fGaBy+gV/XrOSx2yslnrkOFBoJJzzyXqe6sUH1TJDa+OItrxEB3nuKzK+HsUjwP+jkiaLGtSINOcHCS5hNKtIF0M9RRKcx73ZAT18AHmEO5R+SxV2YU1mHfI80xtj43OMjtjz6vaXmZpzyPD7fOaYQOI0ITvRTPLSEWJsQs8xp7qq1TGKpU+lKWsZd1cpOyybLq6CiZ/als0GZdWMAV8rhBwrhp99ArYltaiSE+ndWC1dPRPMWpht9HBxir7031p/C3iss+nDBCvFuWrz6d8wBTlB4zsvlRVuet6Moo8WWJqKKMdRDXbmB0op5cz1zAvxbM9MdlBvYVsaaHliBdYoVaC1HHxCFRp1nZrlC2UPaSXCHsJIT7YTcpUZJAQIyJqxCi7vDW57bon7YTiuiJ3rW66pdJIUbzazKSy5AIojSBueT0qNCeV+pgaPx5IHvDwdZL6TtU6cCA6cR3BVPrAgc+/PE7s3w/TmpJzCyVXli+S6Riurl2opfQ+MR7+QTqAk7or5ZgpN9VJcgdUEn0XikSNfvhropIzZ4h6+qlRVfr4xyX1gTuYrq/Awd9TxCIDheosF33168HHwYFHo0MnS/fDTQzVmj2bozFZ1JpMebVl4NbYjK43t/DqhYVXv4WShQ3Xbthw7S2U7Npnz73U7ZYjgVPdCiTRyR3O1G3pnm8Q+1YOU8Bd3MzsxD08zLycOcrcxrwr8Sw7XugUWHx71UleTEIRsSrxJucgHK+O07/qOMH/SGlxc4JzizDujXtj4xSJktApQoxJOyGZinvW6qMwHjohwtZ4nPHOZCcUSQULqE+A6Q4Ws6GYwYZOiO8IMdHE5v8WL+wls3Qtsws3Lizc+KRJSDqle+6TQlpWiEIcTshklP66/YiiORzXp/QHmd2yJCmeo4h5XgEf4B9ZgdeEbJqkc0QAVmQD/juKwsqyXoAsye81DF0JnFyF40X0InQjA3rF/2DMt8/7MItsnA1ixm7uE0QzlbaKMz4HwAIv5vVovyzpLCg5I+vexuYzqZRZqt2haNUahJxhaAVQjUrtzZqR4iXb4eoP4ow4IU+KWUmR/UwBXsxxBDiOUyQ1Z+VXfL0IvtH1RT3wvvZ3mb+CrDf2GecBeL21LDvU9tIY1DS2SxQ9qhQ3OS8rSqaNR2pVpS1yawNC1U0p1039bcr16/m/zdfr+b0wGD8p+edunZv6Sve5d2+3zv9Ktz0SGO/WIllZw2fgM4gLYj+YhIl8QeHewr29HzCrMvQgYNtPwadiPIG9IMwAAfhzO/qIbcM+fMBf0TTsi8mKvqZ8oPgjGyOPOZRsJkOXm4TNmgRRQi3GxSEpgIB/cVWdohKBQuS4GXUAVpiSsUXk4DLbHN9NSRKumdr5cb/QJ+jp6Ec+39/X12fYVx08CBuP+LP5en9/whNlhR3wuZizpHPwvdi4n/dZ5zuCV/TTUPSP0/az/pEuF6OfL3MblyV19e79uDIvRlU9j/551kgoTwRQbrewfBbKjh1joz8glLfGeV9tfqIxND3RengcrRA8cU2p9ITR88JnllOvWE5NLjvm8D5qdRK/WEv7bKfDRv/B3nMPe7jkvUDMjO3GV04gEkd/qFYOUVY6QrlDJQceiW475z0vuvLD0S7YNXLr3v03XPPz6z720dt+8qHDJ05c3JWbn8PPkGO5lWhaERxqo6nD1MNKwLzTepX/KmsLG+0G9BbgLzTrzuu8fTAVfXGfN36CZU+coFM/gTr8P5Z+hqqCoXoZCDpSHio0r4PwlD6Qv/GDtJv4gL+2B//HsH3BTnv48yP2zu1rcoDPR5PSR4ac7Zj7UpJ7EnPdc0xYkeFx9jq1F6QDVTwt9OnBiegNxlG4dXDj/Fz0ne0SZOZZMXrDzQYc23jexugS6QJIn5eICeXBz+DnOF/ElWD1sB/KNK4dZQSzCUikWBDi1ZSdMpzG7bqBbhS8lWWjGyHAjbsT4cKSdx0yJvoiTME/RLspkL3iCgSwf8GyBw9iLro7/c53WkcC+lph6Tc4AQG+j1IaMueg17oDZ4AOJFX5CN6qVNU3J1Dto/YXKsNAcxQtEPQoMxQmoClBM+Ohj0njggI2bE4k+CHGER0yCWd0Z3CdM90qDW/eUS55wyNbNjVCBy3xGZyVp+u5mujZH37JQH12Y2OdZ0hEsfvXXWfDJ6N99ZGt5+aCEH3BGrdh+qGMiCo5XfXcYKI/PyT16SWvljHlqif053Td4wwbxJdoRbeWSclyKt3vvQxH+WotPyyFXC1H5NngokzssvPddd/BuDFSnETZq+Cq0XrRtU54aBnpyohYw5XR9WMdrtXrocSwhxuB6a5GKo5c+vCljYJEVCdsbIqeKa1buHfzcAmXcPvWkUdztVqrVssZtu3b9lGct23Kcrk4M1ssy7KZqXmlN9Vyw0P5/lp+3XD+cD82bvVfRRv7djfOAB+DX8XRqUvQ9r8C/Yw7mOPMB5lPMI8zX2W+Tz2OeMrjCAFwDTQMQNDrX4tZZ6G7nZ0N0K4LFKaJcSyqM+kZgN6JNy66Tcx1xmmjpoMjcnTNCA0MqIT4QOSHbi8WEZcCDOTIHExOdJJHUoTIcbI5jqqX2NXxCsFMZwK7V8NKHT2ZbgpLiSOi3CQTCtsoVxRvelR7U9/bRpjp2HRNsfSHSVwDPqRkDFNJ24pmEx6Uvsvz04ZqqkZM9s6U7dqgm+JYiD5sGN/wzx0bnSssuPKQJ6A9IsK8r/SlJEMmaaf8LV5S+QEeiMo/HNI0JW/jActUiR/k1aM8pVJcsBskQSSg6/dIwpQoAaUE7PWYJOKUIEnCXaCoLptRRUQYffXJ+g5OAhOKKdOTBIkrcqIoeXdpLCvxmgaSIhBNSnuEExTDUG6hJGWJmp/SOUlUD73mcpnwygRLLFHQePpuWeHZlMzjKlKGAy/iVUInR/ibBntJjU+WgOSNK8nh9SKRxUn1WkFk0YviSEFSJRbR73xVV3TQsJKr+31ox9pbOIXl+P/qmpKuSJyY7xN4oqQU010bZ0kxPlNCXTWOGuN59oxYeFJSEJMsdGAQWuN4qjyHS9wLdFR73gOcitbHNz9PULqF1/j9J3hVuOaVIEZ3wH3sq3bs+pu+/v7xajWLvlAuk2EZS13p4kd/v1kQ9h/n+WsgFT15fbQE7Ct3XHQEMrTLeP/lmRztFZ/35blTfEIjHXFcw6HxirPmD1bZOk2xwulVk4tG4Ak4Njz0INyyegaRD09E69eMT/2BgCm/kEdAum/+HT7Bdvry3+4SLOIMKLZYOoPY4jnEmCpjoWc3wMwz+5jLEEl69HahTe3bKEuNHIomHlZStsoeQic8TJ5rc80wI4Z48uuUtCY7SJ1Jr41oyirPsVR14CSpAkfX0HMnPUT83p32aBUBcqY6avsxhesUyZPOh+g26L8C+vLyDumpRqMThpc1PCmlOdbEYn9172lYkIhoSLI3lK23gSv2ZQbv3MLxC//dbhRc/UrdKY7a84ZbaNjR1xD7n38ry1y932oGrrND8uDi8eiDhhH0lf3sOjMAWWssRlM3CYJmZpy+wWy7pmZDWeJbWwRhc7IH8DhEMZZsoq8bR5gbUKExl7OC9bVka7BcOCvUQmyRONU2VTVobE/AwHkXnTcA6Ww2DUNIo++WOps65Z9CXhKjp+P4yJAovVkiOXRrTQjnB84bwN98Nv1l2gfJfKlTLndK87+mjb9MXf6tks7NzUmmapqJ7CwtxbLj4rzXo4eOOAi1czJzlJom9dKpsVmRJ5StGt0jVNgFoCYXrVQTpcuLF0e3DvUm1axofY/mgpmrb7pmevqa6cELCkd5TYr81v6X7G82kbRgxtlUb9QFVAhCsVZsmwIRJNZmZU1CN4mIrCj1HS1cMDhNB7jp6pkgd5SXNDBb+1vdQd5UrOZ4FRWH6+dEUV3UVJkqHIKrVYAs+8pwGiU3xH1hMvQOMUQeC12og8duMg64BAhuJjvtFr1EmXC5diy9MQo6ae/b7Yz6oCHmiaHuAw+wP3ya49kPfAAR0FO8zD1LIy5wp7N7X2bsC0++YyV84rP5++5hwWf9dHT6C3dz7D1fYFf8nNPg0hmCU27DaTzPztDQqroUrcsg2DJQV/lg+MtnnfotG5mrmJegD8502ggcqHlqOk0KC+jejUKDa21gkzC8SwHFMITJucI9LUKBsw2WOB5irJ6iwPPpepOrN76zchfkxcxoADXFiFAK8BNZZ02BK6DCyoiKEMopVSRaRi2quiIKHEsd3bRhpUVJrKmmJhIjo02Wqz1Fo+qy1VM+I+u0nbVWa1urpY7yElfgQJQ5d4BD4X5rgH6clJElVtc1VZQEVmElNWWnNMKWSqwoqJIs8wpuOpF4VuUkxbBNXWaDq9Wu3tpQrcjaukZP15nK+1tbW/g7v8lzOU4mXGaYF+WunMCjMIxyYlFvIJMsvILo8OzElmw1i7+3Z/uz+LsryQGTprlses2jOy5qTMR5FzEvw3QXVYQUvabYGMCGtkdDGhTnUg04DW6MSeqAoGZVNkQwFYMsDndqdQeET/Euk/EYNYbj9bDVGYdnDCn/sqkLeR2NOefgYmVpMycYmyRFVFiX40VF5y+celle4bjorQ7HEznJq7xYa1zxDlkmCncQgBfVeQk7T9ksT9u4llqVeA5Rb2gbiCjgwVw5lz1QshDgSOTKlCSiPybh8cPTaxwkEkIfq3SgVByKTi7n+suj+WrcILoat47QZHSxSLAWwRMrFlJ6La1zLMtrJL6+i31aeBq+zWRQUxWZITzLM8wC9dhRLKtnmdGQVNsombFbboUudckdGkMlsUvroGjHZWtKErOIzeDeUYlE/9L7TkXQ+tdFXwdTEvc8pziu7lZdgVdVLaW+1sgH5UqelUxLM1Kva6xb58KHRiVTi47Fnes8gqJ10Qk4tleUo1PPSDXLPzwmWKQc6o384fOlwJzZmXEz4eE4Vop6GOBUV/6qzDrE2jvRZ9/PXBnHSs+CL53nlXjPL1lzB7LaAgnVThNXnPEyY5QN+zJBEAaBLamqpaqf9MNwfRj6pueVPO+v7SAY8H1bjus23Wxpd2vWzfENxReow//QUbj50yfgnj+Dm4+CTJsOBAuaqeEvRYdZH76UDlPyPrum7opZ3bL0WUv/NB3qEc166pHgKchA9ONHlvc7jjsGqLenmQsRYxxkrmVuoD5+gh5WrjZ6Wz8LIqktX2rUUI+hBHiJDUtsWgbRf6WOmrDdtWai0DvVK1zruVmZRB5QcNpNuCN618MiF8bBXMVABPZy1TJS0Sc7nLBFgLHBzQOimL6gYRaNgYnBBVsvmZUpk8jxHVglumtkU6OxaWSHXSgMBsEHZA1NibZp40Yff43ISJnUXJusLkW/VHRdeb/IPyCJpilKdw8uDMZjEjG9rYGZaEmSK75RNON7u3PXHyrhwI2GFeC4g8FrdEvHH5h04I2rbMlpGk+rLS/HacLpbw99G38/pOTb3TgAbRfH0KjVyTStamx5TvnU+AAT+b3x/g6eZmgGLT+9pmw3qWmJrUZsSWOTAsrwjmD4FcN9m/obOxr4I+ScQ1NTh+CpUjBw03AuaOy8fGdjaOrQDYemeuM+Bl/5A8Zt7C74105ntw2N7R4d3T1GyPor16+/Er5cr05fH5RqY7uv2j3mdw5ef7DTHZdV4WvxuOUkCFOOwReNVuMyEbjMUmAMt0SPNzJo6FuwqdQqFlul6D44XJ8Pw3m4awQtuz1ZbBc3YlUQzocbw/n6MraH5+DLcXycxlS78XBSxblSaESSNQjxtzcEha9DBRLFsYkTuGCL02zb8/7kFZ2ZxWzOuaQ5etEo/LdW29625bm4ZF8LS7D+X7fayJKRzhUIANXG+tGLXosDbNl2z6ZJbXT96K5RrOjOZ+lXMZ7jYz1ZpfFQdCpqKxqSIjbHCpcvnzo0nPP2fdF6eH10W+JcCKjDyYvvLo+Ozo+OzkXfQ5x3al/0dnjCTxwQFjl6/4v/F62dH33/xcs4EmIfxGFuhwLK0Bq3Y/mGq1Ktk3o4iaaNftBSobcEmF0JFYgeFnRr7CKgeewFEJCXtMSdoGbR9cSVG9vJEAu6NXRUmu00u5dnVNOjuU0iRTSEQIME2AhdEyxy4sh2ErKtd9phtzgJM+Bwc5AUrQrqes1OtzgJO+CYFBXNQXtVtNxFdNUtjlvQtyYTaCaB4ag6Xa1OL1BSGTrnnIunpz/K8gY666LMG4ahh7ogC2YaIJ+xM3mAjMnLApZinSmLHr3Q9ETZ7DaVBDOz3DRtCr2mvIyoSdIJNgeVSKaURgQgaIi3BXymBFEVNMXNqlhpExVYNe+qsqAJWGVgE5UoYkrkdCKbRI376xwWKCv9NV5R3PxK/6yraKv7a/jk0qKC/eFYZXrzdCUmp6Z3T+PvXgDLFBRBr+MydJwsQneNTjYjagRnTgQdV1FHU5FOFpdBo5G0pZwSk7bYBTvKfNIWhzOtLi/mu3OS9TVzEg2RMyWLdNeU4kT97DV5OZ3tLgp5oihreaKLXGqlv8nhgKt4igyQE54m3x7Bt+HXsW7YzuxCO4YeVn0l3DcHCUBPIn6Eo0huMon5oe+LQv6Hf1rDiI7frk+mWS0c2e/pur212dTY9GS97Tsnva1DY2NDW73RoXMLhXOH3uNaBUVP57Jq2s+5flq10lnVyo9ZHTQ7nOwNzx24UedVJxz0vP7+bIrXbzwwN+wqcNHtl7Xz+fZlt6ecUn9/yX482wcK8Q22jlvnZPJcNsuqvsKGgqS66fyLSryuTMtike/amJPoIwuxNYr1ZBwv8AA+V/jz+wufpZT9bOH++wtv+Nzn8NHt8zl8xH0S782Ktfgl9mc/a3/kI5TCsH3ypP1wtOtjzsmTznJcO9aDKrOXWj6qf+i5Q4YRZJsBpOut0m8eGmy4cuFBQtTcnVjnxBokLMT3UF4mJMvmiOrvFnwnoN8JBPTe2ymfsziDvqnErz84I/A8LRQDgYdzDk3TD2og3OwfH3Q2/MaeqV4y1nNH/jn5tuAD9uTczDUbOF7odeM6l3U4Oho7fc0GnmOTF7EcW8ieGMmcB5y9oVTpOVDbaCw95tMzcXwsiQENUntHP9iirgIq/bbV5BJF17bKpPsNDEc/+0LgC89E26u2lT2dtezqnG2cNmyYvDkIXhQE5K3B4wG8yY9+NNTnOH1DYEc/ypdKebCnv/nNb8Lbpi+5hDkLF2QqIqGjtqvUBMYxgxhjx5bgF38MLFiLC1543FWwYGzs98CCLi6g8lFYiSKis9C7rUGTiS/qBuW6kcL/3aAooPUNeOLECcz34oHgjNt7dzsTZ2g4zk9ic73vQWJ72I/eyhjTYubo2YfVVhFijEAhQherIqW5mo22okNoCKwabkA3MEascaSFowiiPIeiG4dpKJqg0gzMZnrP/VZKoqfR771gdig1Md0q2OnaCGhBCTpZx9+2o1wf4/4xEIdLjuFkxyt9A8q2we2FHIgGrKunbaFZrm24lmW6IyFZYnCwRsPN+WO+N5hKLwwYRnHnLW5N0XbvU9ROv1IcU9EQ1dziiJeJPhLkfEgPLKRTg55hdIp7R7H7cvxWgW/E3s0EM5vc9nTKsWS26l0PznMzrXYZ7aVTFsrIFZF0LxrpdyLYGE+oQEF6fEtid6jB3wBoh+lpRc1Qh7+0JcHWo+2aJUgm/CVwEG2Bp6LHBL8/4DfRINi8kK/6AsziSYveS1ydJznCtziJu5CAuIOk/FrtPkWUgUO/RI+eQ7sCefq1drRoeZ6FZ9KybfrwZTMlqqqY+huWHeFMfr0gyYflXXmH4ZeeW8ZCybdtTI2rVwgnxl5Kq5aHMEa3ThWe+ymf5k9zkgSn0AOufetb/0IDsB58l5AokHRJleFT0bZLhv/pLfRkJxgLcNw0jppF2e1n6vFXw01mPbOB2ch8AraejbwoVqrOInqiIIhCI/odcHUS8Qm9YKl7DpYhpKFXbvST4KbYaf8nSHs+SLPLeVvYa1tWmTVsK52Z8Ut7eAH2lHz7okzaqgCWWvZMvryHF6///wjJ7eFsr3BOnlPUrM+pCleyuUJhmNULWO4/r7jz/zrgW75T/xLLMTPMPKZEEofvCNXfhAYgOvE1Rz0WdiykQX/Ri4N8nQQEit1rUntSoI1FeKK/43Pc7DZXM9QUwGwfrleW81mr0ky7Qop+raRb4UgjkxblvfVJnuxd3x4pnxPK0U91YBf6YVM2d+WuTSy7R0hrhS1BqjGcypVYtjDiWg5c1VdKOxxX1M2iG/r1dRcuTB8O8sLEM6pd2cT8H3uqFet4nGNgZGBgAOJ1Bw+djue3+crAzcQAAveX8ljB6P+//n9m4mZiA3I5GMDSAGQKDEl4nGNgZGBgYgACPSaG/7/+f2XiZmBkQAUBAF9QBH8AAHicY2BgYGAC4///mOBsYvD//8SJkSKPrOb/LySx3yDMeI8U99ES//8LYwMA4F4TWgAAAAABEgEkAToBTgFgAXQBiAGcAa4BwAHWAewB/AIQAiYCPAJOAwwDvgQqBOwFhgYoBvAHeggSCCYIXAkyCUQJlAmuCcgKNgqsCsoK9AsoC0wLigwGDF4NoA3+Di4OZA7wD0wPvBAIEBYQJBDQEPwRoBIQEpgTPBNQE2QTkBO8E+wUNBRwFfwWghacFrgXMBdwF5wXyBf4GIAY9hkiGvYbXgAAeJxjYGRgYAhg9GIQYQABJiDmAkIGhv9gPgMAGdoBxgB4nG2PPW7CQBCFn/mLAlKEEilSulWKNBHmp6DgANBT0Buz/kG211oWJC6QE+QMOUNOkDJnyFHybEYuEnal1ffevNnRABjiCx6q4+G2fqvTwg3VhdukoXCH/CTcxQDPwj36I+E+XjEXHuABAX/wOtVv93DCLdzhTbhN/124Q/4Q7uIRn8I9+t/CfWzwIzzAizc/py4ZpaEp1jo+ZoFtdAMbbQ+pKdTUnzTeShfaBk7v1PasDqd45lykImtytTSF01lmVGnNXofOT5wrF+NxJL4fmhxnpNwm4dYpQhgUWEMjxhEZN7ZX6v+dDTssDtSVUpjCx+RKbsVcUWcDVjR2zG6ZU+w9ceaMrkNEHTFjkJOWdWeVzngNnbKu7emE9H1OqLpKLDDmjf7k/Xp2/gurBGCqeJxtUmlz2yAU9DaSK8uKkzRJ7/u+1Pu+7/tIfwJFzxITDCpI8fjfFyTbcTPlA7O7sI/HQmdfpx1h5/9jC/uwhAAhutiPCD3E6CPBMgZYwSrWcADr2MAmDuIQDuMIjuIYjuMETuIUTuMMzuIczuMCLuISLuMKruIariPFDdzELdzGHdzFPdzHAzzEIzzGEzzFMzzHC7zEK7zGG7zFO7zHB3zEJ3zGF3zFN3zHD/zEFn51Ysa5rlUlVD5gxuhxmumxSpms1heo1Cr32soeLd7lU7ekYbXgbuge91yLd/l0yYi8aOwbi3zmX90r9heEpMV16XeuzcnMu/yPEs1Y/Jup7ZQXxLcDDxPOJKmMmZRl2WBORlrRZG1OrTNktaRopixzZovUUC5sRSbwrMsLZirba2r7DpIWcWG4pM2WlEbnhqydqmGjhty1SD03W/LGsEEB1+Wkzw1loko5M1nI3RVU5LOXmmVBZlge+NWQlGsipgmljTNbcjApSJbukdOCqSwUI5ZTItRQp/ZPzVzRwJO+dP2nlpjhRSA13+65fUoMBZloxIRMdV31RkLVtumrQf0mm2mEI22oW7JJyeRSmQ27JelSUq8sdKV9olEpW2/gQeTO1Q3zIDRUyombLVWBZTsUOeD/pU1sIUhm7StEVpvmiwQexJUYUXt4WBkXe1SraU0PunXps4lqSybVw2G4IzLSq2NmlM+iMoKpXNJgrI2rPzsvmIiq6HT+At2JLgAAAAA=") format("woff"),
12
+ url("../fonts/yith-icon.ttf?6c9fac5a69711520a55f03f0159e3932") format("truetype");
13
  font-weight: 400;
14
  font-style: normal;
15
  }
139
  content: "\e91f";
140
  }
141
 
142
+ .yith-icon-charts:before {
143
+ content: "\f130";
144
+ }
145
+
146
  .yith-icon-check-alt:before {
147
  content: "\f114";
148
  }
plugin-fw/assets/fonts/font-awesome/font-awesome.min 2.css ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*!
2
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
+ */@font-face{font-family:'FontAwesome';src:url('./fontawesome-webfont.eot?v=4.7.0');src:url('./fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('./fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('./fontawesome-webfont.woff?v=4.7.0') format('woff'),url('./fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('./fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
plugin-fw/assets/fonts/yith-icon.eot CHANGED
Binary file
plugin-fw/assets/fonts/yith-icon.ttf CHANGED
Binary file
plugin-fw/assets/fonts/yith-icon.woff2 CHANGED
Binary file
plugin-fw/assets/images/arrow 2.svg ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="86px" height="26px" viewBox="0 0 86 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>arrow2</title>
4
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <g id="Create-badge---image-Copy" transform="translate(-795.000000, -218.000000)" fill="#336374">
6
+ <g id="arrow2" transform="translate(795.000000, 218.000000)">
7
+ <path d="M85.2527743,11.0287846 C85.0291804,10.8409658 84.5580864,10.4653284 83.9069923,9.99202513 C81.7582412,8.39556583 77.6702704,5.45995889 74.5990189,3.18547392 C73.0029243,2.00033766 71.6866736,1.0236802 71.0833921,0.482762228 C71.0032358,0.409512919 70.9019857,0.351289109 70.8513607,0.294943486 L70.8513607,0.306212611 L70.8513607,0.293065299 L70.8330794,0.272405237 C70.8246419,0.261136113 70.8204232,0.25550155 70.8218294,0.238597864 L70.8218294,0.238597864 C70.7216008,0.0191459435 70.5127354,-0.0622623017 70.3398646,0.0507452248 C70.1669939,0.163752751 70.086996,0.433994045 70.1552666,0.674337345 C70.2269854,0.978603707 71.7626112,2.67272876 73.859331,4.71995305 C75.783082,6.59814047 78.1540207,8.82567074 80.1143342,10.6512689 C75.6298006,10.6756854 69.8008914,10.6249743 63.3321381,10.6137052 C59.113386,10.6043142 54.6358837,10.5986797 50.0768189,10.641878 C47.4386925,10.6681726 44.7752537,10.7282746 42.1244711,10.7902548 C38.0730628,10.8860423 34.052592,11.0043682 30.1966525,11.1208158 C14.2807069,11.6072663 1.19835652,12.0279803 0.512106166,11.684272 C0.389268144,11.6171708 0.248958141,11.642693 0.144029579,11.7512246 C0.0391010166,11.8597562 -0.0145049592,12.0348087 0.00340450444,12.2104414 C0.0213139681,12.3860742 0.108017998,12.5356045 0.230856023,12.6027056 C0.848200087,12.9558049 11.476643,13.5925104 25.2283687,14.0338845 C30.4314964,14.2010431 36.088843,14.3512981 41.8108772,14.4226693 C44.5727536,14.4583548 47.351505,14.4715021 50.1077564,14.4508421 C52.9202578,14.4320602 55.6933842,14.3738364 58.3976044,14.3043434 C62.8062004,14.1916522 67.016515,14.0338845 70.8344857,13.8648476 C74.942144,13.6770288 78.5885521,13.46855 81.5388661,13.2694622 C81.0438659,13.678907 80.4940219,14.1334284 79.9104278,14.6255135 C79.0905836,15.3148083 78.2074582,16.0717178 77.3130827,16.8511656 C74.0660498,19.6853504 70.6558918,22.7392831 69.5674538,23.650204 C69.1305592,24.0067591 68.9841166,24.7618416 69.2364633,25.3568463 C69.4888101,25.951851 70.0490011,26.1723396 70.5026105,25.8551961 C71.5544861,25.1414849 74.7058939,22.9815693 77.824958,20.6357132 C79.5391776,19.3472767 81.2393347,18.0062509 82.5865229,16.8793384 C83.5022712,16.1209452 84.3879897,15.299703 85.240118,14.4189129 C85.8926184,13.708958 85.9952747,12.9708304 86,12.7754989 C85.9966809,12.7022496 86.0669934,11.6899066 85.2527743,11.0287846 Z" id="Path"></path>
8
+ </g>
9
+ </g>
10
+ </g>
11
+ </svg>
plugin-fw/assets/images/bh-onboarding/check 2.svg ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="100%" height="100%" viewBox="0 0 35 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
4
+ <g transform="matrix(2.0825,0,0,3.04444,-3.82583,-18.2777)">
5
+ <ellipse cx="10.24" cy="11.752" rx="8.403" ry="5.748" style="fill:rgb(226,235,252);"/>
6
+ </g>
7
+ <g transform="matrix(0.805374,0,0,0.805374,7.56329,9.79297)">
8
+ <g id="Plugin-onboarding---Step-2">
9
+ <g id="Group">
10
+ <g id="check-verde--1-" serif:id="check-verde-(1)">
11
+ <path id="Path" d="M4.705,4.608L10.178,9.985L20.163,0L24.676,4.449L10.146,19.139L0,9.249L4.705,4.608Z" style="fill:rgb(115,161,239);fill-rule:nonzero;"/>
12
+ </g>
13
+ </g>
14
+ </g>
15
+ </g>
16
+ </svg>
plugin-fw/assets/images/colorbox/border1 2.png ADDED
Binary file
plugin-fw/assets/images/help-tab/documentation 2.svg ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="274px" height="200px" viewBox="0 0 197 144" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>documentation-bluehost</title>
4
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <g id="Help-Bluehost" transform="translate(-358.000000, -322.000000)" fill-rule="nonzero">
6
+ <g id="documentation-bluehost" transform="translate(358.000000, 322.000000)">
7
+ <g id="Group" transform="translate(110.000000, 0.000000)" fill="#E3F6FF">
8
+ <path d="M6.3766672,35.9266104 C6.44826487,35.8558364 6.475114,35.7496756 6.43931516,35.6523614 C6.42141575,35.6081277 4.85074193,31.2643785 5.39219929,25.3016759 C5.89338295,19.8078504 8.34112819,11.7705873 17.1744903,4.67992536 C17.2863617,4.59145796 17.3042611,4.42779327 17.214764,4.31278566 C17.1252669,4.20220141 16.9552225,4.18450793 16.8433511,4.27297533 C7.85784394,11.4830683 5.37429987,19.6751493 4.86864135,25.2751356 C4.32270914,31.3484225 5.92918179,35.7850625 5.9470812,35.8292962 C5.9963046,35.9664207 6.14844964,36.0327712 6.28269527,35.9841142 C6.3184941,35.9708441 6.35429293,35.9487272 6.3766672,35.922187 L6.3766672,35.9266104 Z" id="Path"></path>
9
+ <path d="M11.1289623,4.62242155 C11.1065881,6.29445537 11.9389109,7.26317338 12.981552,7.27644349 C14.024193,7.2897136 14.8788901,6.34311244 14.9012644,4.66665525 C14.9236387,2.99462143 13.0576245,1.21200335 13.0576245,1.21200335 C13.0576245,1.21200335 11.1513366,2.94596436 11.1289623,4.61799818 L11.1289623,4.62242155 Z" id="Path"></path>
10
+ <path d="M7.28953746,9.36869746 C7.73254802,10.9832275 8.80203817,11.6909667 9.80440551,11.4211411 C10.8112477,11.1513155 11.3706045,10.0100861 10.9275939,8.39555608 C10.4845833,6.78102606 8.19793286,5.57344608 8.19793286,5.57344608 C8.19793286,5.57344608 6.84205204,7.75859081 7.2850626,9.37312083 L7.28953746,9.36869746 Z" id="Path"></path>
11
+ <path d="M4.34060855,14.3582587 C5.15950687,15.8223941 6.36324264,16.2603078 7.27611289,15.7648903 C8.18898315,15.2694729 8.46194925,14.026506 7.64305094,12.5623705 C6.82415262,11.0982351 4.31823428,10.4568465 4.31823428,10.4568465 C4.31823428,10.4568465 3.52171024,12.8941233 4.34060855,14.3626821 L4.34060855,14.3582587 Z" id="Path"></path>
12
+ <path d="M2.33587388,19.6574559 C3.2621687,21.0596641 4.49722845,21.404687 5.36982501,20.842919 C6.24242158,20.281151 6.42141575,19.0204906 5.49512093,17.6227057 C4.56882612,16.2204974 2.01815923,15.7693137 2.01815923,15.7693137 C2.01815923,15.7693137 1.40957907,18.259671 2.33587388,19.6618792 L2.33587388,19.6574559 Z" id="Path"></path>
13
+ <path d="M1.37378023,25.4255302 C2.64911367,26.5269493 3.93339682,26.5269493 4.61804951,25.7484362 C5.3027022,24.9743465 5.12818289,23.7136861 3.85284945,22.6122669 C2.57751601,21.5108478 0,21.7629799 0,21.7629799 C0,21.7629799 0.0984467919,24.3241111 1.37825509,25.4211068 L1.37378023,25.4255302 Z" id="Path"></path>
14
+ <path d="M17.2729371,1.37124467 C16.1631733,2.63632846 16.1676481,3.90583563 16.9552225,4.57818785 C17.7427968,5.25054008 19.0136554,5.07802865 20.1234192,3.81294486 C21.2331831,2.54786106 20.9736415,0 20.9736415,0 C20.9736415,0 18.382701,0.106160878 17.277412,1.37124467 L17.2729371,1.37124467 Z" id="Path"></path>
15
+ <path d="M16.2392458,6.25022167 C14.5567006,6.42715647 13.6841041,7.36048752 13.7915006,8.38228597 C13.9033719,9.40408442 14.9549627,10.1339405 16.6375078,9.95700565 C18.320053,9.78007086 19.886252,7.73647396 19.886252,7.73647396 C19.886252,7.73647396 17.9173161,6.06886351 16.234771,6.25022167 L16.2392458,6.25022167 Z" id="Path"></path>
16
+ <path d="M12.8294069,10.2622182 C11.1468618,10.439153 10.2742652,11.372484 10.3816617,12.3942825 C10.493533,13.4160809 11.5451238,14.145937 13.227669,13.9690022 C14.9102141,13.7920674 16.4764131,11.7484705 16.4764131,11.7484705 C16.4764131,11.7484705 14.5074772,10.08086 12.8249321,10.2577948 L12.8294069,10.2622182 Z" id="Path"></path>
17
+ <path d="M10.2876898,14.3847989 C8.60514459,14.5617337 7.73254802,15.4950648 7.83994452,16.5168632 C7.95181588,17.5386617 9.00340661,18.2685177 10.6859518,18.0915829 C12.368497,17.9146481 13.9346959,15.8710512 13.9346959,15.8710512 C13.9346959,15.8710512 11.9657601,14.2034408 10.2832149,14.3803756 L10.2876898,14.3847989 Z" id="Path"></path>
18
+ <path d="M8.65884284,18.8568259 C6.97629766,19.0337607 6.1037011,19.9670917 6.2110976,20.9888902 C6.32296895,22.0106886 7.37455969,22.7405447 9.05710486,22.5636099 C10.73965,22.3866751 12.305849,20.3430782 12.305849,20.3430782 C12.305849,20.3430782 10.3369132,18.6754677 8.65436798,18.8524025 L8.65884284,18.8568259 Z" id="Path"></path>
19
+ <path d="M7.79519598,23.4482839 C6.11265081,23.6252187 5.24005424,24.5585497 5.34745074,25.5803482 C5.4593221,26.6021466 6.51091283,27.3320026 8.193458,27.1550678 C9.87600317,26.978133 11.4422021,24.9345361 11.4422021,24.9345361 C11.4422021,24.9345361 9.4732663,23.2669257 7.79072113,23.4482839 L7.79519598,23.4482839 Z" id="Path"></path>
20
+ </g>
21
+ <path d="M25.1177429,16.7436106 C15.8345531,17.6803268 6.71594304,25.7112261 7.13406467,35.4779361 C7.50770528,44.1836262 14.8025933,51.007005 16.2749152,59.5839521 C18.4500373,72.2629175 7.61890784,83.259345 5.39930471,95.9294315 C3.94032711,104.262211 6.54246705,113.269781 12.1737648,119.347338 C17.8050625,125.429335 26.3142825,128.425939 34.3075226,127.142949 C44.8495254,125.451532 54.0215127,116.936737 64.6747181,117.393996 C73.2551078,117.762468 80.4610337,123.844464 87.9249497,128.306075 C95.3888656,132.763246 105.45937,135.489046 112.060354,129.726688 C116.517352,125.833322 117.851783,119.316263 121.134483,114.299725 C126.067428,106.761601 135.86215,103.152358 144.211238,105.798248 C151.261481,108.031273 157.12408,114.162103 164.476793,114.637121 C171.736096,115.107698 178.657344,109.269869 180.570028,101.918201 C182.48716,94.5665315 179.769369,86.3491769 174.498368,81.0973506 C171.157843,77.7677904 166.620778,75.0686269 165.56213,70.3672878 C164.583547,66.0299807 167.065589,61.6172036 170.134779,58.5318111 C173.20397,55.4464186 176.95372,53.1068476 179.675959,49.6796203 C185.86327,41.8928888 184.964753,31.4513879 179.800506,23.3672157 C177.09606,19.1364545 174.062454,16.4772458 169.787827,14.0710836 C165.495408,11.6560425 160.887174,9.85808003 156.141049,8.71271131 C145.523428,6.15116964 129.34568,5.32543871 121.276822,14.5416614 C117.260185,19.1320151 113.172379,24.8721769 106.500226,24.0952795 C102.385731,23.6158229 99.8369681,20.4860363 96.5453722,18.2219353 C92.2929863,15.3008011 87.9872231,16.9123083 83.9527942,19.4338952 C79.7938184,22.039831 76.4310529,25.8577268 72.3254543,28.5480114 C63.0867455,34.5989322 56.6236527,28.7966186 48.7149265,23.8688695 C41.6246512,19.4516529 33.5513452,15.8779249 25.1266391,16.7302923 L25.1177429,16.7436106 Z" id="Path" fill="#ECF7FA"></path>
22
+ <path d="M38.1177429,27.7436106 C28.8345531,28.6803268 19.715943,36.7112261 20.1340647,46.4779361 C20.5077053,55.1836262 27.8025933,62.007005 29.2749152,70.5839521 C31.4500373,83.2629175 20.6189078,94.259345 18.3993047,106.929432 C16.9403271,115.262211 19.542467,124.269781 25.1737648,130.347338 C30.8050625,136.429335 39.3142825,139.425939 47.3075226,138.142949 C57.8495254,136.451532 67.0215127,127.936737 77.6747181,128.393996 C86.2551078,128.762468 93.4610337,134.844464 100.92495,139.306075 C108.388866,143.763246 118.45937,146.489046 125.060354,140.726688 C129.517352,136.833322 130.851783,130.316263 134.134483,125.299725 C139.067428,117.761601 148.86215,114.152358 157.211238,116.798248 C164.261481,119.031273 170.12408,125.162103 177.476793,125.637121 C184.736096,126.107698 191.657344,120.269869 193.570028,112.918201 C195.48716,105.566532 192.769369,97.3491769 187.498368,92.0973506 C184.157843,88.7677904 179.620778,86.0686269 178.56213,81.3672878 C177.583547,77.0299807 180.065589,72.6172036 183.134779,69.5318111 C186.20397,66.4464186 189.95372,64.1068476 192.675959,60.6796203 C198.86327,52.8928888 197.964753,42.4513879 192.800506,34.3672157 C190.09606,30.1364545 187.062454,27.4772458 182.787827,25.0710836 C178.495408,22.6560425 173.887174,20.85808 169.141049,19.7127113 C158.523428,17.1511696 142.34568,16.3254387 134.276822,25.5416614 C130.260185,30.1320151 126.172379,35.8721769 119.500226,35.0952795 C115.385731,34.6158229 112.836968,31.4860363 109.545372,29.2219353 C105.292986,26.3008011 100.987223,27.9123083 96.9527942,30.4338952 C92.7938184,33.039831 89.4310529,36.8577268 85.3254543,39.5480114 C76.0867455,45.5989322 69.6236527,39.7966186 61.7149265,34.8688695 C54.6246512,30.4516529 46.5513452,26.8779249 38.1266391,27.7302923 L38.1177429,27.7436106 Z" id="Path" fill="#DDEFF7"></path>
23
+ <g id="Group" transform="translate(41.000000, 35.000000)" fill="#B2E4F9">
24
+ <path d="M30.6678034,26.9903235 C30.5748169,26.963378 30.4951143,26.8870327 30.4774026,26.7837419 C30.4685468,26.7388329 29.6051015,22.135658 26.1203252,17.1911744 C22.9056521,12.6329085 16.7419816,6.84413526 5.61460795,5.12861055 C5.47291437,5.10615603 5.37550004,4.97142896 5.39763966,4.82772008 C5.41977928,4.68401121 5.55261701,4.58521135 5.69431059,4.60766587 C17.0165129,6.350136 23.2908816,12.2556727 26.5631176,16.9037566 C30.1098849,21.9425491 30.9866139,26.6400331 30.9954698,26.689433 C31.0220373,26.8331419 30.9290509,26.9723598 30.7873573,26.9948144 C30.747506,27.0037962 30.7120826,26.9993053 30.6766592,26.9948144 L30.6678034,26.9903235 Z" id="Path"></path>
25
+ <path d="M10.7377163,2.00294247 C11.6055895,3.45799485 11.3841932,4.72892023 10.5030363,5.26782852 C9.6218794,5.80673681 8.40862815,5.4160283 7.54518292,3.96097592 C6.67730977,2.50592354 7.36806595,0 7.36806595,0 C7.36806595,0 9.87427108,0.547890093 10.7421442,2.00294247 L10.7377163,2.00294247 Z" id="Path"></path>
26
+ <path d="M16.4187431,4.20348465 C16.8615355,5.84266403 16.308045,7.00131685 15.3117621,7.2797528 C14.3154791,7.55369784 13.2572052,6.83964436 12.8188407,5.20046498 C12.3760483,3.56128561 13.7132814,1.34277982 13.7132814,1.34277982 C13.7132814,1.34277982 15.9759507,2.56430527 16.4187431,4.20348465 Z" id="Path"></path>
27
+ <path d="M21.4665768,7.07317129 C21.510856,8.7707324 20.7049738,9.76771273 19.6732674,9.79465814 C18.6415611,9.82160356 17.7825438,8.87402315 17.7338366,7.17646204 C17.6895574,5.47890093 19.5050063,3.64212185 19.5050063,3.64212185 C19.5050063,3.64212185 21.4178696,5.37111928 21.4665768,7.07317129 Z" id="Path"></path>
28
+ <path d="M25.8635055,10.6928386 C25.7838029,12.3903997 24.9070739,13.3200165 23.8753676,13.2706166 C22.8436612,13.2212167 22.0554907,12.2107636 22.1351933,10.5132025 C22.214896,8.81564142 24.1587547,7.12257121 24.1587547,7.12257121 C24.1587547,7.12257121 25.9387803,8.99078661 25.8635055,10.6883477 L25.8635055,10.6928386 Z" id="Path"></path>
29
+ <path d="M29.6095295,15.2511046 C29.0781786,16.8633385 27.9800533,17.5145194 27.00591,17.1821926 C26.0273387,16.8498658 25.5402671,15.6597767 26.071618,14.0475427 C26.6029689,12.4353088 28.932057,11.3440195 28.932057,11.3440195 C28.932057,11.3440195 30.1453083,13.6343797 29.6139574,15.2466137 L29.6095295,15.2511046 Z" id="Path"></path>
30
+ <path d="M3.84786617,2.27688752 C5.43749098,2.82028671 6.07511207,3.93403051 5.74744568,4.92202904 C5.41977928,5.91451847 4.24195143,6.40402683 2.65675455,5.86062764 C1.06712974,5.31722845 0,2.95501378 0,2.95501378 C0,2.95501378 2.26266929,1.73348833 3.84786617,2.27239662 L3.84786617,2.27688752 Z" id="Path"></path>
31
+ <path d="M7.20423275,6.02230012 C8.73186662,5.32171935 9.94954579,5.69446425 10.3746265,6.64653556 C10.7997072,7.59860687 10.2683563,8.7707324 8.74515039,9.47131317 C7.21751653,10.1718939 4.84857705,9.17940451 4.84857705,9.17940451 C4.84857705,9.17940451 5.68102681,6.71839 7.20866068,6.02230012 L7.20423275,6.02230012 Z" id="Path"></path>
32
+ <path d="M12.1457962,7.80069748 C13.6734301,7.1001167 14.8911093,7.4728616 15.31619,8.42493291 C15.7412707,9.37700422 15.2099198,10.5491297 13.6867139,11.2497105 C12.15908,11.9502913 9.79014052,10.9578019 9.79014052,10.9578019 C9.79014052,10.9578019 10.6225903,8.49678735 12.1502241,7.80069748 L12.1457962,7.80069748 Z" id="Path"></path>
33
+ <path d="M16.4054593,10.1180031 C17.9330932,9.41742234 19.1507724,9.79016724 19.5758531,10.7422386 C20.0009338,11.6943099 19.4695829,12.8664354 17.946377,13.5670162 C16.4187431,14.2675969 14.0498036,13.2751075 14.0498036,13.2751075 C14.0498036,13.2751075 14.8822534,10.814093 16.4098873,10.1180031 L16.4054593,10.1180031 Z" id="Path"></path>
34
+ <path d="M20.0629248,13.2032531 C21.5905586,12.5026723 22.8082378,12.8754172 23.2333185,13.8274885 C23.6583993,14.7795598 23.1270484,15.9516853 21.6038424,16.6522661 C20.0762085,17.3528469 17.7072691,16.3603575 17.7072691,16.3603575 C17.7072691,16.3603575 18.5397188,13.8993429 20.0673527,13.2032531 L20.0629248,13.2032531 Z" id="Path"></path>
35
+ <path d="M23.1314763,16.7869932 C24.6591101,16.0864124 25.8767893,16.4591573 26.30187,17.4112286 C26.7269508,18.3632999 26.1955999,19.5354255 24.6723939,20.2360062 C23.1447601,20.936587 20.7758206,19.9440976 20.7758206,19.9440976 C20.7758206,19.9440976 21.6082703,17.4830831 23.1359042,16.7869932 L23.1314763,16.7869932 Z" id="Path"></path>
36
+ </g>
37
+ <g id="Group" transform="translate(133.000000, 38.000000)" fill="#B2E4F9">
38
+ <path d="M0.332244101,26.9903218 C0.425243793,26.9633719 0.504957816,26.8870139 0.522672043,26.783706 C0.531529157,26.7387895 1.39509773,22.1348487 4.88037194,17.1895426 C8.09550419,12.6305184 14.2600553,6.84078219 25.3890185,5.12497208 C25.5307323,5.10251383 25.6281606,4.96776435 25.6060178,4.82403156 C25.583875,4.68029878 25.4510183,4.58148249 25.3093045,4.60394074 C13.9854847,6.34670074 7.71021974,12.2532198 4.43751626,16.9020771 C0.890242258,21.9417078 0.0133880103,26.6399732 0.00453089667,26.6893813 C-0.0220404442,26.8331141 0.0709592488,26.9723552 0.212673067,26.9948135 C0.252530078,27.0037968 0.287958532,26.9993051 0.323386987,26.9948135 L0.332244101,26.9903218 Z" id="Path"></path>
39
+ <path d="M20.2651783,2.00327568 C19.3971812,3.45857011 19.618609,4.72970692 20.4998918,5.26870486 C21.3811746,5.8077028 22.5945992,5.4169293 23.4581678,3.96163486 C24.3217363,2.50634042 23.63531,0 23.63531,0 C23.63531,0 21.1287469,0.547981239 20.2607497,2.00327568 L20.2651783,2.00327568 Z" id="Path"></path>
40
+ <path d="M14.5789114,4.19969228 C14.1360557,5.83914435 14.6896253,6.99798992 15.6860506,7.27647219 C16.6824758,7.55046281 17.7409009,6.83629054 18.179328,5.19683847 C18.6177552,3.5573864 17.2847596,1.33851155 17.2847596,1.33851155 C17.2847596,1.33851155 15.021767,2.56024021 14.5789114,4.19969228 Z" id="Path"></path>
41
+ <path d="M9.53478515,7.06985631 C9.49049958,8.76769982 10.2964969,9.76484601 11.3283507,9.79179591 C12.3602044,9.81874581 13.2193444,8.87100776 13.2680585,7.17316425 C13.3123441,5.47532074 11.4966358,3.63823609 11.4966358,3.63823609 C11.4966358,3.63823609 9.58349927,5.36752115 9.53478515,7.06985631 Z" id="Path"></path>
42
+ <path d="M5.13722824,10.6901258 C5.21694226,12.3879693 6.09379651,13.3177408 7.12565024,13.2683326 C8.15750398,13.2189245 8.94578709,12.2083033 8.86607307,10.5104598 C8.78635905,8.81261632 6.84222261,7.11926446 6.84222261,7.11926446 C6.84222261,7.11926446 5.06194277,8.98779065 5.13722824,10.6856342 L5.13722824,10.6901258 Z" id="Path"></path>
43
+ <path d="M1.39066918,15.24915 C1.92209599,16.8616522 3.02037808,17.5129414 3.99466058,17.1805593 C4.96894308,16.8481773 5.46051288,15.6578902 4.92908607,14.045388 C4.39765925,12.4328858 2.06823837,11.341415 2.06823837,11.341415 C2.06823837,11.341415 0.854813804,13.6321562 1.38624062,15.2446584 L1.39066918,15.24915 Z" id="Path"></path>
44
+ <path d="M27.1515841,2.27277465 C25.5617322,2.81626424 24.9240201,3.93019331 25.2517333,4.9183562 C25.5794465,5.91101074 26.7574426,6.40060054 28.3428659,5.85711095 C29.9327178,5.31362136 31,2.95101372 31,2.95101372 C31,2.95101372 28.7370075,1.72928506 27.1515841,2.268283 L27.1515841,2.27277465 Z" id="Path"></path>
45
+ <path d="M23.7991666,6.02330198 C22.2713145,5.32260466 21.0534614,5.69541156 20.62832,6.64764126 C20.2031785,7.59987095 20.7346053,8.77219147 22.2580289,9.47288879 C23.785881,10.1735861 26.1551589,9.18093158 26.1551589,9.18093158 C26.1551589,9.18093158 25.3225902,6.71950765 23.7947381,6.02330198 L23.7991666,6.02330198 Z" id="Path"></path>
46
+ <path d="M18.8568972,7.79750353 C17.3290451,7.09680621 16.111192,7.46961312 15.6860506,8.42184281 C15.2609091,9.3740725 15.7923359,10.546393 17.3157595,11.2470903 C18.8436116,11.9477877 21.2128895,10.9551331 21.2128895,10.9551331 C21.2128895,10.9551331 20.3803208,8.4937092 18.8524687,7.79750353 L18.8568972,7.79750353 Z" id="Path"></path>
47
+ <path d="M14.592197,10.1151947 C13.0643449,9.41449735 11.8464918,9.78730426 11.4213503,10.739534 C10.9962089,11.6917636 11.5276357,12.8640842 13.0510593,13.5647815 C14.5789114,14.2654788 16.9481892,13.2728243 16.9481892,13.2728243 C16.9481892,13.2728243 16.1156206,10.8114003 14.5877685,10.1151947 L14.592197,10.1151947 Z" id="Path"></path>
48
+ <path d="M10.9342091,13.2054495 C9.406357,12.5047522 8.18850388,12.8775591 7.76336243,13.8297888 C7.33822097,14.7820185 7.86964779,15.954339 9.39307133,16.6550363 C10.9209234,17.3557337 13.2902013,16.3630791 13.2902013,16.3630791 C13.2902013,16.3630791 12.4576326,13.9016552 10.9297805,13.2054495 L10.9342091,13.2054495 Z" id="Path"></path>
49
+ <path d="M7.86964779,16.7852942 C6.34179569,16.0845969 5.12394257,16.4574038 4.69880111,17.4096335 C4.27365966,18.3618632 4.80508648,19.5341837 6.32851002,20.234881 C7.85636212,20.9355783 10.22564,19.9429238 10.22564,19.9429238 C10.22564,19.9429238 9.39307133,17.4814999 7.86521923,16.7852942 L7.86964779,16.7852942 Z" id="Path"></path>
50
+ </g>
51
+ <path d="M69.9135227,28 L140.086477,28 C141.144068,28 142,28.850578 142,29.9015539 L142,120.098446 C142,121.149422 141.144068,122 140.086477,122 L69.9135227,122 C68.8559317,122 68,121.149422 68,120.098446 L68,29.9015539 C68,28.850578 68.8559317,28 69.9135227,28 Z" id="Path" fill="#414A59"></path>
52
+ <rect id="Rectangle" fill="#FFFFFF" x="71" y="32" width="67" height="87"></rect>
53
+ <g id="Group" transform="translate(82.000000, 40.000000)" fill="#E5E5E5">
54
+ <g>
55
+ <rect id="Rectangle" x="0" y="6.49645752" width="47" height="1.69783622" rx="0.848918108"></rect>
56
+ <path d="M46.1601618,12.3763324 L0.839838239,12.3763324 C0.375717107,12.3763324 0,11.9965533 0,11.5274143 L0,11.5274143 C0,11.0582754 0.375717107,10.6784962 0.839838239,10.6784962 L46.1601618,10.6784962 C46.6242829,10.6784962 47,11.0582754 47,11.5274143 L47,11.5274143 C47,11.9965533 46.6242829,12.3763324 46.1601618,12.3763324 Z" id="Path"></path>
57
+ <path d="M31.9978369,1.69783622 L15.0065833,1.69783622 C14.5424621,1.69783622 14.166745,1.31805706 14.166745,0.848918108 L14.166745,0.848918108 C14.166745,0.379779154 14.5424621,0 15.0065833,0 L31.9978369,0 C32.4619581,0 32.8376752,0.379779154 32.8376752,0.848918108 L32.8376752,0.848918108 C32.8376752,1.31805706 32.4619581,1.69783622 31.9978369,1.69783622 Z" id="Path"></path>
58
+ <rect id="Rectangle" x="0" y="14.8605349" width="37.2799774" height="1.69783622" rx="0.848918108"></rect>
59
+ <rect id="Rectangle" x="0" y="19.0470416" width="47" height="1.69783622" rx="0.848918108"></rect>
60
+ </g>
61
+ <g transform="translate(0.000000, 25.391587)" id="Rectangle">
62
+ <rect x="0" y="0" width="30.2076554" height="1.69783622" rx="0.848918108"></rect>
63
+ <rect x="37.2799774" y="0" width="9.72002257" height="1.69783622" rx="0.848918108"></rect>
64
+ <rect x="0" y="4.18203868" width="47" height="1.69783622" rx="0.848918108"></rect>
65
+ </g>
66
+ <g transform="translate(0.000000, 44.657560)" id="Rectangle">
67
+ <rect x="0" y="0" width="30.2076554" height="1.69783622" rx="0.848918108"></rect>
68
+ <rect x="37.2799774" y="0" width="9.72002257" height="1.69783622" rx="0.848918108"></rect>
69
+ <rect x="0" y="4.18203868" width="47" height="1.69783622" rx="0.848918108"></rect>
70
+ </g>
71
+ <g transform="translate(0.000000, 35.024574)" id="Rectangle">
72
+ <rect x="16.7923446" y="4.18203868" width="30.2076554" height="1.69783622" rx="0.848918108"></rect>
73
+ <rect x="0" y="4.18203868" width="9.72002257" height="1.69783622" rx="0.848918108"></rect>
74
+ <rect x="0" y="0" width="47" height="1.69783622" rx="0.848918108"></rect>
75
+ </g>
76
+ <g transform="translate(0.000000, 55.751580)" id="Path">
77
+ <path d="M1.37468259,1.69783622 L45.6253174,1.69783622 C46.385592,1.69783622 47,1.31805706 47,0.848918108 L47,0.848918108 C47,0.379779154 46.385592,0 45.6253174,0 L1.37468259,0 C0.614407975,0 0,0.379779154 0,0.848918108 L0,0.848918108 C0,1.31805706 0.614407975,1.69783622 1.37468259,1.69783622 Z"></path>
78
+ <path d="M1.37468259,5.88434289 L45.6253174,5.88434289 C46.385592,5.88434289 47,5.50456373 47,5.03542478 L47,5.03542478 C47,4.56628582 46.385592,4.18650667 45.6253174,4.18650667 L1.37468259,4.18650667 C0.614407975,4.18650667 0,4.56628582 0,5.03542478 L0,5.03542478 C0,5.50456373 0.614407975,5.88434289 1.37468259,5.88434289 Z"></path>
79
+ <path d="M22.8347597,10.0663816 L45.6253174,10.0663816 C46.385592,10.0663816 47,9.68660241 47,9.21746346 L47,9.21746346 C47,8.7483245 46.385592,8.36854535 45.6253174,8.36854535 L22.8347597,8.36854535 C22.0744851,8.36854535 21.4600771,8.7483245 21.4600771,9.21746346 L21.4600771,9.21746346 C21.4600771,9.68660241 22.0744851,10.0663816 22.8347597,10.0663816 Z"></path>
80
+ <path d="M22.8347597,14.2484202 L45.6253174,14.2484202 C46.385592,14.2484202 47,13.8686411 47,13.3995021 L47,13.3995021 C47,12.9303632 46.385592,12.550584 45.6253174,12.550584 L22.8347597,12.550584 C22.0744851,12.550584 21.4600771,12.9303632 21.4600771,13.3995021 L21.4600771,13.3995021 C21.4600771,13.8686411 22.0744851,14.2484202 22.8347597,14.2484202 Z"></path>
81
+ </g>
82
+ </g>
83
+ <path d="M107,23.5 C107,24.8841808 105.879473,26 104.5,26 C103.120527,26 102,24.8794727 102,23.5 C102,22.1205273 103.120527,21 104.5,21 C105.879473,21 107,22.1205273 107,23.5 Z" id="Path" fill="#FFFFFF"></path>
84
+ <g id="Group" transform="translate(4.000000, 55.939667)" fill="#C2EBFF">
85
+ <path d="M2.93251152,0.852687558 L3.1881558,0.845135567 C4.19439556,0.815410223 5.03421121,1.60703157 5.06393656,2.61327133 C5.06501135,2.64965454 5.06499609,2.68606177 5.06389078,2.72244406 L5.05946074,2.86826367 C5.02893766,3.87296381 4.22116579,4.68005863 3.2164404,4.70973923 L2.96079613,4.71729123 C1.95455637,4.74701657 1.11474071,3.95539522 1.08501537,2.94915546 C1.08394057,2.91277226 1.08395584,2.87636502 1.08506114,2.83998273 L1.08949119,2.69416312 C1.12001427,1.68946298 1.92778614,0.882368165 2.93251152,0.852687558 Z" id="Rectangle" transform="translate(3.074476, 2.781213) rotate(32.470000) translate(-3.074476, -2.781213) "></path>
86
+ <path d="M5.92505754,7.55668777 C6.105641,7.90807732 5.94881852,8.32618641 5.573395,8.49520923 C5.19797148,8.66423205 4.75126502,8.51744907 4.57068156,8.16605952 C4.3900981,7.81466997 4.54692058,7.39656089 4.92234409,7.22753807 C5.29776761,7.05851525 5.74447407,7.20529822 5.92505754,7.55668777 Z" id="Path"></path>
87
+ <path d="M2.71257276,14.1441298 C3.0547309,14.8068772 2.75534253,15.6075116 2.04726526,15.9277654 C1.339188,16.2480192 0.483792646,15.9677971 0.141634505,15.3050497 C-0.200523637,14.6423024 0.0988647369,13.8416679 0.806942002,13.5214142 C1.51501927,13.2011604 2.37041462,13.4813825 2.71257276,14.1441298 Z" id="Path"></path>
88
+ </g>
89
+ <g id="Group" transform="translate(20.000000, 61.000000)">
90
+ <g>
91
+ <path d="M9.8410596,9.33125285 C9.8410596,9.33125285 13.4701987,9.88611482 13.9116998,14.0764325 C14.3532009,18.2667501 14.8918322,28.9334167 14.8918322,28.9334167 C14.8918322,28.9334167 15.0198675,32.1072272 12.2384106,33.438896 L9.39514349,23.4069914 L9.83664459,9.33125285 L9.8410596,9.33125285 Z" id="Path" fill="#3B4956"></path>
92
+ <path d="M9.8410596,9.33125285 C9.8410596,9.33125285 12.8565121,9.75738685 13.7704194,13.2197256 C13.7704194,13.2197256 15.1434879,17.077126 14.6225166,22.3150231 C14.6225166,22.3150231 15.4746137,10.5253158 9.98233996,10.1435708 L9.8410596,9.33569175 L9.8410596,9.33125285 Z" id="Path" fill="#3B4956"></path>
93
+ <rect id="Rectangle" fill="#FE9E80" x="10.397351" y="57.1736718" width="1.64238411" height="2.18837563"></rect>
94
+ <path d="M7.11258278,31.0995979 L10.8653422,43.8614233 L10.1059603,59.8725205 L12.0838852,59.9479817 L15.0286976,43.6705508 C15.0286976,43.6705508 13.5143488,28.3741158 11.6203091,25.5776115 L5.68653422,26.3411016 L7.11258278,31.0995979 L7.11258278,31.0995979 Z" id="Path" fill="#062E5B"></path>
95
+ <rect id="Rectangle" fill="#FE9E80" x="3.22295806" y="57.1736718" width="1.64238411" height="2.18837563"></rect>
96
+ <path d="M2.6401766,23.0873909 C2.6401766,23.0873909 -0.136865342,21.0233044 3.200883,58.8471355 L4.92715232,59.1001526 L8.24724062,24.5122765 L2.6401766,23.0873909 L2.6401766,23.0873909 Z" id="Path" fill="#062E5B"></path>
97
+ <path d="M1.94701987,15.4125401 C1.94701987,15.4125401 0.812362031,12.1277572 2.89624724,10.6984328 C4.98013245,9.26910831 10.9845475,9.14481923 12.781457,11.8081567 C14.4415011,14.267305 13.5011038,24.3302818 13.1258278,28.9955613 C13.1258278,28.9955613 7.19205298,30.32723 1.50993377,28.6138162 C1.50993377,28.6138162 2.90066225,23.3137746 1.95143488,15.4081012 L1.94701987,15.4125401 Z" id="Path" fill="#FFFFFF"></path>
98
+ <g transform="translate(6.374388, 0.081227)" id="Path">
99
+ <path d="M3.61236745,6.60888275 C3.61236745,6.60888275 3.31656171,8.36668548 4.01413346,10.2487773 C4.82649549,12.4415918 0.61898997,12.0687246 0.0891886455,10.8968561 C0.0891886455,10.8968561 -0.180127028,10.5284277 0.217223966,9.82264331 C0.610159948,9.11685887 1.45342706,6.24489329 0.504199683,4.69571865 L3.61236745,6.60444385 L3.61236745,6.60888275 Z" fill="#FE9E80"></path>
100
+ <path d="M0.870645599,5.71222579 C0.848570544,5.6012534 0.826495489,5.490281 0.795590411,5.3837475 L3.59912242,6.72429404 C3.56821734,6.95955551 3.51965222,7.54992866 3.58587739,8.30897984 C2.10243368,7.62095099 1.2326765,6.34698789 0.870645599,5.71222579 Z" fill="#F0736D"></path>
101
+ <path d="M5.9920584,4.14529558 C5.60353743,6.16943206 4.2702041,7.6120732 3.02075597,7.36793393 C1.76689284,7.12379466 0.221638977,4.88659117 0.614574959,2.86245469 C1.00751094,0.838318202 3.17969637,-0.209261208 4.43355951,0.0348780613 C5.68742264,0.27901733 6.38499438,2.11672019 5.99647341,4.14085668 L5.9920584,4.14529558 Z" fill="#FE9E80"></path>
102
+ </g>
103
+ <path d="M13.2362031,2.20682509 C13.2362031,2.20682509 13.218543,3.36093799 9.00220751,1.85615232 C9.00220751,1.85615232 7.85871965,1.46552949 8.13686534,4.23983936 L7.8013245,4.6260233 C7.8013245,4.6260233 7.77041943,3.47191039 7.29801325,3.68497739 C6.82560706,3.89804439 6.93156733,4.40407851 7.36423841,5.45609681 C7.36423841,5.45609681 7.41721854,6.2062702 7.27152318,6.45928726 C7.27152318,6.45928726 5.83664459,6.79220445 6.57836645,5.0477184 C6.57836645,5.0477184 4.20750552,0.631017075 7.63355408,0.355805535 C7.63355408,0.355805535 12.3399558,-1.20224689 13.2362031,2.20238619 L13.2362031,2.20682509 Z" id="Path" fill="#282F39"></path>
104
+ <path d="M6.75055188,9.3800807 C6.75055188,9.3800807 8.07505519,11.7282566 7.3200883,17.8850051 L6.43708609,27.5662368 C6.43708609,27.5662368 6.38852097,32.2315163 3.02869757,32.5644335 L0,32.5644335 C0,32.5644335 1.70419426,20.6770705 1.58057395,13.756832 C1.58057395,13.756832 1.26269316,9.18476929 6.7593819,9.37564181 L6.75055188,9.3800807 Z" id="Path" fill="#3B4956"></path>
105
+ <path d="M6.75055188,9.3800807 C6.75055188,9.3800807 8.20309051,11.9191291 7.3200883,17.8850051 L6.8785872,22.8343739 C6.8785872,22.8343739 6.81677704,11.328756 4.77704194,9.47329752 C4.77704194,9.47329752 6.02207506,9.23359714 6.75055188,9.3800807 Z" id="Path" fill="#282F39"></path>
106
+ <path d="M10,14.1430159 C9.598234,14.0453602 9.29801325,13.6858096 9.29801325,13.2507978 C9.29801325,12.7403248 9.70860927,12.3319464 10.2119205,12.3319464 C10.7152318,12.3319464 11.1258278,12.7447637 11.1258278,13.2507978 C11.1258278,13.4638648 11.0507726,13.6547374 10.9315673,13.8145376 C11.2317881,14.6890001 11.8233996,17.077126 11.5717439,21.8666946 L10.5386313,22.7722293 L9.36865342,21.8311834 C9.36865342,21.8311834 10.3311258,16.4956307 9.99558499,14.1430159 L10,14.1430159 Z" id="Path" fill="#64C4FF"></path>
107
+ <polygon id="Path" fill="#FFFFFF" points="10.0573951 12.2831186 9.3200883 14.4049108 8.39735099 13.6636152 8.86975717 12.5006245 9.77041943 12.0700516"></polygon>
108
+ <path d="M9.96909492,12.349702 L11.2935982,13.5881539 L11.7969095,12.860175 C11.7969095,12.860175 11.4966887,12.2254129 11.214128,12.1943406 C10.9315673,12.1632684 10.1236203,12.1144405 10.1236203,12.1144405 L9.96467991,12.3541409 L9.96909492,12.349702 Z" id="Path" fill="#FFFFFF"></path>
109
+ <path d="M11.1434879,22.9453463 C11.3863135,23.6422529 12.1412804,24.0062424 12.8344371,23.766542 C13.5275938,23.5224027 13.8896247,22.7633516 13.6512141,22.0664449 C13.4083885,21.3695383 12.6534216,21.0055488 11.9602649,21.2452492 C11.2671082,21.4893885 10.9050773,22.2484396 11.1434879,22.9453463 Z" id="Path" fill="#FE9E80"></path>
110
+ <polygon id="Path" fill="#3B4956" points="2.30463576 12.988903 1.34657837 24.9384105 11.3863135 23.682203 11.187638 21.5914831 4.7593819 21.4583162 5.1611479 15.7454573"></polygon>
111
+ <g transform="translate(11.395143, 6.710623)">
112
+ <path d="M0.348785872,2.50521853 C-0.0529801325,3.18880848 0.799116998,3.56611462 1.49227373,3.51284787 C2.18543046,3.45958112 2.59161148,2.56736307 2.53863135,1.87045643 C2.48565121,1.17354979 1.2803532,-0.051585456 0.587196468,0.00168129364 C-0.105960265,0.0549480433 1.22737307,1.00931064 0.348785872,2.50077963 L0.348785872,2.50521853 Z" id="Path" fill="#FE9E80"></path>
113
+ <polygon id="Rectangle" fill="#FE9E80" transform="translate(1.162557, 3.583125) rotate(167.890000) translate(-1.162557, -3.583125) " points="0.472204732 2.89380735 1.85443221 2.89227388 1.85290854 4.27244355 0.470681062 4.27397702"></polygon>
114
+ <path d="M2.00883002,3.55723683 L4.36644592,14.2816091 C4.36644592,14.2816091 4.82560706,15.9950229 3.78807947,16.5099348 C2.75055188,17.0248467 1.17880795,16.8384131 1.13465784,14.8897378 L0,3.77918162 L2.01324503,3.55723683 L2.00883002,3.55723683 Z" id="Path" fill="#3B4956"></path>
115
+ </g>
116
+ <polygon id="Path" fill="#282F39" points="6.74172185 24.2548205 2.93156733 24.405743 1.88962472 15.1728397 1.55408389 25.8838953 6.62251656 25.6441949"></polygon>
117
+ <path d="M6.98896247,21.5027051 L5.48344371,21.5027051 C5.48344371,21.5027051 6.90507726,13.6946874 4.77262693,9.47329752 C4.77262693,9.47329752 6.08388521,9.1714526 6.74613687,9.3800807 C6.74613687,9.3800807 7.74392936,18.0758776 6.98896247,21.5027051 Z" id="Path" fill="#282F39"></path>
118
+ </g>
119
+ <path d="M10.384106,58.2700791 C10.384106,58.2700791 9.37306843,59.4774587 10.2560706,61 L16,61 C16,61 15.9381898,59.0024969 12.781457,59.4774587 L12.1236203,58.7317242 C12.1236203,58.7317242 10.9183223,59.508531 10.384106,58.2700791 L10.384106,58.2700791 Z" id="Path" fill="#282F39"></path>
120
+ <path d="M3.20971302,58.2700791 C3.20971302,58.2700791 2.1986755,59.4774587 3.0816777,61 L8.82560706,61 C8.82560706,61 8.76379691,59.0024969 5.60706402,59.4774587 L4.94922737,58.7317242 C4.94922737,58.7317242 3.74392936,59.508531 3.20971302,58.2700791 L3.20971302,58.2700791 Z" id="Path" fill="#282F39"></path>
121
+ </g>
122
+ <g id="Group" transform="translate(44.000000, 59.000000)">
123
+ <g transform="translate(0.000000, 10.153651)">
124
+ <g transform="translate(3.686949, 13.722670)" fill="#FE9E80">
125
+ <polygon id="Rectangle" transform="translate(0.850467, 0.947390) rotate(-29.400000) translate(-0.850467, -0.947390) " points="0.317943382 0.160015062 1.36739467 0.170352929 1.38299137 1.73476414 0.333540078 1.72442627"></polygon>
126
+ <path d="M0.644272177,2.69879007 C0.35980637,2.20117005 0.538744539,1.57354121 1.04344194,1.29559129 C1.5527275,1.01764137 2.19506964,1.19248084 2.47953545,1.68561779 C2.76400126,2.1832378 2.58506309,2.81086665 2.08036569,3.08881656 C1.57108013,3.36676648 0.928737985,3.19192702 0.644272177,2.69879007 Z" id="Path"></path>
127
+ </g>
128
+ <polygon id="Path" fill="#1F4C72" points="7.65304785 3.35781433 2.48678173 7.83191139 5.16167795 14.3592514 3.91369893 14.9106682 0 7.63913967 6.34083461 0"></polygon>
129
+ </g>
130
+ <g transform="translate(13.346952, 10.826111)">
131
+ <g transform="translate(1.351316, 13.726786)" fill="#FE9E80">
132
+ <polygon id="Rectangle" transform="translate(1.767504, 0.947390) rotate(-150.600000) translate(-1.767504, -0.947390) " points="1.25057627 0.170352929 2.30002756 0.160015062 2.28443086 1.72442627 1.23497957 1.73476414"></polygon>
133
+ <path d="M1.97051012,2.69019134 C2.25497592,2.19257132 2.07603776,1.56494248 1.57134036,1.28699256 C1.06664296,1.00904264 0.419712652,1.1838821 0.135246844,1.67701906 C-0.149218963,2.17463907 0.0297192063,2.80226791 0.534416606,3.08021783 C1.03911401,3.35816775 1.68604431,3.18332829 1.97051012,2.69019134 Z" id="Path"></path>
134
+ </g>
135
+ <polygon id="Path" fill="#1F4C72" points="0 3.35781433 5.16626611 7.83191139 2.48678173 14.3592514 3.73934892 14.9061851 7.65304785 7.63913967 1.31221324 0"></polygon>
136
+ </g>
137
+ <path d="M12.5761416,2.01240841 C12.3972034,2.0751713 12.2228534,2.15138337 12.0576797,2.24104463 C10.3279441,3.16455565 9.27266769,5.08778976 8.70373607,6.86756584 C8.36880052,7.92108569 8.26327289,9.06874987 8.58444396,10.1222697 C8.90561503,11.1757896 9.70395456,12.126199 10.7729954,12.4758779 C11.8420363,12.8255568 13.1588377,12.480361 13.7736509,11.561333 C14.2370548,10.8619751 14.2737601,9.95191332 14.764693,9.27048771 C15.1822154,8.69217256 15.9209089,8.26179849 15.9622023,7.55795757 C15.9943194,6.99757468 15.5446799,6.51788691 15.4620931,5.96198708 C15.3519773,5.23573084 15.8842036,4.5587883 15.9163207,3.828049 C15.9576142,2.99868231 15.315272,2.22759545 14.5123443,1.95412859 C13.8883548,1.74342462 13.2001311,1.79273832 12.5761416,2.01689148 L12.5761416,2.01240841 Z" id="Path" fill="#81CAE3"></path>
138
+ <g transform="translate(3.980125, 57.660672)" id="Path">
139
+ <path d="M0.36027273,2.22359934 L0.649326696,1.87840348 L0.603445114,0 L1.91565835,0 L1.72754387,1.80667446 C1.72754387,1.80667446 3.31963476,2.6674226 3.2049308,4.72066554 L2.40659128,4.80584374 C2.40659128,4.80584374 0.938380661,2.30877754 0.36027273,2.21911628 L0.36027273,2.22359934 Z" fill="#FE9E80"></path>
140
+ <path d="M0.36027273,2.22359934 C0.36027273,2.22359934 -0.360068104,2.86467738 0.236392459,3.65817956 L0.61262143,5.33932825 L1.02096751,5.33932825 L1.33296226,3.75232389 C1.33296226,3.75232389 2.02118599,3.81508677 1.92483467,5.33932825 L4.08126902,5.33932825 C4.08126902,5.33932825 4.42538088,4.94033563 3.17740185,4.54582607 L2.52129523,4.42478336 C2.52129523,4.42478336 1.8009544,2.56431214 0.364860888,2.2280824 L0.36027273,2.22359934 Z" fill="#282F39"></path>
141
+ </g>
142
+ <g transform="translate(12.229633, 57.660672)" id="Path">
143
+ <path d="M0.36027273,2.22359934 L0.649326696,1.87840348 L0.603445114,0 L1.91565835,0 L1.72754387,1.80667446 C1.72754387,1.80667446 3.31963476,2.6674226 3.2049308,4.72066554 L2.40659128,4.80584374 C2.40659128,4.80584374 0.938380661,2.30877754 0.36027273,2.21911628 L0.36027273,2.22359934 Z" fill="#FE9E80"></path>
144
+ <path d="M0.36027273,2.22359934 C0.36027273,2.22359934 -0.360068104,2.86467738 0.236392459,3.65817956 L0.61262143,5.33932825 L1.02096751,5.33932825 L1.33296226,3.75232389 C1.33296226,3.75232389 2.02118599,3.81508677 1.92483467,5.33932825 L4.08126902,5.33932825 C4.08126902,5.33932825 4.42538088,4.94033563 3.17740185,4.54582607 L2.52129523,4.42478336 C2.52129523,4.42478336 1.8009544,2.56431214 0.364860888,2.2280824 L0.36027273,2.22359934 Z" fill="#282F39"></path>
145
+ </g>
146
+ <path d="M6.31330566,24.0870115 C6.31330566,24.0870115 3.8953463,20.6350529 4.4872187,58.8666157 L6.02883985,58.8666157 L11.1584007,25.6695328 L6.31330566,24.0870115 L6.31330566,24.0870115 Z" id="Path" fill="#BEDAFC"></path>
147
+ <path d="M8.96067293,24.7639541 C8.96067293,24.7639541 8.82761634,26.1716359 12.617435,58.8710988 L14.2278785,58.8710988 L15.6456194,24.6698098 L8.96067293,24.7639541 Z" id="Path" fill="#BEDAFC"></path>
148
+ <path d="M9.60760323,10.6961018 C8.89185056,10.7364494 8.1852742,10.8664582 7.50622679,11.0906114 C6.80882674,11.3192476 5.85448984,11.843766 5.72602141,12.6103698 C5.56543588,13.5562961 5.9141359,14.3946289 6.30412934,15.2419279 C6.77670964,16.2730324 7.15293861,17.2413741 7.48787415,18.3217923 C7.8228097,19.4022105 7.85492681,20.6485021 7.21717282,21.5899453 C6.66200568,22.4103459 5.859078,22.9931441 5.7168451,23.9659688 C5.63425825,24.5218687 6.06554512,25.252608 7.59340179,26.0819747 C8.85514529,26.7634003 10.2728862,26.7813325 11.718156,26.7813325 C14.154468,26.7813325 15.3290365,26.0864577 15.5905615,25.4139982 C15.9071444,24.6070469 15.7052655,23.696985 15.402447,22.8810675 C15.0996286,22.0696331 14.6958707,21.2761309 14.5995193,20.4153828 C14.3471706,18.1738512 16.2191392,15.963701 15.5630326,13.7983815 C15.1730391,12.4982932 13.9342364,11.5927144 12.6357876,11.1309589 C11.6676863,10.7857631 10.6261744,10.6467881 9.59842692,10.7005849 L9.60760323,10.6961018 Z" id="Path" fill="#1F4C72"></path>
149
+ <g transform="translate(9.592915, 1.537204)" id="Path">
150
+ <path d="M2.94193266,6.73356091 C2.94193266,6.73356091 2.31794315,8.35642978 3.6072156,10.3513929 C4.89648805,12.346356 0.643265412,12.2970423 0.0926864304,11.1179967 C0.0926864304,11.1179967 -0.187191219,10.7459025 0.225743018,10.0375785 C0.634089096,9.32477143 1.50583915,6.43767874 0.5239733,4.87757275 L2.94193266,6.73356091 L2.94193266,6.73356091 Z" fill="#FE9E80"></path>
151
+ <path d="M0.817615423,5.5769306 C0.817615423,5.5769306 1.35901809,6.7828746 2.78593528,7.71983481 C2.78593528,7.71983481 2.7951116,7.27601155 2.88228661,6.98012938 L0.817615423,5.5769306 Z" fill="#F0736D"></path>
152
+ <path d="M5.48377229,3.5685183 C5.48377229,5.5410661 4.46520118,7.14151966 3.20804584,7.14151966 C1.95089049,7.14151966 0.0422166904,5.32587907 0.0422166904,3.35333126 C0.0422166904,1.38078346 1.95089049,0 3.20804584,0 C4.46520118,0 5.48377229,1.60045356 5.48377229,3.57300136 L5.48377229,3.5685183 Z" fill="#FE9E80"></path>
153
+ </g>
154
+ <path d="M14.2278785,1.64479723 C14.2324667,1.71204318 14.2370548,1.77928913 14.2278785,1.84653507 C14.1636443,2.86867348 13.0900153,3.50078539 12.1494429,3.95357477 C11.2088704,4.40636415 10.1352414,5.05192525 10.0893598,6.07406366 C10.0618309,6.73755701 10.4931178,7.32932135 10.731702,7.95246713 C11.167577,9.10461437 10.8464059,10.4674656 10.0205375,11.3730443 C9.26349137,12.197928 8.24492025,13.5338808 7.00611754,13.5518131 C6.07930959,13.5652622 5.17544243,12.9421165 4.87721215,12.0813683 C4.51474765,11.0457807 4.9919161,9.91604881 5.57920035,8.98357167 C6.1664846,8.05109452 6.89141359,7.15448189 7.08870439,6.07854672 C7.24470177,5.23124778 7.05199913,4.33911821 7.27223072,3.50078539 C7.56128468,2.42036716 8.49726895,1.62686498 9.4470177,0.999236132 C10.2866506,0.44781936 11.2409875,-0.0498006533 12.2503823,0.00399610494 C13.1909548,0.0533098 14.1452917,0.748184594 14.2278785,1.64031417 L14.2278785,1.64479723 Z" id="Path" fill="#81CAE3"></path>
155
+ <path d="M5.31767533,9.97432863 C4.80838977,10.8395598 4.7946253,11.9648087 5.27638191,12.8434891 C5.76272668,13.7221695 6.73082805,14.327383 7.74939917,14.3901459 C8.34585973,14.4260104 8.93314398,14.2915185 9.52960454,14.2466878 C10.2453572,14.1928911 10.9702862,14.2780693 11.6860389,14.2691032 C12.6266113,14.2511709 13.5809482,14.0628823 14.3838759,13.5831945 C15.1868036,13.1035067 15.8199694,12.3144876 15.9667905,11.4089089 C16.0723181,10.7498986 15.9254971,10.0774391 16.0264365,9.4184288 C16.154905,8.56664679 16.6733668,7.62968658 16.1778458,6.91239648 C16.0218484,6.68376025 15.778676,6.52236998 15.6135023,6.30269988 C15.1179812,5.65265572 15.3795062,4.73362777 15.2143325,3.94012558 C14.9711601,2.77901222 14.328818,1.73894156 13.1313087,1.56858516 C11.9337994,1.39374569 10.181123,1.96309472 9.0294953,2.32173977 C8.12103998,2.60417275 7.68516496,7.871772 6.07472143,9.27048771 C5.72143325,9.43636105 5.45073192,9.7591416 5.3543806,10.1312358 L5.31767533,9.97881169 L5.31767533,9.97432863 Z" id="Path" fill="#81CAE3"></path>
156
+ <polygon id="Path" fill="#9DC5ED" points="6.02425169 58.8710988 9.84618746 34.191836 9.09372952 28.5969731"></polygon>
157
+ </g>
158
+ <g id="Group" transform="translate(0.000000, 30.000000)" fill="#B1D8E5">
159
+ <path d="M8.05217391,11.3478261 C7.93478261,11.3478261 7.82173913,11.3 7.73913043,11.2173913 L5.83913043,9.3173913 C5.66521739,9.14347826 5.66521739,8.86086957 5.83913043,8.68695652 C5.92173913,8.60434783 6.03478261,8.55652174 6.15217391,8.55652174 C6.26956522,8.55652174 6.3826087,8.60434783 6.46521739,8.68695652 L7.69565217,9.9173913 C7.79130435,10.0130435 7.9173913,10.0652174 8.05217391,10.0652174 C8.18695652,10.0652174 8.31304348,10.0130435 8.40869565,9.9173913 L11.5391304,6.78695652 C11.6217391,6.70434783 11.7347826,6.65652174 11.8521739,6.65652174 C11.9695652,6.65652174 12.0826087,6.70434783 12.1652174,6.78695652 C12.3391304,6.96086957 12.3391304,7.24347826 12.1652174,7.4173913 L8.36086957,11.2217391 C8.27826087,11.3043478 8.16521739,11.3521739 8.04782609,11.3521739 L8.05217391,11.3478261 Z" id="Path"></path>
160
+ <path d="M9,18 C4.03478261,18 0,13.9608696 0,9 C0,4.03913043 4.03913043,0 9,0 C13.9608696,0 18,4.03913043 18,9 C18,13.9608696 13.9608696,18 9,18 Z M9,0.886956522 C4.52608696,0.886956522 0.891304348,4.52608696 0.891304348,8.99565217 C0.891304348,13.4652174 4.53043478,17.1043478 9,17.1043478 C13.4695652,17.1043478 17.1086957,13.4652174 17.1086957,8.99565217 C17.1086957,4.52608696 13.4695652,0.886956522 9,0.886956522 Z" id="Shape"></path>
161
+ </g>
162
+ <g id="Group" transform="translate(161.000000, 15.000000)" fill="#B1D8E5">
163
+ <path d="M15.0100881,14.8700481 C13.4369646,14.8700481 11.9616058,14.2569419 10.8506429,13.1462421 C9.73968001,12.0355424 9.13087233,10.5605331 9.13087233,8.9877823 C9.13087233,7.41503147 9.74412386,5.93557942 10.8506429,4.82932247 C11.9616058,3.71862273 13.4369646,3.10995927 15.0100881,3.10995927 C16.5832116,3.10995927 18.0630142,3.72306553 19.1695332,4.82932247 C20.2804962,5.94002221 20.8937477,7.41947427 20.8937477,8.9877823 C20.8937477,10.5560903 20.2804962,12.0355424 19.1695332,13.1462421 C18.0585703,14.2569419 16.5832116,14.8700481 15.0100881,14.8700481 Z M15.0100881,3.96297668 C13.663601,3.96297668 12.4015472,4.48278415 11.4550067,5.43354313 C10.5040225,6.38430211 9.98409185,7.64605702 9.98409185,8.9877823 C9.98409185,10.3295076 10.5084663,11.5912625 11.4550067,12.5420215 C12.405991,13.4927805 13.6680449,14.0125879 15.0100881,14.0125879 C16.3521313,14.0125879 17.6141852,13.4883377 18.5651694,12.5420215 C19.5161537,11.5912625 20.0360843,10.3295076 20.0360843,8.9877823 C20.0360843,7.64605702 19.5117098,6.38430211 18.5651694,5.43354313 C17.618629,4.48722695 16.3565751,3.96297668 15.0100881,3.96297668 Z" id="Shape"></path>
164
+ <path d="M2.10514284,23.9955572 C1.54966139,23.9955572 1.02084304,23.7734173 0.620896388,23.3735653 C-0.183440763,22.5694187 -0.210103873,21.2854498 0.563126316,20.50796 L7.0644813,14.0081451 L7.14002678,13.9637171 C7.29111774,13.8659756 7.34000011,13.6616068 7.24667922,13.5061088 C5.19361975,9.97852647 5.77132047,5.50907071 8.65093635,2.63013699 C10.3440438,0.937430581 12.6059643,0 15.0100881,0 C17.4142118,0 19.6716885,0.932987782 21.3692398,2.63013699 C23.0667912,4.32728619 24,6.58422806 24,8.9877823 C24,11.3913365 23.0667912,13.6482784 21.3692398,15.3454276 C19.6761323,17.0425768 17.4142118,17.9755646 15.0100881,17.9755646 C13.4325207,17.9755646 11.868285,17.5534987 10.4862471,16.7493521 C10.4329209,16.7182525 10.3751508,16.7049241 10.3129369,16.7049241 C10.1973967,16.7049241 10.0907443,16.7626805 10.0285304,16.8559793 C10.0151988,16.8781933 10.0018673,16.8959645 9.9885357,16.9181785 L3.48273686,23.4313217 C3.11834102,23.7956312 2.62507349,24 2.10069899,24 L2.10514284,23.9955572 Z M5.82909054,16.6027397 C5.73576965,16.6027397 5.65133647,16.6382821 5.58912255,16.7049241 L1.17637785,21.1166235 C0.736436531,21.5564606 0.763099641,22.298408 1.23414792,22.7693447 C1.4652282,23.0003702 1.78518552,23.1336542 2.11403055,23.1336542 C2.41176861,23.1336542 2.68728741,23.0225842 2.88726074,22.8271011 L7.30444929,18.4154017 C7.36666322,18.3532025 7.40665788,18.2643465 7.40665788,18.1754906 C7.40665788,18.0866346 7.37110707,17.9977786 7.30444929,17.9355794 L6.08239008,16.7138097 C6.01573231,16.6471677 5.93129913,16.6116253 5.84242209,16.6116253 L5.82909054,16.6027397 Z M7.82882379,14.6034802 C7.73994676,14.6034802 7.65106972,14.6390226 7.5888558,14.7056646 L6.67786621,15.6164384 C6.61565228,15.6786375 6.57565762,15.7674935 6.57565762,15.8563495 C6.57565762,15.9452055 6.61120843,16.0340615 6.67786621,16.0962606 L7.89992542,17.3180304 C7.96658319,17.3846723 8.05101637,17.4202147 8.13989341,17.4202147 C8.22877044,17.4202147 8.31764747,17.3846723 8.3798614,17.3180304 L9.29085099,16.4072566 C9.35750876,16.3406146 9.39305958,16.2473158 9.38861572,16.1495742 C9.38417187,16.0518327 9.33973336,15.9629767 9.26418788,15.9007775 C9.02421989,15.7008515 8.82424656,15.5186968 8.6464925,15.3409848 C8.46873843,15.1632729 8.29098436,14.9677897 8.08656719,14.7234358 C8.02435326,14.6479082 7.93547623,14.6034802 7.83771149,14.5990374 L7.82437994,14.5990374 L7.82882379,14.6034802 Z M15.0100881,0.861902999 C12.8370446,0.861902999 10.7928729,1.7060348 9.25974403,3.23880044 C6.09127779,6.4109589 6.09127779,11.5690485 9.25974403,14.741207 C10.7928729,16.2739726 12.8370446,17.1181044 15.0100881,17.1181044 C17.1831315,17.1181044 19.2273033,16.2739726 20.7604321,14.741207 C22.293561,13.2084413 23.1378928,11.1647538 23.1378928,8.9922251 C23.1378928,6.81969641 22.293561,4.77600889 20.7604321,3.24324324 C19.2273033,1.7104776 17.1831315,0.866345798 15.0100881,0.866345798 L15.0100881,0.861902999 Z" id="Shape"></path>
165
+ <path d="M17.8985917,8.84116994 C17.6630675,8.84116994 17.4675381,8.65012958 17.4675381,8.41021844 C17.4675381,7.37060348 16.6232062,6.52647168 15.5833449,6.52647168 C15.3478208,6.52647168 15.1522913,6.33543132 15.1522913,6.09552018 C15.1522913,5.85560903 15.343377,5.66456868 15.5833449,5.66456868 C17.0942545,5.66456868 18.3252014,6.89522399 18.3252014,8.40577564 C18.3252014,8.64124398 18.1341158,8.83672714 17.8941478,8.83672714 L17.8985917,8.84116994 Z" id="Path"></path>
166
+ </g>
167
+ <g id="Group" transform="translate(149.000000, 13.000000)" fill="#B9E9FC">
168
+ <path d="M6.75554844,1.00477209 C8.42857149,1.02711616 9.77924792,2.3782215 9.8010608,4.05125155 L9.80296982,4.19767203 C9.82405347,5.81476988 8.53022832,7.14277837 6.91313047,7.16386201 C6.88737145,7.16419786 6.86160911,7.16419377 6.8358502,7.16384974 C5.16282715,7.14150567 3.81215073,5.79040033 3.79033784,4.11737028 L3.78842882,3.9709498 C3.76734518,2.35385195 5.06117033,1.02584346 6.67826817,1.00475982 C6.7040272,1.00442397 6.72978953,1.00442806 6.75554844,1.00477209 Z" id="Rectangle" transform="translate(6.795699, 4.084311) rotate(23.820000) translate(-6.795699, -4.084311) "></path>
169
+ <path d="M14.8902685,11.6454812 C14.603398,12.3155198 13.8498279,12.6216963 13.1990174,12.3243945 C12.5524884,12.0270926 12.2570547,11.2461205 12.5439251,10.5716446 C12.8307956,9.89716877 13.5843657,9.59542956 14.2351763,9.89273143 C14.8817052,10.1900333 15.1771389,10.9710054 14.8902685,11.6454812 Z" id="Path"></path>
170
+ <path d="M4.02344479,15.7012112 C3.55246346,16.8016718 2.31506707,17.298654 1.25321826,16.8149838 C0.19136945,16.3268763 -0.288175173,15.0444847 0.178524505,13.944024 C0.645224183,12.8435634 1.88690223,12.3465812 2.94875103,12.8302514 C4.01059984,13.3183589 4.49014447,14.6007505 4.02344479,15.7012112 L4.02344479,15.7012112 Z" id="Path"></path>
171
+ </g>
172
+ <path d="M161.960187,58.8451352 C161.771932,59.6512551 160.960985,60.1484428 160.154865,59.9601873 C159.348745,59.7719317 158.851557,58.9609847 159.039813,58.1548648 C159.228068,57.3487449 160.039015,56.8515572 160.845135,57.0398127 C161.651255,57.2280683 162.148443,58.0390153 161.960187,58.8451352 Z" id="Path" fill="#C2EBFF"></path>
173
+ </g>
174
+ </g>
175
+ </g>
176
+ </svg>
plugin-fw/assets/js/codemirror/codemirror 2.js ADDED
@@ -0,0 +1,5806 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * CodeMirror version 3.15
3
+ * https://codemirror.net/
4
+ * Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
5
+ *
6
+ * Released under the MIT license
7
+ * https://codemirror.net/LICENSE
8
+ */
9
+
10
+ // CodeMirror is the only global var we claim
11
+ window.CodeMirror = (function() {
12
+ "use strict";
13
+
14
+ // BROWSER SNIFFING
15
+
16
+ // Crude, but necessary to handle a number of hard-to-feature-detect
17
+ // bugs and behavior differences.
18
+ var gecko = /gecko\/\d/i.test(navigator.userAgent);
19
+ var ie = /MSIE \d/.test(navigator.userAgent);
20
+ var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8);
21
+ var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
22
+ var webkit = /WebKit\//.test(navigator.userAgent);
23
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
24
+ var chrome = /Chrome\//.test(navigator.userAgent);
25
+ var opera = /Opera\//.test(navigator.userAgent);
26
+ var safari = /Apple Computer/.test(navigator.vendor);
27
+ var khtml = /KHTML\//.test(navigator.userAgent);
28
+ var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
29
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
30
+ var phantom = /PhantomJS/.test(navigator.userAgent);
31
+
32
+ var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
33
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
34
+ var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
35
+ var mac = ios || /Mac/.test(navigator.platform);
36
+ var windows = /windows/i.test(navigator.platform);
37
+
38
+ var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
39
+ if (opera_version) opera_version = Number(opera_version[1]);
40
+ if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
41
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
42
+ var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
43
+ var captureMiddleClick = gecko || (ie && !ie_lt9);
44
+
45
+ // Optimize some code when these features are not used
46
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
47
+
48
+ // CONSTRUCTOR
49
+
50
+ function CodeMirror(place, options) {
51
+ if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
52
+
53
+ this.options = options = options || {};
54
+ // Determine effective options based on given values and defaults.
55
+ for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt))
56
+ options[opt] = defaults[opt];
57
+ setGuttersForLineNumbers(options);
58
+
59
+ var docStart = typeof options.value == "string" ? 0 : options.value.first;
60
+ var display = this.display = makeDisplay(place, docStart);
61
+ display.wrapper.CodeMirror = this;
62
+ updateGutters(this);
63
+ if (options.autofocus && !mobile) focusInput(this);
64
+
65
+ this.state = {keyMaps: [],
66
+ overlays: [],
67
+ modeGen: 0,
68
+ overwrite: false, focused: false,
69
+ suppressEdits: false, pasteIncoming: false,
70
+ draggingText: false,
71
+ highlight: new Delayed()};
72
+
73
+ themeChanged(this);
74
+ if (options.lineWrapping)
75
+ this.display.wrapper.className += " CodeMirror-wrap";
76
+
77
+ var doc = options.value;
78
+ if (typeof doc == "string") doc = new Doc(options.value, options.mode);
79
+ operation(this, attachDoc)(this, doc);
80
+
81
+ // Override magic textarea content restore that IE sometimes does
82
+ // on our hidden textarea on reload
83
+ if (ie) setTimeout(bind(resetInput, this, true), 20);
84
+
85
+ registerEventHandlers(this);
86
+ // IE throws unspecified error in certain cases, when
87
+ // trying to access activeElement before onload
88
+ var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { }
89
+ if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20);
90
+ else onBlur(this);
91
+
92
+ operation(this, function() {
93
+ for (var opt in optionHandlers)
94
+ if (optionHandlers.propertyIsEnumerable(opt))
95
+ optionHandlers[opt](this, options[opt], Init);
96
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
97
+ })();
98
+ }
99
+
100
+ // DISPLAY CONSTRUCTOR
101
+
102
+ function makeDisplay(place, docStart) {
103
+ var d = {};
104
+
105
+ var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
106
+ if (webkit) input.style.width = "1000px";
107
+ else input.setAttribute("wrap", "off");
108
+ // if border: 0; -- iOS fails to open keyboard (issue #1287)
109
+ if (ios) input.style.border = "1px solid black";
110
+ input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
111
+
112
+ // Wraps and hides input textarea
113
+ d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
114
+ // The actual fake scrollbars.
115
+ d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
116
+ d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
117
+ d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
118
+ d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
119
+ // DIVs containing the selection and the actual code
120
+ d.lineDiv = elt("div", null, "CodeMirror-code");
121
+ d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
122
+ // Blinky cursor, and element used to ensure cursor fits at the end of a line
123
+ d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
124
+ // Secondary cursor, shown when on a 'jump' in bi-directional text
125
+ d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor");
126
+ // Used to measure text size
127
+ d.measure = elt("div", null, "CodeMirror-measure");
128
+ // Wraps everything that needs to exist inside the vertically-padded coordinate system
129
+ d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor],
130
+ null, "position: relative; outline: none");
131
+ // Moved around its parent to cover visible view
132
+ d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
133
+ // Set to the height of the text, causes scrolling
134
+ d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
135
+ // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers
136
+ d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
137
+ // Will contain the gutters, if any
138
+ d.gutters = elt("div", null, "CodeMirror-gutters");
139
+ d.lineGutter = null;
140
+ // Provides scrolling
141
+ d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
142
+ d.scroller.setAttribute("tabIndex", "-1");
143
+ // The element in which the editor lives.
144
+ d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
145
+ d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
146
+ // Work around IE7 z-index bug
147
+ if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
148
+ if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
149
+
150
+ // Needed to hide big blue blinking cursor on Mobile Safari
151
+ if (ios) input.style.width = "0px";
152
+ if (!webkit) d.scroller.draggable = true;
153
+ // Needed to handle Tab key in KHTML
154
+ if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
155
+ // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
156
+ else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px";
157
+
158
+ // Current visible range (may be bigger than the view window).
159
+ d.viewOffset = d.lastSizeC = 0;
160
+ d.showingFrom = d.showingTo = docStart;
161
+
162
+ // Used to only resize the line number gutter when necessary (when
163
+ // the amount of lines crosses a boundary that makes its width change)
164
+ d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
165
+ // See readInput and resetInput
166
+ d.prevInput = "";
167
+ // Set to true when a non-horizontal-scrolling widget is added. As
168
+ // an optimization, widget aligning is skipped when d is false.
169
+ d.alignWidgets = false;
170
+ // Flag that indicates whether we currently expect input to appear
171
+ // (after some event like 'keypress' or 'input') and are polling
172
+ // intensively.
173
+ d.pollingFast = false;
174
+ // Self-resetting timeout for the poller
175
+ d.poll = new Delayed();
176
+
177
+ d.cachedCharWidth = d.cachedTextHeight = null;
178
+ d.measureLineCache = [];
179
+ d.measureLineCachePos = 0;
180
+
181
+ // Tracks when resetInput has punted to just putting a short
182
+ // string instead of the (large) selection.
183
+ d.inaccurateSelection = false;
184
+
185
+ // Tracks the maximum line length so that the horizontal scrollbar
186
+ // can be kept static when scrolling.
187
+ d.maxLine = null;
188
+ d.maxLineLength = 0;
189
+ d.maxLineChanged = false;
190
+
191
+ // Used for measuring wheel scrolling granularity
192
+ d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
193
+
194
+ return d;
195
+ }
196
+
197
+ // STATE UPDATES
198
+
199
+ // Used to get the editor into a consistent state again when options change.
200
+
201
+ function loadMode(cm) {
202
+ cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
203
+ cm.doc.iter(function(line) {
204
+ if (line.stateAfter) line.stateAfter = null;
205
+ if (line.styles) line.styles = null;
206
+ });
207
+ cm.doc.frontier = cm.doc.first;
208
+ startWorker(cm, 100);
209
+ cm.state.modeGen++;
210
+ if (cm.curOp) regChange(cm);
211
+ }
212
+
213
+ function wrappingChanged(cm) {
214
+ if (cm.options.lineWrapping) {
215
+ cm.display.wrapper.className += " CodeMirror-wrap";
216
+ cm.display.sizer.style.minWidth = "";
217
+ } else {
218
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", "");
219
+ computeMaxLength(cm);
220
+ }
221
+ estimateLineHeights(cm);
222
+ regChange(cm);
223
+ clearCaches(cm);
224
+ setTimeout(function(){updateScrollbars(cm);}, 100);
225
+ }
226
+
227
+ function estimateHeight(cm) {
228
+ var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
229
+ var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
230
+ return function(line) {
231
+ if (lineIsHidden(cm.doc, line))
232
+ return 0;
233
+ else if (wrapping)
234
+ return (Math.ceil(line.text.length / perLine) || 1) * th;
235
+ else
236
+ return th;
237
+ };
238
+ }
239
+
240
+ function estimateLineHeights(cm) {
241
+ var doc = cm.doc, est = estimateHeight(cm);
242
+ doc.iter(function(line) {
243
+ var estHeight = est(line);
244
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
245
+ });
246
+ }
247
+
248
+ function keyMapChanged(cm) {
249
+ var map = keyMap[cm.options.keyMap], style = map.style;
250
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
251
+ (style ? " cm-keymap-" + style : "");
252
+ cm.state.disableInput = map.disableInput;
253
+ }
254
+
255
+ function themeChanged(cm) {
256
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
257
+ cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
258
+ clearCaches(cm);
259
+ }
260
+
261
+ function guttersChanged(cm) {
262
+ updateGutters(cm);
263
+ regChange(cm);
264
+ setTimeout(function(){alignHorizontally(cm);}, 20);
265
+ }
266
+
267
+ function updateGutters(cm) {
268
+ var gutters = cm.display.gutters, specs = cm.options.gutters;
269
+ removeChildren(gutters);
270
+ for (var i = 0; i < specs.length; ++i) {
271
+ var gutterClass = specs[i];
272
+ var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
273
+ if (gutterClass == "CodeMirror-linenumbers") {
274
+ cm.display.lineGutter = gElt;
275
+ gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
276
+ }
277
+ }
278
+ gutters.style.display = i ? "" : "none";
279
+ }
280
+
281
+ function lineLength(doc, line) {
282
+ if (line.height == 0) return 0;
283
+ var len = line.text.length, merged, cur = line;
284
+ while (merged = collapsedSpanAtStart(cur)) {
285
+ var found = merged.find();
286
+ cur = getLine(doc, found.from.line);
287
+ len += found.from.ch - found.to.ch;
288
+ }
289
+ cur = line;
290
+ while (merged = collapsedSpanAtEnd(cur)) {
291
+ var found = merged.find();
292
+ len -= cur.text.length - found.from.ch;
293
+ cur = getLine(doc, found.to.line);
294
+ len += cur.text.length - found.to.ch;
295
+ }
296
+ return len;
297
+ }
298
+
299
+ function computeMaxLength(cm) {
300
+ var d = cm.display, doc = cm.doc;
301
+ d.maxLine = getLine(doc, doc.first);
302
+ d.maxLineLength = lineLength(doc, d.maxLine);
303
+ d.maxLineChanged = true;
304
+ doc.iter(function(line) {
305
+ var len = lineLength(doc, line);
306
+ if (len > d.maxLineLength) {
307
+ d.maxLineLength = len;
308
+ d.maxLine = line;
309
+ }
310
+ });
311
+ }
312
+
313
+ // Make sure the gutters options contains the element
314
+ // "CodeMirror-linenumbers" when the lineNumbers option is true.
315
+ function setGuttersForLineNumbers(options) {
316
+ var found = false;
317
+ for (var i = 0; i < options.gutters.length; ++i) {
318
+ if (options.gutters[i] == "CodeMirror-linenumbers") {
319
+ if (options.lineNumbers) found = true;
320
+ else options.gutters.splice(i--, 1);
321
+ }
322
+ }
323
+ if (!found && options.lineNumbers)
324
+ options.gutters.push("CodeMirror-linenumbers");
325
+ }
326
+
327
+ // SCROLLBARS
328
+
329
+ // Re-synchronize the fake scrollbars with the actual size of the
330
+ // content. Optionally force a scrollTop.
331
+ function updateScrollbars(cm) {
332
+ var d = cm.display, docHeight = cm.doc.height;
333
+ var totalHeight = docHeight + paddingVert(d);
334
+ d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
335
+ d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
336
+ var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
337
+ var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
338
+ var needsV = scrollHeight > (d.scroller.clientHeight + 1);
339
+ if (needsV) {
340
+ d.scrollbarV.style.display = "block";
341
+ d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
342
+ d.scrollbarV.firstChild.style.height =
343
+ (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
344
+ } else d.scrollbarV.style.display = "";
345
+ if (needsH) {
346
+ d.scrollbarH.style.display = "block";
347
+ d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0";
348
+ d.scrollbarH.firstChild.style.width =
349
+ (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px";
350
+ } else d.scrollbarH.style.display = "";
351
+ if (needsH && needsV) {
352
+ d.scrollbarFiller.style.display = "block";
353
+ d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
354
+ } else d.scrollbarFiller.style.display = "";
355
+ if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
356
+ d.gutterFiller.style.display = "block";
357
+ d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
358
+ d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
359
+ } else d.gutterFiller.style.display = "";
360
+
361
+ if (mac_geLion && scrollbarWidth(d.measure) === 0)
362
+ d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
363
+ }
364
+
365
+ function visibleLines(display, doc, viewPort) {
366
+ var top = display.scroller.scrollTop, height = display.wrapper.clientHeight;
367
+ if (typeof viewPort == "number") top = viewPort;
368
+ else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;}
369
+ top = Math.floor(top - paddingTop(display));
370
+ var bottom = Math.ceil(top + height);
371
+ return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)};
372
+ }
373
+
374
+ // LINE NUMBERS
375
+
376
+ function alignHorizontally(cm) {
377
+ var display = cm.display;
378
+ if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
379
+ var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
380
+ var gutterW = display.gutters.offsetWidth, l = comp + "px";
381
+ for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) {
382
+ for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l;
383
+ }
384
+ if (cm.options.fixedGutter)
385
+ display.gutters.style.left = (comp + gutterW) + "px";
386
+ }
387
+
388
+ function maybeUpdateLineNumberWidth(cm) {
389
+ if (!cm.options.lineNumbers) return false;
390
+ var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
391
+ if (last.length != display.lineNumChars) {
392
+ var test = display.measure.appendChild(elt("div", [elt("div", last)],
393
+ "CodeMirror-linenumber CodeMirror-gutter-elt"));
394
+ var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
395
+ display.lineGutter.style.width = "";
396
+ display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
397
+ display.lineNumWidth = display.lineNumInnerWidth + padding;
398
+ display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
399
+ display.lineGutter.style.width = display.lineNumWidth + "px";
400
+ return true;
401
+ }
402
+ return false;
403
+ }
404
+
405
+ function lineNumberFor(options, i) {
406
+ return String(options.lineNumberFormatter(i + options.firstLineNumber));
407
+ }
408
+ function compensateForHScroll(display) {
409
+ return getRect(display.scroller).left - getRect(display.sizer).left;
410
+ }
411
+
412
+ // DISPLAY DRAWING
413
+
414
+ function updateDisplay(cm, changes, viewPort, forced) {
415
+ var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
416
+ var visible = visibleLines(cm.display, cm.doc, viewPort);
417
+ for (;;) {
418
+ if (!updateDisplayInner(cm, changes, visible, forced)) break;
419
+ forced = false;
420
+ updated = true;
421
+ updateSelection(cm);
422
+ updateScrollbars(cm);
423
+
424
+ // Clip forced viewport to actual scrollable area
425
+ if (viewPort)
426
+ viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight,
427
+ typeof viewPort == "number" ? viewPort : viewPort.top);
428
+ visible = visibleLines(cm.display, cm.doc, viewPort);
429
+ if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
430
+ break;
431
+ changes = [];
432
+ }
433
+
434
+ if (updated) {
435
+ signalLater(cm, "update", cm);
436
+ if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
437
+ signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
438
+ }
439
+ return updated;
440
+ }
441
+
442
+ // Uses a set of changes plus the current scroll position to
443
+ // determine which DOM updates have to be made, and makes the
444
+ // updates.
445
+ function updateDisplayInner(cm, changes, visible, forced) {
446
+ var display = cm.display, doc = cm.doc;
447
+ if (!display.wrapper.clientWidth) {
448
+ display.showingFrom = display.showingTo = doc.first;
449
+ display.viewOffset = 0;
450
+ return;
451
+ }
452
+
453
+ // Bail out if the visible area is already rendered and nothing changed.
454
+ if (!forced && changes.length == 0 &&
455
+ visible.from > display.showingFrom && visible.to < display.showingTo)
456
+ return;
457
+
458
+ if (maybeUpdateLineNumberWidth(cm))
459
+ changes = [{from: doc.first, to: doc.first + doc.size}];
460
+ var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px";
461
+ display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0";
462
+
463
+ // Used to determine which lines need their line numbers updated
464
+ var positionsChangedFrom = Infinity;
465
+ if (cm.options.lineNumbers)
466
+ for (var i = 0; i < changes.length; ++i)
467
+ if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; }
468
+
469
+ var end = doc.first + doc.size;
470
+ var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);
471
+ var to = Math.min(end, visible.to + cm.options.viewportMargin);
472
+ if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom);
473
+ if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo);
474
+ if (sawCollapsedSpans) {
475
+ from = lineNo(visualLine(doc, getLine(doc, from)));
476
+ while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to;
477
+ }
478
+
479
+ // Create a range of theoretically intact lines, and punch holes
480
+ // in that using the change info.
481
+ var intact = [{from: Math.max(display.showingFrom, doc.first),
482
+ to: Math.min(display.showingTo, end)}];
483
+ if (intact[0].from >= intact[0].to) intact = [];
484
+ else intact = computeIntact(intact, changes);
485
+ // When merged lines are present, we might have to reduce the
486
+ // intact ranges because changes in continued fragments of the
487
+ // intact lines do require the lines to be redrawn.
488
+ if (sawCollapsedSpans)
489
+ for (var i = 0; i < intact.length; ++i) {
490
+ var range = intact[i], merged;
491
+ while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) {
492
+ var newTo = merged.find().from.line;
493
+ if (newTo > range.from) range.to = newTo;
494
+ else { intact.splice(i--, 1); break; }
495
+ }
496
+ }
497
+
498
+ // Clip off the parts that won't be visible
499
+ var intactLines = 0;
500
+ for (var i = 0; i < intact.length; ++i) {
501
+ var range = intact[i];
502
+ if (range.from < from) range.from = from;
503
+ if (range.to > to) range.to = to;
504
+ if (range.from >= range.to) intact.splice(i--, 1);
505
+ else intactLines += range.to - range.from;
506
+ }
507
+ if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
508
+ updateViewOffset(cm);
509
+ return;
510
+ }
511
+ intact.sort(function(a, b) {return a.from - b.from;});
512
+
513
+ // Avoid crashing on IE's "unspecified error" when in iframes
514
+ try {
515
+ var focused = document.activeElement;
516
+ } catch(e) {}
517
+ if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none";
518
+ patchDisplay(cm, from, to, intact, positionsChangedFrom);
519
+ display.lineDiv.style.display = "";
520
+ if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus();
521
+
522
+ var different = from != display.showingFrom || to != display.showingTo ||
523
+ display.lastSizeC != display.wrapper.clientHeight;
524
+ // This is just a bogus formula that detects when the editor is
525
+ // resized or the font size changes.
526
+ if (different) {
527
+ display.lastSizeC = display.wrapper.clientHeight;
528
+ startWorker(cm, 400);
529
+ }
530
+ display.showingFrom = from; display.showingTo = to;
531
+
532
+ updateHeightsInViewport(cm);
533
+ updateViewOffset(cm);
534
+
535
+ return true;
536
+ }
537
+
538
+ function updateHeightsInViewport(cm) {
539
+ var display = cm.display;
540
+ var prevBottom = display.lineDiv.offsetTop;
541
+ for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
542
+ if (ie_lt8) {
543
+ var bot = node.offsetTop + node.offsetHeight;
544
+ height = bot - prevBottom;
545
+ prevBottom = bot;
546
+ } else {
547
+ var box = getRect(node);
548
+ height = box.bottom - box.top;
549
+ }
550
+ var diff = node.lineObj.height - height;
551
+ if (height < 2) height = textHeight(display);
552
+ if (diff > .001 || diff < -.001) {
553
+ updateLineHeight(node.lineObj, height);
554
+ var widgets = node.lineObj.widgets;
555
+ if (widgets) for (var i = 0; i < widgets.length; ++i)
556
+ widgets[i].height = widgets[i].node.offsetHeight;
557
+ }
558
+ }
559
+ }
560
+
561
+ function updateViewOffset(cm) {
562
+ var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom));
563
+ // Position the mover div to align with the current virtual scroll position
564
+ cm.display.mover.style.top = off + "px";
565
+ }
566
+
567
+ function computeIntact(intact, changes) {
568
+ for (var i = 0, l = changes.length || 0; i < l; ++i) {
569
+ var change = changes[i], intact2 = [], diff = change.diff || 0;
570
+ for (var j = 0, l2 = intact.length; j < l2; ++j) {
571
+ var range = intact[j];
572
+ if (change.to <= range.from && change.diff) {
573
+ intact2.push({from: range.from + diff, to: range.to + diff});
574
+ } else if (change.to <= range.from || change.from >= range.to) {
575
+ intact2.push(range);
576
+ } else {
577
+ if (change.from > range.from)
578
+ intact2.push({from: range.from, to: change.from});
579
+ if (change.to < range.to)
580
+ intact2.push({from: change.to + diff, to: range.to + diff});
581
+ }
582
+ }
583
+ intact = intact2;
584
+ }
585
+ return intact;
586
+ }
587
+
588
+ function getDimensions(cm) {
589
+ var d = cm.display, left = {}, width = {};
590
+ for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
591
+ left[cm.options.gutters[i]] = n.offsetLeft;
592
+ width[cm.options.gutters[i]] = n.offsetWidth;
593
+ }
594
+ return {fixedPos: compensateForHScroll(d),
595
+ gutterTotalWidth: d.gutters.offsetWidth,
596
+ gutterLeft: left,
597
+ gutterWidth: width,
598
+ wrapperWidth: d.wrapper.clientWidth};
599
+ }
600
+
601
+ function patchDisplay(cm, from, to, intact, updateNumbersFrom) {
602
+ var dims = getDimensions(cm);
603
+ var display = cm.display, lineNumbers = cm.options.lineNumbers;
604
+ if (!intact.length && (!webkit || !cm.display.currentWheelTarget))
605
+ removeChildren(display.lineDiv);
606
+ var container = display.lineDiv, cur = container.firstChild;
607
+
608
+ function rm(node) {
609
+ var next = node.nextSibling;
610
+ if (webkit && mac && cm.display.currentWheelTarget == node) {
611
+ node.style.display = "none";
612
+ node.lineObj = null;
613
+ } else {
614
+ node.parentNode.removeChild(node);
615
+ }
616
+ return next;
617
+ }
618
+
619
+ var nextIntact = intact.shift(), lineN = from;
620
+ cm.doc.iter(from, to, function(line) {
621
+ if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
622
+ if (lineIsHidden(cm.doc, line)) {
623
+ if (line.height != 0) updateLineHeight(line, 0);
624
+ if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
625
+ var w = line.widgets[i];
626
+ if (w.showIfHidden) {
627
+ var prev = cur.previousSibling;
628
+ if (/pre/i.test(prev.nodeName)) {
629
+ var wrap = elt("div", null, null, "position: relative");
630
+ prev.parentNode.replaceChild(wrap, prev);
631
+ wrap.appendChild(prev);
632
+ prev = wrap;
633
+ }
634
+ var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
635
+ if (!w.handleMouseEvents) wnode.ignoreEvents = true;
636
+ positionLineWidget(w, wnode, prev, dims);
637
+ }
638
+ }
639
+ } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
640
+ // This line is intact. Skip to the actual node. Update its
641
+ // line number if needed.
642
+ while (cur.lineObj != line) cur = rm(cur);
643
+ if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber)
644
+ setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN));
645
+ cur = cur.nextSibling;
646
+ } else {
647
+ // For lines with widgets, make an attempt to find and reuse
648
+ // the existing element, so that widgets aren't needlessly
649
+ // removed and re-inserted into the dom
650
+ if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling)
651
+ if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; }
652
+ // This line needs to be generated.
653
+ var lineNode = buildLineElement(cm, line, lineN, dims, reuse);
654
+ if (lineNode != reuse) {
655
+ container.insertBefore(lineNode, cur);
656
+ } else {
657
+ while (cur != reuse) cur = rm(cur);
658
+ cur = cur.nextSibling;
659
+ }
660
+
661
+ lineNode.lineObj = line;
662
+ }
663
+ ++lineN;
664
+ });
665
+ while (cur) cur = rm(cur);
666
+ }
667
+
668
+ function buildLineElement(cm, line, lineNo, dims, reuse) {
669
+ var lineElement = lineContent(cm, line);
670
+ var markers = line.gutterMarkers, display = cm.display, wrap;
671
+
672
+ if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets)
673
+ return lineElement;
674
+
675
+ // Lines with gutter elements, widgets or a background class need
676
+ // to be wrapped again, and have the extra elements added to the
677
+ // wrapper div
678
+
679
+ if (reuse) {
680
+ reuse.alignable = null;
681
+ var isOk = true, widgetsSeen = 0, insertBefore = null;
682
+ for (var n = reuse.firstChild, next; n; n = next) {
683
+ next = n.nextSibling;
684
+ if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
685
+ reuse.removeChild(n);
686
+ } else {
687
+ for (var i = 0; i < line.widgets.length; ++i) {
688
+ var widget = line.widgets[i];
689
+ if (widget.node == n.firstChild) {
690
+ if (!widget.above && !insertBefore) insertBefore = n;
691
+ positionLineWidget(widget, n, reuse, dims);
692
+ ++widgetsSeen;
693
+ break;
694
+ }
695
+ }
696
+ if (i == line.widgets.length) { isOk = false; break; }
697
+ }
698
+ }
699
+ reuse.insertBefore(lineElement, insertBefore);
700
+ if (isOk && widgetsSeen == line.widgets.length) {
701
+ wrap = reuse;
702
+ reuse.className = line.wrapClass || "";
703
+ }
704
+ }
705
+ if (!wrap) {
706
+ wrap = elt("div", null, line.wrapClass, "position: relative");
707
+ wrap.appendChild(lineElement);
708
+ }
709
+ // Kludge to make sure the styled element lies behind the selection (by z-index)
710
+ if (line.bgClass)
711
+ wrap.insertBefore(elt("div", null, line.bgClass + " CodeMirror-linebackground"), wrap.firstChild);
712
+ if (cm.options.lineNumbers || markers) {
713
+ var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
714
+ (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
715
+ wrap.firstChild);
716
+ if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
717
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
718
+ wrap.lineNumber = gutterWrap.appendChild(
719
+ elt("div", lineNumberFor(cm.options, lineNo),
720
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
721
+ "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
722
+ + display.lineNumInnerWidth + "px"));
723
+ if (markers)
724
+ for (var k = 0; k < cm.options.gutters.length; ++k) {
725
+ var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
726
+ if (found)
727
+ gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
728
+ dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
729
+ }
730
+ }
731
+ if (ie_lt8) wrap.style.zIndex = 2;
732
+ if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
733
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
734
+ if (!widget.handleMouseEvents) node.ignoreEvents = true;
735
+ positionLineWidget(widget, node, wrap, dims);
736
+ if (widget.above)
737
+ wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
738
+ else
739
+ wrap.appendChild(node);
740
+ signalLater(widget, "redraw");
741
+ }
742
+ return wrap;
743
+ }
744
+
745
+ function positionLineWidget(widget, node, wrap, dims) {
746
+ if (widget.noHScroll) {
747
+ (wrap.alignable || (wrap.alignable = [])).push(node);
748
+ var width = dims.wrapperWidth;
749
+ node.style.left = dims.fixedPos + "px";
750
+ if (!widget.coverGutter) {
751
+ width -= dims.gutterTotalWidth;
752
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
753
+ }
754
+ node.style.width = width + "px";
755
+ }
756
+ if (widget.coverGutter) {
757
+ node.style.zIndex = 5;
758
+ node.style.position = "relative";
759
+ if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
760
+ }
761
+ }
762
+
763
+ // SELECTION / CURSOR
764
+
765
+ function updateSelection(cm) {
766
+ var display = cm.display;
767
+ var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to);
768
+ if (collapsed || cm.options.showCursorWhenSelecting)
769
+ updateSelectionCursor(cm);
770
+ else
771
+ display.cursor.style.display = display.otherCursor.style.display = "none";
772
+ if (!collapsed)
773
+ updateSelectionRange(cm);
774
+ else
775
+ display.selectionDiv.style.display = "none";
776
+
777
+ // Move the hidden textarea near the cursor to prevent scrolling artifacts
778
+ if (cm.options.moveInputWithCursor) {
779
+ var headPos = cursorCoords(cm, cm.doc.sel.head, "div");
780
+ var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv);
781
+ display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
782
+ headPos.top + lineOff.top - wrapOff.top)) + "px";
783
+ display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
784
+ headPos.left + lineOff.left - wrapOff.left)) + "px";
785
+ }
786
+ }
787
+
788
+ // No selection, plain cursor
789
+ function updateSelectionCursor(cm) {
790
+ var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div");
791
+ display.cursor.style.left = pos.left + "px";
792
+ display.cursor.style.top = pos.top + "px";
793
+ display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
794
+ display.cursor.style.display = "";
795
+
796
+ if (pos.other) {
797
+ display.otherCursor.style.display = "";
798
+ display.otherCursor.style.left = pos.other.left + "px";
799
+ display.otherCursor.style.top = pos.other.top + "px";
800
+ display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
801
+ } else { display.otherCursor.style.display = "none"; }
802
+ }
803
+
804
+ // Highlight selection
805
+ function updateSelectionRange(cm) {
806
+ var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
807
+ var fragment = document.createDocumentFragment();
808
+ var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
809
+
810
+ function add(left, top, width, bottom) {
811
+ if (top < 0) top = 0;
812
+ fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
813
+ "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
814
+ "px; height: " + (bottom - top) + "px"));
815
+ }
816
+
817
+ function drawForLine(line, fromArg, toArg) {
818
+ var lineObj = getLine(doc, line);
819
+ var lineLen = lineObj.text.length;
820
+ var start, end;
821
+ function coords(ch, bias) {
822
+ return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
823
+ }
824
+
825
+ iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
826
+ var leftPos = coords(from, "left"), rightPos, left, right;
827
+ if (from == to) {
828
+ rightPos = leftPos;
829
+ left = right = leftPos.left;
830
+ } else {
831
+ rightPos = coords(to - 1, "right");
832
+ if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
833
+ left = leftPos.left;
834
+ right = rightPos.right;
835
+ }
836
+ if (fromArg == null && from == 0) left = pl;
837
+ if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
838
+ add(left, leftPos.top, null, leftPos.bottom);
839
+ left = pl;
840
+ if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
841
+ }
842
+ if (toArg == null && to == lineLen) right = clientWidth;
843
+ if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
844
+ start = leftPos;
845
+ if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
846
+ end = rightPos;
847
+ if (left < pl + 1) left = pl;
848
+ add(left, rightPos.top, right - left, rightPos.bottom);
849
+ });
850
+ return {start: start, end: end};
851
+ }
852
+
853
+ if (sel.from.line == sel.to.line) {
854
+ drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
855
+ } else {
856
+ var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
857
+ var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
858
+ var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
859
+ var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
860
+ if (singleVLine) {
861
+ if (leftEnd.top < rightStart.top - 2) {
862
+ add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
863
+ add(pl, rightStart.top, rightStart.left, rightStart.bottom);
864
+ } else {
865
+ add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
866
+ }
867
+ }
868
+ if (leftEnd.bottom < rightStart.top)
869
+ add(pl, leftEnd.bottom, null, rightStart.top);
870
+ }
871
+
872
+ removeChildrenAndAdd(display.selectionDiv, fragment);
873
+ display.selectionDiv.style.display = "";
874
+ }
875
+
876
+ // Cursor-blinking
877
+ function restartBlink(cm) {
878
+ if (!cm.state.focused) return;
879
+ var display = cm.display;
880
+ clearInterval(display.blinker);
881
+ var on = true;
882
+ display.cursor.style.visibility = display.otherCursor.style.visibility = "";
883
+ display.blinker = setInterval(function() {
884
+ display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden";
885
+ }, cm.options.cursorBlinkRate);
886
+ }
887
+
888
+ // HIGHLIGHT WORKER
889
+
890
+ function startWorker(cm, time) {
891
+ if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo)
892
+ cm.state.highlight.set(time, bind(highlightWorker, cm));
893
+ }
894
+
895
+ function highlightWorker(cm) {
896
+ var doc = cm.doc;
897
+ if (doc.frontier < doc.first) doc.frontier = doc.first;
898
+ if (doc.frontier >= cm.display.showingTo) return;
899
+ var end = +new Date + cm.options.workTime;
900
+ var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
901
+ var changed = [], prevChange;
902
+ doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) {
903
+ if (doc.frontier >= cm.display.showingFrom) { // Visible
904
+ var oldStyles = line.styles;
905
+ line.styles = highlightLine(cm, line, state);
906
+ var ischange = !oldStyles || oldStyles.length != line.styles.length;
907
+ for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
908
+ if (ischange) {
909
+ if (prevChange && prevChange.end == doc.frontier) prevChange.end++;
910
+ else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1});
911
+ }
912
+ line.stateAfter = copyState(doc.mode, state);
913
+ } else {
914
+ processLine(cm, line, state);
915
+ line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
916
+ }
917
+ ++doc.frontier;
918
+ if (+new Date > end) {
919
+ startWorker(cm, cm.options.workDelay);
920
+ return true;
921
+ }
922
+ });
923
+ if (changed.length)
924
+ operation(cm, function() {
925
+ for (var i = 0; i < changed.length; ++i)
926
+ regChange(this, changed[i].start, changed[i].end);
927
+ })();
928
+ }
929
+
930
+ // Finds the line to start with when starting a parse. Tries to
931
+ // find a line with a stateAfter, so that it can start with a
932
+ // valid state. If that fails, it returns the line with the
933
+ // smallest indentation, which tends to need the least context to
934
+ // parse correctly.
935
+ function findStartLine(cm, n, precise) {
936
+ var minindent, minline, doc = cm.doc;
937
+ for (var search = n, lim = n - 100; search > lim; --search) {
938
+ if (search <= doc.first) return doc.first;
939
+ var line = getLine(doc, search - 1);
940
+ if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
941
+ var indented = countColumn(line.text, null, cm.options.tabSize);
942
+ if (minline == null || minindent > indented) {
943
+ minline = search - 1;
944
+ minindent = indented;
945
+ }
946
+ }
947
+ return minline;
948
+ }
949
+
950
+ function getStateBefore(cm, n, precise) {
951
+ var doc = cm.doc, display = cm.display;
952
+ if (!doc.mode.startState) return true;
953
+ var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
954
+ if (!state) state = startState(doc.mode);
955
+ else state = copyState(doc.mode, state);
956
+ doc.iter(pos, n, function(line) {
957
+ processLine(cm, line, state);
958
+ var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo;
959
+ line.stateAfter = save ? copyState(doc.mode, state) : null;
960
+ ++pos;
961
+ });
962
+ return state;
963
+ }
964
+
965
+ // POSITION MEASUREMENT
966
+
967
+ function paddingTop(display) {return display.lineSpace.offsetTop;}
968
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
969
+ function paddingLeft(display) {
970
+ var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
971
+ return e.offsetLeft;
972
+ }
973
+
974
+ function measureChar(cm, line, ch, data, bias) {
975
+ var dir = -1;
976
+ data = data || measureLine(cm, line);
977
+
978
+ for (var pos = ch;; pos += dir) {
979
+ var r = data[pos];
980
+ if (r) break;
981
+ if (dir < 0 && pos == 0) dir = 1;
982
+ }
983
+ bias = pos > ch ? "left" : pos < ch ? "right" : bias;
984
+ if (bias == "left" && r.leftSide) r = r.leftSide;
985
+ else if (bias == "right" && r.rightSide) r = r.rightSide;
986
+ return {left: pos < ch ? r.right : r.left,
987
+ right: pos > ch ? r.left : r.right,
988
+ top: r.top,
989
+ bottom: r.bottom};
990
+ }
991
+
992
+ function findCachedMeasurement(cm, line) {
993
+ var cache = cm.display.measureLineCache;
994
+ for (var i = 0; i < cache.length; ++i) {
995
+ var memo = cache[i];
996
+ if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
997
+ cm.display.scroller.clientWidth == memo.width &&
998
+ memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass)
999
+ return memo;
1000
+ }
1001
+ }
1002
+
1003
+ function clearCachedMeasurement(cm, line) {
1004
+ var exists = findCachedMeasurement(cm, line);
1005
+ if (exists) exists.text = exists.measure = exists.markedSpans = null;
1006
+ }
1007
+
1008
+ function measureLine(cm, line) {
1009
+ // First look in the cache
1010
+ var cached = findCachedMeasurement(cm, line);
1011
+ if (cached) return cached.measure;
1012
+
1013
+ // Failing that, recompute and store result in cache
1014
+ var measure = measureLineInner(cm, line);
1015
+ var cache = cm.display.measureLineCache;
1016
+ var memo = {text: line.text, width: cm.display.scroller.clientWidth,
1017
+ markedSpans: line.markedSpans, measure: measure,
1018
+ classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass};
1019
+ if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
1020
+ else cache.push(memo);
1021
+ return measure;
1022
+ }
1023
+
1024
+ function measureLineInner(cm, line) {
1025
+ var display = cm.display, measure = emptyArray(line.text.length);
1026
+ var pre = lineContent(cm, line, measure, true);
1027
+
1028
+ // IE does not cache element positions of inline elements between
1029
+ // calls to getBoundingClientRect. This makes the loop below,
1030
+ // which gathers the positions of all the characters on the line,
1031
+ // do an amount of layout work quadratic to the number of
1032
+ // characters. When line wrapping is off, we try to improve things
1033
+ // by first subdividing the line into a bunch of inline blocks, so
1034
+ // that IE can reuse most of the layout information from caches
1035
+ // for those blocks. This does interfere with line wrapping, so it
1036
+ // doesn't work when wrapping is on, but in that case the
1037
+ // situation is slightly better, since IE does cache line-wrapping
1038
+ // information and only recomputes per-line.
1039
+ if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
1040
+ var fragment = document.createDocumentFragment();
1041
+ var chunk = 10, n = pre.childNodes.length;
1042
+ for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
1043
+ var wrap = elt("div", null, null, "display: inline-block");
1044
+ for (var j = 0; j < chunk && n; ++j) {
1045
+ wrap.appendChild(pre.firstChild);
1046
+ --n;
1047
+ }
1048
+ fragment.appendChild(wrap);
1049
+ }
1050
+ pre.appendChild(fragment);
1051
+ }
1052
+
1053
+ removeChildrenAndAdd(display.measure, pre);
1054
+
1055
+ var outer = getRect(display.lineDiv);
1056
+ var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight;
1057
+ // Work around an IE7/8 bug where it will sometimes have randomly
1058
+ // replaced our pre with a clone at this point.
1059
+ if (ie_lt9 && display.measure.first != pre)
1060
+ removeChildrenAndAdd(display.measure, pre);
1061
+
1062
+ function measureRect(rect) {
1063
+ var top = rect.top - outer.top, bot = rect.bottom - outer.top;
1064
+ if (bot > maxBot) bot = maxBot;
1065
+ if (top < 0) top = 0;
1066
+ for (var i = vranges.length - 2; i >= 0; i -= 2) {
1067
+ var rtop = vranges[i], rbot = vranges[i+1];
1068
+ if (rtop > bot || rbot < top) continue;
1069
+ if (rtop <= top && rbot >= bot ||
1070
+ top <= rtop && bot >= rbot ||
1071
+ Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
1072
+ vranges[i] = Math.min(top, rtop);
1073
+ vranges[i+1] = Math.max(bot, rbot);
1074
+ break;
1075
+ }
1076
+ }
1077
+ if (i < 0) { i = vranges.length; vranges.push(top, bot); }
1078
+ return {left: rect.left - outer.left,
1079
+ right: rect.right - outer.left,
1080
+ top: i, bottom: null};
1081
+ }
1082
+ function finishRect(rect) {
1083
+ rect.bottom = vranges[rect.top+1];
1084
+ rect.top = vranges[rect.top];
1085
+ }
1086
+
1087
+ for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
1088
+ var node = cur, rect = null;
1089
+ // A widget might wrap, needs special care
1090
+ if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
1091
+ if (cur.firstChild.nodeType == 1) node = cur.firstChild;
1092
+ var rects = node.getClientRects();
1093
+ if (rects.length > 1) {
1094
+ rect = data[i] = measureRect(rects[0]);
1095
+ rect.rightSide = measureRect(rects[rects.length - 1]);
1096
+ }
1097
+ }
1098
+ if (!rect) rect = data[i] = measureRect(getRect(node));
1099
+ if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
1100
+ if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
1101
+ }
1102
+ for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
1103
+ finishRect(cur);
1104
+ if (cur.leftSide) finishRect(cur.leftSide);
1105
+ if (cur.rightSide) finishRect(cur.rightSide);
1106
+ }
1107
+ return data;
1108
+ }
1109
+
1110
+ function measureLineWidth(cm, line) {
1111
+ var hasBadSpan = false;
1112
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
1113
+ var sp = line.markedSpans[i];
1114
+ if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
1115
+ }
1116
+ var cached = !hasBadSpan && findCachedMeasurement(cm, line);
1117
+ if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right;
1118
+
1119
+ var pre = lineContent(cm, line, null, true);
1120
+ var end = pre.appendChild(zeroWidthElement(cm.display.measure));
1121
+ removeChildrenAndAdd(cm.display.measure, pre);
1122
+ return getRect(end).right - getRect(cm.display.lineDiv).left;
1123
+ }
1124
+
1125
+ function clearCaches(cm) {
1126
+ cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
1127
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
1128
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
1129
+ cm.display.lineNumChars = null;
1130
+ }
1131
+
1132
+ function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
1133
+ function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
1134
+
1135
+ // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
1136
+ function intoCoordSystem(cm, lineObj, rect, context) {
1137
+ if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
1138
+ var size = widgetHeight(lineObj.widgets[i]);
1139
+ rect.top += size; rect.bottom += size;
1140
+ }
1141
+ if (context == "line") return rect;
1142
+ if (!context) context = "local";
1143
+ var yOff = heightAtLine(cm, lineObj);
1144
+ if (context == "local") yOff += paddingTop(cm.display);
1145
+ else yOff -= cm.display.viewOffset;
1146
+ if (context == "page" || context == "window") {
1147
+ var lOff = getRect(cm.display.lineSpace);
1148
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
1149
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
1150
+ rect.left += xOff; rect.right += xOff;
1151
+ }
1152
+ rect.top += yOff; rect.bottom += yOff;
1153
+ return rect;
1154
+ }
1155
+
1156
+ // Context may be "window", "page", "div", or "local"/null
1157
+ // Result is in "div" coords
1158
+ function fromCoordSystem(cm, coords, context) {
1159
+ if (context == "div") return coords;
1160
+ var left = coords.left, top = coords.top;
1161
+ // First move into "page" coordinate system
1162
+ if (context == "page") {
1163
+ left -= pageScrollX();
1164
+ top -= pageScrollY();
1165
+ } else if (context == "local" || !context) {
1166
+ var localBox = getRect(cm.display.sizer);
1167
+ left += localBox.left;
1168
+ top += localBox.top;
1169
+ }
1170
+
1171
+ var lineSpaceBox = getRect(cm.display.lineSpace);
1172
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
1173
+ }
1174
+
1175
+ function charCoords(cm, pos, context, lineObj, bias) {
1176
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line);
1177
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
1178
+ }
1179
+
1180
+ function cursorCoords(cm, pos, context, lineObj, measurement) {
1181
+ lineObj = lineObj || getLine(cm.doc, pos.line);
1182
+ if (!measurement) measurement = measureLine(cm, lineObj);
1183
+ function get(ch, right) {
1184
+ var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
1185
+ if (right) m.left = m.right; else m.right = m.left;
1186
+ return intoCoordSystem(cm, lineObj, m, context);
1187
+ }
1188
+ function getBidi(ch, partPos) {
1189
+ var part = order[partPos], right = part.level % 2;
1190
+ if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
1191
+ part = order[--partPos];
1192
+ ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
1193
+ right = true;
1194
+ } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
1195
+ part = order[++partPos];
1196
+ ch = bidiLeft(part) - part.level % 2;
1197
+ right = false;
1198
+ }
1199
+ if (right && ch == part.to && ch > part.from) return get(ch - 1);
1200
+ return get(ch, right);
1201
+ }
1202
+ var order = getOrder(lineObj), ch = pos.ch;
1203
+ if (!order) return get(ch);
1204
+ var partPos = getBidiPartAt(order, ch);
1205
+ var val = getBidi(ch, partPos);
1206
+ if (bidiOther != null) val.other = getBidi(ch, bidiOther);
1207
+ return val;
1208
+ }
1209
+
1210
+ function PosWithInfo(line, ch, outside, xRel) {
1211
+ var pos = new Pos(line, ch);
1212
+ pos.xRel = xRel;
1213
+ if (outside) pos.outside = true;
1214
+ return pos;
1215
+ }
1216
+
1217
+ // Coords must be lineSpace-local
1218
+ function coordsChar(cm, x, y) {
1219
+ var doc = cm.doc;
1220
+ y += cm.display.viewOffset;
1221
+ if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
1222
+ var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
1223
+ if (lineNo > last)
1224
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
1225
+ if (x < 0) x = 0;
1226
+
1227
+ for (;;) {
1228
+ var lineObj = getLine(doc, lineNo);
1229
+ var found = coordsCharInner(cm, lineObj, lineNo, x, y);
1230
+ var merged = collapsedSpanAtEnd(lineObj);
1231
+ var mergedPos = merged && merged.find();
1232
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
1233
+ lineNo = mergedPos.to.line;
1234
+ else
1235
+ return found;
1236
+ }
1237
+ }
1238
+
1239
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
1240
+ var innerOff = y - heightAtLine(cm, lineObj);
1241
+ var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
1242
+ var measurement = measureLine(cm, lineObj);
1243
+
1244
+ function getX(ch) {
1245
+ var sp = cursorCoords(cm, Pos(lineNo, ch), "line",
1246
+ lineObj, measurement);
1247
+ wrongLine = true;
1248
+ if (innerOff > sp.bottom) return sp.left - adjust;
1249
+ else if (innerOff < sp.top) return sp.left + adjust;
1250
+ else wrongLine = false;
1251
+ return sp.left;
1252
+ }
1253
+
1254
+ var bidi = getOrder(lineObj), dist = lineObj.text.length;
1255
+ var from = lineLeft(lineObj), to = lineRight(lineObj);
1256
+ var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
1257
+
1258
+ if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
1259
+ // Do a binary search between these bounds.
1260
+ for (;;) {
1261
+ if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
1262
+ var ch = x < fromX || x - fromX <= toX - x ? from : to;
1263
+ var xDiff = x - (ch == from ? fromX : toX);
1264
+ while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
1265
+ var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
1266
+ xDiff < 0 ? -1 : xDiff ? 1 : 0);
1267
+ return pos;
1268
+ }
1269
+ var step = Math.ceil(dist / 2), middle = from + step;
1270
+ if (bidi) {
1271
+ middle = from;
1272
+ for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
1273
+ }
1274
+ var middleX = getX(middle);
1275
+ if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
1276
+ else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
1277
+ }
1278
+ }
1279
+
1280
+ var measureText;
1281
+ function textHeight(display) {
1282
+ if (display.cachedTextHeight != null) return display.cachedTextHeight;
1283
+ if (measureText == null) {
1284
+ measureText = elt("pre");
1285
+ // Measure a bunch of lines, for browsers that compute
1286
+ // fractional heights.
1287
+ for (var i = 0; i < 49; ++i) {
1288
+ measureText.appendChild(document.createTextNode("x"));
1289
+ measureText.appendChild(elt("br"));
1290
+ }
1291
+ measureText.appendChild(document.createTextNode("x"));
1292
+ }
1293
+ removeChildrenAndAdd(display.measure, measureText);
1294
+ var height = measureText.offsetHeight / 50;
1295
+ if (height > 3) display.cachedTextHeight = height;
1296
+ removeChildren(display.measure);
1297
+ return height || 1;
1298
+ }
1299
+
1300
+ function charWidth(display) {
1301
+ if (display.cachedCharWidth != null) return display.cachedCharWidth;
1302
+ var anchor = elt("span", "x");
1303
+ var pre = elt("pre", [anchor]);
1304
+ removeChildrenAndAdd(display.measure, pre);
1305
+ var width = anchor.offsetWidth;
1306
+ if (width > 2) display.cachedCharWidth = width;
1307
+ return width || 10;
1308
+ }
1309
+
1310
+ // OPERATIONS
1311
+
1312
+ // Operations are used to wrap changes in such a way that each
1313
+ // change won't have to update the cursor and display (which would
1314
+ // be awkward, slow, and error-prone), but instead updates are
1315
+ // batched and then all combined and executed at once.
1316
+
1317
+ var nextOpId = 0;
1318
+ function startOperation(cm) {
1319
+ cm.curOp = {
1320
+ // An array of ranges of lines that have to be updated. See
1321
+ // updateDisplay.
1322
+ changes: [],
1323
+ forceUpdate: false,
1324
+ updateInput: null,
1325
+ userSelChange: null,
1326
+ textChanged: null,
1327
+ selectionChanged: false,
1328
+ cursorActivity: false,
1329
+ updateMaxLine: false,
1330
+ updateScrollPos: false,
1331
+ id: ++nextOpId
1332
+ };
1333
+ if (!delayedCallbackDepth++) delayedCallbacks = [];
1334
+ }
1335
+
1336
+ function endOperation(cm) {
1337
+ var op = cm.curOp, doc = cm.doc, display = cm.display;
1338
+ cm.curOp = null;
1339
+
1340
+ if (op.updateMaxLine) computeMaxLength(cm);
1341
+ if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
1342
+ var width = measureLineWidth(cm, display.maxLine);
1343
+ display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
1344
+ display.maxLineChanged = false;
1345
+ var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
1346
+ if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
1347
+ setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);
1348
+ }
1349
+ var newScrollPos, updated;
1350
+ if (op.updateScrollPos) {
1351
+ newScrollPos = op.updateScrollPos;
1352
+ } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible
1353
+ var coords = cursorCoords(cm, doc.sel.head);
1354
+ newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
1355
+ }
1356
+ if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
1357
+ updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
1358
+ if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
1359
+ }
1360
+ if (!updated && op.selectionChanged) updateSelection(cm);
1361
+ if (op.updateScrollPos) {
1362
+ display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop;
1363
+ display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
1364
+ alignHorizontally(cm);
1365
+ if (op.scrollToPos)
1366
+ scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos), op.scrollToPosMargin);
1367
+ } else if (newScrollPos) {
1368
+ scrollCursorIntoView(cm);
1369
+ }
1370
+ if (op.selectionChanged) restartBlink(cm);
1371
+
1372
+ if (cm.state.focused && op.updateInput)
1373
+ resetInput(cm, op.userSelChange);
1374
+
1375
+ var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
1376
+ if (hidden) for (var i = 0; i < hidden.length; ++i)
1377
+ if (!hidden[i].lines.length) signal(hidden[i], "hide");
1378
+ if (unhidden) for (var i = 0; i < unhidden.length; ++i)
1379
+ if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
1380
+
1381
+ var delayed;
1382
+ if (!--delayedCallbackDepth) {
1383
+ delayed = delayedCallbacks;
1384
+ delayedCallbacks = null;
1385
+ }
1386
+ if (op.textChanged)
1387
+ signal(cm, "change", cm, op.textChanged);
1388
+ if (op.cursorActivity) signal(cm, "cursorActivity", cm);
1389
+ if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
1390
+ }
1391
+
1392
+ // Wraps a function in an operation. Returns the wrapped function.
1393
+ function operation(cm1, f) {
1394
+ return function() {
1395
+ var cm = cm1 || this, withOp = !cm.curOp;
1396
+ if (withOp) startOperation(cm);
1397
+ try { var result = f.apply(cm, arguments); }
1398
+ finally { if (withOp) endOperation(cm); }
1399
+ return result;
1400
+ };
1401
+ }
1402
+ function docOperation(f) {
1403
+ return function() {
1404
+ var withOp = this.cm && !this.cm.curOp, result;
1405
+ if (withOp) startOperation(this.cm);
1406
+ try { result = f.apply(this, arguments); }
1407
+ finally { if (withOp) endOperation(this.cm); }
1408
+ return result;
1409
+ };
1410
+ }
1411
+ function runInOp(cm, f) {
1412
+ var withOp = !cm.curOp, result;
1413
+ if (withOp) startOperation(cm);
1414
+ try { result = f(); }
1415
+ finally { if (withOp) endOperation(cm); }
1416
+ return result;
1417
+ }
1418
+
1419
+ function regChange(cm, from, to, lendiff) {
1420
+ if (from == null) from = cm.doc.first;
1421
+ if (to == null) to = cm.doc.first + cm.doc.size;
1422
+ cm.curOp.changes.push({from: from, to: to, diff: lendiff});
1423
+ }
1424
+
1425
+ // INPUT HANDLING
1426
+
1427
+ function slowPoll(cm) {
1428
+ if (cm.display.pollingFast) return;
1429
+ cm.display.poll.set(cm.options.pollInterval, function() {
1430
+ readInput(cm);
1431
+ if (cm.state.focused) slowPoll(cm);
1432
+ });
1433
+ }
1434
+
1435
+ function fastPoll(cm) {
1436
+ var missed = false;
1437
+ cm.display.pollingFast = true;
1438
+ function p() {
1439
+ var changed = readInput(cm);
1440
+ if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
1441
+ else {cm.display.pollingFast = false; slowPoll(cm);}
1442
+ }
1443
+ cm.display.poll.set(20, p);
1444
+ }
1445
+
1446
+ // prevInput is a hack to work with IME. If we reset the textarea
1447
+ // on every change, that breaks IME. So we look for changes
1448
+ // compared to the previous content instead. (Modern browsers have
1449
+ // events that indicate IME taking place, but these are not widely
1450
+ // supported or compatible enough yet to rely on.)
1451
+ function readInput(cm) {
1452
+ var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
1453
+ if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
1454
+ var text = input.value;
1455
+ if (text == prevInput && posEq(sel.from, sel.to)) return false;
1456
+ if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
1457
+ resetInput(cm, true);
1458
+ return false;
1459
+ }
1460
+
1461
+ var withOp = !cm.curOp;
1462
+ if (withOp) startOperation(cm);
1463
+ sel.shift = false;
1464
+ var same = 0, l = Math.min(prevInput.length, text.length);
1465
+ while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
1466
+ var from = sel.from, to = sel.to;
1467
+ if (same < prevInput.length)
1468
+ from = Pos(from.line, from.ch - (prevInput.length - same));
1469
+ else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
1470
+ to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
1471
+
1472
+ var updateInput = cm.curOp.updateInput;
1473
+ var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
1474
+ origin: cm.state.pasteIncoming ? "paste" : "+input"};
1475
+ makeChange(cm.doc, changeEvent, "end");
1476
+ cm.curOp.updateInput = updateInput;
1477
+ signalLater(cm, "inputRead", cm, changeEvent);
1478
+
1479
+ if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
1480
+ else cm.display.prevInput = text;
1481
+ if (withOp) endOperation(cm);
1482
+ cm.state.pasteIncoming = false;
1483
+ return true;
1484
+ }
1485
+
1486
+ function resetInput(cm, user) {
1487
+ var minimal, selected, doc = cm.doc;
1488
+ if (!posEq(doc.sel.from, doc.sel.to)) {
1489
+ cm.display.prevInput = "";
1490
+ minimal = hasCopyEvent &&
1491
+ (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000);
1492
+ var content = minimal ? "-" : selected || cm.getSelection();
1493
+ cm.display.input.value = content;
1494
+ if (cm.state.focused) selectInput(cm.display.input);
1495
+ if (ie && !ie_lt9) cm.display.inputHasSelection = content;
1496
+ } else if (user) {
1497
+ cm.display.prevInput = cm.display.input.value = "";
1498
+ if (ie && !ie_lt9) cm.display.inputHasSelection = null;
1499
+ }
1500
+ cm.display.inaccurateSelection = minimal;
1501
+ }
1502
+
1503
+ function focusInput(cm) {
1504
+ if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input))
1505
+ cm.display.input.focus();
1506
+ }
1507
+
1508
+ function isReadOnly(cm) {
1509
+ return cm.options.readOnly || cm.doc.cantEdit;
1510
+ }
1511
+
1512
+ // EVENT HANDLERS
1513
+
1514
+ function registerEventHandlers(cm) {
1515
+ var d = cm.display;
1516
+ on(d.scroller, "mousedown", operation(cm, onMouseDown));
1517
+ if (ie)
1518
+ on(d.scroller, "dblclick", operation(cm, function(e) {
1519
+ if (signalDOMEvent(cm, e)) return;
1520
+ var pos = posFromMouse(cm, e);
1521
+ if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
1522
+ e_preventDefault(e);
1523
+ var word = findWordAt(getLine(cm.doc, pos.line).text, pos);
1524
+ extendSelection(cm.doc, word.from, word.to);
1525
+ }));
1526
+ else
1527
+ on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
1528
+ on(d.lineSpace, "selectstart", function(e) {
1529
+ if (!eventInWidget(d, e)) e_preventDefault(e);
1530
+ });
1531
+ // Gecko browsers fire contextmenu *after* opening the menu, at
1532
+ // which point we can't mess with it anymore. Context menu is
1533
+ // handled in onMouseDown for Gecko.
1534
+ if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
1535
+
1536
+ on(d.scroller, "scroll", function() {
1537
+ if (d.scroller.clientHeight) {
1538
+ setScrollTop(cm, d.scroller.scrollTop);
1539
+ setScrollLeft(cm, d.scroller.scrollLeft, true);
1540
+ signal(cm, "scroll", cm);
1541
+ }
1542
+ });
1543
+ on(d.scrollbarV, "scroll", function() {
1544
+ if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
1545
+ });
1546
+ on(d.scrollbarH, "scroll", function() {
1547
+ if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
1548
+ });
1549
+
1550
+ on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
1551
+ on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
1552
+
1553
+ function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
1554
+ on(d.scrollbarH, "mousedown", reFocus);
1555
+ on(d.scrollbarV, "mousedown", reFocus);
1556
+ // Prevent wrapper from ever scrolling
1557
+ on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
1558
+
1559
+ var resizeTimer;
1560
+ function onResize() {
1561
+ if (resizeTimer == null) resizeTimer = setTimeout(function() {
1562
+ resizeTimer = null;
1563
+ // Might be a text scaling operation, clear size caches.
1564
+ d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
1565
+ clearCaches(cm);
1566
+ runInOp(cm, bind(regChange, cm));
1567
+ }, 100);
1568
+ }
1569
+ on(window, "resize", onResize);
1570
+ // Above handler holds on to the editor and its data structures.
1571
+ // Here we poll to unregister it when the editor is no longer in
1572
+ // the document, so that it can be garbage-collected.
1573
+ function unregister() {
1574
+ for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {}
1575
+ if (p) setTimeout(unregister, 5000);
1576
+ else off(window, "resize", onResize);
1577
+ }
1578
+ setTimeout(unregister, 5000);
1579
+
1580
+ on(d.input, "keyup", operation(cm, function(e) {
1581
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
1582
+ if (e.keyCode == 16) cm.doc.sel.shift = false;
1583
+ }));
1584
+ on(d.input, "input", bind(fastPoll, cm));
1585
+ on(d.input, "keydown", operation(cm, onKeyDown));
1586
+ on(d.input, "keypress", operation(cm, onKeyPress));
1587
+ on(d.input, "focus", bind(onFocus, cm));
1588
+ on(d.input, "blur", bind(onBlur, cm));
1589
+
1590
+ function drag_(e) {
1591
+ if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
1592
+ e_stop(e);
1593
+ }
1594
+ if (cm.options.dragDrop) {
1595
+ on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
1596
+ on(d.scroller, "dragenter", drag_);
1597
+ on(d.scroller, "dragover", drag_);
1598
+ on(d.scroller, "drop", operation(cm, onDrop));
1599
+ }
1600
+ on(d.scroller, "paste", function(e){
1601
+ if (eventInWidget(d, e)) return;
1602
+ focusInput(cm);
1603
+ fastPoll(cm);
1604
+ });
1605
+ on(d.input, "paste", function() {
1606
+ cm.state.pasteIncoming = true;
1607
+ fastPoll(cm);
1608
+ });
1609
+
1610
+ function prepareCopy() {
1611
+ if (d.inaccurateSelection) {
1612
+ d.prevInput = "";
1613
+ d.inaccurateSelection = false;
1614
+ d.input.value = cm.getSelection();
1615
+ selectInput(d.input);
1616
+ }
1617
+ }
1618
+ on(d.input, "cut", prepareCopy);
1619
+ on(d.input, "copy", prepareCopy);
1620
+
1621
+ // Needed to handle Tab key in KHTML
1622
+ if (khtml) on(d.sizer, "mouseup", function() {
1623
+ if (document.activeElement == d.input) d.input.blur();
1624
+ focusInput(cm);
1625
+ });
1626
+ }
1627
+
1628
+ function eventInWidget(display, e) {
1629
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
1630
+ if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
1631
+ }
1632
+ }
1633
+
1634
+ function posFromMouse(cm, e, liberal) {
1635
+ var display = cm.display;
1636
+ if (!liberal) {
1637
+ var target = e_target(e);
1638
+ if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
1639
+ target == display.scrollbarV || target == display.scrollbarV.firstChild ||
1640
+ target == display.scrollbarFiller || target == display.gutterFiller) return null;
1641
+ }
1642
+ var x, y, space = getRect(display.lineSpace);
1643
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
1644
+ try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
1645
+ return coordsChar(cm, x - space.left, y - space.top);
1646
+ }
1647
+
1648
+ var lastClick, lastDoubleClick;
1649
+ function onMouseDown(e) {
1650
+ if (signalDOMEvent(this, e)) return;
1651
+ var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
1652
+ sel.shift = e.shiftKey;
1653
+
1654
+ if (eventInWidget(display, e)) {
1655
+ if (!webkit) {
1656
+ display.scroller.draggable = false;
1657
+ setTimeout(function(){display.scroller.draggable = true;}, 100);
1658
+ }
1659
+ return;
1660
+ }
1661
+ if (clickInGutter(cm, e)) return;
1662
+ var start = posFromMouse(cm, e);
1663
+
1664
+ switch (e_button(e)) {
1665
+ case 3:
1666
+ if (captureMiddleClick) onContextMenu.call(cm, cm, e);
1667
+ return;
1668
+ case 2:
1669
+ if (start) extendSelection(cm.doc, start);
1670
+ setTimeout(bind(focusInput, cm), 20);
1671
+ e_preventDefault(e);
1672
+ return;
1673
+ }
1674
+ // For button 1, if it was clicked inside the editor
1675
+ // (posFromMouse returning non-null), we have to adjust the
1676
+ // selection.
1677
+ if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
1678
+
1679
+ if (!cm.state.focused) onFocus(cm);
1680
+
1681
+ var now = +new Date, type = "single";
1682
+ if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
1683
+ type = "triple";
1684
+ e_preventDefault(e);
1685
+ setTimeout(bind(focusInput, cm), 20);
1686
+ selectLine(cm, start.line);
1687
+ } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
1688
+ type = "double";
1689
+ lastDoubleClick = {time: now, pos: start};
1690
+ e_preventDefault(e);
1691
+ var word = findWordAt(getLine(doc, start.line).text, start);
1692
+ extendSelection(cm.doc, word.from, word.to);
1693
+ } else { lastClick = {time: now, pos: start}; }
1694
+
1695
+ var last = start;
1696
+ if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) &&
1697
+ !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
1698
+ var dragEnd = operation(cm, function(e2) {
1699
+ if (webkit) display.scroller.draggable = false;
1700
+ cm.state.draggingText = false;
1701
+ off(document, "mouseup", dragEnd);
1702
+ off(display.scroller, "drop", dragEnd);
1703
+ if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
1704
+ e_preventDefault(e2);
1705
+ extendSelection(cm.doc, start);
1706
+ focusInput(cm);
1707
+ }
1708
+ });
1709
+ // Let the drag handler handle this.
1710
+ if (webkit) display.scroller.draggable = true;
1711
+ cm.state.draggingText = dragEnd;
1712
+ // IE's approach to draggable
1713
+ if (display.scroller.dragDrop) display.scroller.dragDrop();
1714
+ on(document, "mouseup", dragEnd);
1715
+ on(display.scroller, "drop", dragEnd);
1716
+ return;
1717
+ }
1718
+ e_preventDefault(e);
1719
+ if (type == "single") extendSelection(cm.doc, clipPos(doc, start));
1720
+
1721
+ var startstart = sel.from, startend = sel.to, lastPos = start;
1722
+
1723
+ function doSelect(cur) {
1724
+ if (posEq(lastPos, cur)) return;
1725
+ lastPos = cur;
1726
+
1727
+ if (type == "single") {
1728
+ extendSelection(cm.doc, clipPos(doc, start), cur);
1729
+ return;
1730
+ }
1731
+
1732
+ startstart = clipPos(doc, startstart);
1733
+ startend = clipPos(doc, startend);
1734
+ if (type == "double") {
1735
+ var word = findWordAt(getLine(doc, cur.line).text, cur);
1736
+ if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend);
1737
+ else extendSelection(cm.doc, startstart, word.to);
1738
+ } else if (type == "triple") {
1739
+ if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0)));
1740
+ else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0)));
1741
+ }
1742
+ }
1743
+
1744
+ var editorSize = getRect(display.wrapper);
1745
+ // Used to ensure timeout re-tries don't fire when another extend
1746
+ // happened in the meantime (clearTimeout isn't reliable -- at
1747
+ // least on Chrome, the timeouts still happen even when cleared,
1748
+ // if the clear happens after their scheduled firing time).
1749
+ var counter = 0;
1750
+
1751
+ function extend(e) {
1752
+ var curCount = ++counter;
1753
+ var cur = posFromMouse(cm, e, true);
1754
+ if (!cur) return;
1755
+ if (!posEq(cur, last)) {
1756
+ if (!cm.state.focused) onFocus(cm);
1757
+ last = cur;
1758
+ doSelect(cur);
1759
+ var visible = visibleLines(display, doc);
1760
+ if (cur.line >= visible.to || cur.line < visible.from)
1761
+ setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
1762
+ } else {
1763
+ var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
1764
+ if (outside) setTimeout(operation(cm, function() {
1765
+ if (counter != curCount) return;
1766
+ display.scroller.scrollTop += outside;
1767
+ extend(e);
1768
+ }), 50);
1769
+ }
1770
+ }
1771
+
1772
+ function done(e) {
1773
+ counter = Infinity;
1774
+ e_preventDefault(e);
1775
+ focusInput(cm);
1776
+ off(document, "mousemove", move);
1777
+ off(document, "mouseup", up);
1778
+ }
1779
+
1780
+ var move = operation(cm, function(e) {
1781
+ if (!ie && !e_button(e)) done(e);
1782
+ else extend(e);
1783
+ });
1784
+ var up = operation(cm, done);
1785
+ on(document, "mousemove", move);
1786
+ on(document, "mouseup", up);
1787
+ }
1788
+
1789
+ function clickInGutter(cm, e) {
1790
+ var display = cm.display;
1791
+ try { var mX = e.clientX, mY = e.clientY; }
1792
+ catch(e) { return false; }
1793
+
1794
+ if (mX >= Math.floor(getRect(display.gutters).right)) return false;
1795
+ e_preventDefault(e);
1796
+ if (!hasHandler(cm, "gutterClick")) return true;
1797
+
1798
+ var lineBox = getRect(display.lineDiv);
1799
+ if (mY > lineBox.bottom) return true;
1800
+ mY -= lineBox.top - display.viewOffset;
1801
+
1802
+ for (var i = 0; i < cm.options.gutters.length; ++i) {
1803
+ var g = display.gutters.childNodes[i];
1804
+ if (g && getRect(g).right >= mX) {
1805
+ var line = lineAtHeight(cm.doc, mY);
1806
+ var gutter = cm.options.gutters[i];
1807
+ signalLater(cm, "gutterClick", cm, line, gutter, e);
1808
+ break;
1809
+ }
1810
+ }
1811
+ return true;
1812
+ }
1813
+
1814
+ // Kludge to work around strange IE behavior where it'll sometimes
1815
+ // re-fire a series of drag-related events right after the drop (#1551)
1816
+ var lastDrop = 0;
1817
+
1818
+ function onDrop(e) {
1819
+ var cm = this;
1820
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
1821
+ return;
1822
+ e_preventDefault(e);
1823
+ if (ie) lastDrop = +new Date;
1824
+ var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
1825
+ if (!pos || isReadOnly(cm)) return;
1826
+ if (files && files.length && window.FileReader && window.File) {
1827
+ var n = files.length, text = Array(n), read = 0;
1828
+ var loadFile = function(file, i) {
1829
+ var reader = new FileReader;
1830
+ reader.onload = function() {
1831
+ text[i] = reader.result;
1832
+ if (++read == n) {
1833
+ pos = clipPos(cm.doc, pos);
1834
+ makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around");
1835
+ }
1836
+ };
1837
+ reader.readAsText(file);
1838
+ };
1839
+ for (var i = 0; i < n; ++i) loadFile(files[i], i);
1840
+ } else {
1841
+ // Don't do a replace if the drop happened inside of the selected text.
1842
+ if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) {
1843
+ cm.state.draggingText(e);
1844
+ // Ensure the editor is re-focused
1845
+ setTimeout(bind(focusInput, cm), 20);
1846
+ return;
1847
+ }
1848
+ try {
1849
+ var text = e.dataTransfer.getData("Text");
1850
+ if (text) {
1851
+ var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to;
1852
+ setSelection(cm.doc, pos, pos);
1853
+ if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste");
1854
+ cm.replaceSelection(text, null, "paste");
1855
+ focusInput(cm);
1856
+ onFocus(cm);
1857
+ }
1858
+ }
1859
+ catch(e){}
1860
+ }
1861
+ }
1862
+
1863
+ function onDragStart(cm, e) {
1864
+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
1865
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
1866
+
1867
+ var txt = cm.getSelection();
1868
+ e.dataTransfer.setData("Text", txt);
1869
+
1870
+ // Use dummy image instead of default browsers image.
1871
+ // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
1872
+ if (e.dataTransfer.setDragImage && !safari) {
1873
+ var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
1874
+ if (opera) {
1875
+ img.width = img.height = 1;
1876
+ cm.display.wrapper.appendChild(img);
1877
+ // Force a relayout, or Opera won't use our image for some obscure reason
1878
+ img._top = img.offsetTop;
1879
+ }
1880
+ e.dataTransfer.setDragImage(img, 0, 0);
1881
+ if (opera) img.parentNode.removeChild(img);
1882
+ }
1883
+ }
1884
+
1885
+ function setScrollTop(cm, val) {
1886
+ if (Math.abs(cm.doc.scrollTop - val) < 2) return;
1887
+ cm.doc.scrollTop = val;
1888
+ if (!gecko) updateDisplay(cm, [], val);
1889
+ if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
1890
+ if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
1891
+ if (gecko) updateDisplay(cm, []);
1892
+ startWorker(cm, 100);
1893
+ }
1894
+ function setScrollLeft(cm, val, isScroller) {
1895
+ if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
1896
+ val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
1897
+ cm.doc.scrollLeft = val;
1898
+ alignHorizontally(cm);
1899
+ if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
1900
+ if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
1901
+ }
1902
+
1903
+ // Since the delta values reported on mouse wheel events are
1904
+ // unstandardized between browsers and even browser versions, and
1905
+ // generally horribly unpredictable, this code starts by measuring
1906
+ // the scroll effect that the first few mouse wheel events have,
1907
+ // and, from that, detects the way it can convert deltas to pixel
1908
+ // offsets afterwards.
1909
+ //
1910
+ // The reason we want to know the amount a wheel event will scroll
1911
+ // is that it gives us a chance to update the display before the
1912
+ // actual scrolling happens, reducing flickering.
1913
+
1914
+ var wheelSamples = 0, wheelPixelsPerUnit = null;
1915
+ // Fill in a browser-detected starting value on browsers where we
1916
+ // know one. These don't have to be accurate -- the result of them
1917
+ // being wrong would just be a slight flicker on the first wheel
1918
+ // scroll (if it is large enough).
1919
+ if (ie) wheelPixelsPerUnit = -.53;
1920
+ else if (gecko) wheelPixelsPerUnit = 15;
1921
+ else if (chrome) wheelPixelsPerUnit = -.7;
1922
+ else if (safari) wheelPixelsPerUnit = -1/3;
1923
+
1924
+ function onScrollWheel(cm, e) {
1925
+ var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
1926
+ if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
1927
+ if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
1928
+ else if (dy == null) dy = e.wheelDelta;
1929
+
1930
+ var display = cm.display, scroll = display.scroller;
1931
+ // Quit if there's nothing to scroll here
1932
+ if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
1933
+ dy && scroll.scrollHeight > scroll.clientHeight)) return;
1934
+
1935
+ // Webkit browsers on OS X abort momentum scrolls when the target
1936
+ // of the scroll event is removed from the scrollable element.
1937
+ // This hack (see related code in patchDisplay) makes sure the
1938
+ // element is kept around.
1939
+ if (dy && mac && webkit) {
1940
+ for (var cur = e.target; cur != scroll; cur = cur.parentNode) {
1941
+ if (cur.lineObj) {
1942
+ cm.display.currentWheelTarget = cur;
1943
+ break;
1944
+ }
1945
+ }
1946
+ }
1947
+
1948
+ // On some browsers, horizontal scrolling will cause redraws to
1949
+ // happen before the gutter has been realigned, causing it to
1950
+ // wriggle around in a most unseemly way. When we have an
1951
+ // estimated pixels/delta value, we just handle horizontal
1952
+ // scrolling entirely here. It'll be slightly off from native, but
1953
+ // better than glitching out.
1954
+ if (dx && !gecko && !opera && wheelPixelsPerUnit != null) {
1955
+ if (dy)
1956
+ setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
1957
+ setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
1958
+ e_preventDefault(e);
1959
+ display.wheelStartX = null; // Abort measurement, if in progress
1960
+ return;
1961
+ }
1962
+
1963
+ if (dy && wheelPixelsPerUnit != null) {
1964
+ var pixels = dy * wheelPixelsPerUnit;
1965
+ var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
1966
+ if (pixels < 0) top = Math.max(0, top + pixels - 50);
1967
+ else bot = Math.min(cm.doc.height, bot + pixels + 50);
1968
+ updateDisplay(cm, [], {top: top, bottom: bot});
1969
+ }
1970
+
1971
+ if (wheelSamples < 20) {
1972
+ if (display.wheelStartX == null) {
1973
+ display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
1974
+ display.wheelDX = dx; display.wheelDY = dy;
1975
+ setTimeout(function() {
1976
+ if (display.wheelStartX == null) return;
1977
+ var movedX = scroll.scrollLeft - display.wheelStartX;
1978
+ var movedY = scroll.scrollTop - display.wheelStartY;
1979
+ var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
1980
+ (movedX && display.wheelDX && movedX / display.wheelDX);
1981
+ display.wheelStartX = display.wheelStartY = null;
1982
+ if (!sample) return;
1983
+ wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
1984
+ ++wheelSamples;
1985
+ }, 200);
1986
+ } else {
1987
+ display.wheelDX += dx; display.wheelDY += dy;
1988
+ }
1989
+ }
1990
+ }
1991
+
1992
+ function doHandleBinding(cm, bound, dropShift) {
1993
+ if (typeof bound == "string") {
1994
+ bound = commands[bound];
1995
+ if (!bound) return false;
1996
+ }
1997
+ // Ensure previous input has been read, so that the handler sees a
1998
+ // consistent view of the document
1999
+ if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
2000
+ var doc = cm.doc, prevShift = doc.sel.shift, done = false;
2001
+ try {
2002
+ if (isReadOnly(cm)) cm.state.suppressEdits = true;
2003
+ if (dropShift) doc.sel.shift = false;
2004
+ done = bound(cm) != Pass;
2005
+ } finally {
2006
+ doc.sel.shift = prevShift;
2007
+ cm.state.suppressEdits = false;
2008
+ }
2009
+ return done;
2010
+ }
2011
+
2012
+ function allKeyMaps(cm) {
2013
+ var maps = cm.state.keyMaps.slice(0);
2014
+ if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
2015
+ maps.push(cm.options.keyMap);
2016
+ return maps;
2017
+ }
2018
+
2019
+ var maybeTransition;
2020
+ function handleKeyBinding(cm, e) {
2021
+ // Handle auto keymap transitions
2022
+ var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
2023
+ clearTimeout(maybeTransition);
2024
+ if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
2025
+ if (getKeyMap(cm.options.keyMap) == startMap) {
2026
+ cm.options.keyMap = (next.call ? next.call(null, cm) : next);
2027
+ keyMapChanged(cm);
2028
+ }
2029
+ }, 50);
2030
+
2031
+ var name = keyName(e, true), handled = false;
2032
+ if (!name) return false;
2033
+ var keymaps = allKeyMaps(cm);
2034
+
2035
+ if (e.shiftKey) {
2036
+ // First try to resolve full name (including 'Shift-'). Failing
2037
+ // that, see if there is a cursor-motion command (starting with
2038
+ // 'go') bound to the keyname without 'Shift-'.
2039
+ handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
2040
+ || lookupKey(name, keymaps, function(b) {
2041
+ if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
2042
+ return doHandleBinding(cm, b);
2043
+ });
2044
+ } else {
2045
+ handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
2046
+ }
2047
+
2048
+ if (handled) {
2049
+ e_preventDefault(e);
2050
+ restartBlink(cm);
2051
+ if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
2052
+ signalLater(cm, "keyHandled", cm, name, e);
2053
+ }
2054
+ return handled;
2055
+ }
2056
+
2057
+ function handleCharBinding(cm, e, ch) {
2058
+ var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
2059
+ function(b) { return doHandleBinding(cm, b, true); });
2060
+ if (handled) {
2061
+ e_preventDefault(e);
2062
+ restartBlink(cm);
2063
+ signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
2064
+ }
2065
+ return handled;
2066
+ }
2067
+
2068
+ var lastStoppedKey = null;
2069
+ function onKeyDown(e) {
2070
+ var cm = this;
2071
+ if (!cm.state.focused) onFocus(cm);
2072
+ if (ie && e.keyCode == 27) { e.returnValue = false; }
2073
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2074
+ var code = e.keyCode;
2075
+ // IE does strange things with escape.
2076
+ cm.doc.sel.shift = code == 16 || e.shiftKey;
2077
+ // First give onKeyEvent option a chance to handle this.
2078
+ var handled = handleKeyBinding(cm, e);
2079
+ if (opera) {
2080
+ lastStoppedKey = handled ? code : null;
2081
+ // Opera has no cut event... we try to at least catch the key combo
2082
+ if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
2083
+ cm.replaceSelection("");
2084
+ }
2085
+ }
2086
+
2087
+ function onKeyPress(e) {
2088
+ var cm = this;
2089
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2090
+ var keyCode = e.keyCode, charCode = e.charCode;
2091
+ if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
2092
+ if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
2093
+ var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
2094
+ if (this.options.electricChars && this.doc.mode.electricChars &&
2095
+ this.options.smartIndent && !isReadOnly(this) &&
2096
+ this.doc.mode.electricChars.indexOf(ch) > -1)
2097
+ setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75);
2098
+ if (handleCharBinding(cm, e, ch)) return;
2099
+ if (ie && !ie_lt9) cm.display.inputHasSelection = null;
2100
+ fastPoll(cm);
2101
+ }
2102
+
2103
+ function onFocus(cm) {
2104
+ if (cm.options.readOnly == "nocursor") return;
2105
+ if (!cm.state.focused) {
2106
+ signal(cm, "focus", cm);
2107
+ cm.state.focused = true;
2108
+ if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
2109
+ cm.display.wrapper.className += " CodeMirror-focused";
2110
+ resetInput(cm, true);
2111
+ }
2112
+ slowPoll(cm);
2113
+ restartBlink(cm);
2114
+ }
2115
+ function onBlur(cm) {
2116
+ if (cm.state.focused) {
2117
+ signal(cm, "blur", cm);
2118
+ cm.state.focused = false;
2119
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", "");
2120
+ }
2121
+ clearInterval(cm.display.blinker);
2122
+ setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150);
2123
+ }
2124
+
2125
+ var detectingSelectAll;
2126
+ function onContextMenu(cm, e) {
2127
+ if (signalDOMEvent(cm, e, "contextmenu")) return;
2128
+ var display = cm.display, sel = cm.doc.sel;
2129
+ if (eventInWidget(display, e)) return;
2130
+
2131
+ var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
2132
+ if (!pos || opera) return; // Opera is difficult.
2133
+ if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
2134
+ operation(cm, setSelection)(cm.doc, pos, pos);
2135
+
2136
+ var oldCSS = display.input.style.cssText;
2137
+ display.inputDiv.style.position = "absolute";
2138
+ display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
2139
+ "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" +
2140
+ "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);";
2141
+ focusInput(cm);
2142
+ resetInput(cm, true);
2143
+ // Adds "Select all" to context menu in FF
2144
+ if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " ";
2145
+
2146
+ function prepareSelectAllHack() {
2147
+ if (display.input.selectionStart != null) {
2148
+ var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value);
2149
+ display.prevInput = " ";
2150
+ display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
2151
+ }
2152
+ }
2153
+ function rehide() {
2154
+ display.inputDiv.style.position = "relative";
2155
+ display.input.style.cssText = oldCSS;
2156
+ if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;
2157
+ slowPoll(cm);
2158
+
2159
+ // Try to detect the user choosing select-all
2160
+ if (display.input.selectionStart != null) {
2161
+ if (!ie || ie_lt9) prepareSelectAllHack();
2162
+ clearTimeout(detectingSelectAll);
2163
+ var i = 0, poll = function(){
2164
+ if (display.prevInput == " " && display.input.selectionStart == 0)
2165
+ operation(cm, commands.selectAll)(cm);
2166
+ else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
2167
+ else resetInput(cm);
2168
+ };
2169
+ detectingSelectAll = setTimeout(poll, 200);
2170
+ }
2171
+ }
2172
+
2173
+ if (ie && !ie_lt9) prepareSelectAllHack();
2174
+ if (captureMiddleClick) {
2175
+ e_stop(e);
2176
+ var mouseup = function() {
2177
+ off(window, "mouseup", mouseup);
2178
+ setTimeout(rehide, 20);
2179
+ };
2180
+ on(window, "mouseup", mouseup);
2181
+ } else {
2182
+ setTimeout(rehide, 50);
2183
+ }
2184
+ }
2185
+
2186
+ // UPDATING
2187
+
2188
+ var changeEnd = CodeMirror.changeEnd = function(change) {
2189
+ if (!change.text) return change.to;
2190
+ return Pos(change.from.line + change.text.length - 1,
2191
+ lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
2192
+ };
2193
+
2194
+ // Make sure a position will be valid after the given change.
2195
+ function clipPostChange(doc, change, pos) {
2196
+ if (!posLess(change.from, pos)) return clipPos(doc, pos);
2197
+ var diff = (change.text.length - 1) - (change.to.line - change.from.line);
2198
+ if (pos.line > change.to.line + diff) {
2199
+ var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1;
2200
+ if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length);
2201
+ return clipToLen(pos, getLine(doc, preLine).text.length);
2202
+ }
2203
+ if (pos.line == change.to.line + diff)
2204
+ return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) +
2205
+ getLine(doc, change.to.line).text.length - change.to.ch);
2206
+ var inside = pos.line - change.from.line;
2207
+ return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch));
2208
+ }
2209
+
2210
+ // Hint can be null|"end"|"start"|"around"|{anchor,head}
2211
+ function computeSelAfterChange(doc, change, hint) {
2212
+ if (hint && typeof hint == "object") // Assumed to be {anchor, head} object
2213
+ return {anchor: clipPostChange(doc, change, hint.anchor),
2214
+ head: clipPostChange(doc, change, hint.head)};
2215
+
2216
+ if (hint == "start") return {anchor: change.from, head: change.from};
2217
+
2218
+ var end = changeEnd(change);
2219
+ if (hint == "around") return {anchor: change.from, head: end};
2220
+ if (hint == "end") return {anchor: end, head: end};
2221
+
2222
+ // hint is null, leave the selection alone as much as possible
2223
+ var adjustPos = function(pos) {
2224
+ if (posLess(pos, change.from)) return pos;
2225
+ if (!posLess(change.to, pos)) return end;
2226
+
2227
+ var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
2228
+ if (pos.line == change.to.line) ch += end.ch - change.to.ch;
2229
+ return Pos(line, ch);
2230
+ };
2231
+ return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)};
2232
+ }
2233
+
2234
+ function filterChange(doc, change, update) {
2235
+ var obj = {
2236
+ canceled: false,
2237
+ from: change.from,
2238
+ to: change.to,
2239
+ text: change.text,
2240
+ origin: change.origin,
2241
+ cancel: function() { this.canceled = true; }
2242
+ };
2243
+ if (update) obj.update = function(from, to, text, origin) {
2244
+ if (from) this.from = clipPos(doc, from);
2245
+ if (to) this.to = clipPos(doc, to);
2246
+ if (text) this.text = text;
2247
+ if (origin !== undefined) this.origin = origin;
2248
+ };
2249
+ signal(doc, "beforeChange", doc, obj);
2250
+ if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
2251
+
2252
+ if (obj.canceled) return null;
2253
+ return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
2254
+ }
2255
+
2256
+ // Replace the range from from to to by the strings in replacement.
2257
+ // change is a {from, to, text [, origin]} object
2258
+ function makeChange(doc, change, selUpdate, ignoreReadOnly) {
2259
+ if (doc.cm) {
2260
+ if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly);
2261
+ if (doc.cm.state.suppressEdits) return;
2262
+ }
2263
+
2264
+ if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
2265
+ change = filterChange(doc, change, true);
2266
+ if (!change) return;
2267
+ }
2268
+
2269
+ // Possibly split or suppress the update based on the presence
2270
+ // of read-only spans in its range.
2271
+ var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
2272
+ if (split) {
2273
+ for (var i = split.length - 1; i >= 1; --i)
2274
+ makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]});
2275
+ if (split.length)
2276
+ makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate);
2277
+ } else {
2278
+ makeChangeNoReadonly(doc, change, selUpdate);
2279
+ }
2280
+ }
2281
+
2282
+ function makeChangeNoReadonly(doc, change, selUpdate) {
2283
+ var selAfter = computeSelAfterChange(doc, change, selUpdate);
2284
+ addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
2285
+
2286
+ makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
2287
+ var rebased = [];
2288
+
2289
+ linkedDocs(doc, function(doc, sharedHist) {
2290
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2291
+ rebaseHist(doc.history, change);
2292
+ rebased.push(doc.history);
2293
+ }
2294
+ makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
2295
+ });
2296
+ }
2297
+
2298
+ function makeChangeFromHistory(doc, type) {
2299
+ if (doc.cm && doc.cm.state.suppressEdits) return;
2300
+
2301
+ var hist = doc.history;
2302
+ var event = (type == "undo" ? hist.done : hist.undone).pop();
2303
+ if (!event) return;
2304
+
2305
+ var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter,
2306
+ anchorAfter: event.anchorBefore, headAfter: event.headBefore,
2307
+ generation: hist.generation};
2308
+ (type == "undo" ? hist.undone : hist.done).push(anti);
2309
+ hist.generation = event.generation || ++hist.maxGeneration;
2310
+
2311
+ var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
2312
+
2313
+ for (var i = event.changes.length - 1; i >= 0; --i) {
2314
+ var change = event.changes[i];
2315
+ change.origin = type;
2316
+ if (filter && !filterChange(doc, change, false)) {
2317
+ (type == "undo" ? hist.done : hist.undone).length = 0;
2318
+ return;
2319
+ }
2320
+
2321
+ anti.changes.push(historyChangeFromChange(doc, change));
2322
+
2323
+ var after = i ? computeSelAfterChange(doc, change, null)
2324
+ : {anchor: event.anchorBefore, head: event.headBefore};
2325
+ makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
2326
+ var rebased = [];
2327
+
2328
+ linkedDocs(doc, function(doc, sharedHist) {
2329
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2330
+ rebaseHist(doc.history, change);
2331
+ rebased.push(doc.history);
2332
+ }
2333
+ makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
2334
+ });
2335
+ }
2336
+ }
2337
+
2338
+ function shiftDoc(doc, distance) {
2339
+ function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);}
2340
+ doc.first += distance;
2341
+ if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance);
2342
+ doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor);
2343
+ doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to);
2344
+ }
2345
+
2346
+ function makeChangeSingleDoc(doc, change, selAfter, spans) {
2347
+ if (doc.cm && !doc.cm.curOp)
2348
+ return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
2349
+
2350
+ if (change.to.line < doc.first) {
2351
+ shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
2352
+ return;
2353
+ }
2354
+ if (change.from.line > doc.lastLine()) return;
2355
+
2356
+ // Clip the change to the size of this doc
2357
+ if (change.from.line < doc.first) {
2358
+ var shift = change.text.length - 1 - (doc.first - change.from.line);
2359
+ shiftDoc(doc, shift);
2360
+ change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
2361
+ text: [lst(change.text)], origin: change.origin};
2362
+ }
2363
+ var last = doc.lastLine();
2364
+ if (change.to.line > last) {
2365
+ change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
2366
+ text: [change.text[0]], origin: change.origin};
2367
+ }
2368
+
2369
+ change.removed = getBetween(doc, change.from, change.to);
2370
+
2371
+ if (!selAfter) selAfter = computeSelAfterChange(doc, change, null);
2372
+ if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter);
2373
+ else updateDoc(doc, change, spans, selAfter);
2374
+ }
2375
+
2376
+ function makeChangeSingleDocInEditor(cm, change, spans, selAfter) {
2377
+ var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
2378
+
2379
+ var recomputeMaxLength = false, checkWidthStart = from.line;
2380
+ if (!cm.options.lineWrapping) {
2381
+ checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line)));
2382
+ doc.iter(checkWidthStart, to.line + 1, function(line) {
2383
+ if (line == display.maxLine) {
2384
+ recomputeMaxLength = true;
2385
+ return true;
2386
+ }
2387
+ });
2388
+ }
2389
+
2390
+ if (!posLess(doc.sel.head, change.from) && !posLess(change.to, doc.sel.head))
2391
+ cm.curOp.cursorActivity = true;
2392
+
2393
+ updateDoc(doc, change, spans, selAfter, estimateHeight(cm));
2394
+
2395
+ if (!cm.options.lineWrapping) {
2396
+ doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
2397
+ var len = lineLength(doc, line);
2398
+ if (len > display.maxLineLength) {
2399
+ display.maxLine = line;
2400
+ display.maxLineLength = len;
2401
+ display.maxLineChanged = true;
2402
+ recomputeMaxLength = false;
2403
+ }
2404
+ });
2405
+ if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
2406
+ }
2407
+
2408
+ // Adjust frontier, schedule worker
2409
+ doc.frontier = Math.min(doc.frontier, from.line);
2410
+ startWorker(cm, 400);
2411
+
2412
+ var lendiff = change.text.length - (to.line - from.line) - 1;
2413
+ // Remember that these lines changed, for updating the display
2414
+ regChange(cm, from.line, to.line + 1, lendiff);
2415
+
2416
+ if (hasHandler(cm, "change")) {
2417
+ var changeObj = {from: from, to: to,
2418
+ text: change.text,
2419
+ removed: change.removed,
2420
+ origin: change.origin};
2421
+ if (cm.curOp.textChanged) {
2422
+ for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {}
2423
+ cur.next = changeObj;
2424
+ } else cm.curOp.textChanged = changeObj;
2425
+ }
2426
+ }
2427
+
2428
+ function replaceRange(doc, code, from, to, origin) {
2429
+ if (!to) to = from;
2430
+ if (posLess(to, from)) { var tmp = to; to = from; from = tmp; }
2431
+ if (typeof code == "string") code = splitLines(code);
2432
+ makeChange(doc, {from: from, to: to, text: code, origin: origin}, null);
2433
+ }
2434
+
2435
+ // POSITION OBJECT
2436
+
2437
+ function Pos(line, ch) {
2438
+ if (!(this instanceof Pos)) return new Pos(line, ch);
2439
+ this.line = line; this.ch = ch;
2440
+ }
2441
+ CodeMirror.Pos = Pos;
2442
+
2443
+ function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
2444
+ function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
2445
+ function copyPos(x) {return Pos(x.line, x.ch);}
2446
+
2447
+ // SELECTION
2448
+
2449
+ function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
2450
+ function clipPos(doc, pos) {
2451
+ if (pos.line < doc.first) return Pos(doc.first, 0);
2452
+ var last = doc.first + doc.size - 1;
2453
+ if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
2454
+ return clipToLen(pos, getLine(doc, pos.line).text.length);
2455
+ }
2456
+ function clipToLen(pos, linelen) {
2457
+ var ch = pos.ch;
2458
+ if (ch == null || ch > linelen) return Pos(pos.line, linelen);
2459
+ else if (ch < 0) return Pos(pos.line, 0);
2460
+ else return pos;
2461
+ }
2462
+ function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
2463
+
2464
+ // If shift is held, this will move the selection anchor. Otherwise,
2465
+ // it'll set the whole selection.
2466
+ function extendSelection(doc, pos, other, bias) {
2467
+ if (doc.sel.shift || doc.sel.extend) {
2468
+ var anchor = doc.sel.anchor;
2469
+ if (other) {
2470
+ var posBefore = posLess(pos, anchor);
2471
+ if (posBefore != posLess(other, anchor)) {
2472
+ anchor = pos;
2473
+ pos = other;
2474
+ } else if (posBefore != posLess(pos, other)) {
2475
+ pos = other;
2476
+ }
2477
+ }
2478
+ setSelection(doc, anchor, pos, bias);
2479
+ } else {
2480
+ setSelection(doc, pos, other || pos, bias);
2481
+ }
2482
+ if (doc.cm) doc.cm.curOp.userSelChange = true;
2483
+ }
2484
+
2485
+ function filterSelectionChange(doc, anchor, head) {
2486
+ var obj = {anchor: anchor, head: head};
2487
+ signal(doc, "beforeSelectionChange", doc, obj);
2488
+ if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
2489
+ obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head);
2490
+ return obj;
2491
+ }
2492
+
2493
+ // Update the selection. Last two args are only used by
2494
+ // updateDoc, since they have to be expressed in the line
2495
+ // numbers before the update.
2496
+ function setSelection(doc, anchor, head, bias, checkAtomic) {
2497
+ if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) {
2498
+ var filtered = filterSelectionChange(doc, anchor, head);
2499
+ head = filtered.head;
2500
+ anchor = filtered.anchor;
2501
+ }
2502
+
2503
+ var sel = doc.sel;
2504
+ sel.goalColumn = null;
2505
+ // Skip over atomic spans.
2506
+ if (checkAtomic || !posEq(anchor, sel.anchor))
2507
+ anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push");
2508
+ if (checkAtomic || !posEq(head, sel.head))
2509
+ head = skipAtomic(doc, head, bias, checkAtomic != "push");
2510
+
2511
+ if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return;
2512
+
2513
+ sel.anchor = anchor; sel.head = head;
2514
+ var inv = posLess(head, anchor);
2515
+ sel.from = inv ? head : anchor;
2516
+ sel.to = inv ? anchor : head;
2517
+
2518
+ if (doc.cm)
2519
+ doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
2520
+ doc.cm.curOp.cursorActivity = true;
2521
+
2522
+ signalLater(doc, "cursorActivity", doc);
2523
+ }
2524
+
2525
+ function reCheckSelection(cm) {
2526
+ setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push");
2527
+ }
2528
+
2529
+ function skipAtomic(doc, pos, bias, mayClear) {
2530
+ var flipped = false, curPos = pos;
2531
+ var dir = bias || 1;
2532
+ doc.cantEdit = false;
2533
+ search: for (;;) {
2534
+ var line = getLine(doc, curPos.line);
2535
+ if (line.markedSpans) {
2536
+ for (var i = 0; i < line.markedSpans.length; ++i) {
2537
+ var sp = line.markedSpans[i], m = sp.marker;
2538
+ if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&
2539
+ (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {
2540
+ if (mayClear) {
2541
+ signal(m, "beforeCursorEnter");
2542
+ if (m.explicitlyCleared) {
2543
+ if (!line.markedSpans) break;
2544
+ else {--i; continue;}
2545
+ }
2546
+ }
2547
+ if (!m.atomic) continue;
2548
+ var newPos = m.find()[dir < 0 ? "from" : "to"];
2549
+ if (posEq(newPos, curPos)) {
2550
+ newPos.ch += dir;
2551
+ if (newPos.ch < 0) {
2552
+ if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));
2553
+ else newPos = null;
2554
+ } else if (newPos.ch > line.text.length) {
2555
+ if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);
2556
+ else newPos = null;
2557
+ }
2558
+ if (!newPos) {
2559
+ if (flipped) {
2560
+ // Driven in a corner -- no valid cursor position found at all
2561
+ // -- try again *with* clearing, if we didn't already
2562
+ if (!mayClear) return skipAtomic(doc, pos, bias, true);
2563
+ // Otherwise, turn off editing until further notice, and return the start of the doc
2564
+ doc.cantEdit = true;
2565
+ return Pos(doc.first, 0);
2566
+ }
2567
+ flipped = true; newPos = pos; dir = -dir;
2568
+ }
2569
+ }
2570
+ curPos = newPos;
2571
+ continue search;
2572
+ }
2573
+ }
2574
+ }
2575
+ return curPos;
2576
+ }
2577
+ }
2578
+
2579
+ // SCROLLING
2580
+
2581
+ function scrollCursorIntoView(cm) {
2582
+ var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
2583
+ if (!cm.state.focused) return;
2584
+ var display = cm.display, box = getRect(display.sizer), doScroll = null;
2585
+ if (coords.top + box.top < 0) doScroll = true;
2586
+ else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
2587
+ if (doScroll != null && !phantom) {
2588
+ var hidden = display.cursor.style.display == "none";
2589
+ if (hidden) {
2590
+ display.cursor.style.display = "";
2591
+ display.cursor.style.left = coords.left + "px";
2592
+ display.cursor.style.top = (coords.top - display.viewOffset) + "px";
2593
+ }
2594
+ display.cursor.scrollIntoView(doScroll);
2595
+ if (hidden) display.cursor.style.display = "none";
2596
+ }
2597
+ }
2598
+
2599
+ function scrollPosIntoView(cm, pos, margin) {
2600
+ if (margin == null) margin = 0;
2601
+ for (;;) {
2602
+ var changed = false, coords = cursorCoords(cm, pos);
2603
+ var scrollPos = calculateScrollPos(cm, coords.left, coords.top - margin, coords.left, coords.bottom + margin);
2604
+ var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
2605
+ if (scrollPos.scrollTop != null) {
2606
+ setScrollTop(cm, scrollPos.scrollTop);
2607
+ if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
2608
+ }
2609
+ if (scrollPos.scrollLeft != null) {
2610
+ setScrollLeft(cm, scrollPos.scrollLeft);
2611
+ if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
2612
+ }
2613
+ if (!changed) return coords;
2614
+ }
2615
+ }
2616
+
2617
+ function scrollIntoView(cm, x1, y1, x2, y2) {
2618
+ var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
2619
+ if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
2620
+ if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
2621
+ }
2622
+
2623
+ function calculateScrollPos(cm, x1, y1, x2, y2) {
2624
+ var display = cm.display, snapMargin = textHeight(cm.display);
2625
+ if (y1 < 0) y1 = 0;
2626
+ var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {};
2627
+ var docBottom = cm.doc.height + paddingVert(display);
2628
+ var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
2629
+ if (y1 < screentop) {
2630
+ result.scrollTop = atTop ? 0 : y1;
2631
+ } else if (y2 > screentop + screen) {
2632
+ var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
2633
+ if (newTop != screentop) result.scrollTop = newTop;
2634
+ }
2635
+
2636
+ var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft;
2637
+ x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth;
2638
+ var gutterw = display.gutters.offsetWidth;
2639
+ var atLeft = x1 < gutterw + 10;
2640
+ if (x1 < screenleft + gutterw || atLeft) {
2641
+ if (atLeft) x1 = 0;
2642
+ result.scrollLeft = Math.max(0, x1 - 10 - gutterw);
2643
+ } else if (x2 > screenw + screenleft - 3) {
2644
+ result.scrollLeft = x2 + 10 - screenw;
2645
+ }
2646
+ return result;
2647
+ }
2648
+
2649
+ function updateScrollPos(cm, left, top) {
2650
+ cm.curOp.updateScrollPos = {scrollLeft: left == null ? cm.doc.scrollLeft : left,
2651
+ scrollTop: top == null ? cm.doc.scrollTop : top};
2652
+ }
2653
+
2654
+ function addToScrollPos(cm, left, top) {
2655
+ var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop});
2656
+ var scroll = cm.display.scroller;
2657
+ pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top));
2658
+ pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left));
2659
+ }
2660
+
2661
+ // API UTILITIES
2662
+
2663
+ function indentLine(cm, n, how, aggressive) {
2664
+ var doc = cm.doc;
2665
+ if (how == null) how = "add";
2666
+ if (how == "smart") {
2667
+ if (!cm.doc.mode.indent) how = "prev";
2668
+ else var state = getStateBefore(cm, n);
2669
+ }
2670
+
2671
+ var tabSize = cm.options.tabSize;
2672
+ var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
2673
+ var curSpaceString = line.text.match(/^\s*/)[0], indentation;
2674
+ if (how == "smart") {
2675
+ indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
2676
+ if (indentation == Pass) {
2677
+ if (!aggressive) return;
2678
+ how = "prev";
2679
+ }
2680
+ }
2681
+ if (how == "prev") {
2682
+ if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
2683
+ else indentation = 0;
2684
+ } else if (how == "add") {
2685
+ indentation = curSpace + cm.options.indentUnit;
2686
+ } else if (how == "subtract") {
2687
+ indentation = curSpace - cm.options.indentUnit;
2688
+ } else if (typeof how == "number") {
2689
+ indentation = curSpace + how;
2690
+ }
2691
+ indentation = Math.max(0, indentation);
2692
+
2693
+ var indentString = "", pos = 0;
2694
+ if (cm.options.indentWithTabs)
2695
+ for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
2696
+ if (pos < indentation) indentString += spaceStr(indentation - pos);
2697
+
2698
+ if (indentString != curSpaceString)
2699
+ replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
2700
+ line.stateAfter = null;
2701
+ }
2702
+
2703
+ function changeLine(cm, handle, op) {
2704
+ var no = handle, line = handle, doc = cm.doc;
2705
+ if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
2706
+ else no = lineNo(handle);
2707
+ if (no == null) return null;
2708
+ if (op(line, no)) regChange(cm, no, no + 1);
2709
+ else return null;
2710
+ return line;
2711
+ }
2712
+
2713
+ function findPosH(doc, pos, dir, unit, visually) {
2714
+ var line = pos.line, ch = pos.ch, origDir = dir;
2715
+ var lineObj = getLine(doc, line);
2716
+ var possible = true;
2717
+ function findNextLine() {
2718
+ var l = line + dir;
2719
+ if (l < doc.first || l >= doc.first + doc.size) return (possible = false);
2720
+ line = l;
2721
+ return lineObj = getLine(doc, l);
2722
+ }
2723
+ function moveOnce(boundToLine) {
2724
+ var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
2725
+ if (next == null) {
2726
+ if (!boundToLine && findNextLine()) {
2727
+ if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
2728
+ else ch = dir < 0 ? lineObj.text.length : 0;
2729
+ } else return (possible = false);
2730
+ } else ch = next;
2731
+ return true;
2732
+ }
2733
+
2734
+ if (unit == "char") moveOnce();
2735
+ else if (unit == "column") moveOnce(true);
2736
+ else if (unit == "word" || unit == "group") {
2737
+ var sawType = null, group = unit == "group";
2738
+ for (var first = true;; first = false) {
2739
+ if (dir < 0 && !moveOnce(!first)) break;
2740
+ var cur = lineObj.text.charAt(ch) || "\n";
2741
+ var type = isWordChar(cur) ? "w"
2742
+ : !group ? null
2743
+ : /\s/.test(cur) ? null
2744
+ : "p";
2745
+ if (sawType && sawType != type) {
2746
+ if (dir < 0) {dir = 1; moveOnce();}
2747
+ break;
2748
+ }
2749
+ if (type) sawType = type;
2750
+ if (dir > 0 && !moveOnce(!first)) break;
2751
+ }
2752
+ }
2753
+ var result = skipAtomic(doc, Pos(line, ch), origDir, true);
2754
+ if (!possible) result.hitSide = true;
2755
+ return result;
2756
+ }
2757
+
2758
+ function findPosV(cm, pos, dir, unit) {
2759
+ var doc = cm.doc, x = pos.left, y;
2760
+ if (unit == "page") {
2761
+ var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
2762
+ y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
2763
+ } else if (unit == "line") {
2764
+ y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
2765
+ }
2766
+ for (;;) {
2767
+ var target = coordsChar(cm, x, y);
2768
+ if (!target.outside) break;
2769
+ if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
2770
+ y += dir * 5;
2771
+ }
2772
+ return target;
2773
+ }
2774
+
2775
+ function findWordAt(line, pos) {
2776
+ var start = pos.ch, end = pos.ch;
2777
+ if (line) {
2778
+ if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
2779
+ var startChar = line.charAt(start);
2780
+ var check = isWordChar(startChar) ? isWordChar
2781
+ : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
2782
+ : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
2783
+ while (start > 0 && check(line.charAt(start - 1))) --start;
2784
+ while (end < line.length && check(line.charAt(end))) ++end;
2785
+ }
2786
+ return {from: Pos(pos.line, start), to: Pos(pos.line, end)};
2787
+ }
2788
+
2789
+ function selectLine(cm, line) {
2790
+ extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0)));
2791
+ }
2792
+
2793
+ // PROTOTYPE
2794
+
2795
+ // The publicly visible API. Note that operation(null, f) means
2796
+ // 'wrap f in an operation, performed on its `this` parameter'
2797
+
2798
+ CodeMirror.prototype = {
2799
+ constructor: CodeMirror,
2800
+ focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);},
2801
+
2802
+ setOption: function(option, value) {
2803
+ var options = this.options, old = options[option];
2804
+ if (options[option] == value && option != "mode") return;
2805
+ options[option] = value;
2806
+ if (optionHandlers.hasOwnProperty(option))
2807
+ operation(this, optionHandlers[option])(this, value, old);
2808
+ },
2809
+
2810
+ getOption: function(option) {return this.options[option];},
2811
+ getDoc: function() {return this.doc;},
2812
+
2813
+ addKeyMap: function(map, bottom) {
2814
+ this.state.keyMaps[bottom ? "push" : "unshift"](map);
2815
+ },
2816
+ removeKeyMap: function(map) {
2817
+ var maps = this.state.keyMaps;
2818
+ for (var i = 0; i < maps.length; ++i)
2819
+ if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) {
2820
+ maps.splice(i, 1);
2821
+ return true;
2822
+ }
2823
+ },
2824
+
2825
+ addOverlay: operation(null, function(spec, options) {
2826
+ var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
2827
+ if (mode.startState) throw new Error("Overlays may not be stateful.");
2828
+ this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
2829
+ this.state.modeGen++;
2830
+ regChange(this);
2831
+ }),
2832
+ removeOverlay: operation(null, function(spec) {
2833
+ var overlays = this.state.overlays;
2834
+ for (var i = 0; i < overlays.length; ++i) {
2835
+ var cur = overlays[i].modeSpec;
2836
+ if (cur == spec || typeof spec == "string" && cur.name == spec) {
2837
+ overlays.splice(i, 1);
2838
+ this.state.modeGen++;
2839
+ regChange(this);
2840
+ return;
2841
+ }
2842
+ }
2843
+ }),
2844
+
2845
+ indentLine: operation(null, function(n, dir, aggressive) {
2846
+ if (typeof dir != "string" && typeof dir != "number") {
2847
+ if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
2848
+ else dir = dir ? "add" : "subtract";
2849
+ }
2850
+ if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
2851
+ }),
2852
+ indentSelection: operation(null, function(how) {
2853
+ var sel = this.doc.sel;
2854
+ if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how);
2855
+ var e = sel.to.line - (sel.to.ch ? 0 : 1);
2856
+ for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how);
2857
+ }),
2858
+
2859
+ // Fetch the parser token for a given character. Useful for hacks
2860
+ // that want to inspect the mode state (say, for completion).
2861
+ getTokenAt: function(pos, precise) {
2862
+ var doc = this.doc;
2863
+ pos = clipPos(doc, pos);
2864
+ var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;
2865
+ var line = getLine(doc, pos.line);
2866
+ var stream = new StringStream(line.text, this.options.tabSize);
2867
+ while (stream.pos < pos.ch && !stream.eol()) {
2868
+ stream.start = stream.pos;
2869
+ var style = mode.token(stream, state);
2870
+ }
2871
+ return {start: stream.start,
2872
+ end: stream.pos,
2873
+ string: stream.current(),
2874
+ className: style || null, // Deprecated, use 'type' instead
2875
+ type: style || null,
2876
+ state: state};
2877
+ },
2878
+
2879
+ getTokenTypeAt: function(pos) {
2880
+ pos = clipPos(this.doc, pos);
2881
+ var styles = getLineStyles(this, getLine(this.doc, pos.line));
2882
+ var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
2883
+ if (ch == 0) return styles[2];
2884
+ for (;;) {
2885
+ var mid = (before + after) >> 1;
2886
+ if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
2887
+ else if (styles[mid * 2 + 1] < ch) before = mid + 1;
2888
+ else return styles[mid * 2 + 2];
2889
+ }
2890
+ },
2891
+
2892
+ getModeAt: function(pos) {
2893
+ var mode = this.doc.mode;
2894
+ if (!mode.innerMode) return mode;
2895
+ return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
2896
+ },
2897
+
2898
+ getHelper: function(pos, type) {
2899
+ if (!helpers.hasOwnProperty(type)) return;
2900
+ var help = helpers[type], mode = this.getModeAt(pos);
2901
+ return mode[type] && help[mode[type]] ||
2902
+ mode.helperType && help[mode.helperType] ||
2903
+ help[mode.name];
2904
+ },
2905
+
2906
+ getStateAfter: function(line, precise) {
2907
+ var doc = this.doc;
2908
+ line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
2909
+ return getStateBefore(this, line + 1, precise);
2910
+ },
2911
+
2912
+ cursorCoords: function(start, mode) {
2913
+ var pos, sel = this.doc.sel;
2914
+ if (start == null) pos = sel.head;
2915
+ else if (typeof start == "object") pos = clipPos(this.doc, start);
2916
+ else pos = start ? sel.from : sel.to;
2917
+ return cursorCoords(this, pos, mode || "page");
2918
+ },
2919
+
2920
+ charCoords: function(pos, mode) {
2921
+ return charCoords(this, clipPos(this.doc, pos), mode || "page");
2922
+ },
2923
+
2924
+ coordsChar: function(coords, mode) {
2925
+ coords = fromCoordSystem(this, coords, mode || "page");
2926
+ return coordsChar(this, coords.left, coords.top);
2927
+ },
2928
+
2929
+ lineAtHeight: function(height, mode) {
2930
+ height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
2931
+ return lineAtHeight(this.doc, height + this.display.viewOffset);
2932
+ },
2933
+ heightAtLine: function(line, mode) {
2934
+ var end = false, last = this.doc.first + this.doc.size - 1;
2935
+ if (line < this.doc.first) line = this.doc.first;
2936
+ else if (line > last) { line = last; end = true; }
2937
+ var lineObj = getLine(this.doc, line);
2938
+ return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top +
2939
+ (end ? lineObj.height : 0);
2940
+ },
2941
+
2942
+ defaultTextHeight: function() { return textHeight(this.display); },
2943
+ defaultCharWidth: function() { return charWidth(this.display); },
2944
+
2945
+ setGutterMarker: operation(null, function(line, gutterID, value) {
2946
+ return changeLine(this, line, function(line) {
2947
+ var markers = line.gutterMarkers || (line.gutterMarkers = {});
2948
+ markers[gutterID] = value;
2949
+ if (!value && isEmpty(markers)) line.gutterMarkers = null;
2950
+ return true;
2951
+ });
2952
+ }),
2953
+
2954
+ clearGutter: operation(null, function(gutterID) {
2955
+ var cm = this, doc = cm.doc, i = doc.first;
2956
+ doc.iter(function(line) {
2957
+ if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
2958
+ line.gutterMarkers[gutterID] = null;
2959
+ regChange(cm, i, i + 1);
2960
+ if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
2961
+ }
2962
+ ++i;
2963
+ });
2964
+ }),
2965
+
2966
+ addLineClass: operation(null, function(handle, where, cls) {
2967
+ return changeLine(this, handle, function(line) {
2968
+ var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2969
+ if (!line[prop]) line[prop] = cls;
2970
+ else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false;
2971
+ else line[prop] += " " + cls;
2972
+ return true;
2973
+ });
2974
+ }),
2975
+
2976
+ removeLineClass: operation(null, function(handle, where, cls) {
2977
+ return changeLine(this, handle, function(line) {
2978
+ var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2979
+ var cur = line[prop];
2980
+ if (!cur) return false;
2981
+ else if (cls == null) line[prop] = null;
2982
+ else {
2983
+ var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)"));
2984
+ if (!found) return false;
2985
+ var end = found.index + found[0].length;
2986
+ line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
2987
+ }
2988
+ return true;
2989
+ });
2990
+ }),
2991
+
2992
+ addLineWidget: operation(null, function(handle, node, options) {
2993
+ return addLineWidget(this, handle, node, options);
2994
+ }),
2995
+
2996
+ removeLineWidget: function(widget) { widget.clear(); },
2997
+
2998
+ lineInfo: function(line) {
2999
+ if (typeof line == "number") {
3000
+ if (!isLine(this.doc, line)) return null;
3001
+ var n = line;
3002
+ line = getLine(this.doc, line);
3003
+ if (!line) return null;
3004
+ } else {
3005
+ var n = lineNo(line);
3006
+ if (n == null) return null;
3007
+ }
3008
+ return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
3009
+ textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
3010
+ widgets: line.widgets};
3011
+ },
3012
+
3013
+ getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};},
3014
+
3015
+ addWidget: function(pos, node, scroll, vert, horiz) {
3016
+ var display = this.display;
3017
+ pos = cursorCoords(this, clipPos(this.doc, pos));
3018
+ var top = pos.bottom, left = pos.left;
3019
+ node.style.position = "absolute";
3020
+ display.sizer.appendChild(node);
3021
+ if (vert == "over") {
3022
+ top = pos.top;
3023
+ } else if (vert == "above" || vert == "near") {
3024
+ var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
3025
+ hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
3026
+ // Default to positioning above (if specified and possible); otherwise default to positioning below
3027
+ if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
3028
+ top = pos.top - node.offsetHeight;
3029
+ else if (pos.bottom + node.offsetHeight <= vspace)
3030
+ top = pos.bottom;
3031
+ if (left + node.offsetWidth > hspace)
3032
+ left = hspace - node.offsetWidth;
3033
+ }
3034
+ node.style.top = top + "px";
3035
+ node.style.left = node.style.right = "";
3036
+ if (horiz == "right") {
3037
+ left = display.sizer.clientWidth - node.offsetWidth;
3038
+ node.style.right = "0px";
3039
+ } else {
3040
+ if (horiz == "left") left = 0;
3041
+ else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
3042
+ node.style.left = left + "px";
3043
+ }
3044
+ if (scroll)
3045
+ scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
3046
+ },
3047
+
3048
+ triggerOnKeyDown: operation(null, onKeyDown),
3049
+
3050
+ execCommand: function(cmd) {return commands[cmd](this);},
3051
+
3052
+ findPosH: function(from, amount, unit, visually) {
3053
+ var dir = 1;
3054
+ if (amount < 0) { dir = -1; amount = -amount; }
3055
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3056
+ cur = findPosH(this.doc, cur, dir, unit, visually);
3057
+ if (cur.hitSide) break;
3058
+ }
3059
+ return cur;
3060
+ },
3061
+
3062
+ moveH: operation(null, function(dir, unit) {
3063
+ var sel = this.doc.sel, pos;
3064
+ if (sel.shift || sel.extend || posEq(sel.from, sel.to))
3065
+ pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually);
3066
+ else
3067
+ pos = dir < 0 ? sel.from : sel.to;
3068
+ extendSelection(this.doc, pos, pos, dir);
3069
+ }),
3070
+
3071
+ deleteH: operation(null, function(dir, unit) {
3072
+ var sel = this.doc.sel;
3073
+ if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete");
3074
+ else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete");
3075
+ this.curOp.userSelChange = true;
3076
+ }),
3077
+
3078
+ findPosV: function(from, amount, unit, goalColumn) {
3079
+ var dir = 1, x = goalColumn;
3080
+ if (amount < 0) { dir = -1; amount = -amount; }
3081
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3082
+ var coords = cursorCoords(this, cur, "div");
3083
+ if (x == null) x = coords.left;
3084
+ else coords.left = x;
3085
+ cur = findPosV(this, coords, dir, unit);
3086
+ if (cur.hitSide) break;
3087
+ }
3088
+ return cur;
3089
+ },
3090
+
3091
+ moveV: operation(null, function(dir, unit) {
3092
+ var sel = this.doc.sel;
3093
+ var pos = cursorCoords(this, sel.head, "div");
3094
+ if (sel.goalColumn != null) pos.left = sel.goalColumn;
3095
+ var target = findPosV(this, pos, dir, unit);
3096
+
3097
+ if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top);
3098
+ extendSelection(this.doc, target, target, dir);
3099
+ sel.goalColumn = pos.left;
3100
+ }),
3101
+
3102
+ toggleOverwrite: function(value) {
3103
+ if (value != null && value == this.state.overwrite) return;
3104
+ if (this.state.overwrite = !this.state.overwrite)
3105
+ this.display.cursor.className += " CodeMirror-overwrite";
3106
+ else
3107
+ this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", "");
3108
+ },
3109
+ hasFocus: function() { return this.state.focused; },
3110
+
3111
+ scrollTo: operation(null, function(x, y) {
3112
+ updateScrollPos(this, x, y);
3113
+ }),
3114
+ getScrollInfo: function() {
3115
+ var scroller = this.display.scroller, co = scrollerCutOff;
3116
+ return {left: scroller.scrollLeft, top: scroller.scrollTop,
3117
+ height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,
3118
+ clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};
3119
+ },
3120
+
3121
+ scrollIntoView: operation(null, function(pos, margin) {
3122
+ if (typeof pos == "number") pos = Pos(pos, 0);
3123
+ if (!margin) margin = 0;
3124
+ var coords = pos;
3125
+
3126
+ if (!pos || pos.line != null) {
3127
+ this.curOp.scrollToPos = pos ? clipPos(this.doc, pos) : this.doc.sel.head;
3128
+ this.curOp.scrollToPosMargin = margin;
3129
+ coords = cursorCoords(this, this.curOp.scrollToPos);
3130
+ }
3131
+ var sPos = calculateScrollPos(this, coords.left, coords.top - margin, coords.right, coords.bottom + margin);
3132
+ updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop);
3133
+ }),
3134
+
3135
+ setSize: operation(null, function(width, height) {
3136
+ function interpret(val) {
3137
+ return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
3138
+ }
3139
+ if (width != null) this.display.wrapper.style.width = interpret(width);
3140
+ if (height != null) this.display.wrapper.style.height = interpret(height);
3141
+ if (this.options.lineWrapping)
3142
+ this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
3143
+ this.curOp.forceUpdate = true;
3144
+ }),
3145
+
3146
+ operation: function(f){return runInOp(this, f);},
3147
+
3148
+ refresh: operation(null, function() {
3149
+ clearCaches(this);
3150
+ updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
3151
+ regChange(this);
3152
+ }),
3153
+
3154
+ swapDoc: operation(null, function(doc) {
3155
+ var old = this.doc;
3156
+ old.cm = null;
3157
+ attachDoc(this, doc);
3158
+ clearCaches(this);
3159
+ resetInput(this, true);
3160
+ updateScrollPos(this, doc.scrollLeft, doc.scrollTop);
3161
+ return old;
3162
+ }),
3163
+
3164
+ getInputField: function(){return this.display.input;},
3165
+ getWrapperElement: function(){return this.display.wrapper;},
3166
+ getScrollerElement: function(){return this.display.scroller;},
3167
+ getGutterElement: function(){return this.display.gutters;}
3168
+ };
3169
+ eventMixin(CodeMirror);
3170
+
3171
+ // OPTION DEFAULTS
3172
+
3173
+ var optionHandlers = CodeMirror.optionHandlers = {};
3174
+
3175
+ // The default configuration options.
3176
+ var defaults = CodeMirror.defaults = {};
3177
+
3178
+ function option(name, deflt, handle, notOnInit) {
3179
+ CodeMirror.defaults[name] = deflt;
3180
+ if (handle) optionHandlers[name] =
3181
+ notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
3182
+ }
3183
+
3184
+ var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
3185
+
3186
+ // These two are, on init, called from the constructor because they
3187
+ // have to be initialized before the editor can start at all.
3188
+ option("value", "", function(cm, val) {
3189
+ cm.setValue(val);
3190
+ }, true);
3191
+ option("mode", null, function(cm, val) {
3192
+ cm.doc.modeOption = val;
3193
+ loadMode(cm);
3194
+ }, true);
3195
+
3196
+ option("indentUnit", 2, loadMode, true);
3197
+ option("indentWithTabs", false);
3198
+ option("smartIndent", true);
3199
+ option("tabSize", 4, function(cm) {
3200
+ loadMode(cm);
3201
+ clearCaches(cm);
3202
+ regChange(cm);
3203
+ }, true);
3204
+ option("electricChars", true);
3205
+ option("rtlMoveVisually", !windows);
3206
+
3207
+ option("theme", "default", function(cm) {
3208
+ themeChanged(cm);
3209
+ guttersChanged(cm);
3210
+ }, true);
3211
+ option("keyMap", "default", keyMapChanged);
3212
+ option("extraKeys", null);
3213
+
3214
+ option("onKeyEvent", null);
3215
+ option("onDragEvent", null);
3216
+
3217
+ option("lineWrapping", false, wrappingChanged, true);
3218
+ option("gutters", [], function(cm) {
3219
+ setGuttersForLineNumbers(cm.options);
3220
+ guttersChanged(cm);
3221
+ }, true);
3222
+ option("fixedGutter", true, function(cm, val) {
3223
+ cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
3224
+ cm.refresh();
3225
+ }, true);
3226
+ option("coverGutterNextToScrollbar", false, updateScrollbars, true);
3227
+ option("lineNumbers", false, function(cm) {
3228
+ setGuttersForLineNumbers(cm.options);
3229
+ guttersChanged(cm);
3230
+ }, true);
3231
+ option("firstLineNumber", 1, guttersChanged, true);
3232
+ option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
3233
+ option("showCursorWhenSelecting", false, updateSelection, true);
3234
+
3235
+ option("readOnly", false, function(cm, val) {
3236
+ if (val == "nocursor") {onBlur(cm); cm.display.input.blur();}
3237
+ else if (!val) resetInput(cm, true);
3238
+ });
3239
+ option("dragDrop", true);
3240
+
3241
+ option("cursorBlinkRate", 530);
3242
+ option("cursorScrollMargin", 0);
3243
+ option("cursorHeight", 1);
3244
+ option("workTime", 100);
3245
+ option("workDelay", 100);
3246
+ option("flattenSpans", true);
3247
+ option("pollInterval", 100);
3248
+ option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;});
3249
+ option("historyEventDelay", 500);
3250
+ option("viewportMargin", 10, function(cm){cm.refresh();}, true);
3251
+ option("maxHighlightLength", 10000, function(cm){loadMode(cm); cm.refresh();}, true);
3252
+ option("moveInputWithCursor", true, function(cm, val) {
3253
+ if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
3254
+ });
3255
+
3256
+ option("tabindex", null, function(cm, val) {
3257
+ cm.display.input.tabIndex = val || "";
3258
+ });
3259
+ option("autofocus", null);
3260
+
3261
+ // MODE DEFINITION AND QUERYING
3262
+
3263
+ // Known modes, by name and by MIME
3264
+ var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
3265
+
3266
+ CodeMirror.defineMode = function(name, mode) {
3267
+ if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
3268
+ if (arguments.length > 2) {
3269
+ mode.dependencies = [];
3270
+ for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
3271
+ }
3272
+ modes[name] = mode;
3273
+ };
3274
+
3275
+ CodeMirror.defineMIME = function(mime, spec) {
3276
+ mimeModes[mime] = spec;
3277
+ };
3278
+
3279
+ CodeMirror.resolveMode = function(spec) {
3280
+ if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
3281
+ spec = mimeModes[spec];
3282
+ } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
3283
+ var found = mimeModes[spec.name];
3284
+ spec = createObj(found, spec);
3285
+ spec.name = found.name;
3286
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
3287
+ return CodeMirror.resolveMode("application/xml");
3288
+ }
3289
+ if (typeof spec == "string") return {name: spec};
3290
+ else return spec || {name: "null"};
3291
+ };
3292
+
3293
+ CodeMirror.getMode = function(options, spec) {
3294
+ var spec = CodeMirror.resolveMode(spec);
3295
+ var mfactory = modes[spec.name];
3296
+ if (!mfactory) return CodeMirror.getMode(options, "text/plain");
3297
+ var modeObj = mfactory(options, spec);
3298
+ if (modeExtensions.hasOwnProperty(spec.name)) {
3299
+ var exts = modeExtensions[spec.name];
3300
+ for (var prop in exts) {
3301
+ if (!exts.hasOwnProperty(prop)) continue;
3302
+ if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
3303
+ modeObj[prop] = exts[prop];
3304
+ }
3305
+ }
3306
+ modeObj.name = spec.name;
3307
+
3308
+ return modeObj;
3309
+ };
3310
+
3311
+ CodeMirror.defineMode("null", function() {
3312
+ return {token: function(stream) {stream.skipToEnd();}};
3313
+ });
3314
+ CodeMirror.defineMIME("text/plain", "null");
3315
+
3316
+ var modeExtensions = CodeMirror.modeExtensions = {};
3317
+ CodeMirror.extendMode = function(mode, properties) {
3318
+ var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
3319
+ copyObj(properties, exts);
3320
+ };
3321
+
3322
+ // EXTENSIONS
3323
+
3324
+ CodeMirror.defineExtension = function(name, func) {
3325
+ CodeMirror.prototype[name] = func;
3326
+ };
3327
+ CodeMirror.defineDocExtension = function(name, func) {
3328
+ Doc.prototype[name] = func;
3329
+ };
3330
+ CodeMirror.defineOption = option;
3331
+
3332
+ var initHooks = [];
3333
+ CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
3334
+
3335
+ var helpers = CodeMirror.helpers = {};
3336
+ CodeMirror.registerHelper = function(type, name, value) {
3337
+ if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {};
3338
+ helpers[type][name] = value;
3339
+ };
3340
+
3341
+ // UTILITIES
3342
+
3343
+ CodeMirror.isWordChar = isWordChar;
3344
+
3345
+ // MODE STATE HANDLING
3346
+
3347
+ // Utility functions for working with state. Exported because modes
3348
+ // sometimes need to do this.
3349
+ function copyState(mode, state) {
3350
+ if (state === true) return state;
3351
+ if (mode.copyState) return mode.copyState(state);
3352
+ var nstate = {};
3353
+ for (var n in state) {
3354
+ var val = state[n];
3355
+ if (val instanceof Array) val = val.concat([]);
3356
+ nstate[n] = val;
3357
+ }
3358
+ return nstate;
3359
+ }
3360
+ CodeMirror.copyState = copyState;
3361
+
3362
+ function startState(mode, a1, a2) {
3363
+ return mode.startState ? mode.startState(a1, a2) : true;
3364
+ }
3365
+ CodeMirror.startState = startState;
3366
+
3367
+ CodeMirror.innerMode = function(mode, state) {
3368
+ while (mode.innerMode) {
3369
+ var info = mode.innerMode(state);
3370
+ if (!info || info.mode == mode) break;
3371
+ state = info.state;
3372
+ mode = info.mode;
3373
+ }
3374
+ return info || {mode: mode, state: state};
3375
+ };
3376
+
3377
+ // STANDARD COMMANDS
3378
+
3379
+ var commands = CodeMirror.commands = {
3380
+ selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));},
3381
+ killLine: function(cm) {
3382
+ var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
3383
+ if (!sel && cm.getLine(from.line).length == from.ch)
3384
+ cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete");
3385
+ else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete");
3386
+ },
3387
+ deleteLine: function(cm) {
3388
+ var l = cm.getCursor().line;
3389
+ cm.replaceRange("", Pos(l, 0), Pos(l), "+delete");
3390
+ },
3391
+ delLineLeft: function(cm) {
3392
+ var cur = cm.getCursor();
3393
+ cm.replaceRange("", Pos(cur.line, 0), cur, "+delete");
3394
+ },
3395
+ undo: function(cm) {cm.undo();},
3396
+ redo: function(cm) {cm.redo();},
3397
+ goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
3398
+ goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
3399
+ goLineStart: function(cm) {
3400
+ cm.extendSelection(lineStart(cm, cm.getCursor().line));
3401
+ },
3402
+ goLineStartSmart: function(cm) {
3403
+ var cur = cm.getCursor(), start = lineStart(cm, cur.line);
3404
+ var line = cm.getLineHandle(start.line);
3405
+ var order = getOrder(line);
3406
+ if (!order || order[0].level == 0) {
3407
+ var firstNonWS = Math.max(0, line.text.search(/\S/));
3408
+ var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch;
3409
+ cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS));
3410
+ } else cm.extendSelection(start);
3411
+ },
3412
+ goLineEnd: function(cm) {
3413
+ cm.extendSelection(lineEnd(cm, cm.getCursor().line));
3414
+ },
3415
+ goLineRight: function(cm) {
3416
+ var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3417
+ cm.extendSelection(cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"));
3418
+ },
3419
+ goLineLeft: function(cm) {
3420
+ var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3421
+ cm.extendSelection(cm.coordsChar({left: 0, top: top}, "div"));
3422
+ },
3423
+ goLineUp: function(cm) {cm.moveV(-1, "line");},
3424
+ goLineDown: function(cm) {cm.moveV(1, "line");},
3425
+ goPageUp: function(cm) {cm.moveV(-1, "page");},
3426
+ goPageDown: function(cm) {cm.moveV(1, "page");},
3427
+ goCharLeft: function(cm) {cm.moveH(-1, "char");},
3428
+ goCharRight: function(cm) {cm.moveH(1, "char");},
3429
+ goColumnLeft: function(cm) {cm.moveH(-1, "column");},
3430
+ goColumnRight: function(cm) {cm.moveH(1, "column");},
3431
+ goWordLeft: function(cm) {cm.moveH(-1, "word");},
3432
+ goGroupRight: function(cm) {cm.moveH(1, "group");},
3433
+ goGroupLeft: function(cm) {cm.moveH(-1, "group");},
3434
+ goWordRight: function(cm) {cm.moveH(1, "word");},
3435
+ delCharBefore: function(cm) {cm.deleteH(-1, "char");},
3436
+ delCharAfter: function(cm) {cm.deleteH(1, "char");},
3437
+ delWordBefore: function(cm) {cm.deleteH(-1, "word");},
3438
+ delWordAfter: function(cm) {cm.deleteH(1, "word");},
3439
+ delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
3440
+ delGroupAfter: function(cm) {cm.deleteH(1, "group");},
3441
+ indentAuto: function(cm) {cm.indentSelection("smart");},
3442
+ indentMore: function(cm) {cm.indentSelection("add");},
3443
+ indentLess: function(cm) {cm.indentSelection("subtract");},
3444
+ insertTab: function(cm) {cm.replaceSelection("\t", "end", "+input");},
3445
+ defaultTab: function(cm) {
3446
+ if (cm.somethingSelected()) cm.indentSelection("add");
3447
+ else cm.replaceSelection("\t", "end", "+input");
3448
+ },
3449
+ transposeChars: function(cm) {
3450
+ var cur = cm.getCursor(), line = cm.getLine(cur.line);
3451
+ if (cur.ch > 0 && cur.ch < line.length - 1)
3452
+ cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
3453
+ Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
3454
+ },
3455
+ newlineAndIndent: function(cm) {
3456
+ operation(cm, function() {
3457
+ cm.replaceSelection("\n", "end", "+input");
3458
+ cm.indentLine(cm.getCursor().line, null, true);
3459
+ })();
3460
+ },
3461
+ toggleOverwrite: function(cm) {cm.toggleOverwrite();}
3462
+ };
3463
+
3464
+ // STANDARD KEYMAPS
3465
+
3466
+ var keyMap = CodeMirror.keyMap = {};
3467
+ keyMap.basic = {
3468
+ "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
3469
+ "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
3470
+ "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto",
3471
+ "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
3472
+ };
3473
+ // Note that the save and find-related commands aren't defined by
3474
+ // default. Unknown commands are simply ignored.
3475
+ keyMap.pcDefault = {
3476
+ "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
3477
+ "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
3478
+ "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
3479
+ "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
3480
+ "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
3481
+ "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
3482
+ fallthrough: "basic"
3483
+ };
3484
+ keyMap.macDefault = {
3485
+ "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
3486
+ "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
3487
+ "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore",
3488
+ "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
3489
+ "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
3490
+ "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft",
3491
+ fallthrough: ["basic", "emacsy"]
3492
+ };
3493
+ keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
3494
+ keyMap.emacsy = {
3495
+ "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
3496
+ "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
3497
+ "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
3498
+ "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
3499
+ };
3500
+
3501
+ // KEYMAP DISPATCH
3502
+
3503
+ function getKeyMap(val) {
3504
+ if (typeof val == "string") return keyMap[val];
3505
+ else return val;
3506
+ }
3507
+
3508
+ function lookupKey(name, maps, handle) {
3509
+ function lookup(map) {
3510
+ map = getKeyMap(map);
3511
+ var found = map[name];
3512
+ if (found === false) return "stop";
3513
+ if (found != null && handle(found)) return true;
3514
+ if (map.nofallthrough) return "stop";
3515
+
3516
+ var fallthrough = map.fallthrough;
3517
+ if (fallthrough == null) return false;
3518
+ if (Object.prototype.toString.call(fallthrough) != "[object Array]")
3519
+ return lookup(fallthrough);
3520
+ for (var i = 0, e = fallthrough.length; i < e; ++i) {
3521
+ var done = lookup(fallthrough[i]);
3522
+ if (done) return done;
3523
+ }
3524
+ return false;
3525
+ }
3526
+
3527
+ for (var i = 0; i < maps.length; ++i) {
3528
+ var done = lookup(maps[i]);
3529
+ if (done) return done != "stop";
3530
+ }
3531
+ }
3532
+ function isModifierKey(event) {
3533
+ var name = keyNames[event.keyCode];
3534
+ return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
3535
+ }
3536
+ function keyName(event, noShift) {
3537
+ if (opera && event.keyCode == 34 && event["char"]) return false;
3538
+ var name = keyNames[event.keyCode];
3539
+ if (name == null || event.altGraphKey) return false;
3540
+ if (event.altKey) name = "Alt-" + name;
3541
+ if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name;
3542
+ if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name;
3543
+ if (!noShift && event.shiftKey) name = "Shift-" + name;
3544
+ return name;
3545
+ }
3546
+ CodeMirror.lookupKey = lookupKey;
3547
+ CodeMirror.isModifierKey = isModifierKey;
3548
+ CodeMirror.keyName = keyName;
3549
+
3550
+ // FROMTEXTAREA
3551
+
3552
+ CodeMirror.fromTextArea = function(textarea, options) {
3553
+ if (!options) options = {};
3554
+ options.value = textarea.value;
3555
+ if (!options.tabindex && textarea.tabindex)
3556
+ options.tabindex = textarea.tabindex;
3557
+ if (!options.placeholder && textarea.placeholder)
3558
+ options.placeholder = textarea.placeholder;
3559
+ // Set autofocus to true if this textarea is focused, or if it has
3560
+ // autofocus and no other element is focused.
3561
+ if (options.autofocus == null) {
3562
+ var hasFocus = document.body;
3563
+ // doc.activeElement occasionally throws on IE
3564
+ try { hasFocus = document.activeElement; } catch(e) {}
3565
+ options.autofocus = hasFocus == textarea ||
3566
+ textarea.getAttribute("autofocus") != null && hasFocus == document.body;
3567
+ }
3568
+
3569
+ function save() {textarea.value = cm.getValue();}
3570
+ if (textarea.form) {
3571
+ on(textarea.form, "submit", save);
3572
+ // Deplorable hack to make the submit method do the right thing.
3573
+ if (!options.leaveSubmitMethodAlone) {
3574
+ var form = textarea.form, realSubmit = form.submit;
3575
+ try {
3576
+ var wrappedSubmit = form.submit = function() {
3577
+ save();
3578
+ form.submit = realSubmit;
3579
+ form.submit();
3580
+ form.submit = wrappedSubmit;
3581
+ };
3582
+ } catch(e) {}
3583
+ }
3584
+ }
3585
+
3586
+ textarea.style.display = "none";
3587
+ var cm = CodeMirror(function(node) {
3588
+ textarea.parentNode.insertBefore(node, textarea.nextSibling);
3589
+ }, options);
3590
+ cm.save = save;
3591
+ cm.getTextArea = function() { return textarea; };
3592
+ cm.toTextArea = function() {
3593
+ save();
3594
+ textarea.parentNode.removeChild(cm.getWrapperElement());
3595
+ textarea.style.display = "";
3596
+ if (textarea.form) {
3597
+ off(textarea.form, "submit", save);
3598
+ if (typeof textarea.form.submit == "function")
3599
+ textarea.form.submit = realSubmit;
3600
+ }
3601
+ };
3602
+ return cm;
3603
+ };
3604
+
3605
+ // STRING STREAM
3606
+
3607
+ // Fed to the mode parsers, provides helper functions to make
3608
+ // parsers more succinct.
3609
+
3610
+ // The character stream used by a mode's parser.
3611
+ function StringStream(string, tabSize) {
3612
+ this.pos = this.start = 0;
3613
+ this.string = string;
3614
+ this.tabSize = tabSize || 8;
3615
+ this.lastColumnPos = this.lastColumnValue = 0;
3616
+ }
3617
+
3618
+ StringStream.prototype = {
3619
+ eol: function() {return this.pos >= this.string.length;},
3620
+ sol: function() {return this.pos == 0;},
3621
+ peek: function() {return this.string.charAt(this.pos) || undefined;},
3622
+ next: function() {
3623
+ if (this.pos < this.string.length)
3624
+ return this.string.charAt(this.pos++);
3625
+ },
3626
+ eat: function(match) {
3627
+ var ch = this.string.charAt(this.pos);
3628
+ if (typeof match == "string") var ok = ch == match;
3629
+ else var ok = ch && (match.test ? match.test(ch) : match(ch));
3630
+ if (ok) {++this.pos; return ch;}
3631
+ },
3632
+ eatWhile: function(match) {
3633
+ var start = this.pos;
3634
+ while (this.eat(match)){}
3635
+ return this.pos > start;
3636
+ },
3637
+ eatSpace: function() {
3638
+ var start = this.pos;
3639
+ while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
3640
+ return this.pos > start;
3641
+ },
3642
+ skipToEnd: function() {this.pos = this.string.length;},
3643
+ skipTo: function(ch) {
3644
+ var found = this.string.indexOf(ch, this.pos);
3645
+ if (found > -1) {this.pos = found; return true;}
3646
+ },
3647
+ backUp: function(n) {this.pos -= n;},
3648
+ column: function() {
3649
+ if (this.lastColumnPos < this.start) {
3650
+ this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
3651
+ this.lastColumnPos = this.start;
3652
+ }
3653
+ return this.lastColumnValue;
3654
+ },
3655
+ indentation: function() {return countColumn(this.string, null, this.tabSize);},
3656
+ match: function(pattern, consume, caseInsensitive) {
3657
+ if (typeof pattern == "string") {
3658
+ var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
3659
+ var substr = this.string.substr(this.pos, pattern.length);
3660
+ if (cased(substr) == cased(pattern)) {
3661
+ if (consume !== false) this.pos += pattern.length;
3662
+ return true;
3663
+ }
3664
+ } else {
3665
+ var match = this.string.slice(this.pos).match(pattern);
3666
+ if (match && match.index > 0) return null;
3667
+ if (match && consume !== false) this.pos += match[0].length;
3668
+ return match;
3669
+ }
3670
+ },
3671
+ current: function(){return this.string.slice(this.start, this.pos);}
3672
+ };
3673
+ CodeMirror.StringStream = StringStream;
3674
+
3675
+ // TEXTMARKERS
3676
+
3677
+ function TextMarker(doc, type) {
3678
+ this.lines = [];
3679
+ this.type = type;
3680
+ this.doc = doc;
3681
+ }
3682
+ CodeMirror.TextMarker = TextMarker;
3683
+ eventMixin(TextMarker);
3684
+
3685
+ TextMarker.prototype.clear = function() {
3686
+ if (this.explicitlyCleared) return;
3687
+ var cm = this.doc.cm, withOp = cm && !cm.curOp;
3688
+ if (withOp) startOperation(cm);
3689
+ if (hasHandler(this, "clear")) {
3690
+ var found = this.find();
3691
+ if (found) signalLater(this, "clear", found.from, found.to);
3692
+ }
3693
+ var min = null, max = null;
3694
+ for (var i = 0; i < this.lines.length; ++i) {
3695
+ var line = this.lines[i];
3696
+ var span = getMarkedSpanFor(line.markedSpans, this);
3697
+ if (span.to != null) max = lineNo(line);
3698
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span);
3699
+ if (span.from != null)
3700
+ min = lineNo(line);
3701
+ else if (this.collapsed && !lineIsHidden(this.doc, line) && cm)
3702
+ updateLineHeight(line, textHeight(cm.display));
3703
+ }
3704
+ if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
3705
+ var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual);
3706
+ if (len > cm.display.maxLineLength) {
3707
+ cm.display.maxLine = visual;
3708
+ cm.display.maxLineLength = len;
3709
+ cm.display.maxLineChanged = true;
3710
+ }
3711
+ }
3712
+
3713
+ if (min != null && cm) regChange(cm, min, max + 1);
3714
+ this.lines.length = 0;
3715
+ this.explicitlyCleared = true;
3716
+ if (this.atomic && this.doc.cantEdit) {
3717
+ this.doc.cantEdit = false;
3718
+ if (cm) reCheckSelection(cm);
3719
+ }
3720
+ if (withOp) endOperation(cm);
3721
+ };
3722
+
3723
+ TextMarker.prototype.find = function() {
3724
+ var from, to;
3725
+ for (var i = 0; i < this.lines.length; ++i) {
3726
+ var line = this.lines[i];
3727
+ var span = getMarkedSpanFor(line.markedSpans, this);
3728
+ if (span.from != null || span.to != null) {
3729
+ var found = lineNo(line);
3730
+ if (span.from != null) from = Pos(found, span.from);
3731
+ if (span.to != null) to = Pos(found, span.to);
3732
+ }
3733
+ }
3734
+ if (this.type == "bookmark") return from;
3735
+ return from && {from: from, to: to};
3736
+ };
3737
+
3738
+ TextMarker.prototype.changed = function() {
3739
+ var pos = this.find(), cm = this.doc.cm;
3740
+ if (!pos || !cm) return;
3741
+ var line = getLine(this.doc, pos.from.line);
3742
+ clearCachedMeasurement(cm, line);
3743
+ if (pos.from.line >= cm.display.showingFrom && pos.from.line < cm.display.showingTo) {
3744
+ for (var node = cm.display.lineDiv.firstChild; node; node = node.nextSibling) if (node.lineObj == line) {
3745
+ if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight);
3746
+ break;
3747
+ }
3748
+ runInOp(cm, function() {
3749
+ cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true;
3750
+ });
3751
+ }
3752
+ };
3753
+
3754
+ TextMarker.prototype.attachLine = function(line) {
3755
+ if (!this.lines.length && this.doc.cm) {
3756
+ var op = this.doc.cm.curOp;
3757
+ if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
3758
+ (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
3759
+ }
3760
+ this.lines.push(line);
3761
+ };
3762
+ TextMarker.prototype.detachLine = function(line) {
3763
+ this.lines.splice(indexOf(this.lines, line), 1);
3764
+ if (!this.lines.length && this.doc.cm) {
3765
+ var op = this.doc.cm.curOp;
3766
+ (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
3767
+ }
3768
+ };
3769
+
3770
+ function markText(doc, from, to, options, type) {
3771
+ if (options && options.shared) return markTextShared(doc, from, to, options, type);
3772
+ if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
3773
+
3774
+ var marker = new TextMarker(doc, type);
3775
+ if (type == "range" && !posLess(from, to)) return marker;
3776
+ if (options) copyObj(options, marker);
3777
+ if (marker.replacedWith) {
3778
+ marker.collapsed = true;
3779
+ marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget");
3780
+ if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true;
3781
+ }
3782
+ if (marker.collapsed) sawCollapsedSpans = true;
3783
+
3784
+ if (marker.addToHistory)
3785
+ addToHistory(doc, {from: from, to: to, origin: "markText"},
3786
+ {head: doc.sel.head, anchor: doc.sel.anchor}, NaN);
3787
+
3788
+ var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd, cm = doc.cm, updateMaxLine;
3789
+ doc.iter(curLine, to.line + 1, function(line) {
3790
+ if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine)
3791
+ updateMaxLine = true;
3792
+ var span = {from: null, to: null, marker: marker};
3793
+ size += line.text.length;
3794
+ if (curLine == from.line) {span.from = from.ch; size -= from.ch;}
3795
+ if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;}
3796
+ if (marker.collapsed) {
3797
+ if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch);
3798
+ if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch);
3799
+ else updateLineHeight(line, 0);
3800
+ }
3801
+ addMarkedSpan(line, span);
3802
+ ++curLine;
3803
+ });
3804
+ if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
3805
+ if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
3806
+ });
3807
+
3808
+ if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
3809
+
3810
+ if (marker.readOnly) {
3811
+ sawReadOnlySpans = true;
3812
+ if (doc.history.done.length || doc.history.undone.length)
3813
+ doc.clearHistory();
3814
+ }
3815
+ if (marker.collapsed) {
3816
+ if (collapsedAtStart != collapsedAtEnd)
3817
+ throw new Error("Inserting collapsed marker overlapping an existing one");
3818
+ marker.size = size;
3819
+ marker.atomic = true;
3820
+ }
3821
+ if (cm) {
3822
+ if (updateMaxLine) cm.curOp.updateMaxLine = true;
3823
+ if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed)
3824
+ regChange(cm, from.line, to.line + 1);
3825
+ if (marker.atomic) reCheckSelection(cm);
3826
+ }
3827
+ return marker;
3828
+ }
3829
+
3830
+ // SHARED TEXTMARKERS
3831
+
3832
+ function SharedTextMarker(markers, primary) {
3833
+ this.markers = markers;
3834
+ this.primary = primary;
3835
+ for (var i = 0, me = this; i < markers.length; ++i) {
3836
+ markers[i].parent = this;
3837
+ on(markers[i], "clear", function(){me.clear();});
3838
+ }
3839
+ }
3840
+ CodeMirror.SharedTextMarker = SharedTextMarker;
3841
+ eventMixin(SharedTextMarker);
3842
+
3843
+ SharedTextMarker.prototype.clear = function() {
3844
+ if (this.explicitlyCleared) return;
3845
+ this.explicitlyCleared = true;
3846
+ for (var i = 0; i < this.markers.length; ++i)
3847
+ this.markers[i].clear();
3848
+ signalLater(this, "clear");
3849
+ };
3850
+ SharedTextMarker.prototype.find = function() {
3851
+ return this.primary.find();
3852
+ };
3853
+
3854
+ function markTextShared(doc, from, to, options, type) {
3855
+ options = copyObj(options);
3856
+ options.shared = false;
3857
+ var markers = [markText(doc, from, to, options, type)], primary = markers[0];
3858
+ var widget = options.replacedWith;
3859
+ linkedDocs(doc, function(doc) {
3860
+ if (widget) options.replacedWith = widget.cloneNode(true);
3861
+ markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
3862
+ for (var i = 0; i < doc.linked.length; ++i)
3863
+ if (doc.linked[i].isParent) return;
3864
+ primary = lst(markers);
3865
+ });
3866
+ return new SharedTextMarker(markers, primary);
3867
+ }
3868
+
3869
+ // TEXTMARKER SPANS
3870
+
3871
+ function getMarkedSpanFor(spans, marker) {
3872
+ if (spans) for (var i = 0; i < spans.length; ++i) {
3873
+ var span = spans[i];
3874
+ if (span.marker == marker) return span;
3875
+ }
3876
+ }
3877
+ function removeMarkedSpan(spans, span) {
3878
+ for (var r, i = 0; i < spans.length; ++i)
3879
+ if (spans[i] != span) (r || (r = [])).push(spans[i]);
3880
+ return r;
3881
+ }
3882
+ function addMarkedSpan(line, span) {
3883
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
3884
+ span.marker.attachLine(line);
3885
+ }
3886
+
3887
+ function markedSpansBefore(old, startCh, isInsert) {
3888
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
3889
+ var span = old[i], marker = span.marker;
3890
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
3891
+ if (startsBefore || marker.type == "bookmark" && span.from == startCh && (!isInsert || !span.marker.insertLeft)) {
3892
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
3893
+ (nw || (nw = [])).push({from: span.from,
3894
+ to: endsAfter ? null : span.to,
3895
+ marker: marker});
3896
+ }
3897
+ }
3898
+ return nw;
3899
+ }
3900
+
3901
+ function markedSpansAfter(old, endCh, isInsert) {
3902
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
3903
+ var span = old[i], marker = span.marker;
3904
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
3905
+ if (endsAfter || marker.type == "bookmark" && span.from == endCh && (!isInsert || span.marker.insertLeft)) {
3906
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
3907
+ (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh,
3908
+ to: span.to == null ? null : span.to - endCh,
3909
+ marker: marker});
3910
+ }
3911
+ }
3912
+ return nw;
3913
+ }
3914
+
3915
+ function stretchSpansOverChange(doc, change) {
3916
+ var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
3917
+ var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
3918
+ if (!oldFirst && !oldLast) return null;
3919
+
3920
+ var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to);
3921
+ // Get the spans that 'stick out' on both sides
3922
+ var first = markedSpansBefore(oldFirst, startCh, isInsert);
3923
+ var last = markedSpansAfter(oldLast, endCh, isInsert);
3924
+
3925
+ // Next, merge those two ends
3926
+ var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
3927
+ if (first) {
3928
+ // Fix up .to properties of first
3929
+ for (var i = 0; i < first.length; ++i) {
3930
+ var span = first[i];
3931
+ if (span.to == null) {
3932
+ var found = getMarkedSpanFor(last, span.marker);
3933
+ if (!found) span.to = startCh;
3934
+ else if (sameLine) span.to = found.to == null ? null : found.to + offset;
3935
+ }
3936
+ }
3937
+ }
3938
+ if (last) {
3939
+ // Fix up .from in last (or move them into first in case of sameLine)
3940
+ for (var i = 0; i < last.length; ++i) {
3941
+ var span = last[i];
3942
+ if (span.to != null) span.to += offset;
3943
+ if (span.from == null) {
3944
+ var found = getMarkedSpanFor(first, span.marker);
3945
+ if (!found) {
3946
+ span.from = offset;
3947
+ if (sameLine) (first || (first = [])).push(span);
3948
+ }
3949
+ } else {
3950
+ span.from += offset;
3951
+ if (sameLine) (first || (first = [])).push(span);
3952
+ }
3953
+ }
3954
+ }
3955
+ if (sameLine && first) {
3956
+ // Make sure we didn't create any zero-length spans
3957
+ for (var i = 0; i < first.length; ++i)
3958
+ if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark")
3959
+ first.splice(i--, 1);
3960
+ if (!first.length) first = null;
3961
+ }
3962
+
3963
+ var newMarkers = [first];
3964
+ if (!sameLine) {
3965
+ // Fill gap with whole-line-spans
3966
+ var gap = change.text.length - 2, gapMarkers;
3967
+ if (gap > 0 && first)
3968
+ for (var i = 0; i < first.length; ++i)
3969
+ if (first[i].to == null)
3970
+ (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker});
3971
+ for (var i = 0; i < gap; ++i)
3972
+ newMarkers.push(gapMarkers);
3973
+ newMarkers.push(last);
3974
+ }
3975
+ return newMarkers;
3976
+ }
3977
+
3978
+ function mergeOldSpans(doc, change) {
3979
+ var old = getOldSpans(doc, change);
3980
+ var stretched = stretchSpansOverChange(doc, change);
3981
+ if (!old) return stretched;
3982
+ if (!stretched) return old;
3983
+
3984
+ for (var i = 0; i < old.length; ++i) {
3985
+ var oldCur = old[i], stretchCur = stretched[i];
3986
+ if (oldCur && stretchCur) {
3987
+ spans: for (var j = 0; j < stretchCur.length; ++j) {
3988
+ var span = stretchCur[j];
3989
+ for (var k = 0; k < oldCur.length; ++k)
3990
+ if (oldCur[k].marker == span.marker) continue spans;
3991
+ oldCur.push(span);
3992
+ }
3993
+ } else if (stretchCur) {
3994
+ old[i] = stretchCur;
3995
+ }
3996
+ }
3997
+ return old;
3998
+ }
3999
+
4000
+ function removeReadOnlyRanges(doc, from, to) {
4001
+ var markers = null;
4002
+ doc.iter(from.line, to.line + 1, function(line) {
4003
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
4004
+ var mark = line.markedSpans[i].marker;
4005
+ if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
4006
+ (markers || (markers = [])).push(mark);
4007
+ }
4008
+ });
4009
+ if (!markers) return null;
4010
+ var parts = [{from: from, to: to}];
4011
+ for (var i = 0; i < markers.length; ++i) {
4012
+ var mk = markers[i], m = mk.find();
4013
+ for (var j = 0; j < parts.length; ++j) {
4014
+ var p = parts[j];
4015
+ if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue;
4016
+ var newParts = [j, 1];
4017
+ if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from))
4018
+ newParts.push({from: p.from, to: m.from});
4019
+ if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to))
4020
+ newParts.push({from: m.to, to: p.to});
4021
+ parts.splice.apply(parts, newParts);
4022
+ j += newParts.length - 1;
4023
+ }
4024
+ }
4025
+ return parts;
4026
+ }
4027
+
4028
+ function collapsedSpanAt(line, ch) {
4029
+ var sps = sawCollapsedSpans && line.markedSpans, found;
4030
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4031
+ sp = sps[i];
4032
+ if (!sp.marker.collapsed) continue;
4033
+ if ((sp.from == null || sp.from < ch) &&
4034
+ (sp.to == null || sp.to > ch) &&
4035
+ (!found || found.width < sp.marker.width))
4036
+ found = sp.marker;
4037
+ }
4038
+ return found;
4039
+ }
4040
+ function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); }
4041
+ function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); }
4042
+
4043
+ function visualLine(doc, line) {
4044
+ var merged;
4045
+ while (merged = collapsedSpanAtStart(line))
4046
+ line = getLine(doc, merged.find().from.line);
4047
+ return line;
4048
+ }
4049
+
4050
+ function lineIsHidden(doc, line) {
4051
+ var sps = sawCollapsedSpans && line.markedSpans;
4052
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4053
+ sp = sps[i];
4054
+ if (!sp.marker.collapsed) continue;
4055
+ if (sp.from == null) return true;
4056
+ if (sp.marker.replacedWith) continue;
4057
+ if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
4058
+ return true;
4059
+ }
4060
+ }
4061
+ function lineIsHiddenInner(doc, line, span) {
4062
+ if (span.to == null) {
4063
+ var end = span.marker.find().to, endLine = getLine(doc, end.line);
4064
+ return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker));
4065
+ }
4066
+ if (span.marker.inclusiveRight && span.to == line.text.length)
4067
+ return true;
4068
+ for (var sp, i = 0; i < line.markedSpans.length; ++i) {
4069
+ sp = line.markedSpans[i];
4070
+ if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to &&
4071
+ (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
4072
+ lineIsHiddenInner(doc, line, sp)) return true;
4073
+ }
4074
+ }
4075
+
4076
+ function detachMarkedSpans(line) {
4077
+ var spans = line.markedSpans;
4078
+ if (!spans) return;
4079
+ for (var i = 0; i < spans.length; ++i)
4080
+ spans[i].marker.detachLine(line);
4081
+ line.markedSpans = null;
4082
+ }
4083
+
4084
+ function attachMarkedSpans(line, spans) {
4085
+ if (!spans) return;
4086
+ for (var i = 0; i < spans.length; ++i)
4087
+ spans[i].marker.attachLine(line);
4088
+ line.markedSpans = spans;
4089
+ }
4090
+
4091
+ // LINE WIDGETS
4092
+
4093
+ var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {
4094
+ if (options) for (var opt in options) if (options.hasOwnProperty(opt))
4095
+ this[opt] = options[opt];
4096
+ this.cm = cm;
4097
+ this.node = node;
4098
+ };
4099
+ eventMixin(LineWidget);
4100
+ function widgetOperation(f) {
4101
+ return function() {
4102
+ var withOp = !this.cm.curOp;
4103
+ if (withOp) startOperation(this.cm);
4104
+ try {var result = f.apply(this, arguments);}
4105
+ finally {if (withOp) endOperation(this.cm);}
4106
+ return result;
4107
+ };
4108
+ }
4109
+ LineWidget.prototype.clear = widgetOperation(function() {
4110
+ var ws = this.line.widgets, no = lineNo(this.line);
4111
+ if (no == null || !ws) return;
4112
+ for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
4113
+ if (!ws.length) this.line.widgets = null;
4114
+ var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop;
4115
+ updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this)));
4116
+ if (aboveVisible) addToScrollPos(this.cm, 0, -this.height);
4117
+ regChange(this.cm, no, no + 1);
4118
+ });
4119
+ LineWidget.prototype.changed = widgetOperation(function() {
4120
+ var oldH = this.height;
4121
+ this.height = null;
4122
+ var diff = widgetHeight(this) - oldH;
4123
+ if (!diff) return;
4124
+ updateLineHeight(this.line, this.line.height + diff);
4125
+ var no = lineNo(this.line);
4126
+ regChange(this.cm, no, no + 1);
4127
+ });
4128
+
4129
+ function widgetHeight(widget) {
4130
+ if (widget.height != null) return widget.height;
4131
+ if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1)
4132
+ removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative"));
4133
+ return widget.height = widget.node.offsetHeight;
4134
+ }
4135
+
4136
+ function addLineWidget(cm, handle, node, options) {
4137
+ var widget = new LineWidget(cm, node, options);
4138
+ if (widget.noHScroll) cm.display.alignWidgets = true;
4139
+ changeLine(cm, handle, function(line) {
4140
+ var widgets = line.widgets || (line.widgets = []);
4141
+ if (widget.insertAt == null) widgets.push(widget);
4142
+ else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
4143
+ widget.line = line;
4144
+ if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) {
4145
+ var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop;
4146
+ updateLineHeight(line, line.height + widgetHeight(widget));
4147
+ if (aboveVisible) addToScrollPos(cm, 0, widget.height);
4148
+ }
4149
+ return true;
4150
+ });
4151
+ return widget;
4152
+ }
4153
+
4154
+ // LINE DATA STRUCTURE
4155
+
4156
+ // Line objects. These hold state related to a line, including
4157
+ // highlighting info (the styles array).
4158
+ var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
4159
+ this.text = text;
4160
+ attachMarkedSpans(this, markedSpans);
4161
+ this.height = estimateHeight ? estimateHeight(this) : 1;
4162
+ };
4163
+ eventMixin(Line);
4164
+
4165
+ function updateLine(line, text, markedSpans, estimateHeight) {
4166
+ line.text = text;
4167
+ if (line.stateAfter) line.stateAfter = null;
4168
+ if (line.styles) line.styles = null;
4169
+ if (line.order != null) line.order = null;
4170
+ detachMarkedSpans(line);
4171
+ attachMarkedSpans(line, markedSpans);
4172
+ var estHeight = estimateHeight ? estimateHeight(line) : 1;
4173
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
4174
+ }
4175
+
4176
+ function cleanUpLine(line) {
4177
+ line.parent = null;
4178
+ detachMarkedSpans(line);
4179
+ }
4180
+
4181
+ // Run the given mode's parser over a line, update the styles
4182
+ // array, which contains alternating fragments of text and CSS
4183
+ // classes.
4184
+ function runMode(cm, text, mode, state, f) {
4185
+ var flattenSpans = mode.flattenSpans;
4186
+ if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
4187
+ var curStart = 0, curStyle = null;
4188
+ var stream = new StringStream(text, cm.options.tabSize), style;
4189
+ if (text == "" && mode.blankLine) mode.blankLine(state);
4190
+ while (!stream.eol()) {
4191
+ if (stream.pos > cm.options.maxHighlightLength) {
4192
+ flattenSpans = false;
4193
+ // Webkit seems to refuse to render text nodes longer than 57444 characters
4194
+ stream.pos = Math.min(text.length, stream.start + 50000);
4195
+ style = null;
4196
+ } else {
4197
+ style = mode.token(stream, state);
4198
+ }
4199
+ if (!flattenSpans || curStyle != style) {
4200
+ if (curStart < stream.start) f(stream.start, curStyle);
4201
+ curStart = stream.start; curStyle = style;
4202
+ }
4203
+ stream.start = stream.pos;
4204
+ }
4205
+ if (curStart < stream.pos) f(stream.pos, curStyle);
4206
+ }
4207
+
4208
+ function highlightLine(cm, line, state) {
4209
+ // A styles array always starts with a number identifying the
4210
+ // mode/overlays that it is based on (for easy invalidation).
4211
+ var st = [cm.state.modeGen];
4212
+ // Compute the base array of styles
4213
+ runMode(cm, line.text, cm.doc.mode, state, function(end, style) {st.push(end, style);});
4214
+
4215
+ // Run overlays, adjust style array.
4216
+ for (var o = 0; o < cm.state.overlays.length; ++o) {
4217
+ var overlay = cm.state.overlays[o], i = 1, at = 0;
4218
+ runMode(cm, line.text, overlay.mode, true, function(end, style) {
4219
+ var start = i;
4220
+ // Ensure there's a token end at the current position, and that i points at it
4221
+ while (at < end) {
4222
+ var i_end = st[i];
4223
+ if (i_end > end)
4224
+ st.splice(i, 1, end, st[i+1], i_end);
4225
+ i += 2;
4226
+ at = Math.min(end, i_end);
4227
+ }
4228
+ if (!style) return;
4229
+ if (overlay.opaque) {
4230
+ st.splice(start, i - start, end, style);
4231
+ i = start + 2;
4232
+ } else {
4233
+ for (; start < i; start += 2) {
4234
+ var cur = st[start+1];
4235
+ st[start+1] = cur ? cur + " " + style : style;
4236
+ }
4237
+ }
4238
+ });
4239
+ }
4240
+
4241
+ return st;
4242
+ }
4243
+
4244
+ function getLineStyles(cm, line) {
4245
+ if (!line.styles || line.styles[0] != cm.state.modeGen)
4246
+ line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));
4247
+ return line.styles;
4248
+ }
4249
+
4250
+ // Lightweight form of highlight -- proceed over this line and
4251
+ // update state, but don't save a style array.
4252
+ function processLine(cm, line, state) {
4253
+ var mode = cm.doc.mode;
4254
+ var stream = new StringStream(line.text, cm.options.tabSize);
4255
+ if (line.text == "" && mode.blankLine) mode.blankLine(state);
4256
+ while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {
4257
+ mode.token(stream, state);
4258
+ stream.start = stream.pos;
4259
+ }
4260
+ }
4261
+
4262
+ var styleToClassCache = {};
4263
+ function styleToClass(style) {
4264
+ if (!style) return null;
4265
+ return styleToClassCache[style] ||
4266
+ (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-"));
4267
+ }
4268
+
4269
+ function lineContent(cm, realLine, measure, copyWidgets) {
4270
+ var merged, line = realLine, empty = true;
4271
+ while (merged = collapsedSpanAtStart(line))
4272
+ line = getLine(cm.doc, merged.find().from.line);
4273
+
4274
+ var builder = {pre: elt("pre"), col: 0, pos: 0,
4275
+ measure: null, measuredSomething: false, cm: cm,
4276
+ copyWidgets: copyWidgets};
4277
+ if (line.textClass) builder.pre.className = line.textClass;
4278
+
4279
+ do {
4280
+ if (line.text) empty = false;
4281
+ builder.measure = line == realLine && measure;
4282
+ builder.pos = 0;
4283
+ builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
4284
+ if ((ie || webkit) && cm.getOption("lineWrapping"))
4285
+ builder.addToken = buildTokenSplitSpaces(builder.addToken);
4286
+ var next = insertLineContent(line, builder, getLineStyles(cm, line));
4287
+ if (measure && line == realLine && !builder.measuredSomething) {
4288
+ measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure));
4289
+ builder.measuredSomething = true;
4290
+ }
4291
+ if (next) line = getLine(cm.doc, next.to.line);
4292
+ } while (next);
4293
+
4294
+ if (measure && !builder.measuredSomething && !measure[0])
4295
+ measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure));
4296
+ if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine))
4297
+ builder.pre.appendChild(document.createTextNode("\u00a0"));
4298
+
4299
+ var order;
4300
+ // Work around problem with the reported dimensions of single-char
4301
+ // direction spans on IE (issue #1129). See also the comment in
4302
+ // cursorCoords.
4303
+ if (measure && ie && (order = getOrder(line))) {
4304
+ var l = order.length - 1;
4305
+ if (order[l].from == order[l].to) --l;
4306
+ var last = order[l], prev = order[l - 1];
4307
+ if (last.from + 1 == last.to && prev && last.level < prev.level) {
4308
+ var span = measure[builder.pos - 1];
4309
+ if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure),
4310
+ span.nextSibling);
4311
+ }
4312
+ }
4313
+
4314
+ signal(cm, "renderLine", cm, realLine, builder.pre);
4315
+ return builder.pre;
4316
+ }
4317
+
4318
+ var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g;
4319
+ function buildToken(builder, text, style, startStyle, endStyle, title) {
4320
+ if (!text) return;
4321
+ if (!tokenSpecialChars.test(text)) {
4322
+ builder.col += text.length;
4323
+ var content = document.createTextNode(text);
4324
+ } else {
4325
+ var content = document.createDocumentFragment(), pos = 0;
4326
+ while (true) {
4327
+ tokenSpecialChars.lastIndex = pos;
4328
+ var m = tokenSpecialChars.exec(text);
4329
+ var skipped = m ? m.index - pos : text.length - pos;
4330
+ if (skipped) {
4331
+ content.appendChild(document.createTextNode(text.slice(pos, pos + skipped)));
4332
+ builder.col += skipped;
4333
+ }
4334
+ if (!m) break;
4335
+ pos += skipped + 1;
4336
+ if (m[0] == "\t") {
4337
+ var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
4338
+ content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
4339
+ builder.col += tabWidth;
4340
+ } else {
4341
+ var token = elt("span", "\u2022", "cm-invalidchar");
4342
+ token.title = "\\u" + m[0].charCodeAt(0).toString(16);
4343
+ content.appendChild(token);
4344
+ builder.col += 1;
4345
+ }
4346
+ }
4347
+ }
4348
+ if (style || startStyle || endStyle || builder.measure) {
4349
+ var fullStyle = style || "";
4350
+ if (startStyle) fullStyle += startStyle;
4351
+ if (endStyle) fullStyle += endStyle;
4352
+ var token = elt("span", [content], fullStyle);
4353
+ if (title) token.title = title;
4354
+ return builder.pre.appendChild(token);
4355
+ }
4356
+ builder.pre.appendChild(content);
4357
+ }
4358
+
4359
+ function buildTokenMeasure(builder, text, style, startStyle, endStyle) {
4360
+ var wrapping = builder.cm.options.lineWrapping;
4361
+ for (var i = 0; i < text.length; ++i) {
4362
+ var ch = text.charAt(i), start = i == 0;
4363
+ if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) {
4364
+ ch = text.slice(i, i + 2);
4365
+ ++i;
4366
+ } else if (i && wrapping && spanAffectsWrapping(text, i)) {
4367
+ builder.pre.appendChild(elt("wbr"));
4368
+ }
4369
+ var old = builder.measure[builder.pos];
4370
+ var span = builder.measure[builder.pos] =
4371
+ buildToken(builder, ch, style,
4372
+ start && startStyle, i == text.length - 1 && endStyle);
4373
+ if (old) span.leftSide = old.leftSide || old;
4374
+ // In IE single-space nodes wrap differently than spaces
4375
+ // embedded in larger text nodes, except when set to
4376
+ // white-space: normal (issue #1268).
4377
+ if (ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) &&
4378
+ i < text.length - 1 && !/\s/.test(text.charAt(i + 1)))
4379
+ span.style.whiteSpace = "normal";
4380
+ builder.pos += ch.length;
4381
+ }
4382
+ if (text.length) builder.measuredSomething = true;
4383
+ }
4384
+
4385
+ function buildTokenSplitSpaces(inner) {
4386
+ function split(old) {
4387
+ var out = " ";
4388
+ for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
4389
+ out += " ";
4390
+ return out;
4391
+ }
4392
+ return function(builder, text, style, startStyle, endStyle, title) {
4393
+ return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle, title);
4394
+ };
4395
+ }
4396
+
4397
+ function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
4398
+ var widget = !ignoreWidget && marker.replacedWith;
4399
+ if (widget) {
4400
+ if (builder.copyWidgets) widget = widget.cloneNode(true);
4401
+ builder.pre.appendChild(widget);
4402
+ if (builder.measure) {
4403
+ if (size) {
4404
+ builder.measure[builder.pos] = widget;
4405
+ } else {
4406
+ var elt = builder.measure[builder.pos] = zeroWidthElement(builder.cm.display.measure);
4407
+ if (marker.type != "bookmark" || marker.insertLeft)
4408
+ builder.pre.insertBefore(elt, widget);
4409
+ else
4410
+ builder.pre.appendChild(elt);
4411
+ }
4412
+ builder.measuredSomething = true;
4413
+ }
4414
+ }
4415
+ builder.pos += size;
4416
+ }
4417
+
4418
+ // Outputs a number of spans to make up a line, taking highlighting
4419
+ // and marked text into account.
4420
+ function insertLineContent(line, builder, styles) {
4421
+ var spans = line.markedSpans, allText = line.text, at = 0;
4422
+ if (!spans) {
4423
+ for (var i = 1; i < styles.length; i+=2)
4424
+ builder.addToken(builder, allText.slice(at, at = styles[i]), styleToClass(styles[i+1]));
4425
+ return;
4426
+ }
4427
+
4428
+ var len = allText.length, pos = 0, i = 1, text = "", style;
4429
+ var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
4430
+ for (;;) {
4431
+ if (nextChange == pos) { // Update current marker set
4432
+ spanStyle = spanEndStyle = spanStartStyle = title = "";
4433
+ collapsed = null; nextChange = Infinity;
4434
+ var foundBookmark = null;
4435
+ for (var j = 0; j < spans.length; ++j) {
4436
+ var sp = spans[j], m = sp.marker;
4437
+ if (sp.from <= pos && (sp.to == null || sp.to > pos)) {
4438
+ if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }
4439
+ if (m.className) spanStyle += " " + m.className;
4440
+ if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
4441
+ if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
4442
+ if (m.title && !title) title = m.title;
4443
+ if (m.collapsed && (!collapsed || collapsed.marker.size < m.size))
4444
+ collapsed = sp;
4445
+ } else if (sp.from > pos && nextChange > sp.from) {
4446
+ nextChange = sp.from;
4447
+ }
4448
+ if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmark = m;
4449
+ }
4450
+ if (collapsed && (collapsed.from || 0) == pos) {
4451
+ buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos,
4452
+ collapsed.marker, collapsed.from == null);
4453
+ if (collapsed.to == null) return collapsed.marker.find();
4454
+ }
4455
+ if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark);
4456
+ }
4457
+ if (pos >= len) break;
4458
+
4459
+ var upto = Math.min(len, nextChange);
4460
+ while (true) {
4461
+ if (text) {
4462
+ var end = pos + text.length;
4463
+ if (!collapsed) {
4464
+ var tokenText = end > upto ? text.slice(0, upto - pos) : text;
4465
+ builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
4466
+ spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title);
4467
+ }
4468
+ if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
4469
+ pos = end;
4470
+ spanStartStyle = "";
4471
+ }
4472
+ text = allText.slice(at, at = styles[i++]);
4473
+ style = styleToClass(styles[i++]);
4474
+ }
4475
+ }
4476
+ }
4477
+
4478
+ // DOCUMENT DATA STRUCTURE
4479
+
4480
+ function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) {
4481
+ function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
4482
+ function update(line, text, spans) {
4483
+ updateLine(line, text, spans, estimateHeight);
4484
+ signalLater(line, "change", line, change);
4485
+ }
4486
+
4487
+ var from = change.from, to = change.to, text = change.text;
4488
+ var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
4489
+ var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
4490
+
4491
+ // First adjust the line structure
4492
+ if (from.ch == 0 && to.ch == 0 && lastText == "") {
4493
+ // This is a whole-line replace. Treated specially to make
4494
+ // sure line objects move the way they are supposed to.
4495
+ for (var i = 0, e = text.length - 1, added = []; i < e; ++i)
4496
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4497
+ update(lastLine, lastLine.text, lastSpans);
4498
+ if (nlines) doc.remove(from.line, nlines);
4499
+ if (added.length) doc.insert(from.line, added);
4500
+ } else if (firstLine == lastLine) {
4501
+ if (text.length == 1) {
4502
+ update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
4503
+ } else {
4504
+ for (var added = [], i = 1, e = text.length - 1; i < e; ++i)
4505
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4506
+ added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
4507
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4508
+ doc.insert(from.line + 1, added);
4509
+ }
4510
+ } else if (text.length == 1) {
4511
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
4512
+ doc.remove(from.line + 1, nlines);
4513
+ } else {
4514
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4515
+ update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
4516
+ for (var i = 1, e = text.length - 1, added = []; i < e; ++i)
4517
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4518
+ if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
4519
+ doc.insert(from.line + 1, added);
4520
+ }
4521
+
4522
+ signalLater(doc, "change", doc, change);
4523
+ setSelection(doc, selAfter.anchor, selAfter.head, null, true);
4524
+ }
4525
+
4526
+ function LeafChunk(lines) {
4527
+ this.lines = lines;
4528
+ this.parent = null;
4529
+ for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
4530
+ lines[i].parent = this;
4531
+ height += lines[i].height;
4532
+ }
4533
+ this.height = height;
4534
+ }
4535
+
4536
+ LeafChunk.prototype = {
4537
+ chunkSize: function() { return this.lines.length; },
4538
+ removeInner: function(at, n) {
4539
+ for (var i = at, e = at + n; i < e; ++i) {
4540
+ var line = this.lines[i];
4541
+ this.height -= line.height;
4542
+ cleanUpLine(line);
4543
+ signalLater(line, "delete");
4544
+ }
4545
+ this.lines.splice(at, n);
4546
+ },
4547
+ collapse: function(lines) {
4548
+ lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
4549
+ },
4550
+ insertInner: function(at, lines, height) {
4551
+ this.height += height;
4552
+ this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
4553
+ for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
4554
+ },
4555
+ iterN: function(at, n, op) {
4556
+ for (var e = at + n; at < e; ++at)
4557
+ if (op(this.lines[at])) return true;
4558
+ }
4559
+ };
4560
+
4561
+ function BranchChunk(children) {
4562
+ this.children = children;
4563
+ var size = 0, height = 0;
4564
+ for (var i = 0, e = children.length; i < e; ++i) {
4565
+ var ch = children[i];
4566
+ size += ch.chunkSize(); height += ch.height;
4567
+ ch.parent = this;
4568
+ }
4569
+ this.size = size;
4570
+ this.height = height;
4571
+ this.parent = null;
4572
+ }
4573
+
4574
+ BranchChunk.prototype = {
4575
+ chunkSize: function() { return this.size; },
4576
+ removeInner: function(at, n) {
4577
+ this.size -= n;
4578
+ for (var i = 0; i < this.children.length; ++i) {
4579
+ var child = this.children[i], sz = child.chunkSize();
4580
+ if (at < sz) {
4581
+ var rm = Math.min(n, sz - at), oldHeight = child.height;
4582
+ child.removeInner(at, rm);
4583
+ this.height -= oldHeight - child.height;
4584
+ if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
4585
+ if ((n -= rm) == 0) break;
4586
+ at = 0;
4587
+ } else at -= sz;
4588
+ }
4589
+ if (this.size - n < 25) {
4590
+ var lines = [];
4591
+ this.collapse(lines);
4592
+ this.children = [new LeafChunk(lines)];
4593
+ this.children[0].parent = this;
4594
+ }
4595
+ },
4596
+ collapse: function(lines) {
4597
+ for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
4598
+ },
4599
+ insertInner: function(at, lines, height) {
4600
+ this.size += lines.length;
4601
+ this.height += height;
4602
+ for (var i = 0, e = this.children.length; i < e; ++i) {
4603
+ var child = this.children[i], sz = child.chunkSize();
4604
+ if (at <= sz) {
4605
+ child.insertInner(at, lines, height);
4606
+ if (child.lines && child.lines.length > 50) {
4607
+ while (child.lines.length > 50) {
4608
+ var spilled = child.lines.splice(child.lines.length - 25, 25);
4609
+ var newleaf = new LeafChunk(spilled);
4610
+ child.height -= newleaf.height;
4611
+ this.children.splice(i + 1, 0, newleaf);
4612
+ newleaf.parent = this;
4613
+ }
4614
+ this.maybeSpill();
4615
+ }
4616
+ break;
4617
+ }
4618
+ at -= sz;
4619
+ }
4620
+ },
4621
+ maybeSpill: function() {
4622
+ if (this.children.length <= 10) return;
4623
+ var me = this;
4624
+ do {
4625
+ var spilled = me.children.splice(me.children.length - 5, 5);
4626
+ var sibling = new BranchChunk(spilled);
4627
+ if (!me.parent) { // Become the parent node
4628
+ var copy = new BranchChunk(me.children);
4629
+ copy.parent = me;
4630
+ me.children = [copy, sibling];
4631
+ me = copy;
4632
+ } else {
4633
+ me.size -= sibling.size;
4634
+ me.height -= sibling.height;
4635
+ var myIndex = indexOf(me.parent.children, me);
4636
+ me.parent.children.splice(myIndex + 1, 0, sibling);
4637
+ }
4638
+ sibling.parent = me.parent;
4639
+ } while (me.children.length > 10);
4640
+ me.parent.maybeSpill();
4641
+ },
4642
+ iterN: function(at, n, op) {
4643
+ for (var i = 0, e = this.children.length; i < e; ++i) {
4644
+ var child = this.children[i], sz = child.chunkSize();
4645
+ if (at < sz) {
4646
+ var used = Math.min(n, sz - at);
4647
+ if (child.iterN(at, used, op)) return true;
4648
+ if ((n -= used) == 0) break;
4649
+ at = 0;
4650
+ } else at -= sz;
4651
+ }
4652
+ }
4653
+ };
4654
+
4655
+ var nextDocId = 0;
4656
+ var Doc = CodeMirror.Doc = function(text, mode, firstLine) {
4657
+ if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);
4658
+ if (firstLine == null) firstLine = 0;
4659
+
4660
+ BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
4661
+ this.first = firstLine;
4662
+ this.scrollTop = this.scrollLeft = 0;
4663
+ this.cantEdit = false;
4664
+ this.history = makeHistory();
4665
+ this.cleanGeneration = 1;
4666
+ this.frontier = firstLine;
4667
+ var start = Pos(firstLine, 0);
4668
+ this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null};
4669
+ this.id = ++nextDocId;
4670
+ this.modeOption = mode;
4671
+
4672
+ if (typeof text == "string") text = splitLines(text);
4673
+ updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start});
4674
+ };
4675
+
4676
+ Doc.prototype = createObj(BranchChunk.prototype, {
4677
+ constructor: Doc,
4678
+ iter: function(from, to, op) {
4679
+ if (op) this.iterN(from - this.first, to - from, op);
4680
+ else this.iterN(this.first, this.first + this.size, from);
4681
+ },
4682
+
4683
+ insert: function(at, lines) {
4684
+ var height = 0;
4685
+ for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
4686
+ this.insertInner(at - this.first, lines, height);
4687
+ },
4688
+ remove: function(at, n) { this.removeInner(at - this.first, n); },
4689
+
4690
+ getValue: function(lineSep) {
4691
+ var lines = getLines(this, this.first, this.first + this.size);
4692
+ if (lineSep === false) return lines;
4693
+ return lines.join(lineSep || "\n");
4694
+ },
4695
+ setValue: function(code) {
4696
+ var top = Pos(this.first, 0), last = this.first + this.size - 1;
4697
+ makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
4698
+ text: splitLines(code), origin: "setValue"},
4699
+ {head: top, anchor: top}, true);
4700
+ },
4701
+ replaceRange: function(code, from, to, origin) {
4702
+ from = clipPos(this, from);
4703
+ to = to ? clipPos(this, to) : from;
4704
+ replaceRange(this, code, from, to, origin);
4705
+ },
4706
+ getRange: function(from, to, lineSep) {
4707
+ var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
4708
+ if (lineSep === false) return lines;
4709
+ return lines.join(lineSep || "\n");
4710
+ },
4711
+
4712
+ getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
4713
+ setLine: function(line, text) {
4714
+ if (isLine(this, line))
4715
+ replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line)));
4716
+ },
4717
+ removeLine: function(line) {
4718
+ if (line) replaceRange(this, "", clipPos(this, Pos(line - 1)), clipPos(this, Pos(line)));
4719
+ else replaceRange(this, "", Pos(0, 0), clipPos(this, Pos(1, 0)));
4720
+ },
4721
+
4722
+ getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
4723
+ getLineNumber: function(line) {return lineNo(line);},
4724
+
4725
+ getLineHandleVisualStart: function(line) {
4726
+ if (typeof line == "number") line = getLine(this, line);
4727
+ return visualLine(this, line);
4728
+ },
4729
+
4730
+ lineCount: function() {return this.size;},
4731
+ firstLine: function() {return this.first;},
4732
+ lastLine: function() {return this.first + this.size - 1;},
4733
+
4734
+ clipPos: function(pos) {return clipPos(this, pos);},
4735
+
4736
+ getCursor: function(start) {
4737
+ var sel = this.sel, pos;
4738
+ if (start == null || start == "head") pos = sel.head;
4739
+ else if (start == "anchor") pos = sel.anchor;
4740
+ else if (start == "end" || start === false) pos = sel.to;
4741
+ else pos = sel.from;
4742
+ return copyPos(pos);
4743
+ },
4744
+ somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);},
4745
+
4746
+ setCursor: docOperation(function(line, ch, extend) {
4747
+ var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line);
4748
+ if (extend) extendSelection(this, pos);
4749
+ else setSelection(this, pos, pos);
4750
+ }),
4751
+ setSelection: docOperation(function(anchor, head) {
4752
+ setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor));
4753
+ }),
4754
+ extendSelection: docOperation(function(from, to) {
4755
+ extendSelection(this, clipPos(this, from), to && clipPos(this, to));
4756
+ }),
4757
+
4758
+ getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);},
4759
+ replaceSelection: function(code, collapse, origin) {
4760
+ makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around");
4761
+ },
4762
+ undo: docOperation(function() {makeChangeFromHistory(this, "undo");}),
4763
+ redo: docOperation(function() {makeChangeFromHistory(this, "redo");}),
4764
+
4765
+ setExtending: function(val) {this.sel.extend = val;},
4766
+
4767
+ historySize: function() {
4768
+ var hist = this.history;
4769
+ return {undo: hist.done.length, redo: hist.undone.length};
4770
+ },
4771
+ clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);},
4772
+
4773
+ markClean: function() {
4774
+ this.cleanGeneration = this.changeGeneration();
4775
+ },
4776
+ changeGeneration: function() {
4777
+ this.history.lastOp = this.history.lastOrigin = null;
4778
+ return this.history.generation;
4779
+ },
4780
+ isClean: function (gen) {
4781
+ return this.history.generation == (gen || this.cleanGeneration);
4782
+ },
4783
+
4784
+ getHistory: function() {
4785
+ return {done: copyHistoryArray(this.history.done),
4786
+ undone: copyHistoryArray(this.history.undone)};
4787
+ },
4788
+ setHistory: function(histData) {
4789
+ var hist = this.history = makeHistory(this.history.maxGeneration);
4790
+ hist.done = histData.done.slice(0);
4791
+ hist.undone = histData.undone.slice(0);
4792
+ },
4793
+
4794
+ markText: function(from, to, options) {
4795
+ return markText(this, clipPos(this, from), clipPos(this, to), options, "range");
4796
+ },
4797
+ setBookmark: function(pos, options) {
4798
+ var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
4799
+ insertLeft: options && options.insertLeft};
4800
+ pos = clipPos(this, pos);
4801
+ return markText(this, pos, pos, realOpts, "bookmark");
4802
+ },
4803
+ findMarksAt: function(pos) {
4804
+ pos = clipPos(this, pos);
4805
+ var markers = [], spans = getLine(this, pos.line).markedSpans;
4806
+ if (spans) for (var i = 0; i < spans.length; ++i) {
4807
+ var span = spans[i];
4808
+ if ((span.from == null || span.from <= pos.ch) &&
4809
+ (span.to == null || span.to >= pos.ch))
4810
+ markers.push(span.marker.parent || span.marker);
4811
+ }
4812
+ return markers;
4813
+ },
4814
+ getAllMarks: function() {
4815
+ var markers = [];
4816
+ this.iter(function(line) {
4817
+ var sps = line.markedSpans;
4818
+ if (sps) for (var i = 0; i < sps.length; ++i)
4819
+ if (sps[i].from != null) markers.push(sps[i].marker);
4820
+ });
4821
+ return markers;
4822
+ },
4823
+
4824
+ posFromIndex: function(off) {
4825
+ var ch, lineNo = this.first;
4826
+ this.iter(function(line) {
4827
+ var sz = line.text.length + 1;
4828
+ if (sz > off) { ch = off; return true; }
4829
+ off -= sz;
4830
+ ++lineNo;
4831
+ });
4832
+ return clipPos(this, Pos(lineNo, ch));
4833
+ },
4834
+ indexFromPos: function (coords) {
4835
+ coords = clipPos(this, coords);
4836
+ var index = coords.ch;
4837
+ if (coords.line < this.first || coords.ch < 0) return 0;
4838
+ this.iter(this.first, coords.line, function (line) {
4839
+ index += line.text.length + 1;
4840
+ });
4841
+ return index;
4842
+ },
4843
+
4844
+ copy: function(copyHistory) {
4845
+ var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);
4846
+ doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
4847
+ doc.sel = {from: this.sel.from, to: this.sel.to, head: this.sel.head, anchor: this.sel.anchor,
4848
+ shift: this.sel.shift, extend: false, goalColumn: this.sel.goalColumn};
4849
+ if (copyHistory) {
4850
+ doc.history.undoDepth = this.history.undoDepth;
4851
+ doc.setHistory(this.getHistory());
4852
+ }
4853
+ return doc;
4854
+ },
4855
+
4856
+ linkedDoc: function(options) {
4857
+ if (!options) options = {};
4858
+ var from = this.first, to = this.first + this.size;
4859
+ if (options.from != null && options.from > from) from = options.from;
4860
+ if (options.to != null && options.to < to) to = options.to;
4861
+ var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);
4862
+ if (options.sharedHist) copy.history = this.history;
4863
+ (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
4864
+ copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
4865
+ return copy;
4866
+ },
4867
+ unlinkDoc: function(other) {
4868
+ if (other instanceof CodeMirror) other = other.doc;
4869
+ if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
4870
+ var link = this.linked[i];
4871
+ if (link.doc != other) continue;
4872
+ this.linked.splice(i, 1);
4873
+ other.unlinkDoc(this);
4874
+ break;
4875
+ }
4876
+ // If the histories were shared, split them again
4877
+ if (other.history == this.history) {
4878
+ var splitIds = [other.id];
4879
+ linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
4880
+ other.history = makeHistory();
4881
+ other.history.done = copyHistoryArray(this.history.done, splitIds);
4882
+ other.history.undone = copyHistoryArray(this.history.undone, splitIds);
4883
+ }
4884
+ },
4885
+ iterLinkedDocs: function(f) {linkedDocs(this, f);},
4886
+
4887
+ getMode: function() {return this.mode;},
4888
+ getEditor: function() {return this.cm;}
4889
+ });
4890
+
4891
+ Doc.prototype.eachLine = Doc.prototype.iter;
4892
+
4893
+ // The Doc methods that should be available on CodeMirror instances
4894
+ var dontDelegate = "iter insert remove copy getEditor".split(" ");
4895
+ for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
4896
+ CodeMirror.prototype[prop] = (function(method) {
4897
+ return function() {return method.apply(this.doc, arguments);};
4898
+ })(Doc.prototype[prop]);
4899
+
4900
+ eventMixin(Doc);
4901
+
4902
+ function linkedDocs(doc, f, sharedHistOnly) {
4903
+ function propagate(doc, skip, sharedHist) {
4904
+ if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
4905
+ var rel = doc.linked[i];
4906
+ if (rel.doc == skip) continue;
4907
+ var shared = sharedHist && rel.sharedHist;
4908
+ if (sharedHistOnly && !shared) continue;
4909
+ f(rel.doc, shared);
4910
+ propagate(rel.doc, doc, shared);
4911
+ }
4912
+ }
4913
+ propagate(doc, null, true);
4914
+ }
4915
+
4916
+ function attachDoc(cm, doc) {
4917
+ if (doc.cm) throw new Error("This document is already in use.");
4918
+ cm.doc = doc;
4919
+ doc.cm = cm;
4920
+ estimateLineHeights(cm);
4921
+ loadMode(cm);
4922
+ if (!cm.options.lineWrapping) computeMaxLength(cm);
4923
+ cm.options.mode = doc.modeOption;
4924
+ regChange(cm);
4925
+ }
4926
+
4927
+ // LINE UTILITIES
4928
+
4929
+ function getLine(chunk, n) {
4930
+ n -= chunk.first;
4931
+ while (!chunk.lines) {
4932
+ for (var i = 0;; ++i) {
4933
+ var child = chunk.children[i], sz = child.chunkSize();
4934
+ if (n < sz) { chunk = child; break; }
4935
+ n -= sz;
4936
+ }
4937
+ }
4938
+ return chunk.lines[n];
4939
+ }
4940
+
4941
+ function getBetween(doc, start, end) {
4942
+ var out = [], n = start.line;
4943
+ doc.iter(start.line, end.line + 1, function(line) {
4944
+ var text = line.text;
4945
+ if (n == end.line) text = text.slice(0, end.ch);
4946
+ if (n == start.line) text = text.slice(start.ch);
4947
+ out.push(text);
4948
+ ++n;
4949
+ });
4950
+ return out;
4951
+ }
4952
+ function getLines(doc, from, to) {
4953
+ var out = [];
4954
+ doc.iter(from, to, function(line) { out.push(line.text); });
4955
+ return out;
4956
+ }
4957
+
4958
+ function updateLineHeight(line, height) {
4959
+ var diff = height - line.height;
4960
+ for (var n = line; n; n = n.parent) n.height += diff;
4961
+ }
4962
+
4963
+ function lineNo(line) {
4964
+ if (line.parent == null) return null;
4965
+ var cur = line.parent, no = indexOf(cur.lines, line);
4966
+ for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
4967
+ for (var i = 0;; ++i) {
4968
+ if (chunk.children[i] == cur) break;
4969
+ no += chunk.children[i].chunkSize();
4970
+ }
4971
+ }
4972
+ return no + cur.first;
4973
+ }
4974
+
4975
+ function lineAtHeight(chunk, h) {
4976
+ var n = chunk.first;
4977
+ outer: do {
4978
+ for (var i = 0, e = chunk.children.length; i < e; ++i) {
4979
+ var child = chunk.children[i], ch = child.height;
4980
+ if (h < ch) { chunk = child; continue outer; }
4981
+ h -= ch;
4982
+ n += child.chunkSize();
4983
+ }
4984
+ return n;
4985
+ } while (!chunk.lines);
4986
+ for (var i = 0, e = chunk.lines.length; i < e; ++i) {
4987
+ var line = chunk.lines[i], lh = line.height;
4988
+ if (h < lh) break;
4989
+ h -= lh;
4990
+ }
4991
+ return n + i;
4992
+ }
4993
+
4994
+ function heightAtLine(cm, lineObj) {
4995
+ lineObj = visualLine(cm.doc, lineObj);
4996
+
4997
+ var h = 0, chunk = lineObj.parent;
4998
+ for (var i = 0; i < chunk.lines.length; ++i) {
4999
+ var line = chunk.lines[i];
5000
+ if (line == lineObj) break;
5001
+ else h += line.height;
5002
+ }
5003
+ for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
5004
+ for (var i = 0; i < p.children.length; ++i) {
5005
+ var cur = p.children[i];
5006
+ if (cur == chunk) break;
5007
+ else h += cur.height;
5008
+ }
5009
+ }
5010
+ return h;
5011
+ }
5012
+
5013
+ function getOrder(line) {
5014
+ var order = line.order;
5015
+ if (order == null) order = line.order = bidiOrdering(line.text);
5016
+ return order;
5017
+ }
5018
+
5019
+ // HISTORY
5020
+
5021
+ function makeHistory(startGen) {
5022
+ return {
5023
+ // Arrays of history events. Doing something adds an event to
5024
+ // done and clears undo. Undoing moves events from done to
5025
+ // undone, redoing moves them in the other direction.
5026
+ done: [], undone: [], undoDepth: Infinity,
5027
+ // Used to track when changes can be merged into a single undo
5028
+ // event
5029
+ lastTime: 0, lastOp: null, lastOrigin: null,
5030
+ // Used by the isClean() method
5031
+ generation: startGen || 1, maxGeneration: startGen || 1
5032
+ };
5033
+ }
5034
+
5035
+ function attachLocalSpans(doc, change, from, to) {
5036
+ var existing = change["spans_" + doc.id], n = 0;
5037
+ doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
5038
+ if (line.markedSpans)
5039
+ (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
5040
+ ++n;
5041
+ });
5042
+ }
5043
+
5044
+ function historyChangeFromChange(doc, change) {
5045
+ var from = { line: change.from.line, ch: change.from.ch };
5046
+ var histChange = {from: from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
5047
+ attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
5048
+ linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
5049
+ return histChange;
5050
+ }
5051
+
5052
+ function addToHistory(doc, change, selAfter, opId) {
5053
+ var hist = doc.history;
5054
+ hist.undone.length = 0;
5055
+ var time = +new Date, cur = lst(hist.done);
5056
+
5057
+ if (cur &&
5058
+ (hist.lastOp == opId ||
5059
+ hist.lastOrigin == change.origin && change.origin &&
5060
+ ((change.origin.charAt(0) == "+" && doc.cm && hist.lastTime > time - doc.cm.options.historyEventDelay) ||
5061
+ change.origin.charAt(0) == "*"))) {
5062
+ // Merge this change into the last event
5063
+ var last = lst(cur.changes);
5064
+ if (posEq(change.from, change.to) && posEq(change.from, last.to)) {
5065
+ // Optimized case for simple insertion -- don't want to add
5066
+ // new changesets for every character typed
5067
+ last.to = changeEnd(change);
5068
+ } else {
5069
+ // Add new sub-event
5070
+ cur.changes.push(historyChangeFromChange(doc, change));
5071
+ }
5072
+ cur.anchorAfter = selAfter.anchor; cur.headAfter = selAfter.head;
5073
+ } else {
5074
+ // Can not be merged, start a new event.
5075
+ cur = {changes: [historyChangeFromChange(doc, change)],
5076
+ generation: hist.generation,
5077
+ anchorBefore: doc.sel.anchor, headBefore: doc.sel.head,
5078
+ anchorAfter: selAfter.anchor, headAfter: selAfter.head};
5079
+ hist.done.push(cur);
5080
+ hist.generation = ++hist.maxGeneration;
5081
+ while (hist.done.length > hist.undoDepth)
5082
+ hist.done.shift();
5083
+ }
5084
+ hist.lastTime = time;
5085
+ hist.lastOp = opId;
5086
+ hist.lastOrigin = change.origin;
5087
+ }
5088
+
5089
+ function removeClearedSpans(spans) {
5090
+ if (!spans) return null;
5091
+ for (var i = 0, out; i < spans.length; ++i) {
5092
+ if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
5093
+ else if (out) out.push(spans[i]);
5094
+ }
5095
+ return !out ? spans : out.length ? out : null;
5096
+ }
5097
+
5098
+ function getOldSpans(doc, change) {
5099
+ var found = change["spans_" + doc.id];
5100
+ if (!found) return null;
5101
+ for (var i = 0, nw = []; i < change.text.length; ++i)
5102
+ nw.push(removeClearedSpans(found[i]));
5103
+ return nw;
5104
+ }
5105
+
5106
+ // Used both to provide a JSON-safe object in .getHistory, and, when
5107
+ // detaching a document, to split the history in two
5108
+ function copyHistoryArray(events, newGroup) {
5109
+ for (var i = 0, copy = []; i < events.length; ++i) {
5110
+ var event = events[i], changes = event.changes, newChanges = [];
5111
+ copy.push({changes: newChanges, anchorBefore: event.anchorBefore, headBefore: event.headBefore,
5112
+ anchorAfter: event.anchorAfter, headAfter: event.headAfter});
5113
+ for (var j = 0; j < changes.length; ++j) {
5114
+ var change = changes[j], m;
5115
+ newChanges.push({from: change.from, to: change.to, text: change.text});
5116
+ if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
5117
+ if (indexOf(newGroup, Number(m[1])) > -1) {
5118
+ lst(newChanges)[prop] = change[prop];
5119
+ delete change[prop];
5120
+ }
5121
+ }
5122
+ }
5123
+ }
5124
+ return copy;
5125
+ }
5126
+
5127
+ // Rebasing/resetting history to deal with externally-sourced changes
5128
+
5129
+ function rebaseHistSel(pos, from, to, diff) {
5130
+ if (to < pos.line) {
5131
+ pos.line += diff;
5132
+ } else if (from < pos.line) {
5133
+ pos.line = from;
5134
+ pos.ch = 0;
5135
+ }
5136
+ }
5137
+
5138
+ // Tries to rebase an array of history events given a change in the
5139
+ // document. If the change touches the same lines as the event, the
5140
+ // event, and everything 'behind' it, is discarded. If the change is
5141
+ // before the event, the event's positions are updated. Uses a
5142
+ // copy-on-write scheme for the positions, to avoid having to
5143
+ // reallocate them all on every rebase, but also avoid problems with
5144
+ // shared position objects being unsafely updated.
5145
+ function rebaseHistArray(array, from, to, diff) {
5146
+ for (var i = 0; i < array.length; ++i) {
5147
+ var sub = array[i], ok = true;
5148
+ for (var j = 0; j < sub.changes.length; ++j) {
5149
+ var cur = sub.changes[j];
5150
+ if (!sub.copied) { cur.from = copyPos(cur.from); cur.to = copyPos(cur.to); }
5151
+ if (to < cur.from.line) {
5152
+ cur.from.line += diff;
5153
+ cur.to.line += diff;
5154
+ } else if (from <= cur.to.line) {
5155
+ ok = false;
5156
+ break;
5157
+ }
5158
+ }
5159
+ if (!sub.copied) {
5160
+ sub.anchorBefore = copyPos(sub.anchorBefore); sub.headBefore = copyPos(sub.headBefore);
5161
+ sub.anchorAfter = copyPos(sub.anchorAfter); sub.readAfter = copyPos(sub.headAfter);
5162
+ sub.copied = true;
5163
+ }
5164
+ if (!ok) {
5165
+ array.splice(0, i + 1);
5166
+ i = 0;
5167
+ } else {
5168
+ rebaseHistSel(sub.anchorBefore); rebaseHistSel(sub.headBefore);
5169
+ rebaseHistSel(sub.anchorAfter); rebaseHistSel(sub.headAfter);
5170
+ }
5171
+ }
5172
+ }
5173
+
5174
+ function rebaseHist(hist, change) {
5175
+ var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
5176
+ rebaseHistArray(hist.done, from, to, diff);
5177
+ rebaseHistArray(hist.undone, from, to, diff);
5178
+ }
5179
+
5180
+ // EVENT OPERATORS
5181
+
5182
+ function stopMethod() {e_stop(this);}
5183
+ // Ensure an event has a stop method.
5184
+ function addStop(event) {
5185
+ if (!event.stop) event.stop = stopMethod;
5186
+ return event;
5187
+ }
5188
+
5189
+ function e_preventDefault(e) {
5190
+ if (e.preventDefault) e.preventDefault();
5191
+ else e.returnValue = false;
5192
+ }
5193
+ function e_stopPropagation(e) {
5194
+ if (e.stopPropagation) e.stopPropagation();
5195
+ else e.cancelBubble = true;
5196
+ }
5197
+ function e_defaultPrevented(e) {
5198
+ return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
5199
+ }
5200
+ function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
5201
+ CodeMirror.e_stop = e_stop;
5202
+ CodeMirror.e_preventDefault = e_preventDefault;
5203
+ CodeMirror.e_stopPropagation = e_stopPropagation;
5204
+
5205
+ function e_target(e) {return e.target || e.srcElement;}
5206
+ function e_button(e) {
5207
+ var b = e.which;
5208
+ if (b == null) {
5209
+ if (e.button & 1) b = 1;
5210
+ else if (e.button & 2) b = 3;
5211
+ else if (e.button & 4) b = 2;
5212
+ }
5213
+ if (mac && e.ctrlKey && b == 1) b = 3;
5214
+ return b;
5215
+ }
5216
+
5217
+ // EVENT HANDLING
5218
+
5219
+ function on(emitter, type, f) {
5220
+ if (emitter.addEventListener)
5221
+ emitter.addEventListener(type, f, false);
5222
+ else if (emitter.attachEvent)
5223
+ emitter.attachEvent("on" + type, f);
5224
+ else {
5225
+ var map = emitter._handlers || (emitter._handlers = {});
5226
+ var arr = map[type] || (map[type] = []);
5227
+ arr.push(f);
5228
+ }
5229
+ }
5230
+
5231
+ function off(emitter, type, f) {
5232
+ if (emitter.removeEventListener)
5233
+ emitter.removeEventListener(type, f, false);
5234
+ else if (emitter.detachEvent)
5235
+ emitter.detachEvent("on" + type, f);
5236
+ else {
5237
+ var arr = emitter._handlers && emitter._handlers[type];
5238
+ if (!arr) return;
5239
+ for (var i = 0; i < arr.length; ++i)
5240
+ if (arr[i] == f) { arr.splice(i, 1); break; }
5241
+ }
5242
+ }
5243
+
5244
+ function signal(emitter, type /*, values...*/) {
5245
+ var arr = emitter._handlers && emitter._handlers[type];
5246
+ if (!arr) return;
5247
+ var args = Array.prototype.slice.call(arguments, 2);
5248
+ for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);
5249
+ }
5250
+
5251
+ var delayedCallbacks, delayedCallbackDepth = 0;
5252
+ function signalLater(emitter, type /*, values...*/) {
5253
+ var arr = emitter._handlers && emitter._handlers[type];
5254
+ if (!arr) return;
5255
+ var args = Array.prototype.slice.call(arguments, 2);
5256
+ if (!delayedCallbacks) {
5257
+ ++delayedCallbackDepth;
5258
+ delayedCallbacks = [];
5259
+ setTimeout(fireDelayed, 0);
5260
+ }
5261
+ function bnd(f) {return function(){f.apply(null, args);};};
5262
+ for (var i = 0; i < arr.length; ++i)
5263
+ delayedCallbacks.push(bnd(arr[i]));
5264
+ }
5265
+
5266
+ function signalDOMEvent(cm, e, override) {
5267
+ signal(cm, override || e.type, cm, e);
5268
+ return e_defaultPrevented(e) || e.codemirrorIgnore;
5269
+ }
5270
+
5271
+ function fireDelayed() {
5272
+ --delayedCallbackDepth;
5273
+ var delayed = delayedCallbacks;
5274
+ delayedCallbacks = null;
5275
+ for (var i = 0; i < delayed.length; ++i) delayed[i]();
5276
+ }
5277
+
5278
+ function hasHandler(emitter, type) {
5279
+ var arr = emitter._handlers && emitter._handlers[type];
5280
+ return arr && arr.length > 0;
5281
+ }
5282
+
5283
+ CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal;
5284
+
5285
+ function eventMixin(ctor) {
5286
+ ctor.prototype.on = function(type, f) {on(this, type, f);};
5287
+ ctor.prototype.off = function(type, f) {off(this, type, f);};
5288
+ }
5289
+
5290
+ // MISC UTILITIES
5291
+
5292
+ // Number of pixels added to scroller and sizer to hide scrollbar
5293
+ var scrollerCutOff = 30;
5294
+
5295
+ // Returned or thrown by various protocols to signal 'I'm not
5296
+ // handling this'.
5297
+ var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
5298
+
5299
+ function Delayed() {this.id = null;}
5300
+ Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
5301
+
5302
+ // Counts the column offset in a string, taking tabs into account.
5303
+ // Used mostly to find indentation.
5304
+ function countColumn(string, end, tabSize, startIndex, startValue) {
5305
+ if (end == null) {
5306
+ end = string.search(/[^\s\u00a0]/);
5307
+ if (end == -1) end = string.length;
5308
+ }
5309
+ for (var i = startIndex || 0, n = startValue || 0; i < end; ++i) {
5310
+ if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
5311
+ else ++n;
5312
+ }
5313
+ return n;
5314
+ }
5315
+ CodeMirror.countColumn = countColumn;
5316
+
5317
+ var spaceStrs = [""];
5318
+ function spaceStr(n) {
5319
+ while (spaceStrs.length <= n)
5320
+ spaceStrs.push(lst(spaceStrs) + " ");
5321
+ return spaceStrs[n];
5322
+ }
5323
+
5324
+ function lst(arr) { return arr[arr.length-1]; }
5325
+
5326
+ function selectInput(node) {
5327
+ if (ios) { // Mobile Safari apparently has a bug where select() is broken.
5328
+ node.selectionStart = 0;
5329
+ node.selectionEnd = node.value.length;
5330
+ } else {
5331
+ // Suppress mysterious IE10 errors
5332
+ try { node.select(); }
5333
+ catch(_e) {}
5334
+ }
5335
+ }
5336
+
5337
+ function indexOf(collection, elt) {
5338
+ if (collection.indexOf) return collection.indexOf(elt);
5339
+ for (var i = 0, e = collection.length; i < e; ++i)
5340
+ if (collection[i] == elt) return i;
5341
+ return -1;
5342
+ }
5343
+
5344
+ function createObj(base, props) {
5345
+ function Obj() {}
5346
+ Obj.prototype = base;
5347
+ var inst = new Obj();
5348
+ if (props) copyObj(props, inst);
5349
+ return inst;
5350
+ }
5351
+
5352
+ function copyObj(obj, target) {
5353
+ if (!target) target = {};
5354
+ for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
5355
+ return target;
5356
+ }
5357
+
5358
+ function emptyArray(size) {
5359
+ for (var a = [], i = 0; i < size; ++i) a.push(undefined);
5360
+ return a;
5361
+ }
5362
+
5363
+ function bind(f) {
5364
+ var args = Array.prototype.slice.call(arguments, 1);
5365
+ return function(){return f.apply(null, args);};
5366
+ }
5367
+
5368
+ var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
5369
+ function isWordChar(ch) {
5370
+ return /\w/.test(ch) || ch > "\x80" &&
5371
+ (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
5372
+ }
5373
+
5374
+ function isEmpty(obj) {
5375
+ for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
5376
+ return true;
5377
+ }
5378
+
5379
+ var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F\udc00-\udfff]/;
5380
+
5381
+ // DOM UTILITIES
5382
+
5383
+ function elt(tag, content, className, style) {
5384
+ var e = document.createElement(tag);
5385
+ if (className) e.className = className;
5386
+ if (style) e.style.cssText = style;
5387
+ if (typeof content == "string") setTextContent(e, content);
5388
+ else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
5389
+ return e;
5390
+ }
5391
+
5392
+ function removeChildren(e) {
5393
+ for (var count = e.childNodes.length; count > 0; --count)
5394
+ e.removeChild(e.firstChild);
5395
+ return e;
5396
+ }
5397
+
5398
+ function removeChildrenAndAdd(parent, e) {
5399
+ return removeChildren(parent).appendChild(e);
5400
+ }
5401
+
5402
+ function setTextContent(e, str) {
5403
+ if (ie_lt9) {
5404
+ e.innerHTML = "";
5405
+ e.appendChild(document.createTextNode(str));
5406
+ } else e.textContent = str;
5407
+ }
5408
+
5409
+ function getRect(node) {
5410
+ return node.getBoundingClientRect();
5411
+ }
5412
+ CodeMirror.replaceGetRect = function(f) { getRect = f; };
5413
+
5414
+ // FEATURE DETECTION
5415
+
5416
+ // Detect drag-and-drop
5417
+ var dragAndDrop = function() {
5418
+ // There is *some* kind of drag-and-drop support in IE6-8, but I
5419
+ // couldn't get it to work yet.
5420
+ if (ie_lt9) return false;
5421
+ var div = elt('div');
5422
+ return "draggable" in div || "dragDrop" in div;
5423
+ }();
5424
+
5425
+ // For a reason I have yet to figure out, some browsers disallow
5426
+ // word wrapping between certain characters *only* if a new inline
5427
+ // element is started between them. This makes it hard to reliably
5428
+ // measure the position of things, since that requires inserting an
5429
+ // extra span. This terribly fragile set of tests matches the
5430
+ // character combinations that suffer from this phenomenon on the
5431
+ // various browsers.
5432
+ function spanAffectsWrapping() { return false; }
5433
+ if (gecko) // Only for "$'"
5434
+ spanAffectsWrapping = function(str, i) {
5435
+ return str.charCodeAt(i - 1) == 36 && str.charCodeAt(i) == 39;
5436
+ };
5437
+ else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent))
5438
+ spanAffectsWrapping = function(str, i) {
5439
+ return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1));
5440
+ };
5441
+ else if (webkit && !/Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent))
5442
+ spanAffectsWrapping = function(str, i) {
5443
+ if (i > 1 && str.charCodeAt(i - 1) == 45) {
5444
+ if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true;
5445
+ if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false;
5446
+ }
5447
+ return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
5448
+ };
5449
+
5450
+ var knownScrollbarWidth;
5451
+ function scrollbarWidth(measure) {
5452
+ if (knownScrollbarWidth != null) return knownScrollbarWidth;
5453
+ var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll");
5454
+ removeChildrenAndAdd(measure, test);
5455
+ if (test.offsetWidth)
5456
+ knownScrollbarWidth = test.offsetHeight - test.clientHeight;
5457
+ return knownScrollbarWidth || 0;
5458
+ }
5459
+
5460
+ var zwspSupported;
5461
+ function zeroWidthElement(measure) {
5462
+ if (zwspSupported == null) {
5463
+ var test = elt("span", "\u200b");
5464
+ removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
5465
+ if (measure.firstChild.offsetHeight != 0)
5466
+ zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8;
5467
+ }
5468
+ if (zwspSupported) return elt("span", "\u200b");
5469
+ else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
5470
+ }
5471
+
5472
+ // See if "".split is the broken IE version, if so, provide an
5473
+ // alternative way to split lines.
5474
+ var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
5475
+ var pos = 0, result = [], l = string.length;
5476
+ while (pos <= l) {
5477
+ var nl = string.indexOf("\n", pos);
5478
+ if (nl == -1) nl = string.length;
5479
+ var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
5480
+ var rt = line.indexOf("\r");
5481
+ if (rt != -1) {
5482
+ result.push(line.slice(0, rt));
5483
+ pos += rt + 1;
5484
+ } else {
5485
+ result.push(line);
5486
+ pos = nl + 1;
5487
+ }
5488
+ }
5489
+ return result;
5490
+ } : function(string){return string.split(/\r\n?|\n/);};
5491
+ CodeMirror.splitLines = splitLines;
5492
+
5493
+ var hasSelection = window.getSelection ? function(te) {
5494
+ try { return te.selectionStart != te.selectionEnd; }
5495
+ catch(e) { return false; }
5496
+ } : function(te) {
5497
+ try {var range = te.ownerDocument.selection.createRange();}
5498
+ catch(e) {}
5499
+ if (!range || range.parentElement() != te) return false;
5500
+ return range.compareEndPoints("StartToEnd", range) != 0;
5501
+ };
5502
+
5503
+ var hasCopyEvent = (function() {
5504
+ var e = elt("div");
5505
+ if ("oncopy" in e) return true;
5506
+ e.setAttribute("oncopy", "return;");
5507
+ return typeof e.oncopy == 'function';
5508
+ })();
5509
+
5510
+ // KEY NAMING
5511
+
5512
+ var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
5513
+ 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
5514
+ 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
5515
+ 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete",
5516
+ 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
5517
+ 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home",
5518
+ 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"};
5519
+ CodeMirror.keyNames = keyNames;
5520
+ (function() {
5521
+ // Number keys
5522
+ for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
5523
+ // Alphabetic keys
5524
+ for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
5525
+ // Function keys
5526
+ for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
5527
+ })();
5528
+
5529
+ // BIDI HELPERS
5530
+
5531
+ function iterateBidiSections(order, from, to, f) {
5532
+ if (!order) return f(from, to, "ltr");
5533
+ var found = false;
5534
+ for (var i = 0; i < order.length; ++i) {
5535
+ var part = order[i];
5536
+ if (part.from < to && part.to > from || from == to && part.to == from) {
5537
+ f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
5538
+ found = true;
5539
+ }
5540
+ }
5541
+ if (!found) f(from, to, "ltr");
5542
+ }
5543
+
5544
+ function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
5545
+ function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
5546
+
5547
+ function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
5548
+ function lineRight(line) {
5549
+ var order = getOrder(line);
5550
+ if (!order) return line.text.length;
5551
+ return bidiRight(lst(order));
5552
+ }
5553
+
5554
+ function lineStart(cm, lineN) {
5555
+ var line = getLine(cm.doc, lineN);
5556
+ var visual = visualLine(cm.doc, line);
5557
+ if (visual != line) lineN = lineNo(visual);
5558
+ var order = getOrder(visual);
5559
+ var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
5560
+ return Pos(lineN, ch);
5561
+ }
5562
+ function lineEnd(cm, lineN) {
5563
+ var merged, line;
5564
+ while (merged = collapsedSpanAtEnd(line = getLine(cm.doc, lineN)))
5565
+ lineN = merged.find().to.line;
5566
+ var order = getOrder(line);
5567
+ var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
5568
+ return Pos(lineN, ch);
5569
+ }
5570
+
5571
+ function compareBidiLevel(order, a, b) {
5572
+ var linedir = order[0].level;
5573
+ if (a == linedir) return true;
5574
+ if (b == linedir) return false;
5575
+ return a < b;
5576
+ }
5577
+ var bidiOther;
5578
+ function getBidiPartAt(order, pos) {
5579
+ for (var i = 0, found; i < order.length; ++i) {
5580
+ var cur = order[i];
5581
+ if (cur.from < pos && cur.to > pos) { bidiOther = null; return i; }
5582
+ if (cur.from == pos || cur.to == pos) {
5583
+ if (found == null) {
5584
+ found = i;
5585
+ } else if (compareBidiLevel(order, cur.level, order[found].level)) {
5586
+ bidiOther = found;
5587
+ return i;
5588
+ } else {
5589
+ bidiOther = i;
5590
+ return found;
5591
+ }
5592
+ }
5593
+ }
5594
+ bidiOther = null;
5595
+ return found;
5596
+ }
5597
+
5598
+ function moveInLine(line, pos, dir, byUnit) {
5599
+ if (!byUnit) return pos + dir;
5600
+ do pos += dir;
5601
+ while (pos > 0 && isExtendingChar.test(line.text.charAt(pos)));
5602
+ return pos;
5603
+ }
5604
+
5605
+ // This is somewhat involved. It is needed in order to move
5606
+ // 'visually' through bi-directional text -- i.e., pressing left
5607
+ // should make the cursor go left, even when in RTL text. The
5608
+ // tricky part is the 'jumps', where RTL and LTR text touch each
5609
+ // other. This often requires the cursor offset to move more than
5610
+ // one unit, in order to visually move one unit.
5611
+ function moveVisually(line, start, dir, byUnit) {
5612
+ var bidi = getOrder(line);
5613
+ if (!bidi) return moveLogically(line, start, dir, byUnit);
5614
+ var pos = getBidiPartAt(bidi, start), part = bidi[pos];
5615
+ var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
5616
+
5617
+ for (;;) {
5618
+ if (target > part.from && target < part.to) return target;
5619
+ if (target == part.from || target == part.to) {
5620
+ if (getBidiPartAt(bidi, target) == pos) return target;
5621
+ part = bidi[pos += dir];
5622
+ return (dir > 0) == part.level % 2 ? part.to : part.from;
5623
+ } else {
5624
+ part = bidi[pos += dir];
5625
+ if (!part) return null;
5626
+ if ((dir > 0) == part.level % 2)
5627
+ target = moveInLine(line, part.to, -1, byUnit);
5628
+ else
5629
+ target = moveInLine(line, part.from, 1, byUnit);
5630
+ }
5631
+ }
5632
+ }
5633
+
5634
+ function moveLogically(line, start, dir, byUnit) {
5635
+ var target = start + dir;
5636
+ if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir;
5637
+ return target < 0 || target > line.text.length ? null : target;
5638
+ }
5639
+
5640
+ // Bidirectional ordering algorithm
5641
+ // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
5642
+ // that this (partially) implements.
5643
+
5644
+ // One-char codes used for character types:
5645
+ // L (L): Left-to-Right
5646
+ // R (R): Right-to-Left
5647
+ // r (AL): Right-to-Left Arabic
5648
+ // 1 (EN): European Number
5649
+ // + (ES): European Number Separator
5650
+ // % (ET): European Number Terminator
5651
+ // n (AN): Arabic Number
5652
+ // , (CS): Common Number Separator
5653
+ // m (NSM): Non-Spacing Mark
5654
+ // b (BN): Boundary Neutral
5655
+ // s (B): Paragraph Separator
5656
+ // t (S): Segment Separator
5657
+ // w (WS): Whitespace
5658
+ // N (ON): Other Neutrals
5659
+
5660
+ // Returns null if characters are ordered as they appear
5661
+ // (left-to-right), or an array of sections ({from, to, level}
5662
+ // objects) in the order in which they occur visually.
5663
+ var bidiOrdering = (function() {
5664
+ // Character types for codepoints 0 to 0xff
5665
+ var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL";
5666
+ // Character types for codepoints 0x600 to 0x6ff
5667
+ var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr";
5668
+ function charType(code) {
5669
+ if (code <= 0xff) return lowTypes.charAt(code);
5670
+ else if (0x590 <= code && code <= 0x5f4) return "R";
5671
+ else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600);
5672
+ else if (0x700 <= code && code <= 0x8ac) return "r";
5673
+ else return "L";
5674
+ }
5675
+
5676
+ var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
5677
+ var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
5678
+ // Browsers seem to always treat the boundaries of block elements as being L.
5679
+ var outerType = "L";
5680
+
5681
+ return function(str) {
5682
+ if (!bidiRE.test(str)) return false;
5683
+ var len = str.length, types = [];
5684
+ for (var i = 0, type; i < len; ++i)
5685
+ types.push(type = charType(str.charCodeAt(i)));
5686
+
5687
+ // W1. Examine each non-spacing mark (NSM) in the level run, and
5688
+ // change the type of the NSM to the type of the previous
5689
+ // character. If the NSM is at the start of the level run, it will
5690
+ // get the type of sor.
5691
+ for (var i = 0, prev = outerType; i < len; ++i) {
5692
+ var type = types[i];
5693
+ if (type == "m") types[i] = prev;
5694
+ else prev = type;
5695
+ }
5696
+
5697
+ // W2. Search backwards from each instance of a European number
5698
+ // until the first strong type (R, L, AL, or sor) is found. If an
5699
+ // AL is found, change the type of the European number to Arabic
5700
+ // number.
5701
+ // W3. Change all ALs to R.
5702
+ for (var i = 0, cur = outerType; i < len; ++i) {
5703
+ var type = types[i];
5704
+ if (type == "1" && cur == "r") types[i] = "n";
5705
+ else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
5706
+ }
5707
+
5708
+ // W4. A single European separator between two European numbers
5709
+ // changes to a European number. A single common separator between
5710
+ // two numbers of the same type changes to that type.
5711
+ for (var i = 1, prev = types[0]; i < len - 1; ++i) {
5712
+ var type = types[i];
5713
+ if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
5714
+ else if (type == "," && prev == types[i+1] &&
5715
+ (prev == "1" || prev == "n")) types[i] = prev;
5716
+ prev = type;
5717
+ }
5718
+
5719
+ // W5. A sequence of European terminators adjacent to European
5720
+ // numbers changes to all European numbers.
5721
+ // W6. Otherwise, separators and terminators change to Other
5722
+ // Neutral.
5723
+ for (var i = 0; i < len; ++i) {
5724
+ var type = types[i];
5725
+ if (type == ",") types[i] = "N";
5726
+ else if (type == "%") {
5727
+ for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
5728
+ var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N";
5729
+ for (var j = i; j < end; ++j) types[j] = replace;
5730
+ i = end - 1;
5731
+ }
5732
+ }
5733
+
5734
+ // W7. Search backwards from each instance of a European number
5735
+ // until the first strong type (R, L, or sor) is found. If an L is
5736
+ // found, then change the type of the European number to L.
5737
+ for (var i = 0, cur = outerType; i < len; ++i) {
5738
+ var type = types[i];
5739
+ if (cur == "L" && type == "1") types[i] = "L";
5740
+ else if (isStrong.test(type)) cur = type;
5741
+ }
5742
+
5743
+ // N1. A sequence of neutrals takes the direction of the
5744
+ // surrounding strong text if the text on both sides has the same
5745
+ // direction. European and Arabic numbers act as if they were R in
5746
+ // terms of their influence on neutrals. Start-of-level-run (sor)
5747
+ // and end-of-level-run (eor) are used at level run boundaries.
5748
+ // N2. Any remaining neutrals take the embedding direction.
5749
+ for (var i = 0; i < len; ++i) {
5750
+ if (isNeutral.test(types[i])) {
5751
+ for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
5752
+ var before = (i ? types[i-1] : outerType) == "L";
5753
+ var after = (end < len - 1 ? types[end] : outerType) == "L";
5754
+ var replace = before || after ? "L" : "R";
5755
+ for (var j = i; j < end; ++j) types[j] = replace;
5756
+ i = end - 1;
5757
+ }
5758
+ }
5759
+
5760
+ // Here we depart from the documented algorithm, in order to avoid
5761
+ // building up an actual levels array. Since there are only three
5762
+ // levels (0, 1, 2) in an implementation that doesn't take
5763
+ // explicit embedding into account, we can build up the order on
5764
+ // the fly, without following the level-based algorithm.
5765
+ var order = [], m;
5766
+ for (var i = 0; i < len;) {
5767
+ if (countsAsLeft.test(types[i])) {
5768
+ var start = i;
5769
+ for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
5770
+ order.push({from: start, to: i, level: 0});
5771
+ } else {
5772
+ var pos = i, at = order.length;
5773
+ for (++i; i < len && types[i] != "L"; ++i) {}
5774
+ for (var j = pos; j < i;) {
5775
+ if (countsAsNum.test(types[j])) {
5776
+ if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1});
5777
+ var nstart = j;
5778
+ for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
5779
+ order.splice(at, 0, {from: nstart, to: j, level: 2});
5780
+ pos = j;
5781
+ } else ++j;
5782
+ }
5783
+ if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1});
5784
+ }
5785
+ }
5786
+ if (order[0].level == 1 && (m = str.match(/^\s+/))) {
5787
+ order[0].from = m[0].length;
5788
+ order.unshift({from: 0, to: m[0].length, level: 0});
5789
+ }
5790
+ if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
5791
+ lst(order).to -= m[0].length;
5792
+ order.push({from: len - m[0].length, to: len, level: 0});
5793
+ }
5794
+ if (order[0].level != lst(order).level)
5795
+ order.push({from: len, to: len, level: order[0].level});
5796
+
5797
+ return order;
5798
+ };
5799
+ })();
5800
+
5801
+ // THE END
5802
+
5803
+ CodeMirror.version = "3.15.0";
5804
+
5805
+ return CodeMirror;
5806
+ })();
plugin-fw/assets/js/jquery-tiptip/jquery.tipTip 2.js ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * TipTip
3
+ * Copyright 2010 Drew Wilson
4
+ * www.drewwilson.com
5
+ * code.drewwilson.com/entry/tiptip-jquery-plugin
6
+ *
7
+ * Version 1.3 - Updated: Mar. 23, 2010
8
+ *
9
+ * This Plug-In will create a custom tooltip to replace the default
10
+ * browser tooltip. It is extremely lightweight and very smart in
11
+ * that it detects the edges of the browser window and will make sure
12
+ * the tooltip stays within the current window size. As a result the
13
+ * tooltip will adjust itself to be displayed above, below, to the left
14
+ * or to the right depending on what is necessary to stay within the
15
+ * browser window. It is completely customizable as well via CSS.
16
+ *
17
+ * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
18
+ * http://www.opensource.org/licenses/mit-license.php
19
+ * http://www.gnu.org/licenses/gpl.html
20
+ */
21
+
22
+ (function($){
23
+ $.fn.tipTip = function(options) {
24
+ var defaults = {
25
+ activation: "hover",
26
+ keepAlive: false,
27
+ maxWidth: "200px",
28
+ edgeOffset: 3,
29
+ defaultPosition: "bottom",
30
+ delay: 400,
31
+ fadeIn: 200,
32
+ fadeOut: 200,
33
+ attribute: "title",
34
+ content: false, // HTML or String to fill TipTIp with
35
+ enter: function(){},
36
+ exit: function(){}
37
+ };
38
+ var opts = $.extend(defaults, options);
39
+
40
+ // Setup tip tip elements and render them to the DOM
41
+ if($("#tiptip_holder").length <= 0){
42
+ var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
43
+ var tiptip_content = $('<div id="tiptip_content"></div>');
44
+ var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
45
+ $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
46
+ } else {
47
+ var tiptip_holder = $("#tiptip_holder");
48
+ var tiptip_content = $("#tiptip_content");
49
+ var tiptip_arrow = $("#tiptip_arrow");
50
+ }
51
+
52
+ return this.each(function(){
53
+ var org_elem = $(this);
54
+ if(opts.content){
55
+ var org_title = opts.content;
56
+ } else {
57
+ var org_title = org_elem.attr(opts.attribute);
58
+ }
59
+ if(org_title != ""){
60
+ if(!opts.content){
61
+ org_elem.removeAttr(opts.attribute); //remove original Attribute
62
+ }
63
+ var timeout = false;
64
+
65
+ if(opts.activation == "hover"){
66
+ org_elem.hover(function(){
67
+ active_tiptip();
68
+ }, function(){
69
+ if(!opts.keepAlive || !tiptip_holder.is(':hover')){
70
+ deactive_tiptip();
71
+ }
72
+ });
73
+ if(opts.keepAlive){
74
+ tiptip_holder.hover(function(){}, function(){
75
+ deactive_tiptip();
76
+ });
77
+ }
78
+ } else if(opts.activation == "focus"){
79
+ org_elem.focus(function(){
80
+ active_tiptip();
81
+ }).blur(function(){
82
+ deactive_tiptip();
83
+ });
84
+ } else if(opts.activation == "click"){
85
+ org_elem.click(function(){
86
+ active_tiptip();
87
+ return false;
88
+ }).hover(function(){},function(){
89
+ if(!opts.keepAlive){
90
+ deactive_tiptip();
91
+ }
92
+ });
93
+ if(opts.keepAlive){
94
+ tiptip_holder.hover(function(){}, function(){
95
+ deactive_tiptip();
96
+ });
97
+ }
98
+ }
99
+
100
+ function active_tiptip(){
101
+ opts.enter.call(this);
102
+ tiptip_content.html(org_title);
103
+ tiptip_holder.hide().removeAttr("class").css("margin","0");
104
+ tiptip_arrow.removeAttr("style");
105
+
106
+ var top = parseInt(org_elem.offset()['top']);
107
+ var left = parseInt(org_elem.offset()['left']);
108
+ var org_width = parseInt(org_elem.outerWidth());
109
+ var org_height = parseInt(org_elem.outerHeight());
110
+ var tip_w = tiptip_holder.outerWidth();
111
+ var tip_h = tiptip_holder.outerHeight();
112
+ var w_compare = Math.round((org_width - tip_w) / 2);
113
+ var h_compare = Math.round((org_height - tip_h) / 2);
114
+ var marg_left = Math.round(left + w_compare);
115
+ var marg_top = Math.round(top + org_height + opts.edgeOffset);
116
+ var t_class = "";
117
+ var arrow_top = "";
118
+ var arrow_left = Math.round(tip_w - 12) / 2;
119
+
120
+ if(opts.defaultPosition == "bottom"){
121
+ t_class = "_bottom";
122
+ } else if(opts.defaultPosition == "top"){
123
+ t_class = "_top";
124
+ } else if(opts.defaultPosition == "left"){
125
+ t_class = "_left";
126
+ } else if(opts.defaultPosition == "right"){
127
+ t_class = "_right";
128
+ }
129
+
130
+ var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());
131
+ var left_compare = (tip_w + left) > parseInt($(window).width());
132
+
133
+ if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){
134
+ t_class = "_right";
135
+ arrow_top = Math.round(tip_h - 13) / 2;
136
+ arrow_left = -12;
137
+ marg_left = Math.round(left + org_width + opts.edgeOffset);
138
+ marg_top = Math.round(top + h_compare);
139
+ } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){
140
+ t_class = "_left";
141
+ arrow_top = Math.round(tip_h - 13) / 2;
142
+ arrow_left = Math.round(tip_w);
143
+ marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));
144
+ marg_top = Math.round(top + h_compare);
145
+ }
146
+
147
+ var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());
148
+ var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;
149
+
150
+ if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){
151
+ if(t_class == "_top" || t_class == "_bottom"){
152
+ t_class = "_top";
153
+ } else {
154
+ t_class = t_class+"_top";
155
+ }
156
+ arrow_top = tip_h;
157
+ marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
158
+ } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){
159
+ if(t_class == "_top" || t_class == "_bottom"){
160
+ t_class = "_bottom";
161
+ } else {
162
+ t_class = t_class+"_bottom";
163
+ }
164
+ arrow_top = -12;
165
+ marg_top = Math.round(top + org_height + opts.edgeOffset);
166
+ }
167
+
168
+ if(t_class == "_right_top" || t_class == "_left_top"){
169
+ marg_top = marg_top + 5;
170
+ } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){
171
+ marg_top = marg_top - 5;
172
+ }
173
+ if(t_class == "_left_top" || t_class == "_left_bottom"){
174
+ marg_left = marg_left + 5;
175
+ }
176
+ tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
177
+ tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);
178
+
179
+ if (timeout){ clearTimeout(timeout); }
180
+ timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay);
181
+ }
182
+
183
+ function deactive_tiptip(){
184
+ opts.exit.call(this);
185
+ if (timeout){ clearTimeout(timeout); }
186
+ tiptip_holder.fadeOut(opts.fadeOut);
187
+ }
188
+ }
189
+ });
190
+ }
191
+ })(jQuery);
plugin-fw/assets/js/select2/select2.min 2.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Select2 4.0.3
3
+ * https://select2.github.io
4
+ *
5
+ * Released under the MIT license
6
+ * https://github.com/select2/select2/blob/master/LICENSE.md
7
+ */
8
+ !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)t=e.fn.select2.amd;var t;return function(){if(!t||!t.requirejs){t?n=t:t={};/**
9
+ * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
10
+ * Available via the MIT or new BSD license.
11
+ * see: http://github.com/jrburke/almond for details
12
+ */
13
+ var e,n,i;!function(t){function r(e,t){return $.call(e,t)}function s(e,t){var n,i,r,s,o,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e&&"."===e.charAt(0))if(t){for(o=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[o])&&(e[o]=e[o].replace(b,"")),e=h.slice(0,h.length-1).concat(e),u=0;u<e.length;u+=1)if("."===(p=e[u]))e.splice(u,1),u-=1;else if(".."===p){if(1===u&&(".."===e[2]||".."===e[0]))break;u>0&&(e.splice(u-1,2),u-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((h||g)&&f){for(u=(n=e.split("/")).length;u>0;u-=1){if(i=n.slice(0,u).join("/"),h)for(d=h.length;d>0;d-=1)if((r=f[h.slice(0,d).join("/")])&&(r=r[i])){s=r,a=u;break}if(s)break;!l&&g&&g[i]&&(l=g[i],c=u)}!s&&l&&(s=l,a=c),s&&(n.splice(0,a,s),e=n.join("/"))}return e}function o(e,n){return function(){var i=w.call(arguments,0);return"string"!=typeof i[0]&&1===i.length&&i.push(null),h.apply(t,i.concat([e,n]))}}function a(e){return function(t){return s(t,e)}}function l(e){return function(t){m[e]=t}}function c(e){if(r(v,e)){var n=v[e];delete v[e],_[e]=!0,p.apply(t,n)}if(!r(m,e)&&!r(_,e))throw new Error("No "+e);return m[e]}function u(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function d(e){return function(){return y&&y.config&&y.config[e]||{}}}var p,h,f,g,m={},v={},y={},_={},$=Object.prototype.hasOwnProperty,w=[].slice,b=/\.js$/;f=function(e,t){var n,i=u(e),r=i[0];return e=i[1],r&&(n=c(r=s(r,t))),r?e=n&&n.normalize?n.normalize(e,a(t)):s(e,t):(r=(i=u(e=s(e,t)))[0],e=i[1],r&&(n=c(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},g={require:function(e){return o(e)},exports:function(e){var t=m[e];return void 0!==t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:d(e)}}},p=function(e,n,i,s){var a,u,d,p,h,y,$=[],w=typeof i;if(s=s||e,"undefined"===w||"function"===w){for(n=!n.length&&i.length?["require","exports","module"]:n,h=0;h<n.length;h+=1)if(p=f(n[h],s),"require"===(u=p.f))$[h]=g.require(e);else if("exports"===u)$[h]=g.exports(e),y=!0;else if("module"===u)a=$[h]=g.module(e);else if(r(m,u)||r(v,u)||r(_,u))$[h]=c(u);else{if(!p.p)throw new Error(e+" missing "+u);p.p.load(p.n,o(s,!0),l(u),{}),$[h]=m[u]}d=i?i.apply(m[e],$):undefined,e&&(a&&a.exports!==t&&a.exports!==m[e]?m[e]=a.exports:d===t&&y||(m[e]=d))}else e&&(m[e]=i)},e=n=h=function(e,n,i,r,s){if("string"==typeof e)return g[e]?g[e](n):c(f(e,n).f);if(!e.splice){if((y=e).deps&&h(y.deps,y.callback),!n)return;n.splice?(e=n,n=i,i=null):e=t}return n=n||function(){},"function"==typeof i&&(i=r,r=s),r?p(t,e,n,i):setTimeout(function(){p(t,e,n,i)},4),h},h.config=function(e){return h(e)},e._defined=m,(i=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),r(m,e)||r(v,e)||(v[e]=[e,t,n])}).amd={jQuery:!0}}(),t.requirejs=e,t.require=n,t.define=i}}(),t.define("almond",function(){}),t.define("jquery",[],function(){var t=e||$;return null==t&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),t}),t.define("select2/utils",["jquery"],function(e){function t(e){var t=e.prototype,n=[];for(var i in t)"function"==typeof t[i]&&"constructor"!==i&&n.push(i);return n}var n={};n.Extend=function(e,t){function n(){this.constructor=e}var i={}.hasOwnProperty;for(var r in t)i.call(t,r)&&(e[r]=t[r]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},n.Decorate=function(e,n){function i(){var t=Array.prototype.unshift,i=n.prototype.constructor.length,r=e.prototype.constructor;i>0&&(t.call(arguments,e.prototype.constructor),r=n.prototype.constructor),r.apply(this,arguments)}var r=t(n),s=t(e);n.displayName=e.displayName,i.prototype=new function(){this.constructor=i};for(var o=0;o<s.length;o++){var a=s[o];i.prototype[a]=e.prototype[a]}for(var l=0;l<r.length;l++){var c=r[l];i.prototype[c]=function(e){var t=function(){};e in i.prototype&&(t=i.prototype[e]);var r=n.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),r.apply(this,arguments)}}(c)}return i};var i=function(){this.listeners={}};return i.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},i.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},null==n&&(n=[]),0===n.length&&n.push({}),n[0]._type=e,e in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},i.prototype.invoke=function(e,t){for(var n=0,i=e.length;n<i;n++)e[n].apply(this,t)},n.Observable=i,n.generateChars=function(e){for(var t="",n=0;n<e;n++)t+=Math.floor(36*Math.random()).toString(36);return t},n.bind=function(e,t){return function(){e.apply(t,arguments)}},n._convertData=function(e){for(var t in e){var n=t.split("-"),i=e;if(1!==n.length){for(var r=0;r<n.length;r++){var s=n[r];(s=s.substring(0,1).toLowerCase()+s.substring(1))in i||(i[s]={}),r==n.length-1&&(i[s]=e[t]),i=i[s]}delete e[t]}}return e},n.hasScroll=function(t,n){var i=e(n),r=n.style.overflowX,s=n.style.overflowY;return(r!==s||"hidden"!==s&&"visible"!==s)&&("scroll"===r||"scroll"===s||(i.innerHeight()<n.scrollHeight||i.innerWidth()<n.scrollWidth))},n.escapeMarkup=function(e){var t={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},n.appendMany=function(t,n){if("1.7"===e.fn.jquery.substr(0,3)){var i=e();e.map(n,function(e){i=i.add(e)}),n=i}t.append(n)},n}),t.define("select2/results",["jquery","./utils"],function(e,t){function n(e,t,i){this.$element=e,this.data=i,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&t.attr("aria-multiselectable","true"),this.$results=t,t},n.prototype.clear=function(){this.$results.empty()},n.prototype.displayMessage=function(t){var n=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var i=e('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),r=this.options.get("translations").get(t.message);i.append(n(r(t.args))),i[0].className+=" select2-results__message",this.$results.append(i)},n.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},n.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var i=e.results[n],r=this.option(i);t.push(r)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},n.prototype.position=function(e,t){t.find(".select2-results").append(e)},n.prototype.sort=function(e){return this.options.get("sorter")(e)},n.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option[aria-selected]"),t=e.filter("[aria-selected=true]");t.length>0?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},n.prototype.setClasses=function(){var t=this;this.data.current(function(n){var i=e.map(n,function(e){return e.id.toString()});t.$results.find(".select2-results__option[aria-selected]").each(function(){var t=e(this),n=e.data(this,"data"),r=""+n.id;null!=n.element&&n.element.selected||null==n.element&&e.inArray(r,i)>-1?t.attr("aria-selected","true"):t.attr("aria-selected","false")})})},n.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},n.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},n.prototype.option=function(t){var n=document.createElement("li");n.className="select2-results__option";var i={role:"treeitem","aria-selected":"false"};t.disabled&&(delete i["aria-selected"],i["aria-disabled"]="true"),null==t.id&&delete i["aria-selected"],null!=t._resultId&&(n.id=t._resultId),t.title&&(n.title=t.title),t.children&&(i.role="group",i["aria-label"]=t.text,delete i["aria-selected"]);for(var r in i){var s=i[r];n.setAttribute(r,s)}if(t.children){var o=e(n),a=document.createElement("strong");a.className="select2-results__group";e(a);this.template(t,a);for(var l=[],c=0;c<t.children.length;c++){var u=t.children[c],d=this.option(u);l.push(d)}var p=e("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});p.append(l),o.append(a),o.append(p)}else this.template(t,n);return e.data(n,"data",t),n},n.prototype.bind=function(t,n){var i=this,r=t.id+"-results";this.$results.attr("id",r),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=i.getHighlightedResults();if(0!==e.length){var t=e.data("data");"true"==e.attr("aria-selected")?i.trigger("close",{}):i.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=i.getHighlightedResults(),t=i.$results.find("[aria-selected]"),n=t.index(e);if(0!==n){var r=n-1;0===e.length&&(r=0);var s=t.eq(r);s.trigger("mouseenter");var o=i.$results.offset().top,a=s.offset().top,l=i.$results.scrollTop()+(a-o);0===r?i.$results.scrollTop(0):a-o<0&&i.$results.scrollTop(l)}}),t.on("results:next",function(){var e=i.getHighlightedResults(),t=i.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var s=i.$results.offset().top+i.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),a=i.$results.scrollTop()+o-s;0===n?i.$results.scrollTop(0):o>s&&i.$results.scrollTop(a)}}),t.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),t.on("results:message",function(e){i.displayMessage(e)}),e.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=i.$results.scrollTop(),n=i.$results.get(0).scrollHeight-t+e.deltaY,r=e.deltaY>0&&t-e.deltaY<=0,s=e.deltaY<0&&n<=i.$results.height();r?(i.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):s&&(i.$results.scrollTop(i.$results.get(0).scrollHeight-i.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(t){var n=e(this),r=n.data("data");"true"!==n.attr("aria-selected")?i.trigger("select",{originalEvent:t,data:r}):i.options.get("multiple")?i.trigger("unselect",{originalEvent:t,data:r}):i.trigger("close",{})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(t){var n=e(this).data("data");i.getHighlightedResults().removeClass("select2-results__option--highlighted"),i.trigger("results:focus",{data:n,element:e(this)})})},n.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},n.prototype.destroy=function(){this.$results.remove()},n.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]").index(e),n=this.$results.offset().top,i=e.offset().top,r=this.$results.scrollTop()+(i-n),s=i-n;r-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(s>this.$results.outerHeight()||s<0)&&this.$results.scrollTop(r)}},n.prototype.template=function(t,n){var i=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),s=i(t,n);null==s?n.style.display="none":"string"==typeof s?n.innerHTML=r(s):e(n).append(s)},n}),t.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),t.define("select2/selection/base",["jquery","../utils","../keys"],function(e,t,n){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var t=e('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),t.attr("title",this.$element.attr("title")),t.attr("tabindex",this._tabindex),this.$selection=t,t},i.prototype.bind=function(e,t){var i=this,r=(e.id,e.id+"-results");this.container=e,this.$selection.on("focus",function(e){i.trigger("focus",e)}),this.$selection.on("blur",function(e){i._handleBlur(e)}),this.$selection.on("keydown",function(e){i.trigger("keypress",e),e.which===n.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){i.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){i.update(e.data)}),e.on("open",function(){i.$selection.attr("aria-expanded","true"),i.$selection.attr("aria-owns",r),i._attachCloseHandler(e)}),e.on("close",function(){i.$selection.attr("aria-expanded","false"),i.$selection.removeAttr("aria-activedescendant"),i.$selection.removeAttr("aria-owns"),i.$selection.focus(),i._detachCloseHandler(e)}),e.on("enable",function(){i.$selection.attr("tabindex",i._tabindex)}),e.on("disable",function(){i.$selection.attr("tabindex","-1")})},i.prototype._handleBlur=function(t){var n=this;window.setTimeout(function(){document.activeElement==n.$selection[0]||e.contains(n.$selection[0],document.activeElement)||n.trigger("blur",t)},1)},i.prototype._attachCloseHandler=function(t){e(document.body).on("mousedown.select2."+t.id,function(t){var n=e(t.target).closest(".select2");e(".select2.select2-container--open").each(function(){var t=e(this);this!=n[0]&&t.data("element").select2("close")})})},i.prototype._detachCloseHandler=function(t){e(document.body).off("mousedown.select2."+t.id)},i.prototype.position=function(e,t){t.find(".selection").append(e)},i.prototype.destroy=function(){this._detachCloseHandler(this.container)},i.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},i}),t.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var i=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),e.on("focus",function(t){e.isOpen()||n.$selection.focus()}),e.on("selection:update",function(e){n.update(e.data)})},r.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("<span></span>")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i),n.prop("title",t.title||t.text)}else this.clear()},r}),t.define("select2/selection/multiple",["jquery","./base","../utils"],function(e,t,n){function i(e,t){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered"></ul>'),e},i.prototype.bind=function(t,n){var r=this;i.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(t){if(!r.options.get("disabled")){var n=e(this).parent().data("data");r.trigger("unselect",{originalEvent:t,data:n})}})},i.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},i.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],i=0;i<e.length;i++){var r=e[i],s=this.selectionContainer(),o=this.display(r,s);s.append(o),s.prop("title",r.title||r.text),s.data("data",r),t.push(s)}var a=this.$selection.find(".select2-selection__rendered");n.appendMany(a,t)}},i}),t.define("select2/selection/placeholder",["../utils"],function(e){function t(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return t.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},t.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();return n.html(this.display(t)),n.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),n},t.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(t.length>1||n)return e.call(this,t);this.clear();var i=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(i)},t}),t.define("select2/selection/allowClear",["jquery","../keys"],function(e,t){function n(){}return n.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){i._handleClear(e)}),t.on("keypress",function(e){i._handleKeyboardClear(e,t)})},n.prototype._handleClear=function(e,t){if(!this.options.get("disabled")){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();for(var i=n.data("data"),r=0;r<i.length;r++){var s={data:i[r]};if(this.trigger("unselect",s),s.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},n.prototype._handleKeyboardClear=function(e,n,i){i.isOpen()||n.which!=t.DELETE&&n.which!=t.BACKSPACE||this._handleClear(n)},n.prototype.update=function(t,n){if(t.call(this,n),!(this.$selection.find(".select2-selection__placeholder").length>0||0===n.length)){var i=e('<span class="select2-selection__clear">&times;</span>');i.data("data",n),this.$selection.find(".select2-selection__rendered").prepend(i)}},n}),t.define("select2/selection/search",["jquery","../utils","../keys"],function(e,t,n){function i(e,t,n){e.call(this,t,n)}return i.prototype.render=function(t){var n=e('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=n,this.$search=n.find("input");var i=t.call(this);return this._transferTabIndex(),i},i.prototype.bind=function(e,t,i){var r=this;e.call(this,t,i),t.on("open",function(){r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){r.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===n.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(t.length>0){var i=t.data("data");r.searchRemoveChoice(i),e.preventDefault()}}});var s=document.documentMode,o=s&&s<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?r.$selection.off("input.search input.searchcheck"):r.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(o&&"input"===e.type)r.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=n.SHIFT&&t!=n.CTRL&&t!=n.ALT&&t!=n.TAB&&r.handleSearch(e)}})},i.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},i.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},i.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&this.$search.focus()},i.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},i.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},i.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";e=""!==this.$search.attr("placeholder")?this.$selection.find(".select2-selection__rendered").innerWidth():.75*(this.$search.val().length+1)+"em",this.$search.css("width",e)},i}),t.define("select2/selection/eventRelay",["jquery"],function(e){function t(){}return t.prototype.bind=function(t,n,i){var r=this,s=["open","opening","close","closing","select","selecting","unselect","unselecting"],o=["opening","closing","selecting","unselecting"];t.call(this,n,i),n.on("*",function(t,n){if(-1!==e.inArray(t,s)){n=n||{};var i=e.Event("select2:"+t,{params:n});r.$element.trigger(i),-1!==e.inArray(t,o)&&(n.prevented=i.isDefaultPrevented())}})},t}),t.define("select2/translation",["jquery","require"],function(e,t){function n(e){this.dict=e||{}}return n.prototype.all=function(){return this.dict},n.prototype.get=function(e){return this.dict[e]},n.prototype.extend=function(t){this.dict=e.extend({},t.all(),this.dict)},n._cache={},n.loadPath=function(e){if(!(e in n._cache)){var i=t(e);n._cache[e]=i}return new n(n._cache[e])},n}),t.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),t.define("select2/data/base",["../utils"],function(e){function t(e,n){t.__super__.constructor.call(this)}return e.Extend(t,e.Observable),t.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},t.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},t.prototype.bind=function(e,t){},t.prototype.destroy=function(){},t.prototype.generateResultId=function(t,n){var i=t.id+"-result-";return i+=e.generateChars(4),null!=n.id?i+="-"+n.id.toString():i+="-"+e.generateChars(4),i},t}),t.define("select2/data/select",["./base","../utils","jquery"],function(e,t,n){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,e),i.prototype.current=function(e){var t=[],i=this;this.$element.find(":selected").each(function(){var e=n(this),r=i.item(e);t.push(r)}),e(t)},i.prototype.select=function(e){var t=this;if(e.selected=!0,n(e.element).is("option"))return e.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(i){var r=[];(e=[e]).push.apply(e,i);for(var s=0;s<e.length;s++){var o=e[s].id;-1===n.inArray(o,r)&&r.push(o)}t.$element.val(r),t.$element.trigger("change")});else{var i=e.id;this.$element.val(i),this.$element.trigger("change")}},i.prototype.unselect=function(e){var t=this;if(this.$element.prop("multiple")){if(e.selected=!1,n(e.element).is("option"))return e.element.selected=!1,void this.$element.trigger("change");this.current(function(i){for(var r=[],s=0;s<i.length;s++){var o=i[s].id;o!==e.id&&-1===n.inArray(o,r)&&r.push(o)}t.$element.val(r),t.$element.trigger("change")})}},i.prototype.bind=function(e,t){var n=this;this.container=e,e.on("select",function(e){n.select(e.data)}),e.on("unselect",function(e){n.unselect(e.data)})},i.prototype.destroy=function(){this.$element.find("*").each(function(){n.removeData(this,"data")})},i.prototype.query=function(e,t){var i=[],r=this;this.$element.children().each(function(){var t=n(this);if(t.is("option")||t.is("optgroup")){var s=r.item(t),o=r.matches(e,s);null!==o&&i.push(o)}}),t({results:i})},i.prototype.addOptions=function(e){t.appendMany(this.$element,e)},i.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:(t=document.createElement("option")).textContent!==undefined?t.textContent=e.text:t.innerText=e.text,e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);var i=n(t),r=this._normalizeItem(e);return r.element=t,n.data(t,"data",r),i},i.prototype.item=function(e){var t={};if(null!=(t=n.data(e[0],"data")))return t;if(e.is("option"))t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if(e.is("optgroup")){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var i=e.children("option"),r=[],s=0;s<i.length;s++){var o=n(i[s]),a=this.item(o);r.push(a)}t.children=r}return t=this._normalizeItem(t),t.element=e[0],n.data(e[0],"data",t),t},i.prototype._normalizeItem=function(e){n.isPlainObject(e)||(e={id:e,text:e});var t={selected:!1,disabled:!1};return null!=(e=n.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),n.extend({},t,e)},i.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},i}),t.define("select2/data/array",["./select","../utils","jquery"],function(e,t,n){function i(e,t){var n=t.get("data")||[];i.__super__.constructor.call(this,e,t),this.addOptions(this.convertToOptions(n))}return t.Extend(i,e),i.prototype.select=function(e){var t=this.$element.find("option").filter(function(t,n){return n.value==e.id.toString()});0===t.length&&(t=this.option(e),this.addOptions(t)),i.__super__.select.call(this,e)},i.prototype.convertToOptions=function(e){for(var i=this,r=this.$element.find("option"),s=r.map(function(){return i.item(n(this)).id}).get(),o=[],a=0;a<e.length;a++){var l=this._normalizeItem(e[a]);if(n.inArray(l.id,s)>=0){var c=r.filter(function(e){return function(){return n(this).val()==e.id}}(l)),u=this.item(c),d=n.extend(!0,{},l,u),p=this.option(d);c.replaceWith(p)}else{var h=this.option(l);if(l.children){var f=this.convertToOptions(l.children);t.appendMany(h,f)}o.push(h)}}return o},i}),t.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,n){function i(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),i.__super__.constructor.call(this,e,t)}return t.Extend(i,e),i.prototype._applyDefaults=function(e){var t={data:function(e){return n.extend({},e,{q:e.term})},transport:function(e,t,i){var r=n.ajax(e);return r.then(t),r.fail(i),r}};return n.extend({},t,e,!0)},i.prototype.processResults=function(e){return e},i.prototype.query=function(e,t){function i(){var i=s.transport(s,function(i){var s=r.processResults(i,e);r.options.get("debug")&&window.console&&console.error&&(s&&s.results&&n.isArray(s.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),t(s)},function(){i.status&&"0"===i.status||r.trigger("results:message",{message:"errorLoading"})});r._request=i}var r=this;null!=this._request&&(n.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var s=n.extend({type:"GET"},this.ajaxOptions);"function"==typeof s.url&&(s.url=s.url.call(this.$element,e)),"function"==typeof s.data&&(s.data=s.data.call(this.$element,e)),this.ajaxOptions.delay&&null!=e.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(i,this.ajaxOptions.delay)):i()},i}),t.define("select2/data/tags",["jquery"],function(e){function t(t,n,i){var r=i.get("tags"),s=i.get("createTag");s!==undefined&&(this.createTag=s);var o=i.get("insertTag");if(o!==undefined&&(this.insertTag=o),t.call(this,n,i),e.isArray(r))for(var a=0;a<r.length;a++){var l=r[a],c=this._normalizeItem(l),u=this.option(c);this.$element.append(u)}}return t.prototype.query=function(e,t,n){function i(e,s){for(var o=e.results,a=0;a<o.length;a++){var l=o[a],c=null!=l.children&&!i({results:l.children},!0);if(l.text===t.term||c)return!s&&(e.data=o,void n(e))}if(s)return!0;var u=r.createTag(t);if(null!=u){var d=r.option(u);d.attr("data-select2-tag",!0),r.addOptions([d]),r.insertTag(o,u)}e.results=o,n(e)}var r=this;this._removeOldTags(),null!=t.term&&null==t.page?e.call(this,t,i):e.call(this,t,n)},t.prototype.createTag=function(t,n){var i=e.trim(n.term);return""===i?null:{id:i,text:i}},t.prototype.insertTag=function(e,t,n){t.unshift(n)},t.prototype._removeOldTags=function(t){this._lastTag;this.$element.find("option[data-select2-tag]").each(function(){this.selected||e(this).remove()})},t}),t.define("select2/data/tokenizer",["jquery"],function(e){function t(e,t,n){var i=n.get("tokenizer");i!==undefined&&(this.tokenizer=i),e.call(this,t,n)}return t.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},t.prototype.query=function(t,n,i){function r(e){s.trigger("select",{data:e})}var s=this;n.term=n.term||"";var o=this.tokenizer(n,this.options,function(t){var n=s._normalizeItem(t);if(!s.$element.find("option").filter(function(){return e(this).val()===n.id}).length){var i=s.option(n);i.attr("data-select2-tag",!0),s._removeOldTags(),s.addOptions([i])}r(n)});o.term!==n.term&&(this.$search.length&&(this.$search.val(o.term),this.$search.focus()),n.term=o.term),t.call(this,n,i)},t.prototype.tokenizer=function(t,n,i,r){for(var s=i.get("tokenSeparators")||[],o=n.term,a=0,l=this.createTag||function(e){return{id:e.term,text:e.term}};a<o.length;){var c=o[a];if(-1!==e.inArray(c,s)){var u=o.substr(0,a),d=l(e.extend({},n,{term:u}));null!=d?(r(d),o=o.substr(a+1)||"",a=0):a++}else a++}return{term:o}},t}),t.define("select2/data/minimumInputLength",[],function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),t.define("select2/data/maximumInputLength",[],function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",this.maximumInputLength>0&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),t.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){var i=this;this.current(function(r){var s=null!=r?r.length:0;i.maximumSelectionLength>0&&s>=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):e.call(i,t,n)})},e}),t.define("select2/dropdown",["jquery","./utils"],function(e,t){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('<span class="select2-dropdown"><span class="select2-results"></span></span>');return t.attr("dir",this.options.get("dir")),this.$dropdown=t,t},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),t.define("select2/dropdown/search",["jquery","../utils"],function(e,t){function n(){}return n.prototype.render=function(t){var n=t.call(this),i=e('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=i,this.$search=i.find("input"),n.prepend(i),n},n.prototype.bind=function(t,n,i){var r=this;t.call(this,n,i),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(t){e(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),n.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),n.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val("")}),n.on("focus",function(){n.isOpen()&&r.$search.focus()}),n.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))})},n.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},n.prototype.showSearch=function(e,t){return!0},n}),t.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;i>=0;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),t.define("select2/dropdown/infiniteScroll",["jquery"],function(e){function t(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return t.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},t.prototype.bind=function(t,n,i){var r=this;t.call(this,n,i),n.on("query",function(e){r.lastParams=e,r.loading=!0}),n.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",function(){var t=e.contains(document.documentElement,r.$loadingMore[0]);!r.loading&&t&&r.$results.offset().top+r.$results.outerHeight(!1)+50>=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1)&&r.loadMore()})},t.prototype.loadMore=function(){this.loading=!0;var t=e.extend({},{page:1},this.lastParams);t.page++,this.trigger("query:append",t)},t.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},t.prototype.createLoadingMore=function(){var t=e('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),n=this.options.get("translations").get("loadingMore");return t.html(n(this.lastParams)),t},t}),t.define("select2/dropdown/attachBody",["jquery","../utils"],function(e,t){function n(t,n,i){this.$dropdownParent=i.get("dropdownParent")||e(document.body),t.call(this,n,i)}return n.prototype.bind=function(e,t,n){var i=this,r=!1;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){i._positionDropdown(),i._resizeDropdown()}),t.on("results:append",function(){i._positionDropdown(),i._resizeDropdown()}))}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},n.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},n.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},n.prototype.render=function(t){var n=e("<span></span>"),i=t.call(this);return n.append(i),this.$dropdownContainer=n,n},n.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},n.prototype._attachPositioningHandler=function(n,i){var r=this,s="scroll.select2."+i.id,o="resize.select2."+i.id,a="orientationchange.select2."+i.id,l=this.$container.parents().filter(t.hasScroll);l.each(function(){e(this).data("select2-scroll-position",{x:e(this).scrollLeft(),y:e(this).scrollTop()})}),l.on(s,function(t){var n=e(this).data("select2-scroll-position");e(this).scrollTop(n.y)}),e(window).on(s+" "+o+" "+a,function(e){r._positionDropdown(),r._resizeDropdown()})},n.prototype._detachPositioningHandler=function(n,i){var r="scroll.select2."+i.id,s="resize.select2."+i.id,o="orientationchange.select2."+i.id;this.$container.parents().filter(t.hasScroll).off(r),e(window).off(r+" "+s+" "+o)},n.prototype._positionDropdown=function(){var t=e(window),n=this.$dropdown.hasClass("select2-dropdown--above"),i=this.$dropdown.hasClass("select2-dropdown--below"),r=null,s=this.$container.offset();s.bottom=s.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=s.top,o.bottom=s.top+o.height;var a={height:this.$dropdown.outerHeight(!1)},l={top:t.scrollTop(),bottom:t.scrollTop()+t.height()},c=l.top<s.top-a.height,u=l.bottom>s.bottom+a.height,d={left:s.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,n||i||(r="below"),u||!c||n?!c&&u&&n&&(r="below"):r="above",("above"==r||n&&"below"!==r)&&(d.top=o.top-h.top-a.height),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},n.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},n.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},n}),t.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(t){for(var n=0,i=0;i<t.length;i++){var r=t[i];r.children?n+=e(r.children):n++}return n}function t(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=Infinity),e.call(this,t,n,i)}return t.prototype.showSearch=function(t,n){return!(e(n.data.results)<this.minimumResultsForSearch)&&t.call(this,n)},t}),t.define("select2/dropdown/selectOnClose",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("close",function(e){i._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}var i=this.getHighlightedResults();if(!(i.length<1)){var r=i.data("data");null!=r.element&&r.element.selected||null==r.element&&r.selected||this.trigger("select",{data:r})}},e}),t.define("select2/dropdown/closeOnSelect",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(e){i._selectTriggered(e)}),t.on("unselect",function(e){i._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&n.ctrlKey||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e}),t.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return 1!=t&&(n+="s"),n},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),t.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(e,t,n,i,r,s,o,a,l,c,u,d,p,h,f,g,m,v,y,_,$,w,b,A,x,E,C,O,S){function T(){this.reset()}return T.prototype.apply=function(d){if(null==(d=e.extend(!0,{},this.defaults,d)).dataAdapter){if(null!=d.ajax?d.dataAdapter=f:null!=d.data?d.dataAdapter=h:d.dataAdapter=p,d.minimumInputLength>0&&(d.dataAdapter=c.Decorate(d.dataAdapter,v)),d.maximumInputLength>0&&(d.dataAdapter=c.Decorate(d.dataAdapter,y)),d.maximumSelectionLength>0&&(d.dataAdapter=c.Decorate(d.dataAdapter,_)),d.tags&&(d.dataAdapter=c.Decorate(d.dataAdapter,g)),null==d.tokenSeparators&&null==d.tokenizer||(d.dataAdapter=c.Decorate(d.dataAdapter,m)),null!=d.query){var S=t(d.amdBase+"compat/query");d.dataAdapter=c.Decorate(d.dataAdapter,S)}if(null!=d.initSelection){var T=t(d.amdBase+"compat/initSelection");d.dataAdapter=c.Decorate(d.dataAdapter,T)}}if(null==d.resultsAdapter&&(d.resultsAdapter=n,null!=d.ajax&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,A)),null!=d.placeholder&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,b)),d.selectOnClose&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,C))),null==d.dropdownAdapter){if(d.multiple)d.dropdownAdapter=$;else{var D=c.Decorate($,w);d.dropdownAdapter=D}if(0!==d.minimumResultsForSearch&&(d.dropdownAdapter=c.Decorate(d.dropdownAdapter,E)),d.closeOnSelect&&(d.dropdownAdapter=c.Decorate(d.dropdownAdapter,O)),null!=d.dropdownCssClass||null!=d.dropdownCss||null!=d.adaptDropdownCssClass){var q=t(d.amdBase+"compat/dropdownCss");d.dropdownAdapter=c.Decorate(d.dropdownAdapter,q)}d.dropdownAdapter=c.Decorate(d.dropdownAdapter,x)}if(null==d.selectionAdapter){if(d.multiple?d.selectionAdapter=r:d.selectionAdapter=i,null!=d.placeholder&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,s)),d.allowClear&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,o)),d.multiple&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,a)),null!=d.containerCssClass||null!=d.containerCss||null!=d.adaptContainerCssClass){var L=t(d.amdBase+"compat/containerCss");d.selectionAdapter=c.Decorate(d.selectionAdapter,L)}d.selectionAdapter=c.Decorate(d.selectionAdapter,l)}if("string"==typeof d.language)if(d.language.indexOf("-")>0){var j=d.language.split("-")[0];d.language=[d.language,j]}else d.language=[d.language];if(e.isArray(d.language)){var P=new u;d.language.push("en");for(var k=d.language,I=0;I<k.length;I++){var R=k[I],M={};try{M=u.loadPath(R)}catch(z){try{R=this.defaults.amdLanguageBase+R,M=u.loadPath(R)}catch(N){d.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+R+'" could not be automatically loaded. A fallback will be used instead.');continue}}P.extend(M)}d.translations=P}else{var U=u.loadPath(this.defaults.amdLanguageBase+"en"),H=new u(d.language);H.extend(U),d.translations=H}return d},T.prototype.reset=function(){function t(e){return e.replace(/[^\u0000-\u007E]/g,function(e){return d[e]||e})}function n(i,r){if(""===e.trim(i.term))return r;if(r.children&&r.children.length>0){for(var s=e.extend(!0,{},r),o=r.children.length-1;o>=0;o--)null==n(i,r.children[o])&&s.children.splice(o,1);return s.children.length>0?s:n(i,s)}var a=t(r.text).toUpperCase(),l=t(i.term).toUpperCase();return a.indexOf(l)>-1?r:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:c.escapeMarkup,language:S,matcher:n,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},T.prototype.set=function(t,n){var i={};i[e.camelCase(t)]=n;var r=c._convertData(i);e.extend(this.defaults,r)},new T}),t.define("select2/options",["require","jquery","./defaults","./utils"],function(e,t,n,i){function r(t,r){if(this.options=t,null!=r&&this.fromElement(r),this.options=n.apply(this.options),r&&r.is("input")){var s=e(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=i.Decorate(this.options.dataAdapter,s)}}return r.prototype.fromElement=function(e){var n=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.language&&(e.prop("lang")?this.options.language=e.prop("lang").toLowerCase():e.closest("[lang]").prop("lang")&&(this.options.language=e.closest("[lang]").prop("lang"))),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),e.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),e.data("data",e.data("select2Tags")),e.data("tags",!0)),e.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",e.data("ajaxUrl")),e.data("ajax--url",e.data("ajaxUrl")));var r={};r=t.fn.jquery&&"1."==t.fn.jquery.substr(0,2)&&e[0].dataset?t.extend(!0,{},e[0].dataset,e.data()):e.data();var s=t.extend(!0,{},r);s=i._convertData(s);for(var o in s)t.inArray(o,n)>-1||(t.isPlainObject(this.options[o])?t.extend(this.options[o],s[o]):this.options[o]=s[o]);return this},r.prototype.get=function(e){return this.options[e]},r.prototype.set=function(e,t){this.options[e]=t},r}),t.define("select2/core",["jquery","./options","./utils","./keys"],function(e,t,n,i){var r=function(e,n){null!=e.data("select2")&&e.data("select2").destroy(),this.$element=e,this.id=this._generateId(e),n=n||{},this.options=new t(n,e),r.__super__.constructor.call(this);var i=e.attr("tabindex")||0;e.data("old-tabindex",i),e.attr("tabindex","-1");var s=this.options.get("dataAdapter");this.dataAdapter=new s(e,this.options);var o=this.render();this._placeContainer(o);var a=this.options.get("selectionAdapter");this.selection=new a(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,o);var l=this.options.get("dropdownAdapter");this.dropdown=new l(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,o);var c=this.options.get("resultsAdapter");this.results=new c(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var u=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){u.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),e.data("select2",this)};return n.Extend(r,n.Observable),r.prototype._generateId=function(e){var t="";return t=null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+n.generateChars(2):n.generateChars(4),t=t.replace(/(:|\.|\[|\]|,)/g,""),t="select2-"+t},r.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},r.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var i=this._resolveWidth(e,"style");return null!=i?i:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return r<=0?"auto":r+"px"}if("style"==t){var s=e.attr("style");if("string"!=typeof s)return null;for(var o=s.split(";"),a=0,l=o.length;a<l;a+=1){var c=o[a].replace(/\s/g,"").match(n);if(null!==c&&c.length>=1)return c[1]}return null}return t},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=n.bind(this._syncAttributes,this),this._syncS=n.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var i=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=i?(this._observer=new i(function(n){e.each(n,t._syncA),e.each(n,t._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},r.prototype._registerDataEvents=function(){var e=this;this.dataAdapter.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerSelectionEvents=function(){var t=this,n=["toggle","focus"];this.selection.on("toggle",function(){t.toggleDropdown()}),this.selection.on("focus",function(e){t.focus(e)}),this.selection.on("*",function(i,r){-1===e.inArray(i,n)&&t.trigger(i,r)})},r.prototype._registerDropdownEvents=function(){var e=this;this.dropdown.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerResultsEvents=function(){var e=this;this.results.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerEvents=function(){var e=this;this.on("open",function(){e.$container.addClass("select2-container--open")}),this.on("close",function(){e.$container.removeClass("select2-container--open")}),this.on("enable",function(){e.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){e.$container.addClass("select2-container--disabled")}),this.on("blur",function(){e.$container.removeClass("select2-container--focus")}),this.on("query",function(t){e.isOpen()||e.trigger("open",{}),this.dataAdapter.query(t,function(n){e.trigger("results:all",{data:n,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(n){e.trigger("results:append",{data:n,query:t})})}),this.on("keypress",function(t){var n=t.which;e.isOpen()?n===i.ESC||n===i.TAB||n===i.UP&&t.altKey?(e.close(),t.preventDefault()):n===i.ENTER?(e.trigger("results:select",{}),t.preventDefault()):n===i.SPACE&&t.ctrlKey?(e.trigger("results:toggle",{}),t.preventDefault()):n===i.UP?(e.trigger("results:previous",{}),t.preventDefault()):n===i.DOWN&&(e.trigger("results:next",{}),t.preventDefault()):(n===i.ENTER||n===i.SPACE||n===i.DOWN&&t.altKey)&&(e.open(),t.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},r.prototype._syncSubtree=function(e,t){var n=!1,i=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&t.addedNodes.length>0)for(var r=0;r<t.addedNodes.length;r++)t.addedNodes[r].selected&&(n=!0);else t.removedNodes&&t.removedNodes.length>0&&(n=!0);else n=!0;n&&this.dataAdapter.current(function(e){i.trigger("selection:update",{data:e})})}},r.prototype.trigger=function(e,t){var n=r.__super__.trigger,i={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(t===undefined&&(t={}),e in i){var s=i[e],o={prevented:!1,name:e,args:t};if(n.call(this,s,o),o.prevented)return void(t.prevented=!0)}n.call(this,e,t)},r.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger("query",{})},r.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},r.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},r.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},r.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},r.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},r.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var e=[];return this.dataAdapter.current(function(t){e=t}),e},r.prototype.val=function(t){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==t||0===t.length)return this.$element.val();var n=t[0];e.isArray(n)&&(n=e.map(n,function(e){return e.toString()})),this.$element.val(n).trigger("change")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var t=e('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return t.attr("dir",this.options.get("dir")),this.$container=t,this.$container.addClass("select2-container--"+this.options.get("theme")),t.data("element",this.$element),t},r}),t.define("jquery-mousewheel",["jquery"],function(e){return e}),t.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(e,t,n,i){if(null==e.fn.select2){var r=["open","close","destroy"];e.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var i=e.extend(!0,{},t);new n(e(this),i)}),this;if("string"==typeof t){var i,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var n=e(this).data("select2");null==n&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),i=n[t].apply(n,s)}),e.inArray(t,r)>-1?this:i}throw new Error("Invalid arguments for Select2: "+t)}}return null==e.fn.select2.defaults&&(e.fn.select2.defaults=i),n}),{define:t.define,require:t.require}}(),n=t.require("jquery.select2");return e.fn.select2.amd=t,n});
plugin-fw/assets/js/yith-enhanced-select.js CHANGED
@@ -1,198 +1,227 @@
1
- /* global yith_framework_enhanced_select_params */
2
 
3
  jQuery( function ( $ ) {
4
- "use strict";
5
-
6
- $( document.body )
7
- .on( 'yith-framework-enhanced-select-init', function () {
8
- // Post Search
9
- $( '.yith-post-search' ).filter( ':not(.enhanced)' ).each( function () {
10
- var default_data = {
11
- action : 'yith_plugin_fw_json_search_posts',
12
- security : yith_framework_enhanced_select_params.search_posts_nonce,
13
- post_type: 'post'
14
- },
15
- current_data = $.extend( default_data, $( this ).data() ),
16
- select2_args = {
17
- allowClear : $( this ).data( 'allow_clear' ) ? true : false,
18
- placeholder : $( this ).data( 'placeholder' ),
19
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
20
- escapeMarkup : function ( m ) {
21
- return m;
22
- },
23
- ajax : {
24
- url : ajaxurl,
25
- dataType : 'json',
26
- quietMillis : 250,
27
- data : function ( params ) {
28
- var default_data_to_return = {
29
- term: params.term
30
- };
31
-
32
- return $.extend( default_data_to_return, current_data );
33
- },
34
- processResults: function ( data ) {
35
- var terms = [];
36
- if ( data ) {
37
- $.each( data, function ( id, text ) {
38
- terms.push( { id: id, text: text } );
39
- } );
40
- }
41
- return {
42
- results: terms
43
- };
44
- },
45
- cache : true
46
- }
47
- };
48
-
49
- $( this ).select2( select2_args ).addClass( 'enhanced' );
50
-
51
- if ( $( this ).data( 'sortable' ) ) {
52
- var $select = $( this );
53
- var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
54
-
55
- $list.sortable( {
56
- placeholder : 'ui-state-highlight select2-selection__choice',
57
- forcePlaceholderSize: true,
58
- items : 'li:not(.select2-search__field)',
59
- tolerance : 'pointer',
60
- stop : function () {
61
- $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
62
- var id = $( this ).data( 'data' ).id;
63
- var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
64
- $select.prepend( option );
65
- } );
66
- }
67
- } );
68
- }
69
- } );
70
-
71
- // Customer Search
72
- $( '.yith-customer-search' ).filter( ':not(.enhanced)' ).each( function () {
73
- var default_data = {
74
- action : 'woocommerce_json_search_customers',
75
- security : yith_framework_enhanced_select_params.search_customers_nonce,
76
- },
77
- current_data = $.extend( default_data, $( this ).data() ),
78
- select2_args = {
79
- allowClear : $( this ).data( 'allow_clear' ) ? true : false,
80
- placeholder : $( this ).data( 'placeholder' ),
81
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
82
- escapeMarkup : function ( m ) {
83
- return m;
84
- },
85
- ajax : {
86
- url : ajaxurl,
87
- dataType : 'json',
88
- quietMillis : 250,
89
- data : function ( params ) {
90
- var default_data_to_return = {
91
- term: params.term
92
- };
93
-
94
- return $.extend( default_data_to_return, current_data );
95
- },
96
- processResults: function ( data ) {
97
- var terms = [];
98
- if ( data ) {
99
- $.each( data, function ( id, text ) {
100
- terms.push( { id: id, text: text } );
101
- } );
102
- }
103
- return {
104
- results: terms
105
- };
106
- },
107
- cache : true
108
- }
109
- };
110
-
111
- $( this ).select2( select2_args ).addClass( 'enhanced' );
112
-
113
- if ( $( this ).data( 'sortable' ) ) {
114
- var $select = $( this );
115
- var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
116
-
117
- $list.sortable( {
118
- placeholder : 'ui-state-highlight select2-selection__choice',
119
- forcePlaceholderSize: true,
120
- items : 'li:not(.select2-search__field)',
121
- tolerance : 'pointer',
122
- stop : function () {
123
- $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
124
- var id = $( this ).data( 'data' ).id;
125
- var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
126
- $select.prepend( option );
127
- } );
128
- }
129
- } );
130
- }
131
- } );
132
-
133
- // TERM SEARCH
134
- $( '.yith-term-search' ).filter( ':not(.enhanced)' ).each( function () {
135
- var default_data = {
136
- action : 'yith_plugin_fw_json_search_terms',
137
- security: yith_framework_enhanced_select_params.search_terms_nonce,
138
- taxonomy: 'category'
139
- },
140
- current_data = $.extend( default_data, $( this ).data() ),
141
- select2_args = {
142
- allowClear : $( this ).data( 'allow_clear' ) ? true : false,
143
- placeholder : $( this ).data( 'placeholder' ),
144
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
145
- escapeMarkup : function ( m ) {
146
- return m;
147
- },
148
- ajax : {
149
- url : ajaxurl,
150
- dataType : 'json',
151
- quietMillis : 250,
152
- data : function ( params ) {
153
- var default_data_to_return = {
154
- term: params.term
155
- };
156
-
157
- return $.extend( default_data_to_return, current_data );
158
- },
159
- processResults: function ( data ) {
160
- var terms = [];
161
- if ( data ) {
162
- $.each( data, function ( id, text ) {
163
- terms.push( { id: id, text: text } );
164
- } );
165
- }
166
- return {
167
- results: terms
168
- };
169
- },
170
- cache : true
171
- }
172
- };
173
-
174
- $( this ).select2( select2_args ).addClass( 'enhanced' );
175
-
176
- if ( $( this ).data( 'sortable' ) ) {
177
- var $select = $( this );
178
- var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
179
-
180
- $list.sortable( {
181
- placeholder : 'ui-state-highlight select2-selection__choice',
182
- forcePlaceholderSize: true,
183
- items : 'li:not(.select2-search__field)',
184
- tolerance : 'pointer',
185
- stop : function () {
186
- $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
187
- var id = $( this ).data( 'data' ).id;
188
- var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
189
- $select.prepend( option );
190
- } );
191
- }
192
- } );
193
- }
194
- } );
195
-
196
- } ).trigger( 'yith-framework-enhanced-select-init' );
197
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  } );
1
+ /* global yith_framework_enhanced_select_params, ajaxurl */
2
 
3
  jQuery( function ( $ ) {
4
+ "use strict";
5
+
6
+ var getEnhancedSelectLanguage = function () {
7
+ return {
8
+ inputTooShort: function ( args ) {
9
+ var remainingChars = args.minimum - args.input.length;
10
+
11
+ if ( 1 === remainingChars ) {
12
+ return yith_framework_enhanced_select_params.i18n.input_too_short_1;
13
+ }
14
+
15
+ return yith_framework_enhanced_select_params.i18n.input_too_short_n.replace( '%s', remainingChars );
16
+ },
17
+ errorLoading : function () {
18
+ return yith_framework_enhanced_select_params.i18n.searching;
19
+ },
20
+ loadingMore : function () {
21
+ return yith_framework_enhanced_select_params.i18n.load_more;
22
+ },
23
+ noResults : function () {
24
+ return yith_framework_enhanced_select_params.i18n.no_matches;
25
+ },
26
+ searching : function () {
27
+ return yith_framework_enhanced_select_params.i18n.searching;
28
+ }
29
+ };
30
+ };
31
+
32
+ $( document.body )
33
+ .on( 'yith-framework-enhanced-select-init', function () {
34
+ // Post Search
35
+ $( '.yith-post-search' ).filter( ':not(.enhanced)' ).each( function () {
36
+ var default_data = {
37
+ action : 'yith_plugin_fw_json_search_posts',
38
+ security : yith_framework_enhanced_select_params.search_posts_nonce,
39
+ post_type: 'post'
40
+ },
41
+ current_data = $.extend( default_data, $( this ).data() ),
42
+ select2_args = {
43
+ allowClear : $( this ).data( 'allow_clear' ) ? true : false,
44
+ placeholder : $( this ).data( 'placeholder' ),
45
+ minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
46
+ language : getEnhancedSelectLanguage(),
47
+ escapeMarkup : function ( m ) {
48
+ return m;
49
+ },
50
+ ajax : {
51
+ url : ajaxurl,
52
+ dataType : 'json',
53
+ quietMillis : 250,
54
+ data : function ( params ) {
55
+ var default_data_to_return = {
56
+ term: params.term
57
+ };
58
+
59
+ return $.extend( default_data_to_return, current_data );
60
+ },
61
+ processResults: function ( data ) {
62
+ var terms = [];
63
+ if ( data ) {
64
+ $.each( data, function ( id, text ) {
65
+ terms.push( { id: id, text: text } );
66
+ } );
67
+ }
68
+ return {
69
+ results: terms
70
+ };
71
+ },
72
+ cache : true
73
+ }
74
+ };
75
+
76
+ $( this ).select2( select2_args ).addClass( 'enhanced' );
77
+
78
+ if ( $( this ).data( 'sortable' ) ) {
79
+ var $select = $( this );
80
+ var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
81
+
82
+ $list.sortable( {
83
+ placeholder : 'ui-state-highlight select2-selection__choice',
84
+ forcePlaceholderSize: true,
85
+ items : 'li:not(.select2-search__field)',
86
+ tolerance : 'pointer',
87
+ stop : function () {
88
+ $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
89
+ var id = $( this ).data( 'data' ).id;
90
+ var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
91
+ $select.prepend( option );
92
+ } );
93
+ }
94
+ } );
95
+ }
96
+ } );
97
+
98
+ // Customer Search
99
+ $( '.yith-customer-search' ).filter( ':not(.enhanced)' ).each( function () {
100
+ var default_data = {
101
+ action : 'woocommerce_json_search_customers',
102
+ security: yith_framework_enhanced_select_params.search_customers_nonce
103
+ },
104
+ current_data = $.extend( default_data, $( this ).data() ),
105
+ select2_args = {
106
+ allowClear : $( this ).data( 'allow_clear' ) ? true : false,
107
+ placeholder : $( this ).data( 'placeholder' ),
108
+ minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
109
+ language : getEnhancedSelectLanguage(),
110
+ escapeMarkup : function ( m ) {
111
+ return m;
112
+ },
113
+ ajax : {
114
+ url : ajaxurl,
115
+ dataType : 'json',
116
+ quietMillis : 250,
117
+ data : function ( params ) {
118
+ var default_data_to_return = {
119
+ term: params.term
120
+ };
121
+
122
+ return $.extend( default_data_to_return, current_data );
123
+ },
124
+ processResults: function ( data ) {
125
+ var terms = [];
126
+ if ( data ) {
127
+ $.each( data, function ( id, text ) {
128
+ terms.push( { id: id, text: text } );
129
+ } );
130
+ }
131
+ return {
132
+ results: terms
133
+ };
134
+ },
135
+ cache : true
136
+ }
137
+ };
138
+
139
+ $( this ).select2( select2_args ).addClass( 'enhanced' );
140
+
141
+ if ( $( this ).data( 'sortable' ) ) {
142
+ var $select = $( this );
143
+ var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
144
+
145
+ $list.sortable( {
146
+ placeholder : 'ui-state-highlight select2-selection__choice',
147
+ forcePlaceholderSize: true,
148
+ items : 'li:not(.select2-search__field)',
149
+ tolerance : 'pointer',
150
+ stop : function () {
151
+ $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
152
+ var id = $( this ).data( 'data' ).id;
153
+ var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
154
+ $select.prepend( option );
155
+ } );
156
+ }
157
+ } );
158
+ }
159
+ } );
160
+
161
+ // TERM SEARCH
162
+ $( '.yith-term-search' ).filter( ':not(.enhanced)' ).each( function () {
163
+ var default_data = {
164
+ action : 'yith_plugin_fw_json_search_terms',
165
+ security: yith_framework_enhanced_select_params.search_terms_nonce,
166
+ taxonomy: 'category'
167
+ },
168
+ current_data = $.extend( default_data, $( this ).data() ),
169
+ select2_args = {
170
+ allowClear : $( this ).data( 'allow_clear' ) ? true : false,
171
+ placeholder : $( this ).data( 'placeholder' ),
172
+ minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
173
+ language : getEnhancedSelectLanguage(),
174
+ escapeMarkup : function ( m ) {
175
+ return m;
176
+ },
177
+ ajax : {
178
+ url : ajaxurl,
179
+ dataType : 'json',
180
+ quietMillis : 250,
181
+ data : function ( params ) {
182
+ var default_data_to_return = {
183
+ term: params.term
184
+ };
185
+
186
+ return $.extend( default_data_to_return, current_data );
187
+ },
188
+ processResults: function ( data ) {
189
+ var terms = [];
190
+ if ( data ) {
191
+ $.each( data, function ( id, text ) {
192
+ terms.push( { id: id, text: text } );
193
+ } );
194
+ }
195
+ return {
196
+ results: terms
197
+ };
198
+ },
199
+ cache : true
200
+ }
201
+ };
202
+
203
+ $( this ).select2( select2_args ).addClass( 'enhanced' );
204
+
205
+ if ( $( this ).data( 'sortable' ) ) {
206
+ var $select = $( this );
207
+ var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
208
+
209
+ $list.sortable( {
210
+ placeholder : 'ui-state-highlight select2-selection__choice',
211
+ forcePlaceholderSize: true,
212
+ items : 'li:not(.select2-search__field)',
213
+ tolerance : 'pointer',
214
+ stop : function () {
215
+ $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function () {
216
+ var id = $( this ).data( 'data' ).id;
217
+ var option = $select.find( 'option[value="' + id + '"]' )[ 0 ];
218
+ $select.prepend( option );
219
+ } );
220
+ }
221
+ } );
222
+ }
223
+ } );
224
+
225
+ } ).trigger( 'yith-framework-enhanced-select-init' );
226
+
227
  } );
plugin-fw/bin/clean-language-files 2.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* jshint ignore: start */
2
+
3
+ /**
4
+ *
5
+ *
6
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
7
+ */
8
+
9
+ const fs = require( 'fs' );
10
+ const glob = require( 'glob' );
11
+ const chalk = require( 'chalk' );
12
+
13
+ const DELETED = chalk.reset.inverse.bold.green( ' DELETED ' );
14
+ const ERROR = chalk.reset.inverse.bold.red( ' ERROR ' );
15
+
16
+ console.log( chalk.green( '\nCleaning language files...' ) );
17
+ glob( "languages/*.po~", function ( er, files ) {
18
+
19
+ if ( files.length ) {
20
+ console.log( `Processing ${files.length} files:` );
21
+
22
+ files.forEach( ( file ) => {
23
+ fs.unlink( file, ( err ) => {
24
+ if ( err ) {
25
+ console.log( chalk.bold( ` - ${file} ` ) + ERROR );
26
+ console.error( err );
27
+ return;
28
+ }
29
+ console.log( chalk.bold( ` - ${file} ` ) + DELETED );
30
+ } );
31
+ } );
32
+ } else {
33
+ console.log( `No file to clean.\n` );
34
+ }
35
+
36
+ } );
plugin-fw/bin/clean-language-files.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* jshint ignore: start */
2
+
3
+ /**
4
+ *
5
+ *
6
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
7
+ */
8
+
9
+ const fs = require( 'fs' );
10
+ const glob = require( 'glob' );
11
+ const chalk = require( 'chalk' );
12
+
13
+ const DELETED = chalk.reset.inverse.bold.green( ' DELETED ' );
14
+ const ERROR = chalk.reset.inverse.bold.red( ' ERROR ' );
15
+
16
+ console.log( chalk.green( '\nCleaning language files...' ) );
17
+ glob( "languages/*.po~", function ( er, files ) {
18
+
19
+ if ( files.length ) {
20
+ console.log( `Processing ${files.length} files:` );
21
+
22
+ files.forEach( ( file ) => {
23
+ fs.unlink( file, ( err ) => {
24
+ if ( err ) {
25
+ console.log( chalk.bold( ` - ${file} ` ) + ERROR );
26
+ console.error( err );
27
+ return;
28
+ }
29
+ console.log( chalk.bold( ` - ${file} ` ) + DELETED );
30
+ } );
31
+ } );
32
+ } else {
33
+ console.log( `No file to clean.\n` );
34
+ }
35
+
36
+ } );
plugin-fw/bin/download-translations-config.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "projectPath": "https://translate.yithemes.com/gp/projects/yith-framework/",
3
+ "textDomain": "yith-plugin-fw",
4
+ "destFolder": "languages/",
5
+ "languages": [
6
+ {
7
+ "id": "es",
8
+ "name": "Spanish",
9
+ "slug": "es_ES"
10
+ },
11
+ {
12
+ "id": "it",
13
+ "name": "Italian",
14
+ "slug": "it_IT"
15
+ },
16
+ {
17
+ "id": "nl",
18
+ "name": "Dutch",
19
+ "slug": "nl_NL"
20
+ },
21
+ {
22
+ "id": "el",
23
+ "name": "Greek",
24
+ "slug": "el"
25
+ },
26
+ {
27
+ "id": "ru",
28
+ "name": "Russian",
29
+ "slug": "ru_RU"
30
+ },
31
+ {
32
+ "id": "zh",
33
+ "name": "Chinese (China)",
34
+ "slug": "zh_CN"
35
+ }
36
+ ]
37
+ }
plugin-fw/bin/download-translations.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* jshint ignore: start */
2
+
3
+ /**
4
+ * This script download translations from https://translate.yithemes.com/
5
+ *
6
+ * @version 1.1.0
7
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
8
+ */
9
+
10
+ const fs = require( 'fs' );
11
+ const path = require( 'path' );
12
+ const axios = require( 'axios' );
13
+ const chalk = require( 'chalk' );
14
+ const options = require( './download-translations-config' );
15
+
16
+ const SPACE = '\t';
17
+ const DONE = chalk.reset.inverse.bold.green( ' DONE ' );
18
+ const ERROR = chalk.reset.inverse.bold.red( ' ERROR ' );
19
+
20
+ async function download( url, dest ) {
21
+ const destPath = path.resolve( dest );
22
+ const writer = fs.createWriteStream( destPath );
23
+
24
+ const response = await axios( {
25
+ url,
26
+ method : 'GET',
27
+ responseType: 'stream'
28
+ } );
29
+
30
+ response.data.pipe( writer );
31
+
32
+ return new Promise( ( resolve, reject ) => {
33
+ writer.on( 'finish', resolve );
34
+ writer.on( 'error', reject );
35
+ } )
36
+ }
37
+
38
+ const downloadLanguage = function ( language ) {
39
+ const languageName = language.name || language.id;
40
+ const source = options.projectPath + language.id + "/default/export-translations/";
41
+ const fileName = options.textDomain + '-' + language.slug + '.po';
42
+ const dest = options.destFolder + fileName;
43
+ const message = ' - ' + chalk.bold( languageName ) + SPACE;
44
+
45
+ download( source, dest ).then( () => {
46
+ console.log( message + DONE );
47
+ } ).catch( ( err ) => {
48
+ console.log( message + ERROR );
49
+ throw err;
50
+ } );
51
+ };
52
+
53
+ console.log( chalk.green( '\nDownloading Transations from translate.yithemes.com...' ) );
54
+
55
+ options.languages.forEach( ( language ) => {
56
+ downloadLanguage( language );
57
+ } );
plugin-fw/composer 2.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "yith/plugin-fw",
3
+ "description": "YITH Plugin Framework",
4
+ "type": "wordpress-plugin",
5
+ "license": "GPL-3.0-or-later",
6
+ "prefer-stable": true,
7
+ "minimum-stability": "dev",
8
+ "require-dev": {
9
+ "wp-coding-standards/wpcs": "^2.2",
10
+ "squizlabs/php_codesniffer": "^3.5",
11
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1"
12
+ },
13
+ "scripts": {
14
+ "phpcs": [
15
+ "phpcs -s -p"
16
+ ],
17
+ "phpcs-pre-commit": [
18
+ "phpcs -s -p -n"
19
+ ],
20
+ "phpcbf": [
21
+ "phpcbf -p --standard=WordPress"
22
+ ]
23
+ }
24
+ }
plugin-fw/composer.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "yith/plugin-fw",
3
+ "description": "YITH Plugin Framework",
4
+ "type": "wordpress-plugin",
5
+ "license": "GPL-3.0-or-later",
6
+ "prefer-stable": true,
7
+ "minimum-stability": "dev",
8
+ "require-dev": {
9
+ "wp-coding-standards/wpcs": "^2.2",
10
+ "squizlabs/php_codesniffer": "^3.5",
11
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1"
12
+ },
13
+ "scripts": {
14
+ "phpcs": [
15
+ "phpcs -s -p"
16
+ ],
17
+ "phpcs-pre-commit": [
18
+ "phpcs -s -p -n"
19
+ ],
20
+ "phpcbf": [
21
+ "phpcbf -p --standard=WordPress"
22
+ ]
23
+ },
24
+ "config": {
25
+ "allow-plugins": {
26
+ "dealerdirect/phpcodesniffer-composer-installer": true
27
+ }
28
+ }
29
+ }
plugin-fw/dist/gutenberg/index.asset 2.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php return array('dependencies' => array('lodash', 'react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '38c85839447dbb33cdd5faa58bc6e790');
plugin-fw/dist/gutenberg/style-index 2.css ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--empty-html,.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--first-loading,.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--shortcode{border:1px solid #1e1e1e;border-radius:4px;padding:1em 1em 1.2em}.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--shortcode .block-editor-yith-plugin-fw-shortcode-block__content{border:1px solid #ddd;border-radius:4px;color:#1e1e1e;font-family:Menlo,Consolas,monaco,monospace;font-size:13px;padding:.8em 1em}.block-editor-yith-plugin-fw-shortcode-block{min-height:30px;position:relative}.block-editor-yith-plugin-fw-shortcode-block .block-editor-yith-plugin-fw-shortcode-block__spinner-wrap{left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%)}.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--empty-html.block-editor-yith-plugin-fw-shortcode-block--no-message .block-editor-yith-plugin-fw-shortcode-block__title,.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--first-loading .block-editor-yith-plugin-fw-shortcode-block__title{margin-bottom:0}.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--empty-html .block-editor-yith-plugin-fw-shortcode-block__message{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;font-style:italic}.block-editor-yith-plugin-fw-shortcode-block.block-editor-yith-plugin-fw-shortcode-block--empty-html .block-editor-yith-plugin-fw-shortcode-block__content{display:none}
2
+ .block-editor-yith-color-palette-control .block-editor-yith-color-palette-control__color-indicator{margin-bottom:12px}.block-editor-yith-color-palette-control .component-color-indicator{vertical-align:text-bottom}
3
+ .yith-fw-components__multiple-select .yith-fw-components__multiple-select__input-container{border:1px solid #757575;border-radius:2px;padding:5px}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__input-container .yith-fw-components__multiple-select__input{background:inherit;border:0;box-shadow:none;color:#1e1e1e;min-height:24px;width:100%}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__input-container .yith-fw-components__multiple-select__input::-moz-placeholder{color:inherit;opacity:.6}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__input-container .yith-fw-components__multiple-select__input:-ms-input-placeholder{color:inherit;opacity:.6}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__input-container .yith-fw-components__multiple-select__input::placeholder{color:inherit;opacity:.6}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__item{align-items:center;background:#f1f1f1;border-radius:3px;display:inline-block;margin:0 5px 5px 0;max-width:100%;padding:4px 25px 4px 10px;position:relative}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__item .yith-fw-components__multiple-select__item__remove{cursor:pointer;font-size:14px;height:auto;padding:5px;position:absolute;right:3px;top:50%;transform:translateY(-50%);width:auto}.yith-fw-components__multiple-select .yith-fw-components__multiple-select__item .yith-fw-components__multiple-select__item__remove:hover{color:#c50c0c}.yith-fw-components__multiple-select__popover .components-popover__content{border:0;overflow:visible}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions{border-radius:5px;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);display:flex;flex-direction:column;max-height:200px;overflow:hidden;overflow-y:auto;padding-top:5px}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions.no-results{padding-top:0}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestions__message{line-height:1.5em;overflow-wrap:break-word;padding:8px 15px}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion{align-items:center;cursor:pointer;display:flex;justify-content:space-between;line-height:1.5em;min-height:40px;padding:8px 15px}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion.selected{background:rgba(25,118,210,.08)}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion:hover{background:rgba(0,0,0,.04)}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion.selected:hover{background:rgba(25,118,210,.12)}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion__remove{background:transparent;border-radius:50%;box-shadow:0 0 0 10px transparent;font-size:13px;font-weight:600;height:23px;padding:5px;transition:all .3s ease-in-out;width:23px}.yith-fw-components__multiple-select__popover .yith-fw-components__multiple-select__suggestions .yith-fw-components__multiple-select__suggestion__remove:hover{background:rgba(0,0,0,.06);box-shadow:0 0 0 3px rgba(0,0,0,.06);color:#c50c0c}.yith-fw-components__multiple-select__popover ::-webkit-scrollbar-track{background-color:transparent;-webkit-box-shadow:none}.yith-fw-components__multiple-select__popover ::-webkit-scrollbar{background-color:rgba(94,88,154,.04);width:10px}.yith-fw-components__multiple-select__popover ::-webkit-scrollbar-thumb{background-color:#b1b4bf;border-radius:10px}
plugin-fw/docker-compose 2.yml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.7'
2
+
3
+ services:
4
+
5
+ mysql:
6
+ image: "mariadb:latest"
7
+ environment:
8
+ MYSQL_DATABASE: "yith_plugin_fw_tests"
9
+ MYSQL_ROOT_PASSWORD: "password"
10
+ ports:
11
+ - "3306"
12
+ networks:
13
+ - yithdevnet
14
+ volumes:
15
+ - ./tools/local-env/mysql-init.sql:/docker-entrypoint-initdb.d/mysql-init.sql
16
+ - mysql:/var/lib/mysql
17
+
18
+ ##
19
+ # The WP CLI container.
20
+ ##
21
+ cli:
22
+ image: wordpress:cli-php7.4
23
+ environment:
24
+ APACHE_RUN_USER: "www-data"
25
+ APACHE_RUN_GROUP: "www-data"
26
+ depends_on:
27
+ - mysql
28
+
29
+ networks:
30
+ - yithdevnet
31
+
32
+ volumes:
33
+ - html:/var/www/html
34
+ - ./tools/local-env/install-wp-tests.sh:/var/www/html/install-wp-tests.sh
35
+
36
+ # The init directive ensures the command runs with a PID > 1, so Ctrl+C works correctly.
37
+ init: true
38
+
39
+ ##
40
+ # The PHPUnit container.
41
+ ##
42
+ phpunit:
43
+ build:
44
+ context: ./tools/local-env/docker/phpunit
45
+
46
+ networks:
47
+ - yithdevnet
48
+
49
+ volumes:
50
+ - ./tools/local-env/phpunit-config.ini:/usr/local/etc/php/conf.d/phpunit-config.ini
51
+ - ./tools/local-env/install-wp-tests.sh:/var/www/html/install-wp-tests.sh
52
+ - ./tools/local-env/yith-plugin-fw-loader.php:/var/www/html/wp-content/plugins/yith-plugin-fw-loader/yith-plugin-fw-loader.php
53
+ - .:/var/www/html/wp-content/plugins/yith-plugin-fw-loader/plugin-fw
54
+ - ../../woocommerce:/var/www/html/wp-content/plugins/woocommerce
55
+ - html:/var/www/html
56
+ - phpunit-uploads:/var/www/html/wp-content/uploads
57
+ - testsuite:/tmp
58
+
59
+ # The init directive ensures the command runs with a PID > 1, so Ctrl+C works correctly.
60
+ init: true
61
+
62
+ depends_on:
63
+ - mysql
64
+
65
+ volumes:
66
+ # So that sites aren't wiped every time containers are restarted, MySQL uses a persistent volume.
67
+ mysql: {}
68
+ # Using a volume for the uploads directory improves PHPUnit performance.
69
+ phpunit-uploads: {}
70
+ html: {}
71
+ testsuite: {}
72
+
73
+ networks:
74
+ # Creating our own network allows us to connect between containers using their service name.
75
+ yithdevnet:
76
+ driver: bridge
plugin-fw/docker-compose.yml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.7'
2
+
3
+ services:
4
+
5
+ mysql:
6
+ image: "mariadb:latest"
7
+ environment:
8
+ MYSQL_DATABASE: "yith_plugin_fw_tests"
9
+ MYSQL_ROOT_PASSWORD: "password"
10
+ ports:
11
+ - "3306"
12
+ networks:
13
+ - yithdevnet
14
+ volumes:
15
+ - ./tools/local-env/mysql-init.sql:/docker-entrypoint-initdb.d/mysql-init.sql
16
+ - mysql:/var/lib/mysql
17
+
18
+ ##
19
+ # The WP CLI container.
20
+ ##
21
+ cli:
22
+ image: wordpress:cli-php7.4
23
+ environment:
24
+ APACHE_RUN_USER: "www-data"
25
+ APACHE_RUN_GROUP: "www-data"
26
+ depends_on:
27
+ - mysql
28
+
29
+ networks:
30
+ - yithdevnet
31
+
32
+ volumes:
33
+ - html:/var/www/html
34
+ - ./tools/local-env/install-wp-tests.sh:/var/www/html/install-wp-tests.sh
35
+
36
+ # The init directive ensures the command runs with a PID > 1, so Ctrl+C works correctly.
37
+ init: true
38
+
39
+ ##
40
+ # The PHPUnit container.
41
+ ##
42
+ phpunit:
43
+ build:
44
+ context: ./tools/local-env/docker/phpunit
45
+
46
+ networks:
47
+ - yithdevnet
48
+
49
+ volumes:
50
+ - ./tools/local-env/phpunit-config.ini:/usr/local/etc/php/conf.d/phpunit-config.ini
51
+ - ./tools/local-env/install-wp-tests.sh:/var/www/html/install-wp-tests.sh
52
+ - ./tools/local-env/yith-plugin-fw-loader.php:/var/www/html/wp-content/plugins/yith-plugin-fw-loader/yith-plugin-fw-loader.php
53
+ - .:/var/www/html/wp-content/plugins/yith-plugin-fw-loader/plugin-fw
54
+ - ../../woocommerce:/var/www/html/wp-content/plugins/woocommerce
55
+ - html:/var/www/html
56
+ - phpunit-uploads:/var/www/html/wp-content/uploads
57
+ - testsuite:/tmp
58
+
59
+ # The init directive ensures the command runs with a PID > 1, so Ctrl+C works correctly.
60
+ init: true
61
+
62
+ depends_on:
63
+ - mysql
64
+
65
+ volumes:
66
+ # So that sites aren't wiped every time containers are restarted, MySQL uses a persistent volume.
67
+ mysql: {}
68
+ # Using a volume for the uploads directory improves PHPUnit performance.
69
+ phpunit-uploads: {}
70
+ html: {}
71
+ testsuite: {}
72
+
73
+ networks:
74
+ # Creating our own network allows us to connect between containers using their service name.
75
+ yithdevnet:
76
+ driver: bridge
plugin-fw/includes/builders/elementor/class-yith-elementor 2.php ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Elementor Class.
4
+ *
5
+ * @class YITH_Elementor
6
+ * @package YITH\PluginFramework\Classes
7
+ * @since 3.6.0
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YITH_Elementor' ) ) {
13
+ /**
14
+ * YITH_Elementor class.
15
+ *
16
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
17
+ */
18
+ class YITH_Elementor {
19
+
20
+ /**
21
+ * The single instance of the class.
22
+ *
23
+ * @var YITH_Elementor
24
+ */
25
+ private static $instance;
26
+
27
+ /**
28
+ * The registered widgets.
29
+ *
30
+ * @var array
31
+ */
32
+ private $widgets = array();
33
+
34
+ /**
35
+ * Singleton implementation.
36
+ *
37
+ * @return YITH_Elementor
38
+ */
39
+ public static function instance() {
40
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
41
+ }
42
+
43
+ /**
44
+ * YITH_Elementor constructor.
45
+ */
46
+ private function __construct() {
47
+ if ( defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, '3.0.0', '>=' ) ) {
48
+ add_action( 'elementor/widgets/widgets_registered', array( $this, 'register_widgets' ) );
49
+ add_action( 'elementor/elements/categories_registered', array( $this, 'add_yith_category' ) );
50
+
51
+ add_action( 'elementor/editor/after_enqueue_styles', array( $this, 'enqueue_styles' ) );
52
+ add_action( 'elementor/frontend/after_enqueue_styles', array( $this, 'enqueue_styles' ) );
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Register Elementor widget
58
+ *
59
+ * @param string $widget_name The widget name.
60
+ * @param array $widget_options The widget options.
61
+ */
62
+ public function register_widget( $widget_name, $widget_options ) {
63
+ if ( ! isset( $widget_options['name'] ) ) {
64
+ $widget_options['name'] = $widget_name;
65
+ }
66
+ $this->widgets[ $widget_name ] = $widget_options;
67
+ }
68
+
69
+ /**
70
+ * Let's start with Elementor
71
+ *
72
+ * @deprecated 3.7.2
73
+ */
74
+ public function init() {
75
+ }
76
+
77
+ /**
78
+ * Load files
79
+ */
80
+ private function load_files() {
81
+ require_once 'class-yith-elementor-widget.php';
82
+ }
83
+
84
+ /**
85
+ * Register Elementor Widgets
86
+ */
87
+ public function register_widgets() {
88
+ if ( $this->widgets ) {
89
+ $this->load_files();
90
+ }
91
+
92
+ foreach ( $this->widgets as $widget ) {
93
+ \Elementor\Plugin::instance()->widgets_manager->register_widget_type( new YITH_Elementor_Widget( array(), array( 'yith_data' => $widget ) ) );
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Add "YITH" category for Elementor widgets
99
+ *
100
+ * @param Elementor\Elements_Manager $elements_manager Elements Manager.
101
+ */
102
+ public function add_yith_category( $elements_manager ) {
103
+ // If the category is empty, it'll be automatically hidden by Elementor.
104
+ $elements_manager->add_category(
105
+ 'yith',
106
+ array(
107
+ 'title' => 'YITH',
108
+ 'icon' => 'fa fa-plug',
109
+ 'active' => false,
110
+ )
111
+ );
112
+ }
113
+
114
+ /**
115
+ * Enqueue styles in elementor
116
+ */
117
+ public function enqueue_styles() {
118
+ if ( $this->widgets ) {
119
+ if ( \Elementor\Plugin::$instance->preview->is_preview_mode() || \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
120
+ wp_enqueue_style( 'yith-plugin-fw-icon-font' );
121
+ wp_enqueue_style( 'yith-plugin-fw-elementor' );
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ YITH_Elementor::instance();
plugin-fw/includes/builders/elementor/class-yith-elementor-widget 2.php ADDED
@@ -0,0 +1,480 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Elementor Widget Skeleton Class.
4
+ *
5
+ * @class YITH_Elementor_Widget
6
+ * @package YITH\PluginFramework\Classes
7
+ * @since 3.6.0
8
+ */
9
+
10
+ use Elementor\Controls_Manager;
11
+ use Elementor\Plugin;
12
+ use Elementor\Widget_Base;
13
+
14
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
15
+
16
+ if ( ! class_exists( 'YITH_Elementor_Widget' ) ) {
17
+ /**
18
+ * YITH_Elementor_Widget class.
19
+ *
20
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
21
+ */
22
+ class YITH_Elementor_Widget extends Widget_Base {
23
+
24
+ /**
25
+ * YITH Data.
26
+ *
27
+ * @var array
28
+ */
29
+ protected $yith_data = array();
30
+
31
+ /**
32
+ * Widget constructor.
33
+ *
34
+ * @param array $data Widget data. Default is an empty array.
35
+ * @param array|null $args Optional. Widget default arguments. Default is null.
36
+ *
37
+ * @throws Exception If arguments are missing when initializing a full widget instance.
38
+ */
39
+ public function __construct( $data = array(), $args = null ) {
40
+ $this->yith_data = $args['yith_data'];
41
+ $this->init_yith_data();
42
+
43
+ parent::__construct( $data, $args );
44
+ }
45
+
46
+ /**
47
+ * Retrieve an YITH prop.
48
+ *
49
+ * @param string $prop The prop.
50
+ * @param bool|string|array $default Default value.
51
+ *
52
+ * @return mixed|string
53
+ */
54
+ public function get_yith_prop( $prop, $default = null ) {
55
+ if ( is_null( $default ) ) {
56
+ $defaults = $this->get_yith_data_defaults();
57
+ $default = array_key_exists( $prop, $defaults ) ? $defaults[ $prop ] : false;
58
+ }
59
+
60
+ return array_key_exists( $prop, $this->yith_data ) ? $this->yith_data[ $prop ] : $default;
61
+ }
62
+
63
+ /**
64
+ * Get element name.
65
+ *
66
+ * @return string
67
+ */
68
+ public function get_name() {
69
+ return $this->get_yith_prop( 'name', '' );
70
+ }
71
+
72
+ /**
73
+ * Get the element title.
74
+ *
75
+ * @return string
76
+ */
77
+ public function get_title() {
78
+ return $this->get_yith_prop( 'title', '' );
79
+ }
80
+
81
+ /**
82
+ * Get the element icon.
83
+ *
84
+ * @return string
85
+ */
86
+ public function get_icon() {
87
+ return $this->get_yith_prop( 'icon', 'yith-icon yith-icon-yith' );
88
+ }
89
+
90
+ /**
91
+ * Get widget categories.
92
+ *
93
+ * @return array Widget categories.
94
+ */
95
+ public function get_categories() {
96
+ return array( 'yith' ) + (array) $this->get_yith_prop( 'categories', array() );
97
+ }
98
+
99
+ /**
100
+ * Register the widget controls.
101
+ */
102
+ public function register_controls() {
103
+ $options = $this->get_yith_prop( 'options' );
104
+ $description = $this->get_yith_prop( 'description' );
105
+
106
+ if ( $options ) {
107
+ $this->start_controls_section(
108
+ 'options',
109
+ array(
110
+ 'label' => $this->get_yith_prop( 'section_title' ),
111
+ 'tab' => Controls_Manager::TAB_CONTENT,
112
+ )
113
+ );
114
+
115
+ if ( $description ) {
116
+ $this->add_control(
117
+ 'description',
118
+ array(
119
+ 'type' => Controls_Manager::RAW_HTML,
120
+ 'raw' => $description,
121
+ 'content_classes' => 'yith-plugin-fw-elementor-widget-description',
122
+ )
123
+ );
124
+ }
125
+
126
+ foreach ( $options as $option ) {
127
+ if ( ! isset( $option['type'] ) ) {
128
+ continue;
129
+ }
130
+
131
+ $this->add_control( $option['yith_key'], $option );
132
+ }
133
+
134
+ $this->end_controls_section();
135
+ } elseif ( $description ) {
136
+ $this->start_controls_section(
137
+ 'options',
138
+ array(
139
+ 'label' => $this->get_title(),
140
+ 'tab' => Controls_Manager::TAB_CONTENT,
141
+ )
142
+ );
143
+ $this->add_control(
144
+ 'description',
145
+ array(
146
+ 'type' => Controls_Manager::RAW_HTML,
147
+ 'raw' => $description,
148
+ 'content_classes' => 'yith-plugin-fw-elementor-widget-description',
149
+ )
150
+ );
151
+
152
+ $this->end_controls_section();
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Render the content of the widget
158
+ */
159
+ protected function render() {
160
+ $settings = $this->get_settings_for_display();
161
+ $option_values = $this->get_yith_option_values();
162
+ $options = $this->get_yith_prop( 'options' );
163
+ $shortcode_name = $this->get_yith_prop( 'shortcode_name' );
164
+ $do_shortcode = ! ! $this->get_yith_prop( 'do_shortcode' );
165
+ $render_cb = $this->get_yith_prop( 'render_cb' );
166
+ $editor_render_cb = $this->get_yith_prop( 'editor_render_cb' );
167
+ $empty_message = $this->get_yith_prop( 'empty_message', '' );
168
+
169
+ if ( Plugin::$instance->editor->is_edit_mode() && $editor_render_cb && is_callable( $editor_render_cb ) ) {
170
+ echo call_user_func( $editor_render_cb, $option_values ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
171
+ } elseif ( $render_cb && is_callable( $render_cb ) ) {
172
+ echo call_user_func( $render_cb, $option_values ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
173
+ } else {
174
+ $shortcode_attrs = array();
175
+
176
+ foreach ( $options as $option ) {
177
+ $display_key = $option['yith_display_key'];
178
+ $value = isset( $option_values[ $display_key ] ) ? $option_values[ $display_key ] : null;
179
+ $show = $this->is_control_visible( $option, $settings );
180
+
181
+ if ( $show && ! is_null( $value ) && '' !== $value ) {
182
+ $value = is_array( $value ) ? implode( ',', $value ) : $value;
183
+ $shortcode_value = ! empty( $option['remove_quotes'] ) ? $value : ( '"' . $value . '"' );
184
+ $shortcode_attrs[] = $display_key . '=' . $shortcode_value;
185
+ }
186
+ }
187
+
188
+ $shortcode_attrs = implode( ' ', $shortcode_attrs );
189
+ $shortcode = "[{$shortcode_name} {$shortcode_attrs}]";
190
+
191
+ if ( Plugin::$instance->editor->is_edit_mode() ) {
192
+ $html = esc_html( $shortcode );
193
+ if ( $do_shortcode ) {
194
+ do_action( 'yith_plugin_fw_elementor_editor_before_do_shortcode', $shortcode, $this );
195
+ $html = do_shortcode( apply_filters( 'yith_plugin_fw_elementor_editor_shortcode', $shortcode, $this ) );
196
+ do_action( 'yith_plugin_fw_elementor_editor_after_do_shortcode', $shortcode, $this );
197
+ }
198
+ $type = $do_shortcode ? 'html' : 'shortcode';
199
+ $html_to_show = $html;
200
+ $message = '';
201
+
202
+ if ( $do_shortcode && $empty_message && ! $html ) {
203
+ $type = 'empty-html';
204
+ $html_to_show = esc_html( $shortcode );
205
+ $message = $empty_message;
206
+ }
207
+
208
+ $show_title = in_array( $type, array( 'shortcode', 'empty-html' ), true );
209
+ $show_content = 'empty-html' !== $type;
210
+ ?>
211
+ <div class="yith-plugin-fw-elementor-shortcode-widget yith-plugin-fw-elementor-shortcode-widget--<?php echo esc_attr( $type ); ?>">
212
+ <?php if ( $show_title ) : ?>
213
+ <div class="yith-plugin-fw-elementor-shortcode-widget__title">
214
+ <?php echo esc_html( $this->get_title() ); ?>
215
+ </div>
216
+ <?php endif; ?>
217
+ <?php if ( $message ) : ?>
218
+ <div class="yith-plugin-fw-elementor-shortcode-widget__message">
219
+ <?php echo wp_kses_post( $message ); ?>
220
+ </div>
221
+ <?php endif; ?>
222
+ <?php if ( $show_content ) : ?>
223
+ <div class="yith-plugin-fw-elementor-shortcode-widget__content">
224
+ <?php echo $html_to_show; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
225
+ </div>
226
+ <?php endif; ?>
227
+ </div>
228
+ <?php
229
+ } else {
230
+ do_action( 'yith_plugin_fw_elementor_before_do_shortcode', $shortcode, $this );
231
+ echo do_shortcode( apply_filters( 'yith_plugin_fw_elementor_shortcode', $shortcode, $this ) );
232
+ do_action( 'yith_plugin_fw_elementor_after_do_shortcode', $shortcode, $this );
233
+ }
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Retrieve the YITH Data defaults.
239
+ *
240
+ * @return array
241
+ */
242
+ public function get_yith_data_defaults() {
243
+ return array(
244
+ 'map_from_gutenberg' => false,
245
+ 'shortcode_name' => '',
246
+ 'do_shortcode' => true,
247
+ 'render_cb' => false,
248
+ 'editor_render_cb' => false,
249
+ 'options' => array(),
250
+ 'section_title' => sprintf(
251
+ // translators: %s it the Elementor Widget title.
252
+ _x( '%s - Options', 'Elementor Widget - section title', 'yith-plugin-fw' ),
253
+ $this->get_title()
254
+ ),
255
+ );
256
+ }
257
+
258
+ /**
259
+ * Retrieve YITH options with their values.
260
+ */
261
+ protected function get_yith_option_values() {
262
+ $settings = $this->get_settings_for_display();
263
+ $map_from_gutenberg = $this->get_yith_prop( 'map_from_gutenberg' );
264
+ $options = $this->get_yith_prop( 'options' );
265
+ $option_values = array();
266
+
267
+ foreach ( $options as $option ) {
268
+ $value = isset( $option['default'] ) ? $option['default'] : null;
269
+ $key = $option['yith_key'];
270
+ $display_key = $option['yith_display_key'];
271
+
272
+ if ( isset( $settings[ $key ] ) ) {
273
+ $value = $settings[ $key ];
274
+ }
275
+
276
+ if ( isset( $option['type'] ) && Controls_Manager::SWITCHER === $option['type'] ) {
277
+ $yes_no_values = isset( $option['yes_no_values'] ) ? $option['yes_no_values'] : ! $map_from_gutenberg;
278
+ if ( false === $yes_no_values ) {
279
+ $yes_no_values = array( 'true', 'false' );
280
+ } elseif ( ! is_array( $yes_no_values ) || 2 !== count( $yes_no_values ) ) {
281
+ $yes_no_values = array( 'yes', 'no' );
282
+ }
283
+
284
+ $value = 'yes' === $value ? $yes_no_values[0] : $yes_no_values[1];
285
+ }
286
+
287
+ $option_values[ $display_key ] = $value;
288
+ }
289
+
290
+ return $option_values;
291
+ }
292
+
293
+ /**
294
+ * YITH Data Initialization.
295
+ */
296
+ protected function init_yith_data() {
297
+ $data = wp_parse_args( $this->yith_data, $this->get_yith_data_defaults() );
298
+
299
+ if ( ! ! $data['map_from_gutenberg'] ) {
300
+ $data = $this->override_elementor_specific_data( $data );
301
+
302
+ if ( ! $data['options'] && ! empty( $data['attributes'] ) && is_array( $data['attributes'] ) ) {
303
+ $data['options'] = $data['attributes'];
304
+ unset( $data['attributes'] );
305
+ }
306
+
307
+ if ( $data['options'] ) {
308
+ $data['options'] = array_map( array( $this, 'map_option_from_gutenberg' ), $data['options'] );
309
+ }
310
+ }
311
+
312
+ $data['options'] = $this->validate_yith_options( $data['options'] );
313
+
314
+ $this->yith_data = $data;
315
+ }
316
+
317
+ /**
318
+ * Validate field types
319
+ *
320
+ * @param array $options The options.
321
+ *
322
+ * @return array|false The validate option array; false if the type is not set.
323
+ */
324
+ protected function validate_yith_options( $options ) {
325
+ foreach ( $options as $key => &$option ) {
326
+ if ( ! isset( $option['type'] ) ) {
327
+ unset( $options[ $key ] );
328
+ continue;
329
+ }
330
+
331
+ // Let's fix the option type.
332
+ if ( in_array( $option['type'], array( 'toggle', 'onoff', 'checkbox' ), true ) ) {
333
+ $option['type'] = Controls_Manager::SWITCHER;
334
+
335
+ if ( isset( $option['default'] ) && is_bool( $option['default'] ) ) {
336
+ $option['default'] = yith_plugin_fw_is_true( $option['default'] ) ? 'yes' : 'no';
337
+ }
338
+ } elseif ( in_array( $option['type'], array( 'radio' ), true ) ) {
339
+ $option['type'] = Controls_Manager::SELECT;
340
+ } elseif ( in_array( $option['type'], array( 'color', 'colorpicker', 'color-palette' ), true ) ) {
341
+ $option['type'] = Controls_Manager::COLOR;
342
+ } elseif ( in_array( $option['type'], array( 'select' ), true ) && ! empty( $option['multiple'] ) ) {
343
+ $option['type'] = Controls_Manager::SELECT2;
344
+ }
345
+
346
+ // Set the key, used to store the option, and the display_key, used in the render method.
347
+ $option['yith_key'] = $this->maybe_prefix_yith_key( $key );
348
+ if ( ! isset( $option['yith_display_key'] ) ) {
349
+ $option['yith_display_key'] = $key;
350
+ }
351
+
352
+ // Auto-set the block_label to display label in a separate line.
353
+ if ( ! isset( $option['label_block'] ) ) {
354
+ $option['label_block'] = true;
355
+ }
356
+ }
357
+
358
+ return $options;
359
+ }
360
+
361
+ /**
362
+ * Override Elementor specific data if exists.
363
+ * This allows setting/overriding specific values for Elementor.
364
+ *
365
+ * @param array $data The data array.
366
+ *
367
+ * @return array
368
+ */
369
+ protected function override_elementor_specific_data( $data ) {
370
+ $elementor_data = array_filter(
371
+ $data,
372
+ function ( $key ) {
373
+ return 'elementor_' === substr( $key, 0, 10 );
374
+ },
375
+ ARRAY_FILTER_USE_KEY
376
+ );
377
+
378
+ $elementor_data = array_combine(
379
+ array_map(
380
+ function ( $key ) {
381
+ return substr( $key, 10 );
382
+ },
383
+ array_keys( $elementor_data )
384
+ ),
385
+ array_values( $elementor_data )
386
+ );
387
+
388
+ $data = array_merge( $data, $elementor_data );
389
+
390
+ return $data;
391
+ }
392
+
393
+ /**
394
+ * Map an option from Gutenberg
395
+ *
396
+ * @param array $option The option array.
397
+ *
398
+ * @return array
399
+ */
400
+ protected function map_option_from_gutenberg( $option ) {
401
+ $option = $this->override_elementor_specific_data( $option );
402
+ $type = isset( $option['type'] ) ? $option['type'] : false;
403
+
404
+ if ( ! empty( $option['deps'] ) && ! isset( $option['condition'] ) ) {
405
+ if ( isset( $option['deps']['id'], $option['deps']['value'] ) ) {
406
+ $deps = array(
407
+ array(
408
+ 'id' => $option['deps']['id'],
409
+ 'value' => $option['deps']['value'],
410
+ ),
411
+ );
412
+ } else {
413
+ $deps = $option['deps'];
414
+ }
415
+
416
+ $option['condition'] = array();
417
+
418
+ foreach ( $deps as $dep ) {
419
+ if ( isset( $dep['id'], $dep['value'] ) ) {
420
+ $dep_value = $dep['value'];
421
+ $dep_id = $dep['id'];
422
+ if ( in_array( $type, array( 'toggle', 'onoff', 'checkbox' ), true ) ) {
423
+ $dep_value = yith_plugin_fw_is_true( $dep_value ) ? 'yes' : 'no';
424
+ }
425
+ $option['condition'][ $dep_id ] = $dep_value;
426
+ }
427
+ }
428
+
429
+ unset( $option['deps'] );
430
+ }
431
+
432
+ switch ( $type ) {
433
+ case 'color':
434
+ case 'colorpicker':
435
+ if ( ! isset( $option['alpha'] ) ) {
436
+ $option['alpha'] = isset( $option['disableAlpha'] ) ? ! $option['disableAlpha'] : false;
437
+ }
438
+
439
+ break;
440
+ case 'color-palette':
441
+ $option['alpha'] = false;
442
+ break;
443
+ }
444
+
445
+ if ( isset( $option['help'] ) && ! isset( $option['description'] ) ) {
446
+ $option['description'] = $option['help'];
447
+ unset( $option['help'] );
448
+ }
449
+
450
+ return $option;
451
+ }
452
+
453
+ /**
454
+ * Return the YITH key prefix.
455
+ *
456
+ * @return string
457
+ */
458
+ public function get_yith_key_prefix() {
459
+ return '_yith_';
460
+ }
461
+
462
+ /**
463
+ * Add YITH prefix to a specific key.
464
+ *
465
+ * @param string $key The key to be prefixed.
466
+ *
467
+ * @return string
468
+ */
469
+ public function maybe_prefix_yith_key( $key ) {
470
+ $reserved_keys = array( 'id', 'elType', 'settings', 'elements', 'isInner' );
471
+ if ( in_array( $key, $reserved_keys, true ) ) {
472
+ $prefix = $this->get_yith_key_prefix();
473
+
474
+ $key = substr( $key, 0, strlen( $prefix ) ) === $prefix ? $key : ( $prefix . $key );
475
+ }
476
+
477
+ return $key;
478
+ }
479
+ }
480
+ }
plugin-fw/includes/builders/gutenberg/class-yith-gutenberg 2.php ADDED
@@ -0,0 +1,360 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Gutenberg Class
4
+ * handle Gutenberg blocks and shortcodes.
5
+ *
6
+ * @class YITH_Gutenberg
7
+ * @package YITH\PluginFramework\Classes
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YITH_Gutenberg' ) ) {
13
+ /**
14
+ * YITH_Gutenberg class.
15
+ *
16
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
17
+ */
18
+ class YITH_Gutenberg {
19
+ /**
20
+ * The single instance of the class.
21
+ *
22
+ * @var YITH_Gutenberg
23
+ */
24
+ private static $instance;
25
+
26
+ /**
27
+ * Registered blocks
28
+ *
29
+ * @var array
30
+ */
31
+ private $registered_blocks = array();
32
+
33
+ /**
34
+ * Blocks to register
35
+ *
36
+ * @var array
37
+ */
38
+ private $to_register_blocks = array();
39
+
40
+ /**
41
+ * Blocks args
42
+ *
43
+ * @var array
44
+ */
45
+ private $blocks_args = array();
46
+
47
+ /**
48
+ * Block category slug
49
+ *
50
+ * @var string
51
+ */
52
+ private $category_slug = 'yith-blocks';
53
+
54
+ /**
55
+ * Singleton implementation.
56
+ *
57
+ * @return YITH_Gutenberg
58
+ */
59
+ public static function instance() {
60
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
61
+ }
62
+
63
+ /**
64
+ * YITH_Gutenberg constructor.
65
+ */
66
+ private function __construct() {
67
+ add_action( 'init', array( $this, 'init' ) );
68
+ add_action( 'init', array( $this, 'register_blocks' ), 30 );
69
+ add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_block_editor_assets' ) );
70
+ add_action( 'wp_ajax_yith_plugin_fw_gutenberg_do_shortcode', array( $this, 'do_shortcode' ) );
71
+ add_action( 'wc_ajax_yith_plugin_fw_gutenberg_do_shortcode', array( $this, 'do_shortcode' ) );
72
+ }
73
+
74
+ /**
75
+ * Initialization
76
+ */
77
+ public function init() {
78
+
79
+ }
80
+
81
+ /**
82
+ * Enqueue scripts for gutenberg
83
+ */
84
+ public function enqueue_block_editor_assets() {
85
+ $ajax_url = function_exists( 'WC' ) ? add_query_arg( 'wc-ajax', 'yith_plugin_fw_gutenberg_do_shortcode', trailingslashit( site_url() ) ) : admin_url( 'admin-ajax.php' );
86
+ $gutenberg = array(
87
+ 'ajaxurl' => $ajax_url,
88
+ 'ajaxNonce' => wp_create_nonce( 'gutenberg-ajax-action' ),
89
+ );
90
+ $asset_file = include YIT_CORE_PLUGIN_PATH . '/dist/gutenberg/index.asset.php';
91
+
92
+ $gutenberg_assets_url = YIT_CORE_PLUGIN_URL . '/dist/gutenberg';
93
+
94
+ wp_register_script(
95
+ 'yith-gutenberg',
96
+ $gutenberg_assets_url . '/index.js',
97
+ $asset_file['dependencies'],
98
+ $asset_file['version'],
99
+ true
100
+ );
101
+
102
+ wp_localize_script( 'yith-gutenberg', 'yith_gutenberg_ajax', $gutenberg ); // Deprecated! Kept for backward compatibility.
103
+ wp_localize_script( 'yith-gutenberg', 'yith_gutenberg', $this->blocks_args ); // Deprecated! Kept for backward compatibility.
104
+
105
+ wp_localize_script( 'yith-gutenberg', 'yithGutenberg', $gutenberg );
106
+ wp_localize_script( 'yith-gutenberg', 'yithGutenbergBlocks', $this->blocks_args );
107
+
108
+ wp_enqueue_script( 'yith-gutenberg' );
109
+ wp_enqueue_style( 'yith-gutenberg', $gutenberg_assets_url . '/style-index.css', array( 'yith-plugin-fw-icon-font' ), yith_plugin_fw_get_version() );
110
+ }
111
+
112
+ /**
113
+ * Add blocks to gutenberg editor.
114
+ */
115
+ public function register_blocks() {
116
+ $block_args = array();
117
+ foreach ( $this->to_register_blocks as $block => $args ) {
118
+ if ( isset( $args['style'] ) ) {
119
+ $block_args['style'] = $args['style'];
120
+ }
121
+
122
+ if ( isset( $args['script'] ) ) {
123
+ $block_args['script'] = $args['script'];
124
+ }
125
+
126
+ if ( register_block_type( "yith/{$block}", $block_args ) ) {
127
+ $this->registered_blocks[] = $block;
128
+ }
129
+ }
130
+
131
+ if ( ! empty( $this->registered_blocks ) ) {
132
+ global $wp_version;
133
+
134
+ $categories_hook = version_compare( $wp_version, '5.8-beta', '>=' ) ? 'block_categories_all' : 'block_categories';
135
+ add_filter( $categories_hook, array( $this, 'block_category' ), 10, 1 );
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Add block category
141
+ *
142
+ * @param array $categories The block categories.
143
+ *
144
+ * @return array The block categories.
145
+ */
146
+ public function block_category( $categories ) {
147
+ return array_merge(
148
+ $categories,
149
+ array(
150
+ array(
151
+ 'slug' => 'yith-blocks',
152
+ 'title' => _x( 'YITH', '[gutenberg]: Category Name', 'yith-plugin-fw' ),
153
+ ),
154
+ )
155
+ );
156
+ }
157
+
158
+ /**
159
+ * Add new blocks to Gutenberg
160
+ *
161
+ * @param string|array $blocks The blocks to be added.
162
+ *
163
+ * @return bool True if the blocks was successfully added, false otherwise.
164
+ */
165
+ public function add_blocks( $blocks ) {
166
+ $added = false;
167
+ if ( ! empty( $blocks ) ) {
168
+ $added = true;
169
+ if ( is_array( $blocks ) ) {
170
+ $this->to_register_blocks = array_merge( $this->to_register_blocks, $blocks );
171
+ } else {
172
+ $this->to_register_blocks[] = $blocks;
173
+ }
174
+ }
175
+
176
+ return $added;
177
+ }
178
+
179
+ /**
180
+ * Return an array with the registered blocks
181
+ *
182
+ * @return array
183
+ */
184
+ public function get_registered_blocks() {
185
+ return $this->registered_blocks;
186
+ }
187
+
188
+ /**
189
+ * Return an array with the blocks to register
190
+ *
191
+ * @return array
192
+ */
193
+ public function get_to_register_blocks() {
194
+ return $this->to_register_blocks;
195
+ }
196
+
197
+ /**
198
+ * Return an array with the block(s) arguments
199
+ *
200
+ * @param string $block_key The block key.
201
+ *
202
+ * @return array|false
203
+ */
204
+ public function get_block_args( $block_key = 'all' ) {
205
+ if ( 'all' === $block_key ) {
206
+ return $this->blocks_args;
207
+ } elseif ( isset( $this->blocks_args[ $block_key ] ) ) {
208
+ return $this->blocks_args[ $block_key ];
209
+ }
210
+
211
+ return false;
212
+ }
213
+
214
+ /**
215
+ * Retrieve the default category slug
216
+ *
217
+ * @return string
218
+ */
219
+ public function get_default_blocks_category_slug() {
220
+ return $this->category_slug;
221
+ }
222
+
223
+ /**
224
+ * Set the block arguments
225
+ *
226
+ * @param array $args The block arguments.
227
+ */
228
+ public function set_block_args( $args ) {
229
+ foreach ( $args as $block => $block_args ) {
230
+
231
+ // Add Default Keywords.
232
+ $default_keywords = array( 'yith' );
233
+ if ( ! empty( $block_args['shortcode_name'] ) ) {
234
+ $default_keywords[] = $block_args['shortcode_name'];
235
+ }
236
+
237
+ $args[ $block ]['keywords'] = ! empty( $args[ $block ]['keywords'] ) ? array_merge( $args[ $block ]['keywords'], $default_keywords ) : $default_keywords;
238
+
239
+ if ( count( $args[ $block ]['keywords'] ) > 3 ) {
240
+ $args[ $block ]['keywords'] = array_slice( $args[ $block ]['keywords'], 0, 3 );
241
+ }
242
+
243
+ if ( empty( $block_args['category'] ) ) {
244
+ // Add the YITH block category.
245
+ $args[ $block ]['category'] = $this->get_default_blocks_category_slug();
246
+ }
247
+
248
+ $args[ $block ]['do_shortcode'] = isset( $block_args['do_shortcode'] ) ? ! ! $block_args['do_shortcode'] : true;
249
+
250
+ if ( isset( $block_args['attributes'] ) ) {
251
+ foreach ( $block_args['attributes'] as $attr_name => $attributes ) {
252
+
253
+ if ( ! empty( $attributes['options'] ) && is_array( $attributes['options'] ) ) {
254
+ $options = array();
255
+ foreach ( $attributes['options'] as $v => $l ) {
256
+ // Prepare options array for react component.
257
+ $options[] = array(
258
+ 'label' => $l,
259
+ 'value' => $v,
260
+ );
261
+ }
262
+ $args[ $block ]['attributes'][ $attr_name ]['options'] = $options;
263
+ }
264
+
265
+ if ( empty( $attributes['remove_quotes'] ) ) {
266
+ $args[ $block ]['attributes'][ $attr_name ]['remove_quotes'] = false;
267
+ }
268
+
269
+ // Special Requirements for Block Type.
270
+ if ( ! empty( $attributes['type'] ) ) {
271
+ $args[ $block ]['attributes'][ $attr_name ]['controlType'] = $attributes['type'];
272
+ $args[ $block ]['attributes'][ $attr_name ]['type'] = 'string';
273
+
274
+ switch ( $attributes['type'] ) {
275
+ case 'select':
276
+ // Add default value for multiple.
277
+ if ( ! isset( $attributes['multiple'] ) ) {
278
+ $args[ $block ]['attributes'][ $attr_name ]['multiple'] = false;
279
+ }
280
+
281
+ if ( ! empty( $attributes['multiple'] ) ) {
282
+ $args[ $block ]['attributes'][ $attr_name ]['type'] = 'array';
283
+ }
284
+ break;
285
+
286
+ case 'color':
287
+ case 'colorpicker':
288
+ if ( ! isset( $attributes['disableAlpha'] ) ) {
289
+ // Disable alpha gradient for color picker.
290
+ $args[ $block ]['attributes'][ $attr_name ]['disableAlpha'] = true;
291
+ }
292
+ break;
293
+
294
+ case 'number':
295
+ $args[ $block ]['attributes'][ $attr_name ]['type'] = 'integer';
296
+ break;
297
+
298
+ case 'toggle':
299
+ case 'checkbox':
300
+ $args[ $block ]['attributes'][ $attr_name ]['type'] = 'boolean';
301
+ break;
302
+ }
303
+ }
304
+ }
305
+ }
306
+ }
307
+
308
+ $this->blocks_args = array_merge( $this->blocks_args, $args );
309
+ }
310
+
311
+ /**
312
+ * Get a do_shortcode in ajax call to show block preview
313
+ **/
314
+ public function do_shortcode() {
315
+ check_ajax_referer( 'gutenberg-ajax-action', 'security' );
316
+
317
+ $post_id = absint( $_REQUEST['context']['postId'] ?? 0 );
318
+ $admin_page = sanitize_text_field( wp_unslash( $_REQUEST['context']['adminPage'] ?? '' ) );
319
+ $has_access = ( in_array( $admin_page, array( 'widgets-php', 'site-editor-php' ), true ) && current_user_can( 'edit_theme_options' ) );
320
+ $has_access = $has_access || $post_id && current_user_can( 'edit_post', $post_id );
321
+
322
+ if ( $has_access ) {
323
+ $current_action = current_action();
324
+ $shortcode = ! empty( $_REQUEST['shortcode'] ) ? wp_unslash( $_REQUEST['shortcode'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
325
+
326
+ if ( ! apply_filters( 'yith_plugin_fw_gutenberg_skip_shortcode_sanitize', false ) ) {
327
+ $shortcode = sanitize_text_field( stripslashes( $shortcode ) );
328
+ }
329
+
330
+ ob_start();
331
+
332
+ do_action( 'yith_plugin_fw_gutenberg_before_do_shortcode', $shortcode, $current_action );
333
+ echo do_shortcode( apply_filters( 'yith_plugin_fw_gutenberg_shortcode', $shortcode, $current_action ) );
334
+ do_action( 'yith_plugin_fw_gutenberg_after_do_shortcode', $shortcode, $current_action );
335
+
336
+ $html = ob_get_clean();
337
+
338
+ wp_send_json(
339
+ array(
340
+ 'html' => $html,
341
+ )
342
+ );
343
+
344
+ }
345
+ }
346
+ }
347
+ }
348
+
349
+ if ( ! function_exists( 'YITH_Gutenberg' ) ) {
350
+ /**
351
+ * Single instance of YITH_Gutenberg
352
+ *
353
+ * @return YITH_Gutenberg
354
+ */
355
+ function YITH_Gutenberg() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
356
+ return YITH_Gutenberg::instance();
357
+ }
358
+ }
359
+
360
+ YITH_Gutenberg();
plugin-fw/includes/builders/gutenberg/src/common/actions-to-jquery-events 2.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Actions to jQuery events
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { addAction } from '@wordpress/hooks';
9
+
10
+ const actions = [
11
+ { key: 'yith_plugin_fw_gutenberg_before_do_shortcode', delay: 0 },
12
+ { key: 'yith_plugin_fw_gutenberg_success_do_shortcode', delay: 200 },
13
+ { key: 'yith_plugin_fw_gutenberg_after_do_shortcode', delay: 200 }
14
+ ];
15
+
16
+ for ( const action of actions ) {
17
+ addAction(
18
+ action.key,
19
+ 'yith-plugin-fw/jquery-events',
20
+ ( ...params ) => {
21
+ if ( 'jQuery' in window ) {
22
+ if ( action.delay ) {
23
+ setTimeout( () => {
24
+ jQuery( document ).trigger( action.key, Object.values( params ) );
25
+ }, action.delay );
26
+ } else {
27
+ jQuery( document ).trigger( action.key, Object.values( params ) );
28
+ }
29
+ }
30
+ }
31
+ );
32
+ }
plugin-fw/includes/builders/gutenberg/src/common/actions-to-jquery-events.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Actions to jQuery events
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { addAction } from '@wordpress/hooks';
9
+
10
+ const actions = [
11
+ { key: 'yith_plugin_fw_gutenberg_before_do_shortcode', delay: 0 },
12
+ { key: 'yith_plugin_fw_gutenberg_success_do_shortcode', delay: 200 },
13
+ { key: 'yith_plugin_fw_gutenberg_after_do_shortcode', delay: 200 }
14
+ ];
15
+
16
+ for ( const action of actions ) {
17
+ addAction(
18
+ action.key,
19
+ 'yith-plugin-fw/jquery-events',
20
+ ( ...params ) => {
21
+ if ( 'jQuery' in window ) {
22
+ if ( action.delay ) {
23
+ setTimeout( () => {
24
+ jQuery( document ).trigger( action.key, Object.values( params ) );
25
+ }, action.delay );
26
+ } else {
27
+ jQuery( document ).trigger( action.key, Object.values( params ) );
28
+ }
29
+ }
30
+ }
31
+ );
32
+ }
plugin-fw/includes/builders/gutenberg/src/common/ajaxFetch 2.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Ajax Fetch
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { addQueryArgs } from '@wordpress/url';
9
+
10
+ /**
11
+ * Check status of ajax call
12
+ * @param response
13
+ * @returns {*}
14
+ */
15
+ function ajaxCheckStatus( response ) {
16
+ if ( response.status >= 200 && response.status < 300 ) {
17
+ return response;
18
+ }
19
+
20
+ throw response;
21
+ }
22
+
23
+ /**
24
+ * Parse the response of the ajax call
25
+ * @param response
26
+ * @returns {*}
27
+ */
28
+ function parseResponse( response ) {
29
+ return response.json ? response.json() : response.text();
30
+ }
31
+
32
+ /**
33
+ * Fetch using WordPress Ajax
34
+ *
35
+ * @param {object} data The data to use in the ajax call.
36
+ * @param {string} url The ajax URL.
37
+ * @returns {Promise<Response>}
38
+ */
39
+ export const ajaxFetch = ( data, url = yithGutenberg.ajaxurl ) => {
40
+ data.security = data.security ?? yithGutenberg.ajaxNonce;
41
+ url = addQueryArgs( url, data );
42
+ return fetch( url ).then( ajaxCheckStatus ).then( parseResponse );
43
+ };
plugin-fw/includes/builders/gutenberg/src/common/ajaxFetch.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Ajax Fetch
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies
7
+ */
8
+ import { addQueryArgs } from '@wordpress/url';
9
+
10
+ /**
11
+ * Check status of ajax call
12
+ * @param response
13
+ * @returns {*}
14
+ */
15
+ function ajaxCheckStatus( response ) {
16
+ if ( response.status >= 200 && response.status < 300 ) {
17
+ return response;
18
+ }
19
+
20
+ throw response;
21
+ }
22
+
23
+ /**
24
+ * Parse the response of the ajax call
25
+ * @param response
26
+ * @returns {*}
27
+ */
28
+ function parseResponse( response ) {
29
+ return response.json ? response.json() : response.text();
30
+ }
31
+
32
+ /**
33
+ * Fetch using WordPress Ajax
34
+ *
35
+ * @param {object} data The data to use in the ajax call.
36
+ * @param {string} url The ajax URL.
37
+ * @returns {Promise<Response>}
38
+ */
39
+ export const ajaxFetch = ( data, url = yithGutenberg.ajaxurl ) => {
40
+ data.security = data.security ?? yithGutenberg.ajaxNonce;
41
+ url = addQueryArgs( url, data );
42
+ return fetch( url ).then( ajaxCheckStatus ).then( parseResponse );
43
+ };
plugin-fw/includes/builders/gutenberg/src/common/checkForDeps 2.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Check for dependencies
3
+ *
4
+ * @param {object} attributeArgs Attribute arguments.
5
+ * @param {object} attributes The attributes.
6
+ * @returns {boolean}
7
+ */
8
+
9
+ import _ from 'lodash';
10
+
11
+ const checkForSingleDep = ( attributes, dep, controlType ) => {
12
+ let show = true;
13
+
14
+ if ( dep && dep.id && 'value' in dep ) {
15
+ let depValue = dep.value;
16
+ if ( ['toggle', 'checkbox'].includes( controlType ) ) {
17
+ depValue = true === depValue || 'yes' === depValue || 1 === depValue;
18
+ }
19
+ depValue = _.isArray( depValue ) ? depValue : [depValue];
20
+
21
+ show = typeof attributes[ dep.id ] !== 'undefined' && depValue.includes( attributes[ dep.id ] );
22
+ }
23
+
24
+ return show;
25
+ };
26
+
27
+ export const checkForDeps = ( attributeArgs, attributes ) => {
28
+ const { controlType } = attributeArgs;
29
+ let show = true;
30
+
31
+ if ( attributeArgs.deps ) {
32
+ if ( _.isArray( attributeArgs.deps ) ) {
33
+ for ( let i in attributeArgs.deps ) {
34
+ const singleDep = attributeArgs.deps[ i ];
35
+ show = checkForSingleDep( attributes, singleDep, controlType );
36
+ if ( !show ) {
37
+ break;
38
+ }
39
+ }
40
+ } else {
41
+ show = checkForSingleDep( attributes, attributeArgs.deps, controlType );
42
+ }
43
+ }
44
+
45
+ return show;
46
+ };
plugin-fw/includes/builders/gutenberg/src/common/checkForDeps.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Check for dependencies
3
+ *
4
+ * @param {object} attributeArgs Attribute arguments.
5
+ * @param {object} attributes The attributes.
6
+ * @returns {boolean}
7
+ */
8
+
9
+ import _ from 'lodash';
10
+
11
+ const checkForSingleDep = ( attributes, dep, controlType ) => {
12
+ let show = true;
13
+
14
+ if ( dep && dep.id && 'value' in dep ) {
15
+ let depValue = dep.value;
16
+ if ( ['toggle', 'checkbox'].includes( controlType ) ) {
17
+ depValue = true === depValue || 'yes' === depValue || 1 === depValue;
18
+ }
19
+ depValue = _.isArray( depValue ) ? depValue : [depValue];
20
+
21
+ show = typeof attributes[ dep.id ] !== 'undefined' && depValue.includes( attributes[ dep.id ] );
22
+ }
23
+
24
+ return show;
25
+ };
26
+
27
+ export const checkForDeps = ( attributeArgs, attributes ) => {
28
+ const { controlType } = attributeArgs;
29
+ let show = true;
30
+
31
+ if ( attributeArgs.deps ) {
32
+ if ( _.isArray( attributeArgs.deps ) ) {
33
+ for ( let i in attributeArgs.deps ) {
34
+ const singleDep = attributeArgs.deps[ i ];
35
+ show = checkForSingleDep( attributes, singleDep, controlType );
36
+ if ( !show ) {
37
+ break;
38
+ }
39
+ }
40
+ } else {
41
+ show = checkForSingleDep( attributes, attributeArgs.deps, controlType );
42
+ }
43
+ }
44
+
45
+ return show;
46
+ };
plugin-fw/includes/builders/gutenberg/src/common/generateShortcode 2.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { checkForDeps } from './checkForDeps';
5
+
6
+ /**
7
+ * Generate the shortcode
8
+ *
9
+ * @param {object} blockArgs The block arguments.
10
+ * @param {object} attributes The attributes
11
+ * @returns {string}
12
+ */
13
+ export const generateShortcode = ( blockArgs, attributes ) => {
14
+ let theShortcode = '';
15
+ let callback = false;
16
+
17
+ if ( typeof blockArgs.callback !== 'undefined' ) {
18
+ if ( jQuery && blockArgs.callback in jQuery.fn ) {
19
+ callback = jQuery.fn[ blockArgs.callback ];
20
+ } else if ( blockArgs.callback in window ) {
21
+ callback = window[ blockArgs.callback ];
22
+ }
23
+ }
24
+
25
+ if ( typeof callback === 'function' ) {
26
+ theShortcode = callback( attributes, blockArgs );
27
+ } else {
28
+ const shortcodeAttrs = blockArgs.attributes ? Object.entries( blockArgs.attributes ).map( ( [attributeName, attributeArgs] ) => {
29
+ const show = checkForDeps( attributeArgs, attributes );
30
+ const value = attributes[ attributeName ];
31
+
32
+ if ( show && typeof value !== 'undefined' ) {
33
+ const shortcodeValue = !!attributeArgs.remove_quotes ? value : `"${value}"`;
34
+ return attributeName + '=' + shortcodeValue;
35
+ }
36
+ } ) : [];
37
+
38
+ const shortcodeAttrsText = shortcodeAttrs.length ? ( ' ' + shortcodeAttrs.join( ' ' ) ) : '';
39
+ theShortcode = `[${blockArgs.shortcode_name}${shortcodeAttrsText}]`;
40
+ }
41
+ return theShortcode;
42
+ };
plugin-fw/includes/builders/gutenberg/src/common/generateShortcode.js ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { checkForDeps } from './checkForDeps';
5
+
6
+ /**
7
+ * Generate the shortcode
8
+ *
9
+ * @param {object} blockArgs The block arguments.
10
+ * @param {object} attributes The attributes
11
+ * @returns {string}
12
+ */
13
+ export const generateShortcode = ( blockArgs, attributes ) => {
14
+ let theShortcode = '';
15
+ let callback = false;
16
+
17
+ if ( typeof blockArgs.callback !== 'undefined' ) {
18
+ if ( jQuery && blockArgs.callback in jQuery.fn ) {
19
+ callback = jQuery.fn[ blockArgs.callback ];
20
+ } else if ( blockArgs.callback in window ) {
21
+ callback = window[ blockArgs.callback ];
22
+ }
23
+ }
24
+
25
+ if ( typeof callback === 'function' ) {
26
+ theShortcode = callback( attributes, blockArgs );
27
+ } else {
28
+ const shortcodeAttrs = blockArgs.attributes ? Object.entries( blockArgs.attributes ).map( ( [attributeName, attributeArgs] ) => {
29
+ const show = checkForDeps( attributeArgs, attributes );
30
+ const value = attributes[ attributeName ];
31
+
32
+ if ( show && typeof value !== 'undefined' ) {
33
+ const shortcodeValue = !!attributeArgs.remove_quotes ? value : `"${value}"`;
34
+ return attributeName + '=' + shortcodeValue;
35
+ }
36
+ } ) : [];
37
+
38
+ const shortcodeAttrsText = shortcodeAttrs.length ? ( ' ' + shortcodeAttrs.join( ' ' ) ) : '';
39
+ theShortcode = `[${blockArgs.shortcode_name}${shortcodeAttrsText}]`;
40
+ }
41
+ return theShortcode;
42
+ };
plugin-fw/includes/builders/gutenberg/src/common/icons 2.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * SVG Icons
3
+ */
4
+
5
+ /**
6
+ * The YITH Logo Icon
7
+ * @type {JSX.Element}
8
+ */
9
+ export const yith_icon = <svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" width="22" height="22" role="img" aria-hidden="true" focusable="false">
10
+ <path width="22" height="22"
11
+ d="M 18.24 7.628 C 17.291 8.284 16.076 8.971 14.587 9.688 C 15.344 7.186 15.765 4.851 15.849 2.684 C 15.912 0.939 15.133 0.045 13.514 0.003 C 11.558 -0.06 10.275 1.033 9.665 3.284 C 10.007 3.137 10.359 3.063 10.723 3.063 C 11.021 3.063 11.267 3.184 11.459 3.426 C 11.651 3.668 11.736 3.947 11.715 4.262 C 11.695 5.082 11.276 5.961 10.46 6.896 C 9.644 7.833 8.918 8.3 8.282 8.3 C 7.837 8.3 7.625 7.922 7.646 7.165 C 7.667 6.765 7.804 5.955 8.056 4.735 C 8.287 3.579 8.403 2.801 8.403 2.401 C 8.403 1.707 8.224 1.144 7.867 0.713 C 7.509 0.282 6.994 0.098 6.321 0.161 C 5.858 0.203 5.175 0.624 4.27 1.422 C 3.596 2.035 2.923 2.644 2.25 3.254 L 2.976 4.106 C 3.564 3.664 3.922 3.443 4.048 3.443 C 4.448 3.443 4.637 3.717 4.617 4.263 C 4.617 4.306 4.427 4.968 4.049 6.251 C 3.671 7.534 3.471 8.491 3.449 9.122 C 3.407 9.985 3.565 10.647 3.924 11.109 C 4.367 11.677 5.106 11.919 6.142 11.835 C 7.366 11.751 8.591 11.298 9.816 10.479 C 10.323 10.142 10.808 9.753 11.273 9.311 C 11.105 10.153 10.905 10.868 10.673 11.457 C 8.402 12.487 6.762 13.37 5.752 14.107 C 4.321 15.137 3.554 16.241 3.449 17.419 C 3.259 19.459 4.29 20.479 6.541 20.479 C 8.055 20.479 9.517 19.554 10.926 17.703 C 12.125 16.126 13.166 14.022 14.049 11.394 C 15.578 10.635 16.87 9.892 17.928 9.164 C 17.894 9.409 18.319 7.308 18.24 7.628 Z M 7.393 16.095 C 7.056 16.095 6.898 15.947 6.919 15.653 C 6.961 15.106 7.908 14.38 9.759 13.476 C 8.791 15.221 8.002 16.095 7.393 16.095 Z"/>
12
+ </svg>;
plugin-fw/includes/builders/gutenberg/src/common/icons.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * SVG Icons
3
+ */
4
+
5
+ /**
6
+ * The YITH Logo Icon
7
+ * @type {JSX.Element}
8
+ */
9
+ export const yith_icon = <svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" width="22" height="22" role="img" aria-hidden="true" focusable="false">
10
+ <path width="22" height="22"
11
+ d="M 18.24 7.628 C 17.291 8.284 16.076 8.971 14.587 9.688 C 15.344 7.186 15.765 4.851 15.849 2.684 C 15.912 0.939 15.133 0.045 13.514 0.003 C 11.558 -0.06 10.275 1.033 9.665 3.284 C 10.007 3.137 10.359 3.063 10.723 3.063 C 11.021 3.063 11.267 3.184 11.459 3.426 C 11.651 3.668 11.736 3.947 11.715 4.262 C 11.695 5.082 11.276 5.961 10.46 6.896 C 9.644 7.833 8.918 8.3 8.282 8.3 C 7.837 8.3 7.625 7.922 7.646 7.165 C 7.667 6.765 7.804 5.955 8.056 4.735 C 8.287 3.579 8.403 2.801 8.403 2.401 C 8.403 1.707 8.224 1.144 7.867 0.713 C 7.509 0.282 6.994 0.098 6.321 0.161 C 5.858 0.203 5.175 0.624 4.27 1.422 C 3.596 2.035 2.923 2.644 2.25 3.254 L 2.976 4.106 C 3.564 3.664 3.922 3.443 4.048 3.443 C 4.448 3.443 4.637 3.717 4.617 4.263 C 4.617 4.306 4.427 4.968 4.049 6.251 C 3.671 7.534 3.471 8.491 3.449 9.122 C 3.407 9.985 3.565 10.647 3.924 11.109 C 4.367 11.677 5.106 11.919 6.142 11.835 C 7.366 11.751 8.591 11.298 9.816 10.479 C 10.323 10.142 10.808 9.753 11.273 9.311 C 11.105 10.153 10.905 10.868 10.673 11.457 C 8.402 12.487 6.762 13.37 5.752 14.107 C 4.321 15.137 3.554 16.241 3.449 17.419 C 3.259 19.459 4.29 20.479 6.541 20.479 C 8.055 20.479 9.517 19.554 10.926 17.703 C 12.125 16.126 13.166 14.022 14.049 11.394 C 15.578 10.635 16.87 9.892 17.928 9.164 C 17.894 9.409 18.319 7.308 18.24 7.628 Z M 7.393 16.095 C 7.056 16.095 6.898 15.947 6.919 15.653 C 6.961 15.106 7.908 14.38 9.759 13.476 C 8.791 15.221 8.002 16.095 7.393 16.095 Z"/>
12
+ </svg>;
plugin-fw/includes/builders/gutenberg/src/common/index 2.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ export * from './ajaxFetch';
2
+ export * from './icons';
3
+ export * from './generateShortcode';
4
+ export * from './checkForDeps';
plugin-fw/includes/builders/gutenberg/src/common/index.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ export * from './ajaxFetch';
2
+ export * from './icons';
3
+ export * from './generateShortcode';
4
+ export * from './checkForDeps';
plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/index 2.js ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Color Palette Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React from 'react';
9
+
10
+ /**
11
+ * WordPress dependencies
12
+ */
13
+ import { BaseControl, ColorIndicator, ColorPalette } from '@wordpress/components';
14
+ import { useSetting } from '@wordpress/block-editor';
15
+ import { useInstanceId } from '@wordpress/compose';
16
+
17
+ /**
18
+ * Internal dependencies
19
+ */
20
+ import './style.scss';
21
+
22
+ /**
23
+ * Visual Label Element
24
+ *
25
+ * @param {string} label The label.
26
+ * @param {string} colorValue The color.
27
+ * @returns {JSX.Element}
28
+ * @constructor
29
+ */
30
+ function VisualLabel( {
31
+ label,
32
+ colorValue
33
+ } ) {
34
+
35
+ return (
36
+ <>
37
+ {label}
38
+ {!!colorValue && (
39
+ <ColorIndicator colorValue={colorValue}/>
40
+ )}
41
+ </>
42
+ );
43
+ }
44
+
45
+ /**
46
+ * Color Palette Control
47
+ *
48
+ * @param {string} className The CSS class name.
49
+ * @param {string} label The label.
50
+ * @param {function} onChange The function callback fired on value change.
51
+ * @param {string} value The initial value.
52
+ * @param {string} help The help message.
53
+ * @param {array} palette Array of palette colors.
54
+ * @param {bool} clearable Set true to allow clear.
55
+ * @returns {JSX.Element}
56
+ * @constructor
57
+ */
58
+ export default function ColorPaletteControl( {
59
+ className,
60
+ label,
61
+ onChange,
62
+ value,
63
+ help,
64
+ palette,
65
+ clearable
66
+ } ) {
67
+
68
+ palette = !!palette ? palette : useSetting( 'color.palette' );
69
+
70
+ const instanceId = useInstanceId( ColorPaletteControl );
71
+ const id = `inspector-yith-color-palette-control-${instanceId}`;
72
+
73
+ return (
74
+ <BaseControl
75
+ id={id}
76
+ className={`block-editor-yith-color-palette-control ${className}`}
77
+ help={help}
78
+ >
79
+ <fieldset>
80
+ <legend>
81
+ <div className="block-editor-yith-color-palette-control__color-indicator">
82
+ <BaseControl.VisualLabel>
83
+ <VisualLabel colorValue={value} label={label}/>
84
+ </BaseControl.VisualLabel>
85
+ </div>
86
+ </legend>
87
+
88
+ <ColorPalette
89
+ value={value}
90
+ onChange={onChange}
91
+ colors={palette}
92
+ clearable={clearable}
93
+ />
94
+ </fieldset>
95
+ </BaseControl> );
96
+ }
plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/index.js ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Color Palette Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React from 'react';
9
+
10
+ /**
11
+ * WordPress dependencies
12
+ */
13
+ import { BaseControl, ColorIndicator, ColorPalette } from '@wordpress/components';
14
+ import { useSetting } from '@wordpress/block-editor';
15
+ import { useInstanceId } from '@wordpress/compose';
16
+
17
+ /**
18
+ * Internal dependencies
19
+ */
20
+ import './style.scss';
21
+
22
+ /**
23
+ * Visual Label Element
24
+ *
25
+ * @param {string} label The label.
26
+ * @param {string} colorValue The color.
27
+ * @returns {JSX.Element}
28
+ * @constructor
29
+ */
30
+ function VisualLabel( {
31
+ label,
32
+ colorValue
33
+ } ) {
34
+
35
+ return (
36
+ <>
37
+ {label}
38
+ {!!colorValue && (
39
+ <ColorIndicator colorValue={colorValue}/>
40
+ )}
41
+ </>
42
+ );
43
+ }
44
+
45
+ /**
46
+ * Color Palette Control
47
+ *
48
+ * @param {string} className The CSS class name.
49
+ * @param {string} label The label.
50
+ * @param {function} onChange The function callback fired on value change.
51
+ * @param {string} value The initial value.
52
+ * @param {string} help The help message.
53
+ * @param {array} palette Array of palette colors.
54
+ * @param {bool} clearable Set true to allow clear.
55
+ * @returns {JSX.Element}
56
+ * @constructor
57
+ */
58
+ export default function ColorPaletteControl( {
59
+ className,
60
+ label,
61
+ onChange,
62
+ value,
63
+ help,
64
+ palette,
65
+ clearable
66
+ } ) {
67
+
68
+ palette = !!palette ? palette : useSetting( 'color.palette' );
69
+
70
+ const instanceId = useInstanceId( ColorPaletteControl );
71
+ const id = `inspector-yith-color-palette-control-${instanceId}`;
72
+
73
+ return (
74
+ <BaseControl
75
+ id={id}
76
+ className={`block-editor-yith-color-palette-control ${className}`}
77
+ help={help}
78
+ >
79
+ <fieldset>
80
+ <legend>
81
+ <div className="block-editor-yith-color-palette-control__color-indicator">
82
+ <BaseControl.VisualLabel>
83
+ <VisualLabel colorValue={value} label={label}/>
84
+ </BaseControl.VisualLabel>
85
+ </div>
86
+ </legend>
87
+
88
+ <ColorPalette
89
+ value={value}
90
+ onChange={onChange}
91
+ colors={palette}
92
+ clearable={clearable}
93
+ />
94
+ </fieldset>
95
+ </BaseControl> );
96
+ }
plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/style 2.scss ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ .block-editor-yith-color-palette-control {
2
+ .block-editor-yith-color-palette-control__color-indicator {
3
+ margin-bottom: 12px;
4
+ }
5
+
6
+ .component-color-indicator{
7
+ vertical-align: text-bottom;
8
+ }
9
+ }
plugin-fw/includes/builders/gutenberg/src/components/color-palette-control/style.scss ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ .block-editor-yith-color-palette-control {
2
+ .block-editor-yith-color-palette-control__color-indicator {
3
+ margin-bottom: 12px;
4
+ }
5
+
6
+ .component-color-indicator{
7
+ vertical-align: text-bottom;
8
+ }
9
+ }
plugin-fw/includes/builders/gutenberg/src/components/color-picker-control/index 2.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Color Picker Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React from 'react';
9
+
10
+ /**
11
+ * WordPress dependencies
12
+ */
13
+ import { BaseControl, ColorPicker } from '@wordpress/components';
14
+ import { useInstanceId } from '@wordpress/compose';
15
+
16
+ /**
17
+ * Color Picker Control
18
+ *
19
+ * @param {string} className The CSS class name.
20
+ * @param {string} label The label.
21
+ * @param {function} onChange The function callback fired on value change.
22
+ * @param {string} value The initial value.
23
+ * @param {string} help The help message.
24
+ * @param {bool} disableAlpha Set true to disable the alpha
25
+ * @returns {ColorPickerControl}
26
+ * @constructor
27
+ */
28
+ export default function ColorPickerControl( {
29
+ className,
30
+ label,
31
+ onChange,
32
+ value,
33
+ help,
34
+ disableAlpha,
35
+ } ) {
36
+
37
+ const instanceId = useInstanceId( ColorPickerControl );
38
+ const id = `inspector-yith-color-picker-control-${instanceId}`;
39
+
40
+ return (
41
+ <BaseControl
42
+ id={id}
43
+ label={label}
44
+ className={`block-editor-yith-color-control ${className}`}
45
+ help={help}
46
+ >
47
+ <ColorPicker
48
+ color={value}
49
+ disableAlpha={disableAlpha}
50
+ onChangeComplete={onChange}
51
+ />
52
+ </BaseControl> );
53
+ }
plugin-fw/includes/builders/gutenberg/src/components/color-picker-control/index.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Color Picker Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React from 'react';
9
+
10
+ /**
11
+ * WordPress dependencies
12
+ */
13
+ import { BaseControl, ColorPicker } from '@wordpress/components';
14
+ import { useInstanceId } from '@wordpress/compose';
15
+
16
+ /**
17
+ * Color Picker Control
18
+ *
19
+ * @param {string} className The CSS class name.
20
+ * @param {string} label The label.
21
+ * @param {function} onChange The function callback fired on value change.
22
+ * @param {string} value The initial value.
23
+ * @param {string} help The help message.
24
+ * @param {bool} disableAlpha Set true to disable the alpha
25
+ * @returns {ColorPickerControl}
26
+ * @constructor
27
+ */
28
+ export default function ColorPickerControl( {
29
+ className,
30
+ label,
31
+ onChange,
32
+ value,
33
+ help,
34
+ disableAlpha,
35
+ } ) {
36
+
37
+ const instanceId = useInstanceId( ColorPickerControl );
38
+ const id = `inspector-yith-color-picker-control-${instanceId}`;
39
+
40
+ return (
41
+ <BaseControl
42
+ id={id}
43
+ label={label}
44
+ className={`block-editor-yith-color-control ${className}`}
45
+ help={help}
46
+ >
47
+ <ColorPicker
48
+ color={value}
49
+ disableAlpha={disableAlpha}
50
+ onChangeComplete={onChange}
51
+ />
52
+ </BaseControl> );
53
+ }
plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/index 2.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { BaseControl } from '@wordpress/components';
10
+ import { useInstanceId } from '@wordpress/compose';
11
+ import MultipleSelect from './multiple-select';
12
+
13
+ import './style.scss';
14
+
15
+ /**
16
+ * Color Picker Control
17
+ *
18
+ * @param {string} className The CSS class name.
19
+ * @param {string} label The label.
20
+ * @param {function} onChange The function callback fired on value change.
21
+ * @param {string} value The initial value.
22
+ * @param {string} help The help message.
23
+ * @param {bool} disableAlpha Set true to disable the alpha
24
+ * @returns {MultipleSelectControl}
25
+ * @constructor
26
+ */
27
+ export default function MultipleSelectControl(
28
+ {
29
+ className,
30
+ label,
31
+ onChange,
32
+ value,
33
+ help,
34
+ options,
35
+ messages
36
+ }
37
+ ) {
38
+
39
+ const instanceId = useInstanceId( MultipleSelectControl );
40
+ const id = `inspector-yith-multiple-select-control-${instanceId}`;
41
+
42
+ return <BaseControl
43
+ id={id}
44
+ label={label}
45
+ className={`block-editor-yith-multiple-select-control ${className}`}
46
+ help={help}
47
+ >
48
+ <MultipleSelect
49
+ id={id}
50
+ value={value}
51
+ options={options}
52
+ onChange={onChange}
53
+ messages={messages}
54
+ />
55
+ </BaseControl>
56
+ }
plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/index.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import React from 'react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { BaseControl } from '@wordpress/components';
10
+ import { useInstanceId } from '@wordpress/compose';
11
+ import MultipleSelect from './multiple-select';
12
+
13
+ import './style.scss';
14
+
15
+ /**
16
+ * Color Picker Control
17
+ *
18
+ * @param {string} className The CSS class name.
19
+ * @param {string} label The label.
20
+ * @param {function} onChange The function callback fired on value change.
21
+ * @param {string} value The initial value.
22
+ * @param {string} help The help message.
23
+ * @param {bool} disableAlpha Set true to disable the alpha
24
+ * @returns {MultipleSelectControl}
25
+ * @constructor
26
+ */
27
+ export default function MultipleSelectControl(
28
+ {
29
+ className,
30
+ label,
31
+ onChange,
32
+ value,
33
+ help,
34
+ options,
35
+ messages
36
+ }
37
+ ) {
38
+
39
+ const instanceId = useInstanceId( MultipleSelectControl );
40
+ const id = `inspector-yith-multiple-select-control-${instanceId}`;
41
+
42
+ return <BaseControl
43
+ id={id}
44
+ label={label}
45
+ className={`block-editor-yith-multiple-select-control ${className}`}
46
+ help={help}
47
+ >
48
+ <MultipleSelect
49
+ id={id}
50
+ value={value}
51
+ options={options}
52
+ onChange={onChange}
53
+ messages={messages}
54
+ />
55
+ </BaseControl>
56
+ }
plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/multiple-select.js ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import classNames from 'classnames';
2
+ import noop from 'lodash';
3
+ import PropTypes from 'prop-types';
4
+ import { useState, useEffect, useRef, useMemo } from 'react';
5
+
6
+ import { __, sprintf } from '@wordpress/i18n';
7
+ import { useInstanceId } from '@wordpress/compose';
8
+ import { Popover } from '@wordpress/components';
9
+
10
+ import MultipleSelectControl from './index';
11
+
12
+ const defaultMessages = {
13
+ noItems : __( 'No items found.', 'yith-plugin-fw' ),
14
+ noResults: __( 'No results for "%s"', 'yith-plugin-fw' ),
15
+ search : __( 'Search for items...', 'yith-plugin-fw' )
16
+ };
17
+
18
+ function useUniqueId( idProp ) {
19
+ const instanceId = useInstanceId( MultipleSelectControl );
20
+ const id = `inspector-yith-multiple-select-control-${instanceId}`;
21
+
22
+ return idProp || id;
23
+ }
24
+
25
+ export default function MultipleSelect( { id: idProp, value, options, onChange, messages: messagesProp } ) {
26
+ const [search, setSearch] = useState( '' );
27
+ const [showSuggesions, setShowSuggestions] = useState( false );
28
+ const [width, setWidth] = useState( 248 );
29
+ const messages = { ...defaultMessages, ...messagesProp };
30
+ const wrapperRef = useRef();
31
+ const inputRef = useRef();
32
+ const inputContainerRef = useRef();
33
+ const popoverRef = useRef();
34
+ const suggestionsRef = useRef();
35
+
36
+ const classes = classNames(
37
+ 'yith-fw-components__multiple-select'
38
+ );
39
+
40
+ const allowedValues = useMemo( () => options.map( _ => _.value ), [options] );
41
+ const validValues = useMemo( () => value.filter( _ => allowedValues.includes( _ ) ), [value, allowedValues] );
42
+ const filteredOptions = useMemo( () => options.filter( ( _ ) => _.label.toLowerCase().indexOf( search.toLowerCase() ) >= 0 ), [options, search] );
43
+ const selected = useMemo( () => options.filter( ( _ ) => validValues.includes( _.value ) ), [options, validValues] );
44
+
45
+ const addItem = itemValue => {
46
+ onChange( [...validValues, itemValue] );
47
+ setSearch( '' );
48
+ };
49
+ const removeItem = ( itemValue ) => {
50
+ const newSelected = [...validValues].filter( _ => _ !== itemValue );
51
+ onChange( newSelected );
52
+ };
53
+ const focusInput = () => !!inputRef.current && inputRef.current.focus();
54
+
55
+ const handleClickOutside = e => {
56
+ const isWrapperClick = wrapperRef?.current && wrapperRef.current.contains( e.target );
57
+ const isPopoverClick = popoverRef?.current && popoverRef.current.contains( e.target );
58
+ if ( !isWrapperClick && !isPopoverClick ) {
59
+ setShowSuggestions( false );
60
+ }
61
+ };
62
+
63
+ const handleInputContainerClick = e => {
64
+ const isInputContainerClick = inputContainerRef?.current && inputContainerRef.current === e.target;
65
+ if ( isInputContainerClick ) {
66
+ focusInput();
67
+ }
68
+ };
69
+
70
+ useEffect( () => {
71
+ document.addEventListener( 'mousedown', handleClickOutside );
72
+ return () => document.removeEventListener( 'mousedown', handleClickOutside );
73
+ } );
74
+
75
+ useEffect( () => {
76
+ const refresh = () => {
77
+ if ( !wrapperRef.current ) {
78
+ return;
79
+ }
80
+
81
+ const width = wrapperRef.current.getBoundingClientRect()?.width;
82
+ setWidth( width );
83
+ };
84
+
85
+ refresh();
86
+ }, [] );
87
+
88
+ return <div className={classes} ref={wrapperRef}>
89
+ <div className="yith-fw-components__multiple-select__input-container" ref={inputContainerRef} onClick={handleInputContainerClick}>
90
+ {selected.map( item => {
91
+ return <span key={item.value} className="yith-fw-components__multiple-select__item">
92
+ <span className="yith-fw-components__multiple-select__item__label">{item.label}</span>
93
+ <i
94
+ className="yith-fw-components__multiple-select__item__remove yith-icon-close-alt"
95
+ onClick={() => {
96
+ removeItem( item.value );
97
+ setShowSuggestions( false );
98
+ }}
99
+ />
100
+ </span>
101
+ } )}
102
+ <input
103
+ className="yith-fw-components__multiple-select__input"
104
+ id={useUniqueId( idProp )}
105
+ ref={inputRef}
106
+ type="text"
107
+ autoComplete="off"
108
+ placeholder={messages.search}
109
+ onFocus={() => setShowSuggestions( true )}
110
+ value={search}
111
+ onChange={( e ) => setSearch( e.target.value )}
112
+ />
113
+ </div>
114
+ {showSuggesions && <Popover
115
+ className="yith-fw-components__multiple-select__popover"
116
+ position="bottom"
117
+ offset={20}
118
+ anchorRef={wrapperRef?.current ?? undefined}
119
+ anchorRect={wrapperRef?.current && wrapperRef?.current.getBoundingClientRect()}
120
+ focusOnMount={false}
121
+ ref={popoverRef}
122
+ >
123
+ <div
124
+ className={classNames( 'yith-fw-components__multiple-select__suggestions', !filteredOptions.length && 'no-results' )}
125
+ ref={suggestionsRef}
126
+ style={{ width }}
127
+ >
128
+ {!!options.length && !!filteredOptions.length ?
129
+ (
130
+ filteredOptions.map(
131
+ item => {
132
+ const isSelected = validValues.includes( item.value );
133
+
134
+ return <div
135
+ key={item.value}
136
+ className={classNames( 'yith-fw-components__multiple-select__suggestion', isSelected && 'selected' )}
137
+ onClick={() => {
138
+ if ( !isSelected ) {
139
+ addItem( item.value );
140
+ focusInput();
141
+ }
142
+ }}
143
+ >
144
+ <div className="yith-fw-components__multiple-select__suggestion__label">{item.label}</div>
145
+ {isSelected && <i
146
+ className="yith-fw-components__multiple-select__suggestion__remove yith-icon yith-icon-close-alt"
147
+ onClick={() => {
148
+ removeItem( item.value );
149
+ focusInput();
150
+ }}/>}
151
+ </div>
152
+ }
153
+ )
154
+ ) :
155
+ <div className="yith-fw-components__multiple-select__suggestions__message">
156
+ {!options.length || !search ? messages.noItems : sprintf( messages.noResults, search )}
157
+ </div>
158
+ }
159
+ </div>
160
+ </Popover>}
161
+ </div>
162
+ }
163
+
164
+ MultipleSelect.propTypes = {
165
+ id : PropTypes.string,
166
+ className: PropTypes.string,
167
+ value : PropTypes.array,
168
+ options : PropTypes.arrayOf(
169
+ PropTypes.shape(
170
+ {
171
+ label: PropTypes.string,
172
+ value: PropTypes.oneOfType( [PropTypes.string, PropTypes.number] )
173
+ }
174
+ )
175
+ ),
176
+ onChange : PropTypes.func
177
+
178
+ };
179
+
180
+ MultipleSelect.defaultProps = {
181
+ id : '',
182
+ value : [],
183
+ className: '',
184
+ options : [],
185
+ onChange : noop
186
+ };
plugin-fw/includes/builders/gutenberg/src/components/multiple-select-control/style.scss ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .yith-fw-components__multiple-select {
2
+ .yith-fw-components__multiple-select__input-container {
3
+ border-radius : 2px;
4
+ border : 1px solid #757575;
5
+ padding : 5px;
6
+
7
+ .yith-fw-components__multiple-select__input {
8
+ border : 0;
9
+ min-height : 24px;
10
+ width : 100%;
11
+ background : inherit;
12
+ color : #1e1e1e;
13
+ box-shadow : none;
14
+
15
+ &::placeholder {
16
+ opacity : .6;
17
+ color : inherit;
18
+ }
19
+ }
20
+ }
21
+
22
+ .yith-fw-components__multiple-select__item {
23
+ border-radius : 3px;
24
+ background : #f1f1f1;
25
+ display : inline-block;
26
+ padding : 4px 25px 4px 10px;
27
+ margin : 0 5px 5px 0;
28
+ max-width : 100%;
29
+ align-items : center;
30
+ position : relative;
31
+
32
+ .yith-fw-components__multiple-select__item__label {
33
+
34
+ }
35
+
36
+ .yith-fw-components__multiple-select__item__remove {
37
+ font-size : 14px;
38
+ cursor : pointer;
39
+ position : absolute;
40
+ top : 50%;
41
+ right : 3px;
42
+ transform : translateY(-50%);
43
+ padding : 5px;
44
+ width : auto;
45
+ height : auto;
46
+
47
+ &:hover {
48
+ color : #c50c0c;
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ .yith-fw-components__multiple-select__popover {
55
+ .components-popover__content {
56
+ border : 0;
57
+ overflow : visible;
58
+ }
59
+
60
+ .yith-fw-components__multiple-select__suggestions {
61
+ display : flex;
62
+ flex-direction : column;
63
+ overflow : hidden;
64
+ overflow-y : auto;
65
+ padding-top : 5px;
66
+ max-height : 200px;
67
+ border-radius : 5px;
68
+ box-shadow : rgb(0 0 0 / 20%) 0px 5px 5px -3px, rgb(0 0 0 / 14%) 0px 8px 10px 1px, rgb(0 0 0 / 12%) 0px 3px 14px 2px;
69
+
70
+ &.no-results {
71
+ padding-top : 0;
72
+ }
73
+
74
+ .yith-fw-components__multiple-select__suggestions__message {
75
+ padding : 8px 15px;
76
+ line-height : 1.5em;
77
+ overflow-wrap : break-word;
78
+ }
79
+
80
+ .yith-fw-components__multiple-select__suggestion {
81
+ padding : 8px 15px;
82
+ min-height : 40px;
83
+ cursor : pointer;
84
+ line-height : 1.5em;
85
+ display : flex;
86
+ align-items : center;
87
+ justify-content : space-between;
88
+
89
+ &.selected {
90
+ background : rgba(25, 118, 210, 0.08);
91
+ }
92
+
93
+ &:hover {
94
+ background : rgba(0, 0, 0, 0.04);
95
+ }
96
+
97
+ &.selected:hover {
98
+ background : rgba(25, 118, 210, 0.12);
99
+ }
100
+ }
101
+
102
+ .yith-fw-components__multiple-select__suggestion__remove {
103
+ font-size : 13px;
104
+ font-weight : 600;
105
+ padding : 5px;
106
+ height : 23px;
107
+ width : 23px;
108
+ background : rgba(0, 0, 0, 0);
109
+ box-shadow : 0 0 0 10px rgba(0, 0, 0, 0);
110
+ border-radius : 50%;
111
+ transition : all .3s ease-in-out;
112
+
113
+ &:hover {
114
+ color : #c50c0c;
115
+ background : rgba(0, 0, 0, .06);
116
+ box-shadow : 0 0 0 3px rgba(0, 0, 0, .06);
117
+ }
118
+ }
119
+ }
120
+
121
+ ::-webkit-scrollbar-track {
122
+ -webkit-box-shadow : none;
123
+ background-color : transparent;
124
+ }
125
+
126
+ ::-webkit-scrollbar {
127
+ width : 10px;
128
+ background-color : rgba(94, 88, 154, 0.04);
129
+ }
130
+
131
+ ::-webkit-scrollbar-thumb {
132
+ background-color : #b1b4bf;
133
+ border-radius : 10px;
134
+ }
135
+ }
plugin-fw/includes/builders/gutenberg/src/components/shortcode/index 2.js ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Shortcode Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React, { Component } from 'react';
9
+ import { isEqual } from 'lodash';
10
+
11
+ /**
12
+ * WordPress dependencies
13
+ */
14
+ import { RawHTML } from '@wordpress/element';
15
+ import { Spinner } from '@wordpress/components';
16
+ import { doAction, addAction } from '@wordpress/hooks';
17
+
18
+ /**
19
+ * Internal dependencies
20
+ */
21
+ import { ajaxFetch, generateShortcode, yith_icon } from '../../common';
22
+ import md5 from 'md5';
23
+ import './style.scss';
24
+
25
+ const BEFORE_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_before_do_shortcode';
26
+ const SUCCESS_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_success_do_shortcode';
27
+ const AFTER_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_after_do_shortcode';
28
+
29
+ /**
30
+ * Shortcode Component
31
+ */
32
+ export class Shortcode extends Component {
33
+ constructor() {
34
+ super( ...arguments );
35
+
36
+ this.state = {
37
+ html : '',
38
+ shortcode : '',
39
+ shortcodeHash: '',
40
+ ajaxUpdated : false,
41
+ ajaxSuccess : false,
42
+ ajaxResponse : false,
43
+ loading : false,
44
+ firstLoading : true
45
+ };
46
+
47
+ this.ajaxTimeout = false;
48
+ }
49
+
50
+ componentDidMount() {
51
+ this.updateShortcode();
52
+ }
53
+
54
+ componentDidUpdate( prevProps, prevState, snapshot ) {
55
+ const { shortcode, shortcodeHash, ajaxSuccess, ajaxResponse, ajaxUpdated } = this.state;
56
+
57
+ if ( !isEqual( prevProps, this.props ) ) {
58
+ this.updateShortcode();
59
+ }
60
+
61
+
62
+ if ( this.props.blockArgs.do_shortcode && ajaxUpdated ) {
63
+
64
+ if ( ajaxSuccess ) {
65
+ doAction( SUCCESS_DO_SHORTCODE_ACTION, shortcode, shortcodeHash, ajaxResponse );
66
+ }
67
+
68
+ doAction( AFTER_DO_SHORTCODE_ACTION, shortcode, shortcodeHash, ajaxResponse );
69
+
70
+ this.setState( { ajaxUpdated: false } );
71
+ }
72
+ }
73
+
74
+ updateShortcode() {
75
+ const { attributes, blockArgs } = this.props;
76
+
77
+ this.setState( { loading: true, ajaxSuccess: false, ajaxResponse: false } );
78
+
79
+ const shortcode = generateShortcode( blockArgs, attributes );
80
+ const shortcodeHash = md5( shortcode );
81
+
82
+ if ( blockArgs.do_shortcode ) {
83
+ !!this.ajaxTimeout && clearTimeout( this.ajaxTimeout );
84
+
85
+ doAction( BEFORE_DO_SHORTCODE_ACTION, shortcode, shortcodeHash );
86
+
87
+ this.ajaxTimeout = setTimeout( () => {
88
+ const ajaxData = {
89
+ action : 'yith_plugin_fw_gutenberg_do_shortcode',
90
+ shortcode: shortcode,
91
+ context : { ...( this.props.context ?? {} ), adminPage: window?.adminpage ?? '' }
92
+ };
93
+
94
+ ajaxFetch( ajaxData ).then( response => {
95
+ this.setState( { loading: false, firstLoading: false, html: response.html, shortcode, shortcodeHash, ajaxSuccess: true, ajaxUpdated: true, ajaxResponse: response } );
96
+ } )
97
+ .catch( error => {
98
+ console.log( { error } );
99
+ } );
100
+ }, 300 );
101
+ } else {
102
+ this.setState( { loading: false, firstLoading: false, html: shortcode, shortcode, shortcodeHash } );
103
+ }
104
+ }
105
+
106
+ render() {
107
+ const { html, loading, firstLoading, shortcode, shortcodeHash } = this.state;
108
+ const { blockArgs } = this.props;
109
+ const { do_shortcode, title, empty_message } = blockArgs;
110
+
111
+ const mainClass = 'block-editor-yith-plugin-fw-shortcode-block';
112
+
113
+ let wrapperClasses = [mainClass];
114
+ let type = do_shortcode ? 'html' : 'shortcode';
115
+ let htmlToShow = html;
116
+ let message = '';
117
+
118
+ if ( firstLoading && loading ) {
119
+ type = 'first-loading';
120
+ } else if ( do_shortcode && !html ) {
121
+ type = 'empty-html';
122
+ htmlToShow = shortcode;
123
+ if ( !loading && empty_message ) {
124
+ message = empty_message;
125
+ }
126
+ }
127
+
128
+ const showTitle = ['first-loading', 'empty-html', 'shortcode'].includes( type );
129
+ const showContent = !['first-loading', 'empty-html'].includes( type );
130
+ const showMessage = !!message;
131
+
132
+ wrapperClasses.push( `${mainClass}--${type}` );
133
+ wrapperClasses.push( showMessage ? `${mainClass}--has-message` : `${mainClass}--no-message` );
134
+ wrapperClasses.push( `yith_block_${shortcodeHash}` );
135
+
136
+ return (
137
+ <>
138
+ <div className={wrapperClasses.join( ' ' )}>
139
+ {!!loading ? <div className={`${mainClass}__spinner-wrap`}><Spinner/></div> : ''}
140
+ {showTitle &&
141
+ <div className={`${mainClass}__title components-placeholder__label`}>{yith_icon}{title}</div>
142
+ }
143
+ {showMessage &&
144
+ <RawHTML className={`${mainClass}__message`}>{message}</RawHTML>
145
+ }
146
+ {showContent &&
147
+ <RawHTML className={`${mainClass}__content`}>{htmlToShow}</RawHTML>
148
+ }
149
+ </div>
150
+ </>
151
+ )
152
+ }
153
+ }
plugin-fw/includes/builders/gutenberg/src/components/shortcode/index.js ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Shortcode Component
3
+ */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import React, { Component } from 'react';
9
+ import { isEqual } from 'lodash';
10
+
11
+ /**
12
+ * WordPress dependencies
13
+ */
14
+ import { RawHTML } from '@wordpress/element';
15
+ import { Spinner } from '@wordpress/components';
16
+ import { doAction, addAction } from '@wordpress/hooks';
17
+
18
+ /**
19
+ * Internal dependencies
20
+ */
21
+ import { ajaxFetch, generateShortcode, yith_icon } from '../../common';
22
+ import md5 from 'md5';
23
+ import './style.scss';
24
+
25
+ const BEFORE_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_before_do_shortcode';
26
+ const SUCCESS_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_success_do_shortcode';
27
+ const AFTER_DO_SHORTCODE_ACTION = 'yith_plugin_fw_gutenberg_after_do_shortcode';
28
+
29
+ /**
30
+ * Shortcode Component
31
+ */
32
+ export class Shortcode extends Component {
33
+ constructor() {
34
+ super( ...arguments );
35
+
36
+ this.state = {
37
+ html : '',
38
+ shortcode : '',
39
+ shortcodeHash: '',
40
+ ajaxUpdated : false,
41
+ ajaxSuccess : false,
42
+ ajaxResponse : false,
43
+ loading : false,
44
+ firstLoading : true
45
+ };
46
+
47
+ this.ajaxTimeout = false;
48
+ }
49
+
50
+ componentDidMount() {
51
+ this.updateShortcode();
52
+ }
53
+
54
+ componentDidUpdate( prevProps, prevState, snapshot ) {
55
+ const { shortcode, shortcodeHash, ajaxSuccess, ajaxResponse, ajaxUpdated } = this.state;
56
+
57
+ if ( !isEqual( prevProps, this.props ) ) {
58
+ this.updateShortcode();
59
+ }
60
+
61
+
62
+ if ( this.props.blockArgs.do_shortcode && ajaxUpdated ) {
63
+
64
+ if ( ajaxSuccess ) {
65
+ doAction( SUCCESS_DO_SHORTCODE_ACTION, shortcode, shortcodeHash, ajaxResponse );
66
+ }
67
+
68
+ doAction( AFTER_DO_SHORTCODE_ACTION, shortcode, shortcodeHash, ajaxResponse );
69
+
70
+ this.setState( { ajaxUpdated: false } );
71
+ }
72
+ }
73
+
74
+ updateShortcode() {
75
+ const { attributes, blockArgs } = this.props;
76
+
77
+ this.setState( { loading: true, ajaxSuccess: false, ajaxResponse: false } );
78
+
79
+ const shortcode = generateShortcode( blockArgs, attributes );
80
+ const shortcodeHash = md5( shortcode );
81
+
82
+ if ( blockArgs.do_shortcode ) {
83
+ !!this.ajaxTimeout && clearTimeout( this.ajaxTimeout );
84
+
85
+ doAction( BEFORE_DO_SHORTCODE_ACTION, shortcode, shortcodeHash );
86
+
87
+ this.ajaxTimeout = setTimeout( () => {
88
+ const ajaxData = {
89
+ action : 'yith_plugin_fw_gutenberg_do_shortcode',
90
+ shortcode: shortcode,
91
+ context : { ...( this.props.context ?? {} ), adminPage: window?.adminpage ?? '' }
92
+ };
93
+
94
+ ajaxFetch( ajaxData ).then( response => {
95
+ this.setState( { loading: false, firstLoading: false, html: response.html, shortcode, shortcodeHash, ajaxSuccess: true, ajaxUpdated: true, ajaxResponse: response } );
96
+ } )
97
+ .catch( error => {
98
+ console.log( { error } );
99
+ } );
100
+ }, 300 );
101
+ } else {
102
+ this.setState( { loading: false, firstLoading: false, html: shortcode, shortcode, shortcodeHash } );
103
+ }
104
+ }
105
+
106
+ render() {
107
+ const { html, loading, firstLoading, shortcode, shortcodeHash } = this.state;
108
+ const { blockArgs } = this.props;
109
+ const { do_shortcode, title, empty_message } = blockArgs;
110
+
111
+ const mainClass = 'block-editor-yith-plugin-fw-shortcode-block';
112
+
113
+ let wrapperClasses = [mainClass];
114
+ let type = do_shortcode ? 'html' : 'shortcode';
115
+ let htmlToShow = html;
116
+ let message = '';
117
+
118
+ if ( firstLoading && loading ) {
119
+ type = 'first-loading';
120
+ } else if ( do_shortcode && !html ) {
121
+ type = 'empty-html';
122
+ htmlToShow = shortcode;
123
+ if ( !loading && empty_message ) {
124
+ message = empty_message;
125
+ }
126
+ }
127
+
128
+ const showTitle = ['first-loading', 'empty-html', 'shortcode'].includes( type );
129
+ const showContent = !['first-loading', 'empty-html'].includes( type );
130
+ const showMessage = !!message;
131
+
132
+ wrapperClasses.push( `${mainClass}--${type}` );
133
+ wrapperClasses.push( showMessage ? `${mainClass}--has-message` : `${mainClass}--no-message` );
134
+ wrapperClasses.push( `yith_block_${shortcodeHash}` );
135
+
136
+ return (
137
+ <>
138
+ <div className={wrapperClasses.join( ' ' )}>
139
+ {!!loading ? <div className={`${mainClass}__spinner-wrap`}><Spinner/></div> : ''}
140
+ {showTitle &&
141
+ <div className={`${mainClass}__title components-placeholder__label`}>{yith_icon}{title}</div>
142
+ }
143
+ {showMessage &&
144
+ <RawHTML className={`${mainClass}__message`}>{message}</RawHTML>
145
+ }
146
+ {showContent &&
147
+ <RawHTML className={`${mainClass}__content`}>{htmlToShow}</RawHTML>
148
+ }
149
+ </div>
150
+ </>
151
+ )
152
+ }
153
+ }
plugin-fw/includes/builders/gutenberg/src/components/shortcode/style 2.scss ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ %bordered-block {
2
+ padding: 1em 1em 1.2em;
3
+ border: 1px solid #1e1e1e;
4
+ border-radius: 4px;
5
+ }
6
+
7
+ %shortcode-box {
8
+ font-family: Menlo, Consolas, monaco, monospace;
9
+ color: #1e1e1e;
10
+ font-size: 13px;
11
+ padding: 0.8em 1em;
12
+ border: 1px solid #ddd;
13
+ border-radius: 4px;
14
+ }
15
+
16
+ .block-editor-yith-plugin-fw-shortcode-block {
17
+ position: relative;
18
+ min-height: 30px;
19
+
20
+ .block-editor-yith-plugin-fw-shortcode-block__spinner-wrap {
21
+ position: absolute;
22
+ top: 50%;
23
+ left: 50%;
24
+ transform: translateX(-50%) translateY(-50%);
25
+ }
26
+
27
+ &.block-editor-yith-plugin-fw-shortcode-block--first-loading{
28
+ @extend %bordered-block;
29
+
30
+ .block-editor-yith-plugin-fw-shortcode-block__title {
31
+ margin-bottom: 0;
32
+ }
33
+ }
34
+
35
+ &.block-editor-yith-plugin-fw-shortcode-block--shortcode {
36
+
37
+ @extend %bordered-block;
38
+
39
+ .block-editor-yith-plugin-fw-shortcode-block__content {
40
+ @extend %shortcode-box;
41
+ }
42
+ }
43
+
44
+ &.block-editor-yith-plugin-fw-shortcode-block--empty-html {
45
+
46
+ @extend %bordered-block;
47
+
48
+ &.block-editor-yith-plugin-fw-shortcode-block--no-message {
49
+ .block-editor-yith-plugin-fw-shortcode-block__title {
50
+ margin-bottom: 0;
51
+ }
52
+ }
53
+
54
+ .block-editor-yith-plugin-fw-shortcode-block__message {
55
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
56
+ font-style: italic;
57
+ font-size: 13px;
58
+ }
59
+
60
+ .block-editor-yith-plugin-fw-shortcode-block__content {
61
+ display: none;
62
+ }
63
+ }
64
+ }
plugin-fw/includes/builders/gutenberg/src/components/shortcode/style.scss ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ %bordered-block {
2
+ padding: 1em 1em 1.2em;
3
+ border: 1px solid #1e1e1e;
4
+ border-radius: 4px;
5
+ }
6
+
7
+ %shortcode-box {
8
+ font-family: Menlo, Consolas, monaco, monospace;
9
+ color: #1e1e1e;
10
+ font-size: 13px;
11
+ padding: 0.8em 1em;
12
+ border: 1px solid #ddd;
13
+ border-radius: 4px;
14
+ }
15
+
16
+ .block-editor-yith-plugin-fw-shortcode-block {
17
+ position: relative;
18
+ min-height: 30px;
19
+
20
+ .block-editor-yith-plugin-fw-shortcode-block__spinner-wrap {
21
+ position: absolute;
22
+ top: 50%;
23
+ left: 50%;
24
+ transform: translateX(-50%) translateY(-50%);
25
+ }
26
+
27
+ &.block-editor-yith-plugin-fw-shortcode-block--first-loading{
28
+ @extend %bordered-block;
29
+
30
+ .block-editor-yith-plugin-fw-shortcode-block__title {
31
+ margin-bottom: 0;
32
+ }
33
+ }
34
+
35
+ &.block-editor-yith-plugin-fw-shortcode-block--shortcode {
36
+
37
+ @extend %bordered-block;
38
+
39
+ .block-editor-yith-plugin-fw-shortcode-block__content {
40
+ @extend %shortcode-box;
41
+ }
42
+ }
43
+
44
+ &.block-editor-yith-plugin-fw-shortcode-block--empty-html {
45
+
46
+ @extend %bordered-block;
47
+
48
+ &.block-editor-yith-plugin-fw-shortcode-block--no-message {
49
+ .block-editor-yith-plugin-fw-shortcode-block__title {
50
+ margin-bottom: 0;
51
+ }
52
+ }
53
+
54
+ .block-editor-yith-plugin-fw-shortcode-block__message {
55
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
56
+ font-style: italic;
57
+ font-size: 13px;
58
+ }
59
+
60
+ .block-editor-yith-plugin-fw-shortcode-block__content {
61
+ display: none;
62
+ }
63
+ }
64
+ }
plugin-fw/includes/builders/gutenberg/src/edit 2.js ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Handle YITH Gutenberg Blocks Edit
3
+ *
4
+ * @var {Object} yithGutenbergBlocks The Gutenberg blocks object.
5
+ */
6
+
7
+ /**
8
+ * External dependencies
9
+ */
10
+ import React from 'react';
11
+
12
+ /**
13
+ * WordPress dependencies
14
+ */
15
+ import {
16
+ PanelBody,
17
+ ToggleControl,
18
+ SelectControl,
19
+ TextControl,
20
+ TextareaControl,
21
+ CheckboxControl,
22
+ RangeControl,
23
+ RadioControl
24
+ } from '@wordpress/components';
25
+ import { InspectorControls } from '@wordpress/block-editor';
26
+
27
+ /**
28
+ * Internal dependencies
29
+ */
30
+ import { Shortcode } from './components/shortcode';
31
+ import { checkForDeps } from './common';
32
+ import ColorPickerControl from './components/color-picker-control';
33
+ import ColorPaletteControl from './components/color-palette-control';
34
+ import MultipleSelectControl from './components/multiple-select-control';
35
+ import classNames from 'classnames';
36
+
37
+ /**
38
+ * Retrieve an help message from arguments.
39
+ *
40
+ * @param {Object} args The arguments.
41
+ * @param {bool} value The value.
42
+ * @returns {string}
43
+ */
44
+ const getHelpMessage = ( args, value ) => {
45
+ let helpMessage = '';
46
+ if ( args.helps && args.helps.checked && args.helps.unchecked ) {
47
+ helpMessage = !!value ? args.helps.checked : args.helps.unchecked;
48
+ } else if ( args.help ) {
49
+ helpMessage = args.help;
50
+ }
51
+ return helpMessage;
52
+ };
53
+
54
+ const ComponentControl = ( { attributeName, attributeArgs, attributes, onChange, blockName } ) => {
55
+ const { controlType, label, wrapper_class } = attributeArgs;
56
+ const value = attributes[ attributeName ];
57
+ const helpMessage = getHelpMessage( attributeArgs, value );
58
+ const show = checkForDeps( attributeArgs, attributes );
59
+ const wrapperClass = classNames(
60
+ `${blockName}__${attributeName}-field-wrapper`,
61
+ wrapper_class
62
+ );
63
+
64
+ let componentControl = false;
65
+ if ( show ) {
66
+ switch ( controlType ) {
67
+ case 'select':
68
+ if ( !attributeArgs.multiple ) {
69
+ componentControl = <SelectControl
70
+ className={wrapperClass}
71
+ value={value}
72
+ label={label}
73
+ options={attributeArgs?.options ?? []}
74
+ help={helpMessage}
75
+ onChange={onChange}
76
+ />;
77
+ } else {
78
+ componentControl = <MultipleSelectControl
79
+ className={wrapperClass}
80
+ value={value}
81
+ label={label}
82
+ options={attributeArgs?.options ?? []}
83
+ help={helpMessage}
84
+ onChange={onChange}
85
+ messages={attributeArgs?.messages ?? {}}
86
+ />;
87
+ }
88
+ break;
89
+
90
+ case 'text':
91
+ componentControl = <TextControl
92
+ className={wrapperClass}
93
+ key={attributeName}
94
+ value={value}
95
+ label={label}
96
+ help={helpMessage}
97
+ onChange={onChange}
98
+ />;
99
+ break;
100
+
101
+ case 'textarea':
102
+ componentControl = <TextareaControl
103
+ className={wrapperClass}
104
+ key={attributeName}
105
+ value={value}
106
+ label={label}
107
+ help={helpMessage}
108
+ onChange={onChange}
109
+ />;
110
+ break;
111
+
112
+ case 'toggle':
113
+ componentControl = <ToggleControl
114
+ className={wrapperClass}
115
+ key={attributeName}
116
+ label={label}
117
+ help={helpMessage}
118
+ checked={value}
119
+ onChange={onChange}
120
+ />;
121
+ break;
122
+
123
+ case 'checkbox':
124
+ componentControl = <CheckboxControl
125
+ className={wrapperClass}
126
+ key={attributeName}
127
+ label={label}
128
+ help={helpMessage}
129
+ checked={value}
130
+ onChange={onChange}
131
+ />;
132
+ break;
133
+
134
+ case 'number':
135
+ case 'range':
136
+ componentControl = <RangeControl
137
+ className={wrapperClass}
138
+ key={attributeName}
139
+ value={value}
140
+ label={label}
141
+ help={helpMessage}
142
+ min={attributeArgs?.min}
143
+ max={attributeArgs?.max}
144
+ onChange={onChange}
145
+ />;
146
+ break;
147
+
148
+ case 'color':
149
+ case 'colorpicker':
150
+ componentControl = <ColorPickerControl
151
+ className={wrapperClass}
152
+ key={attributeName}
153
+ label={label}
154
+ help={helpMessage}
155
+ value={value}
156
+ disableAlpha={attributeArgs?.disableAlpha ?? false}
157
+ onChange={onChange}/>;
158
+ break;
159
+
160
+ case 'color-palette':
161
+ componentControl = <ColorPaletteControl
162
+ className={wrapperClass}
163
+ key={attributeName}
164
+ label={label}
165
+ help={helpMessage}
166
+ value={value}
167
+ clearable={attributeArgs?.clearable ?? false}
168
+ onChange={onChange}/>;
169
+ break;
170
+
171
+ case 'radio':
172
+ componentControl = <RadioControl
173
+ key={attributeName}
174
+ label={label}
175
+ options={attributeArgs?.options ?? []}
176
+ selected={value}
177
+ help={helpMessage}
178
+ onChange={onChange}
179
+ />;
180
+ break;
181
+ default:
182
+ componentControl = false;
183
+ }
184
+ }
185
+ return componentControl;
186
+ }
187
+
188
+ /**
189
+ * Create edit function.
190
+ *
191
+ * @param {string} blockName The block name.
192
+ * @param {Object} blockArgs The block arguments.
193
+ * @returns {function({attributes?: *, className: *, setAttributes: *})}
194
+ */
195
+ export const createEditFunction = ( blockName, blockArgs ) => {
196
+ return function ( { context, attributes, className, setAttributes } ) {
197
+
198
+ const onChangeHandler = ( updatedValue, attributeName, controlType ) => {
199
+ if ( ['colorpicker', 'color'].includes( controlType ) ) {
200
+ if ( 'rgb' in updatedValue && 'hex' in updatedValue ) {
201
+ const { r, g, b, a } = updatedValue.rgb;
202
+ updatedValue = a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : updatedValue.hex;
203
+ } else {
204
+ updatedValue = updatedValue.color.getAlpha() < 1 ? updatedValue.color.toRgbString() : updatedValue.color.toHexString();
205
+ }
206
+ }
207
+
208
+ setAttributes( { [ attributeName ]: updatedValue } );
209
+ }
210
+
211
+ return (
212
+ <>
213
+ {!!blockArgs.attributes &&
214
+ <InspectorControls>
215
+ <PanelBody>
216
+ {Object.entries( blockArgs.attributes ).map( ( [attributeName, attributeArgs] ) => {
217
+ const { controlType } = attributeArgs;
218
+ return <ComponentControl
219
+ key={attributeName}
220
+ attributeArgs={attributeArgs}
221
+ attributeName={attributeName}
222
+ attributes={attributes}
223
+ blockName={blockName}
224
+ onChange={_ => onChangeHandler( _, attributeName, controlType )}
225
+ />
226
+ } )}
227
+ </PanelBody>
228
+ </InspectorControls>
229
+ }
230
+ <Shortcode attributes={attributes} blockArgs={blockArgs} context={context}/>
231
+ </>
232
+ );
233
+ }
234
+ }
plugin-fw/includes/builders/gutenberg/src/edit.js ADDED
@@ -0,0 +1,234 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Handle YITH Gutenberg Blocks Edit
3
+ *
4
+ * @var {Object} yithGutenbergBlocks The Gutenberg blocks object.
5
+ */
6
+
7
+ /**
8
+ * External dependencies
9
+ */
10
+ import React from 'react';
11
+
12
+ /**
13
+ * WordPress dependencies
14
+ */
15
+ import {
16
+ PanelBody,
17
+ ToggleControl,
18
+ SelectControl,
19
+ TextControl,
20
+ TextareaControl,
21
+ CheckboxControl,
22
+ RangeControl,
23
+ RadioControl
24
+ } from '@wordpress/components';
25
+ import { InspectorControls } from '@wordpress/block-editor';
26
+
27
+ /**
28
+ * Internal dependencies
29
+ */
30
+ import { Shortcode } from './components/shortcode';
31
+ import { checkForDeps } from './common';
32
+ import ColorPickerControl from './components/color-picker-control';
33
+ import ColorPaletteControl from './components/color-palette-control';
34
+ import MultipleSelectControl from './components/multiple-select-control';
35
+ import classNames from 'classnames';
36
+
37
+ /**
38
+ * Retrieve an help message from arguments.
39
+ *
40
+ * @param {Object} args The arguments.
41
+ * @param {bool} value The value.
42
+ * @returns {string}
43
+ */
44
+ const getHelpMessage = ( args, value ) => {
45
+ let helpMessage = '';
46
+ if ( args.helps && args.helps.checked && args.helps.unchecked ) {
47
+ helpMessage = !!value ? args.helps.checked : args.helps.unchecked;
48
+ } else if ( args.help ) {
49
+ helpMessage = args.help;
50
+ }
51
+ return helpMessage;
52
+ };
53
+
54
+ const ComponentControl = ( { attributeName, attributeArgs, attributes, onChange, blockName } ) => {
55
+ const { controlType, label, wrapper_class } = attributeArgs;
56
+ const value = attributes[ attributeName ];
57
+ const helpMessage = getHelpMessage( attributeArgs, value );
58
+ const show = checkForDeps( attributeArgs, attributes );
59
+ const wrapperClass = classNames(
60
+ `${blockName}__${attributeName}-field-wrapper`,
61
+ wrapper_class
62
+ );
63
+
64
+ let componentControl = false;
65
+ if ( show ) {
66
+ switch ( controlType ) {
67
+ case 'select':
68
+ if ( !attributeArgs.multiple ) {
69
+ componentControl = <SelectControl
70
+ className={wrapperClass}
71
+ value={value}
72
+ label={label}
73
+ options={attributeArgs?.options ?? []}
74
+ help={helpMessage}
75
+ onChange={onChange}
76
+ />;
77
+ } else {
78
+ componentControl = <MultipleSelectControl
79
+ className={wrapperClass}
80
+ value={value}
81
+ label={label}
82
+ options={attributeArgs?.options ?? []}
83
+ help={helpMessage}
84
+ onChange={onChange}
85
+ messages={attributeArgs?.messages ?? {}}
86
+ />;
87
+ }
88
+ break;
89
+
90
+ case 'text':
91
+ componentControl = <TextControl
92
+ className={wrapperClass}
93
+ key={attributeName}
94
+ value={value}
95
+ label={label}
96
+ help={helpMessage}
97
+ onChange={onChange}
98
+ />;
99
+ break;
100
+
101
+ case 'textarea':
102
+ componentControl = <TextareaControl
103
+ className={wrapperClass}
104
+ key={attributeName}
105
+ value={value}
106
+ label={label}
107
+ help={helpMessage}
108
+ onChange={onChange}
109
+ />;
110
+ break;
111
+
112
+ case 'toggle':
113
+ componentControl = <ToggleControl
114
+ className={wrapperClass}
115
+ key={attributeName}
116
+ label={label}
117
+ help={helpMessage}
118
+ checked={value}
119
+ onChange={onChange}
120
+ />;
121
+ break;
122
+
123
+ case 'checkbox':
124
+ componentControl = <CheckboxControl
125
+ className={wrapperClass}
126
+ key={attributeName}
127
+ label={label}
128
+ help={helpMessage}
129
+ checked={value}
130
+ onChange={onChange}
131
+ />;
132
+ break;
133
+
134
+ case 'number':
135
+ case 'range':
136
+ componentControl = <RangeControl
137
+ className={wrapperClass}
138
+ key={attributeName}
139
+ value={value}
140
+ label={label}
141
+ help={helpMessage}
142
+ min={attributeArgs?.min}
143
+ max={attributeArgs?.max}
144
+ onChange={onChange}
145
+ />;
146
+ break;
147
+
148
+ case 'color':
149
+ case 'colorpicker':
150
+ componentControl = <ColorPickerControl
151
+ className={wrapperClass}
152
+ key={attributeName}
153
+ label={label}
154
+ help={helpMessage}
155
+ value={value}
156
+ disableAlpha={attributeArgs?.disableAlpha ?? false}
157
+ onChange={onChange}/>;
158
+ break;
159
+
160
+ case 'color-palette':
161
+ componentControl = <ColorPaletteControl
162
+ className={wrapperClass}
163
+ key={attributeName}
164
+ label={label}
165
+ help={helpMessage}
166
+ value={value}
167
+ clearable={attributeArgs?.clearable ?? false}
168
+ onChange={onChange}/>;
169
+ break;
170
+
171
+ case 'radio':
172
+ componentControl = <RadioControl
173
+ key={attributeName}
174
+ label={label}
175
+ options={attributeArgs?.options ?? []}
176
+ selected={value}
177
+ help={helpMessage}
178
+ onChange={onChange}
179
+ />;
180
+ break;
181
+ default:
182
+ componentControl = false;
183
+ }
184
+ }
185
+ return componentControl;
186
+ }
187
+
188
+ /**
189
+ * Create edit function.
190
+ *
191
+ * @param {string} blockName The block name.
192
+ * @param {Object} blockArgs The block arguments.
193
+ * @returns {function({attributes?: *, className: *, setAttributes: *})}
194
+ */
195
+ export const createEditFunction = ( blockName, blockArgs ) => {
196
+ return function ( { context, attributes, className, setAttributes } ) {
197
+
198
+ const onChangeHandler = ( updatedValue, attributeName, controlType ) => {
199
+ if ( ['colorpicker', 'color'].includes( controlType ) ) {
200
+ if ( 'rgb' in updatedValue && 'hex' in updatedValue ) {
201
+ const { r, g, b, a } = updatedValue.rgb;
202
+ updatedValue = a < 1 ? `rgba(${r}, ${g}, ${b}, ${a})` : updatedValue.hex;
203
+ } else {
204
+ updatedValue = updatedValue.color.getAlpha() < 1 ? updatedValue.color.toRgbString() : updatedValue.color.toHexString();
205
+ }
206
+ }
207
+
208
+ setAttributes( { [ attributeName ]: updatedValue } );
209
+ }
210
+
211
+ return (
212
+ <>
213
+ {!!blockArgs.attributes &&
214
+ <InspectorControls>
215
+ <PanelBody>
216
+ {Object.entries( blockArgs.attributes ).map( ( [attributeName, attributeArgs] ) => {
217
+ const { controlType } = attributeArgs;
218
+ return <ComponentControl
219
+ key={attributeName}
220
+ attributeArgs={attributeArgs}
221
+ attributeName={attributeName}
222
+ attributes={attributes}
223
+ blockName={blockName}
224
+ onChange={_ => onChangeHandler( _, attributeName, controlType )}
225
+ />
226
+ } )}
227
+ </PanelBody>
228
+ </InspectorControls>
229
+ }
230
+ <Shortcode attributes={attributes} blockArgs={blockArgs} context={context}/>
231
+ </>
232
+ );
233
+ }
234
+ }
plugin-fw/includes/builders/gutenberg/src/index 2.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Handle YITH Gutenberg Blocks
3
+ *
4
+ * @var {Object} yithGutenbergBlocks The Gutenberg blocks object.
5
+ */
6
+
7
+ /**
8
+ * External dependencies
9
+ */
10
+ import React from 'react';
11
+ import md5 from 'md5';
12
+
13
+ /**
14
+ * WordPress dependencies
15
+ */
16
+ import { registerBlockType } from '@wordpress/blocks';
17
+ import { RawHTML } from '@wordpress/element';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import { yith_icon, generateShortcode } from './common';
23
+ import { createEditFunction } from './edit';
24
+ import './common/actions-to-jquery-events';
25
+
26
+ for ( const [blockName, blockArgs] of Object.entries( yithGutenbergBlocks ) ) {
27
+ registerBlockType( 'yith/' + blockName, {
28
+ title : blockArgs.title,
29
+ description: blockArgs.description,
30
+ category : blockArgs.category,
31
+ attributes : blockArgs.attributes,
32
+ icon : typeof blockArgs.icon !== 'undefined' ? blockArgs.icon : yith_icon,
33
+ keywords : blockArgs.keywords,
34
+ edit : createEditFunction( blockName, blockArgs ),
35
+ usesContext: [
36
+ 'postId',
37
+ ],
38
+ save : ( { attributes } ) => {
39
+ return generateShortcode( blockArgs, attributes );
40
+ },
41
+ deprecated : [
42
+ {
43
+ attributes: blockArgs.attributes,
44
+ save : ( { attributes } ) => {
45
+ const shortcode = generateShortcode( blockArgs, attributes );
46
+ const blockHash = md5( shortcode );
47
+ const shortcodeSpan = '<span class="yith_block_' + blockHash + '">' + shortcode + '</span>';
48
+
49
+ return (
50
+ <RawHTML>{shortcodeSpan}</RawHTML>
51
+ )
52
+ }
53
+ }
54
+ ]
55
+ } );
56
+ }
plugin-fw/includes/builders/gutenberg/src/index.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Handle YITH Gutenberg Blocks
3
+ *
4
+ * @var {Object} yithGutenbergBlocks The Gutenberg blocks object.
5
+ */
6
+
7
+ /**
8
+ * External dependencies
9
+ */
10
+ import React from 'react';
11
+ import md5 from 'md5';
12
+
13
+ /**
14
+ * WordPress dependencies
15
+ */
16
+ import { registerBlockType } from '@wordpress/blocks';
17
+ import { RawHTML } from '@wordpress/element';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import { yith_icon, generateShortcode } from './common';
23
+ import { createEditFunction } from './edit';
24
+ import './common/actions-to-jquery-events';
25
+
26
+ for ( const [blockName, blockArgs] of Object.entries( yithGutenbergBlocks ) ) {
27
+ registerBlockType( 'yith/' + blockName, {
28
+ title : blockArgs.title,
29
+ description: blockArgs.description,
30
+ category : blockArgs.category,
31
+ attributes : blockArgs.attributes,
32
+ icon : typeof blockArgs.icon !== 'undefined' ? blockArgs.icon : yith_icon,
33
+ keywords : blockArgs.keywords,
34
+ edit : createEditFunction( blockName, blockArgs ),
35
+ usesContext: [
36
+ 'postId',
37
+ ],
38
+ save : ( { attributes } ) => {
39
+ return generateShortcode( blockArgs, attributes );
40
+ },
41
+ deprecated : [
42
+ {
43
+ attributes: blockArgs.attributes,
44
+ save : ( { attributes } ) => {
45
+ const shortcode = generateShortcode( blockArgs, attributes );
46
+ const blockHash = md5( shortcode );
47
+ const shortcodeSpan = '<span class="yith_block_' + blockHash + '">' + shortcode + '</span>';
48
+
49
+ return (
50
+ <RawHTML>{shortcodeSpan}</RawHTML>
51
+ )
52
+ }
53
+ }
54
+ ]
55
+ } );
56
+ }
plugin-fw/includes/class-yit-assets.php CHANGED
@@ -116,6 +116,13 @@ if ( ! class_exists( 'YIT_Assets' ) ) {
116
  'search_terms_nonce' => wp_create_nonce( 'search-terms' ),
117
  'search_customers_nonce' => wp_create_nonce( 'search-customers' ),
118
  'search_pages_nonce' => wp_create_nonce( 'search-pages' ),
 
 
 
 
 
 
 
119
  )
120
  );
121
 
116
  'search_terms_nonce' => wp_create_nonce( 'search-terms' ),
117
  'search_customers_nonce' => wp_create_nonce( 'search-customers' ),
118
  'search_pages_nonce' => wp_create_nonce( 'search-pages' ),
119
+ 'i18n' => array(
120
+ 'no_matches' => _x( 'No matches found', 'Enhanced select', 'yith-plugin-fw' ),
121
+ 'input_too_short_1' => _x( 'Please enter 1 or more characters', 'Enhanced select', 'yith-plugin-fw' ),
122
+ // translators: %s is the number of characters.
123
+ 'input_too_short_n' => _x( 'Please enter %s or more characters', 'Enhanced select', 'yith-plugin-fw' ),
124
+ 'searching' => _x( 'Searching&hellip;', 'Enhanced select', 'yith-plugin-fw' ),
125
+ ),
126
  )
127
  );
128
 
plugin-fw/includes/class-yit-cpt-unlimited 2.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Custom-Post-Type Unlimited Class.
4
+ * Deprecated! Kept only to prevent fatal errors if someone is using it.
5
+ *
6
+ * @class YIT_CPT_Unlimited
7
+ * @package YITH\PluginFramework\Classes
8
+ * @deprecated 3.5 | This will be removed, so please don't use it
9
+ */
10
+
11
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
12
+
13
+ if ( ! class_exists( 'YIT_CPT_Unlimited' ) ) {
14
+
15
+ /**
16
+ * Class YIT_CPT_Unlimited
17
+ *
18
+ * @deprecated 3.5 | This will be removed, so please don't use it
19
+ */
20
+ class YIT_CPT_Unlimited {
21
+
22
+ /**
23
+ * YIT_CPT_Unlimited constructor.
24
+ *
25
+ * @param array $args Configuration arguments of post type.
26
+ */
27
+ public function __construct( $args = array() ) {
28
+
29
+ }
30
+
31
+ /**
32
+ * Avoid issues when calling a non-defined method
33
+ *
34
+ * @param string $name Name of the missing method.
35
+ * @param array $arguments Arguments.
36
+ *
37
+ * @return bool
38
+ */
39
+ public function __call( $name, $arguments ) {
40
+ return false;
41
+ }
42
+
43
+ /**
44
+ * Avoid issues when calling a non-defined attribute
45
+ *
46
+ * @param string $key Name of the missing attribute.
47
+ *
48
+ * @return bool
49
+ */
50
+ public function __get( $key ) {
51
+ return false;
52
+ }
53
+ }
54
+ }
plugin-fw/includes/class-yit-icons 2.php ADDED
@@ -0,0 +1,1237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Icons Class.
4
+ *
5
+ * @class YIT_Icons
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YIT_Icons' ) ) {
12
+ /**
13
+ * YIT_Icons class.
14
+ *
15
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
16
+ */
17
+ class YIT_Icons {
18
+
19
+ /**
20
+ * The single instance of the class.
21
+ *
22
+ * @var YIT_Icons
23
+ */
24
+ private static $instance;
25
+
26
+ /**
27
+ * Array of data
28
+ *
29
+ * @var array
30
+ */
31
+ private $data
32
+ = array(
33
+ 'font_awesome_version' => '4.7.0',
34
+ 'icons' => array(
35
+ 'FontAwesome' => array(
36
+ '\f000' => 'glass',
37
+ '\f001' => 'music',
38
+ '\f002' => 'search',
39
+ '\f003' => 'envelope-o',
40
+ '\f004' => 'heart',
41
+ '\f005' => 'star',
42
+ '\f006' => 'star-o',
43
+ '\f007' => 'user',
44
+ '\f008' => 'film',
45
+ '\f009' => 'th-large',
46
+ '\f00a' => 'th',
47
+ '\f00b' => 'th-list',
48
+ '\f00c' => 'check',
49
+ '\f00d' => 'times',
50
+ '\f00e' => 'search-plus',
51
+ '\f010' => 'search-minus',
52
+ '\f011' => 'power-off',
53
+ '\f012' => 'signal',
54
+ '\f013' => 'cog',
55
+ '\f014' => 'trash-o',
56
+ '\f015' => 'home',
57
+ '\f016' => 'file-o',
58
+ '\f017' => 'clock-o',
59
+ '\f018' => 'road',
60
+ '\f019' => 'download',
61
+ '\f01a' => 'arrow-circle-o-down',
62
+ '\f01b' => 'arrow-circle-o-up',
63
+ '\f01c' => 'inbox',
64
+ '\f01d' => 'play-circle-o',
65
+ '\f01e' => 'repeat',
66
+ '\f021' => 'refresh',
67
+ '\f022' => 'list-alt',
68
+ '\f023' => 'lock',
69
+ '\f024' => 'flag',
70
+ '\f025' => 'headphones',
71
+ '\f026' => 'volume-off',
72
+ '\f027' => 'volume-down',
73
+ '\f028' => 'volume-up',
74
+ '\f029' => 'qrcode',
75
+ '\f02a' => 'barcode',
76
+ '\f02b' => 'tag',
77
+ '\f02c' => 'tags',
78
+ '\f02d' => 'book',
79
+ '\f02e' => 'bookmark',
80
+ '\f02f' => 'print',
81
+ '\f030' => 'camera',
82
+ '\f031' => 'font',
83
+ '\f032' => 'bold',
84
+ '\f033' => 'italic',
85
+ '\f034' => 'text-height',
86
+ '\f035' => 'text-width',
87
+ '\f036' => 'align-left',
88
+ '\f037' => 'align-center',
89
+ '\f038' => 'align-right',
90
+ '\f039' => 'align-justify',
91
+ '\f03a' => 'list',
92
+ '\f03b' => 'outdent',
93
+ '\f03c' => 'indent',
94
+ '\f03d' => 'video-camera',
95
+ '\f03e' => 'picture-o',
96
+ '\f040' => 'pencil',
97
+ '\f041' => 'map-marker',
98
+ '\f042' => 'adjust',
99
+ '\f043' => 'tint',
100
+ '\f044' => 'pencil-square-o',
101
+ '\f045' => 'share-square-o',
102
+ '\f046' => 'check-square-o',
103
+ '\f047' => 'arrows',
104
+ '\f048' => 'step-backward',
105
+ '\f049' => 'fast-backward',
106
+ '\f04a' => 'backward',
107
+ '\f04b' => 'play',
108
+ '\f04c' => 'pause',
109
+ '\f04d' => 'stop',
110
+ '\f04e' => 'forward',
111
+ '\f050' => 'fast-forward',
112
+ '\f051' => 'step-forward',
113
+ '\f052' => 'eject',
114
+ '\f053' => 'chevron-left',
115
+ '\f054' => 'chevron-right',
116
+ '\f055' => 'plus-circle',
117
+ '\f056' => 'minus-circle',
118
+ '\f057' => 'times-circle',
119
+ '\f058' => 'check-circle',
120
+ '\f059' => 'question-circle',
121
+ '\f05a' => 'info-circle',
122
+ '\f05b' => 'crosshairs',
123
+ '\f05c' => 'times-circle-o',
124
+ '\f05d' => 'check-circle-o',
125
+ '\f05e' => 'ban',
126
+ '\f060' => 'arrow-left',
127
+ '\f061' => 'arrow-right',
128
+ '\f062' => 'arrow-up',
129
+ '\f063' => 'arrow-down',
130
+ '\f064' => 'share',
131
+ '\f065' => 'expand',
132
+ '\f066' => 'compress',
133
+ '\f067' => 'plus',
134
+ '\f068' => 'minus',
135
+ '\f069' => 'asterisk',
136
+ '\f06a' => 'exclamation-circle',
137
+ '\f06b' => 'gift',
138
+ '\f06c' => 'leaf',
139
+ '\f06d' => 'fire',
140
+ '\f06e' => 'eye',
141
+ '\f070' => 'eye-slash',
142
+ '\f071' => 'exclamation-triangle',
143
+ '\f072' => 'plane',
144
+ '\f073' => 'calendar',
145
+ '\f074' => 'random',
146
+ '\f075' => 'comment',
147
+ '\f076' => 'magnet',
148
+ '\f077' => 'chevron-up',
149
+ '\f078' => 'chevron-down',
150
+ '\f079' => 'retweet',
151
+ '\f07a' => 'shopping-cart',
152
+ '\f07b' => 'folder',
153
+ '\f07c' => 'folder-open',
154
+ '\f07d' => 'arrows-v',
155
+ '\f07e' => 'arrows-h',
156
+ '\f080' => 'bar-chart',
157
+ '\f081' => 'twitter-square',
158
+ '\f082' => 'facebook-square',
159
+ '\f083' => 'camera-retro',
160
+ '\f084' => 'key',
161
+ '\f085' => 'cogs',
162
+ '\f086' => 'comments',
163
+ '\f087' => 'thumbs-o-up',
164
+ '\f088' => 'thumbs-o-down',
165
+ '\f089' => 'star-half',
166
+ '\f08a' => 'heart-o',
167
+ '\f08b' => 'sign-out',
168
+ '\f08c' => 'linkedin-square',
169
+ '\f08d' => 'thumb-tack',
170
+ '\f08e' => 'external-link',
171
+ '\f090' => 'sign-in',
172
+ '\f091' => 'trophy',
173
+ '\f092' => 'github-square',
174
+ '\f093' => 'upload',
175
+ '\f094' => 'lemon-o',
176
+ '\f095' => 'phone',
177
+ '\f096' => 'square-o',
178
+ '\f097' => 'bookmark-o',
179
+ '\f098' => 'phone-square',
180
+ '\f099' => 'twitter',
181
+ '\f09a' => 'facebook',
182
+ '\f09b' => 'github',
183
+ '\f09c' => 'unlock',
184
+ '\f09d' => 'credit-card',
185
+ '\f09e' => 'rss',
186
+ '\f0a0' => 'hdd-o',
187
+ '\f0a1' => 'bullhorn',
188
+ '\f0a2' => 'bell-o',
189
+ '\f0a3' => 'certificate',
190
+ '\f0a4' => 'hand-o-right',
191
+ '\f0a5' => 'hand-o-left',
192
+ '\f0a6' => 'hand-o-up',
193
+ '\f0a7' => 'hand-o-down',
194
+ '\f0a8' => 'arrow-circle-left',
195
+ '\f0a9' => 'arrow-circle-right',
196
+ '\f0aa' => 'arrow-circle-up',
197
+ '\f0ab' => 'arrow-circle-down',
198
+ '\f0ac' => 'globe',
199
+ '\f0ad' => 'wrench',
200
+ '\f0ae' => 'tasks',
201
+ '\f0b0' => 'filter',
202
+ '\f0b1' => 'briefcase',
203
+ '\f0b2' => 'arrows-alt',
204
+ '\f0c0' => 'users',
205
+ '\f0c1' => 'link',
206
+ '\f0c2' => 'cloud',
207
+ '\f0c3' => 'flask',
208
+ '\f0c4' => 'scissors',
209
+ '\f0c5' => 'files-o',
210
+ '\f0c6' => 'paperclip',
211
+ '\f0c7' => 'floppy-o',
212
+ '\f0c8' => 'square',
213
+ '\f0c9' => 'bars',
214
+ '\f0ca' => 'list-ul',
215
+ '\f0cb' => 'list-ol',
216
+ '\f0cc' => 'strikethrough',
217
+ '\f0cd' => 'underline',
218
+ '\f0ce' => 'table',
219
+ '\f0d0' => 'magic',
220
+ '\f0d1' => 'truck',
221
+ '\f0d2' => 'pinterest',
222
+ '\f0d3' => 'pinterest-square',
223
+ '\f0d4' => 'google-plus-square',
224
+ '\f0d5' => 'google-plus',
225
+ '\f0d6' => 'money',
226
+ '\f0d7' => 'caret-down',
227
+ '\f0d8' => 'caret-up',
228
+ '\f0d9' => 'caret-left',
229
+ '\f0da' => 'caret-right',
230
+ '\f0db' => 'columns',
231
+ '\f0dc' => 'sort',
232
+ '\f0dd' => 'sort-desc',
233
+ '\f0de' => 'sort-asc',
234
+ '\f0e0' => 'envelope',
235
+ '\f0e1' => 'linkedin',
236
+ '\f0e2' => 'undo',
237
+ '\f0e3' => 'gavel',
238
+ '\f0e4' => 'tachometer',
239
+ '\f0e5' => 'comment-o',
240
+ '\f0e6' => 'comments-o',
241
+ '\f0e7' => 'bolt',
242
+ '\f0e8' => 'sitemap',
243
+ '\f0e9' => 'umbrella',
244
+ '\f0ea' => 'clipboard',
245
+ '\f0eb' => 'lightbulb-o',
246
+ '\f0ec' => 'exchange',
247
+ '\f0ed' => 'cloud-download',
248
+ '\f0ee' => 'cloud-upload',
249
+ '\f0f0' => 'user-md',
250
+ '\f0f1' => 'stethoscope',
251
+ '\f0f2' => 'suitcase',
252
+ '\f0f3' => 'bell',
253
+ '\f0f4' => 'coffee',
254
+ '\f0f5' => 'cutlery',
255
+ '\f0f6' => 'file-text-o',
256
+ '\f0f7' => 'building-o',
257
+ '\f0f8' => 'hospital-o',
258
+ '\f0f9' => 'ambulance',
259
+ '\f0fa' => 'medkit',
260
+ '\f0fb' => 'fighter-jet',
261
+ '\f0fc' => 'beer',
262
+ '\f0fd' => 'h-square',
263
+ '\f0fe' => 'plus-square',
264
+ '\f100' => 'angle-double-left',
265
+ '\f101' => 'angle-double-right',
266
+ '\f102' => 'angle-double-up',
267
+ '\f103' => 'angle-double-down',
268
+ '\f104' => 'angle-left',
269
+ '\f105' => 'angle-right',
270
+ '\f106' => 'angle-up',
271
+ '\f107' => 'angle-down',
272
+ '\f108' => 'desktop',
273
+ '\f109' => 'laptop',
274
+ '\f10a' => 'tablet',
275
+ '\f10b' => 'mobile',
276
+ '\f10c' => 'circle-o',
277
+ '\f10d' => 'quote-left',
278
+ '\f10e' => 'quote-right',
279
+ '\f110' => 'spinner',
280
+ '\f111' => 'circle',
281
+ '\f112' => 'reply',
282
+ '\f113' => 'github-alt',
283
+ '\f114' => 'folder-o',
284
+ '\f115' => 'folder-open-o',
285
+ '\f118' => 'smile-o',
286
+ '\f119' => 'frown-o',
287
+ '\f11a' => 'meh-o',
288
+ '\f11b' => 'gamepad',
289
+ '\f11c' => 'keyboard-o',
290
+ '\f11d' => 'flag-o',
291
+ '\f11e' => 'flag-checkered',
292
+ '\f120' => 'terminal',
293
+ '\f121' => 'code',
294
+ '\f122' => 'reply-all',
295
+ '\f123' => 'star-half-o',
296
+ '\f124' => 'location-arrow',
297
+ '\f125' => 'crop',
298
+ '\f126' => 'code-fork',
299
+ '\f127' => 'chain-broken',
300
+ '\f128' => 'question',
301
+ '\f129' => 'info',
302
+ '\f12a' => 'exclamation',
303
+ '\f12b' => 'superscript',
304
+ '\f12c' => 'subscript',
305
+ '\f12d' => 'eraser',
306
+ '\f12e' => 'puzzle-piece',
307
+ '\f130' => 'microphone',
308
+ '\f131' => 'microphone-slash',
309
+ '\f132' => 'shield',
310
+ '\f133' => 'calendar-o',
311
+ '\f134' => 'fire-extinguisher',
312
+ '\f135' => 'rocket',
313
+ '\f136' => 'maxcdn',
314
+ '\f137' => 'chevron-circle-left',
315
+ '\f138' => 'chevron-circle-right',
316
+ '\f139' => 'chevron-circle-up',
317
+ '\f13a' => 'chevron-circle-down',
318
+ '\f13b' => 'html5',
319
+ '\f13c' => 'css3',
320
+ '\f13d' => 'anchor',
321
+ '\f13e' => 'unlock-alt',
322
+ '\f140' => 'bullseye',
323
+ '\f141' => 'ellipsis-h',
324
+ '\f142' => 'ellipsis-v',
325
+ '\f143' => 'rss-square',
326
+ '\f144' => 'play-circle',
327
+ '\f145' => 'ticket',
328
+ '\f146' => 'minus-square',
329
+ '\f147' => 'minus-square-o',
330
+ '\f148' => 'level-up',
331
+ '\f149' => 'level-down',
332
+ '\f14a' => 'check-square',
333
+ '\f14b' => 'pencil-square',
334
+ '\f14c' => 'external-link-square',
335
+ '\f14d' => 'share-square',
336
+ '\f14e' => 'compass',
337
+ '\f150' => 'caret-square-o-down',
338
+ '\f151' => 'caret-square-o-up',
339
+ '\f152' => 'caret-square-o-right',
340
+ '\f153' => 'eur',
341
+ '\f154' => 'gbp',
342
+ '\f155' => 'usd',
343
+ '\f156' => 'inr',
344
+ '\f157' => 'jpy',
345
+ '\f158' => 'rub',
346
+ '\f159' => 'krw',
347
+ '\f15a' => 'btc',
348
+ '\f15b' => 'file',
349
+ '\f15c' => 'file-text',
350
+ '\f15d' => 'sort-alpha-asc',
351
+ '\f15e' => 'sort-alpha-desc',
352
+ '\f160' => 'sort-amount-asc',
353
+ '\f161' => 'sort-amount-desc',
354
+ '\f162' => 'sort-numeric-asc',
355
+ '\f163' => 'sort-numeric-desc',
356
+ '\f164' => 'thumbs-up',
357
+ '\f165' => 'thumbs-down',
358
+ '\f166' => 'youtube-square',
359
+ '\f167' => 'youtube',
360
+ '\f168' => 'xing',
361
+ '\f169' => 'xing-square',
362
+ '\f16a' => 'youtube-play',
363
+ '\f16b' => 'dropbox',
364
+ '\f16c' => 'stack-overflow',
365
+ '\f16d' => 'instagram',
366
+ '\f16e' => 'flickr',
367
+ '\f170' => 'adn',
368
+ '\f171' => 'bitbucket',
369
+ '\f172' => 'bitbucket-square',
370
+ '\f173' => 'tumblr',
371
+ '\f174' => 'tumblr-square',
372
+ '\f175' => 'long-arrow-down',
373
+ '\f176' => 'long-arrow-up',
374
+ '\f177' => 'long-arrow-left',
375
+ '\f178' => 'long-arrow-right',
376
+ '\f179' => 'apple',
377
+ '\f17a' => 'windows',
378
+ '\f17b' => 'android',
379
+ '\f17c' => 'linux',
380
+ '\f17d' => 'dribbble',
381
+ '\f17e' => 'skype',
382
+ '\f180' => 'foursquare',
383
+ '\f181' => 'trello',
384
+ '\f182' => 'female',
385
+ '\f183' => 'male',
386
+ '\f184' => 'gratipay',
387
+ '\f185' => 'sun-o',
388
+ '\f186' => 'moon-o',
389
+ '\f187' => 'archive',
390
+ '\f188' => 'bug',
391
+ '\f189' => 'vk',
392
+ '\f18a' => 'weibo',
393
+ '\f18b' => 'renren',
394
+ '\f18c' => 'pagelines',
395
+ '\f18d' => 'stack-exchange',
396
+ '\f18e' => 'arrow-circle-o-right',
397
+ '\f190' => 'arrow-circle-o-left',
398
+ '\f191' => 'caret-square-o-left',
399
+ '\f192' => 'dot-circle-o',
400
+ '\f193' => 'wheelchair',
401
+ '\f194' => 'vimeo-square',
402
+ '\f195' => 'try',
403
+ '\f196' => 'plus-square-o',
404
+ '\f197' => 'space-shuttle',
405
+ '\f198' => 'slack',
406
+ '\f199' => 'envelope-square',
407
+ '\f19a' => 'wordpress',
408
+ '\f19b' => 'openid',
409
+ '\f19c' => 'university',
410
+ '\f19d' => 'graduation-cap',
411
+ '\f19e' => 'yahoo',
412
+ '\f1a0' => 'google',
413
+ '\f1a1' => 'reddit',
414
+ '\f1a2' => 'reddit-square',
415
+ '\f1a3' => 'stumbleupon-circle',
416
+ '\f1a4' => 'stumbleupon',
417
+ '\f1a5' => 'delicious',
418
+ '\f1a6' => 'digg',
419
+ '\f1a7' => 'pied-piper-pp',
420
+ '\f1a8' => 'pied-piper-alt',
421
+ '\f1a9' => 'drupal',
422
+ '\f1aa' => 'joomla',
423
+ '\f1ab' => 'language',
424
+ '\f1ac' => 'fax',
425
+ '\f1ad' => 'building',
426
+ '\f1ae' => 'child',
427
+ '\f1b0' => 'paw',
428
+ '\f1b1' => 'spoon',
429
+ '\f1b2' => 'cube',
430
+ '\f1b3' => 'cubes',
431
+ '\f1b4' => 'behance',
432
+ '\f1b5' => 'behance-square',
433
+ '\f1b6' => 'steam',
434
+ '\f1b7' => 'steam-square',
435
+ '\f1b8' => 'recycle',
436
+ '\f1b9' => 'car',
437
+ '\f1ba' => 'taxi',
438
+ '\f1bb' => 'tree',
439
+ '\f1bc' => 'spotify',
440
+ '\f1bd' => 'deviantart',
441
+ '\f1be' => 'soundcloud',
442
+ '\f1c0' => 'database',
443
+ '\f1c1' => 'file-pdf-o',
444
+ '\f1c2' => 'file-word-o',
445
+ '\f1c3' => 'file-excel-o',
446
+ '\f1c4' => 'file-powerpoint-o',
447
+ '\f1c5' => 'file-image-o',
448
+ '\f1c6' => 'file-archive-o',
449
+ '\f1c7' => 'file-audio-o',
450
+ '\f1c8' => 'file-video-o',
451
+ '\f1c9' => 'file-code-o',
452
+ '\f1ca' => 'vine',
453
+ '\f1cb' => 'codepen',
454
+ '\f1cc' => 'jsfiddle',
455
+ '\f1cd' => 'life-ring',
456
+ '\f1ce' => 'circle-o-notch',
457
+ '\f1d0' => 'rebel',
458
+ '\f1d1' => 'empire',
459
+ '\f1d2' => 'git-square',
460
+ '\f1d3' => 'git',
461
+ '\f1d4' => 'hacker-news',
462
+ '\f1d5' => 'tencent-weibo',
463
+ '\f1d6' => 'qq',
464
+ '\f1d7' => 'weixin',
465
+ '\f1d8' => 'paper-plane',
466
+ '\f1d9' => 'paper-plane-o',
467
+ '\f1da' => 'history',
468
+ '\f1db' => 'circle-thin',
469
+ '\f1dc' => 'header',
470
+ '\f1dd' => 'paragraph',
471
+ '\f1de' => 'sliders',
472
+ '\f1e0' => 'share-alt',
473
+ '\f1e1' => 'share-alt-square',
474
+ '\f1e2' => 'bomb',
475
+ '\f1e3' => 'futbol-o',
476
+ '\f1e4' => 'tty',
477
+ '\f1e5' => 'binoculars',
478
+ '\f1e6' => 'plug',
479
+ '\f1e7' => 'slideshare',
480
+ '\f1e8' => 'twitch',
481
+ '\f1e9' => 'yelp',
482
+ '\f1ea' => 'newspaper-o',
483
+ '\f1eb' => 'wifi',
484
+ '\f1ec' => 'calculator',
485
+ '\f1ed' => 'paypal',
486
+ '\f1ee' => 'google-wallet',
487
+ '\f1f0' => 'cc-visa',
488
+ '\f1f1' => 'cc-mastercard',
489
+ '\f1f2' => 'cc-discover',
490
+ '\f1f3' => 'cc-amex',
491
+ '\f1f4' => 'cc-paypal',
492
+ '\f1f5' => 'cc-stripe',
493
+ '\f1f6' => 'bell-slash',
494
+ '\f1f7' => 'bell-slash-o',
495
+ '\f1f8' => 'trash',
496
+ '\f1f9' => 'copyright',
497
+ '\f1fa' => 'at',
498
+ '\f1fb' => 'eyedropper',
499
+ '\f1fc' => 'paint-brush',
500
+ '\f1fd' => 'birthday-cake',
501
+ '\f1fe' => 'area-chart',
502
+ '\f200' => 'pie-chart',
503
+ '\f201' => 'line-chart',
504
+ '\f202' => 'lastfm',
505
+ '\f203' => 'lastfm-square',
506
+ '\f204' => 'toggle-off',
507
+ '\f205' => 'toggle-on',
508
+ '\f206' => 'bicycle',
509
+ '\f207' => 'bus',
510
+ '\f208' => 'ioxhost',
511
+ '\f209' => 'angellist',
512
+ '\f20a' => 'cc',
513
+ '\f20b' => 'ils',
514
+ '\f20c' => 'meanpath',
515
+ '\f20d' => 'buysellads',
516
+ '\f20e' => 'connectdevelop',
517
+ '\f210' => 'dashcube',
518
+ '\f211' => 'forumbee',
519
+ '\f212' => 'leanpub',
520
+ '\f213' => 'sellsy',
521
+ '\f214' => 'shirtsinbulk',
522
+ '\f215' => 'simplybuilt',
523
+ '\f216' => 'skyatlas',
524
+ '\f217' => 'cart-plus',
525
+ '\f218' => 'cart-arrow-down',
526
+ '\f219' => 'diamond',
527
+ '\f21a' => 'ship',
528
+ '\f21b' => 'user-secret',
529
+ '\f21c' => 'motorcycle',
530
+ '\f21d' => 'street-view',
531
+ '\f21e' => 'heartbeat',
532
+ '\f221' => 'venus',
533
+ '\f222' => 'mars',
534
+ '\f223' => 'mercury',
535
+ '\f224' => 'transgender',
536
+ '\f225' => 'transgender-alt',
537
+ '\f226' => 'venus-double',
538
+ '\f227' => 'mars-double',
539
+ '\f228' => 'venus-mars',
540
+ '\f229' => 'mars-stroke',
541
+ '\f22a' => 'mars-stroke-v',
542
+ '\f22b' => 'mars-stroke-h',
543
+ '\f22c' => 'neuter',
544
+ '\f22d' => 'genderless',
545
+ '\f230' => 'facebook-official',
546
+ '\f231' => 'pinterest-p',
547
+ '\f232' => 'whatsapp',
548
+ '\f233' => 'server',
549
+ '\f234' => 'user-plus',
550
+ '\f235' => 'user-times',
551
+ '\f236' => 'bed',
552
+ '\f237' => 'viacoin',
553
+ '\f238' => 'train',
554
+ '\f239' => 'subway',
555
+ '\f23a' => 'medium',
556
+ '\f23b' => 'y-combinator',
557
+ '\f23c' => 'optin-monster',
558
+ '\f23d' => 'opencart',
559
+ '\f23e' => 'expeditedssl',
560
+ '\f240' => 'battery-full',
561
+ '\f241' => 'battery-three-quarters',
562
+ '\f242' => 'battery-half',
563
+ '\f243' => 'battery-quarter',
564
+ '\f244' => 'battery-empty',
565
+ '\f245' => 'mouse-pointer',
566
+ '\f246' => 'i-cursor',
567
+ '\f247' => 'object-group',
568
+ '\f248' => 'object-ungroup',
569
+ '\f249' => 'sticky-note',
570
+ '\f24a' => 'sticky-note-o',
571
+ '\f24b' => 'cc-jcb',
572
+ '\f24c' => 'cc-diners-club',
573
+ '\f24d' => 'clone',
574
+ '\f24e' => 'balance-scale',
575
+ '\f250' => 'hourglass-o',
576
+ '\f251' => 'hourglass-start',
577
+ '\f252' => 'hourglass-half',
578
+ '\f253' => 'hourglass-end',
579
+ '\f254' => 'hourglass',
580
+ '\f255' => 'hand-rock-o',
581
+ '\f256' => 'hand-paper-o',
582
+ '\f257' => 'hand-scissors-o',
583
+ '\f258' => 'hand-lizard-o',
584
+ '\f259' => 'hand-spock-o',
585
+ '\f25a' => 'hand-pointer-o',
586
+ '\f25b' => 'hand-peace-o',
587
+ '\f25c' => 'trademark',
588
+ '\f25d' => 'registered',
589
+ '\f25e' => 'creative-commons',
590
+ '\f260' => 'gg',
591
+ '\f261' => 'gg-circle',
592
+ '\f262' => 'tripadvisor',
593
+ '\f263' => 'odnoklassniki',
594
+ '\f264' => 'odnoklassniki-square',
595
+ '\f265' => 'get-pocket',
596
+ '\f266' => 'wikipedia-w',
597
+ '\f267' => 'safari',
598
+ '\f268' => 'chrome',
599
+ '\f269' => 'firefox',
600
+ '\f26a' => 'opera',
601
+ '\f26b' => 'internet-explorer',
602
+ '\f26c' => 'television',
603
+ '\f26d' => 'contao',
604
+ '\f26e' => '500px',
605
+ '\f270' => 'amazon',
606
+ '\f271' => 'calendar-plus-o',
607
+ '\f272' => 'calendar-minus-o',
608
+ '\f273' => 'calendar-times-o',
609
+ '\f274' => 'calendar-check-o',
610
+ '\f275' => 'industry',
611
+ '\f276' => 'map-pin',
612
+ '\f277' => 'map-signs',
613
+ '\f278' => 'map-o',
614
+ '\f279' => 'map',
615
+ '\f27a' => 'commenting',
616
+ '\f27b' => 'commenting-o',
617
+ '\f27c' => 'houzz',
618
+ '\f27d' => 'vimeo',
619
+ '\f27e' => 'black-tie',
620
+ '\f280' => 'fonticons',
621
+ '\f281' => 'reddit-alien',
622
+ '\f282' => 'edge',
623
+ '\f283' => 'credit-card-alt',
624
+ '\f284' => 'codiepie',
625
+ '\f285' => 'modx',
626
+ '\f286' => 'fort-awesome',
627
+ '\f287' => 'usb',
628
+ '\f288' => 'product-hunt',
629
+ '\f289' => 'mixcloud',
630
+ '\f28a' => 'scribd',
631
+ '\f28b' => 'pause-circle',
632
+ '\f28c' => 'pause-circle-o',
633
+ '\f28d' => 'stop-circle',
634
+ '\f28e' => 'stop-circle-o',
635
+ '\f290' => 'shopping-bag',
636
+ '\f291' => 'shopping-basket',
637
+ '\f292' => 'hashtag',
638
+ '\f293' => 'bluetooth',
639
+ '\f294' => 'bluetooth-b',
640
+ '\f295' => 'percent',
641
+ '\f296' => 'gitlab',
642
+ '\f297' => 'wpbeginner',
643
+ '\f298' => 'wpforms',
644
+ '\f299' => 'envira',
645
+ '\f29a' => 'universal-access',
646
+ '\f29b' => 'wheelchair-alt',
647
+ '\f29c' => 'question-circle-o',
648
+ '\f29d' => 'blind',
649
+ '\f29e' => 'audio-description',
650
+ '\f2a0' => 'volume-control-phone',
651
+ '\f2a1' => 'braille',
652
+ '\f2a2' => 'assistive-listening-systems',
653
+ '\f2a3' => 'american-sign-language-interpreting',
654
+ '\f2a4' => 'deaf',
655
+ '\f2a5' => 'glide',
656
+ '\f2a6' => 'glide-g',
657
+ '\f2a7' => 'sign-language',
658
+ '\f2a8' => 'low-vision',
659
+ '\f2a9' => 'viadeo',
660
+ '\f2aa' => 'viadeo-square',
661
+ '\f2ab' => 'snapchat',
662
+ '\f2ac' => 'snapchat-ghost',
663
+ '\f2ad' => 'snapchat-square',
664
+ '\f2ae' => 'pied-piper',
665
+ '\f2b0' => 'first-order',
666
+ '\f2b1' => 'yoast',
667
+ '\f2b2' => 'themeisle',
668
+ '\f2b3' => 'google-plus-official',
669
+ '\f2b4' => 'font-awesome',
670
+ '\f2b5' => 'handshake-o',
671
+ '\f2b6' => 'envelope-open',
672
+ '\f2b7' => 'envelope-open-o',
673
+ '\f2b8' => 'linode',
674
+ '\f2b9' => 'address-book',
675
+ '\f2ba' => 'address-book-o',
676
+ '\f2bb' => 'address-card',
677
+ '\f2bc' => 'address-card-o',
678
+ '\f2bd' => 'user-circle',
679
+ '\f2be' => 'user-circle-o',
680
+ '\f2c0' => 'user-o',
681
+ '\f2c1' => 'id-badge',
682
+ '\f2c2' => 'id-card',
683
+ '\f2c3' => 'id-card-o',
684
+ '\f2c4' => 'quora',
685
+ '\f2c5' => 'free-code-camp',
686
+ '\f2c6' => 'telegram',
687
+ '\f2c7' => 'thermometer-full',
688
+ '\f2c8' => 'thermometer-three-quarters',
689
+ '\f2c9' => 'thermometer-half',
690
+ '\f2ca' => 'thermometer-quarter',
691
+ '\f2cb' => 'thermometer-empty',
692
+ '\f2cc' => 'shower',
693
+ '\f2cd' => 'bath',
694
+ '\f2ce' => 'podcast',
695
+ '\f2d0' => 'window-maximize',
696
+ '\f2d1' => 'window-minimize',
697
+ '\f2d2' => 'window-restore',
698
+ '\f2d3' => 'window-close',
699
+ '\f2d4' => 'window-close-o',
700
+ '\f2d5' => 'bandcamp',
701
+ '\f2d6' => 'grav',
702
+ '\f2d7' => 'etsy',
703
+ '\f2d8' => 'imdb',
704
+ '\f2d9' => 'ravelry',
705
+ '\f2da' => 'eercast',
706
+ '\f2db' => 'microchip',
707
+ '\f2dc' => 'snowflake-o',
708
+ '\f2dd' => 'superpowers',
709
+ '\f2de' => 'wpexplorer',
710
+ '\f2e0' => 'meetup',
711
+ ),
712
+ 'Dashicons' => array(
713
+ '\f100' => 'admin-appearance',
714
+ '\f101' => 'admin-comments',
715
+ '\f102' => 'admin-home',
716
+ '\f104' => 'admin-media',
717
+ '\f105' => 'admin-page',
718
+ '\f106' => 'admin-plugins',
719
+ '\f107' => 'admin-tools',
720
+ '\f108' => 'admin-settings',
721
+ '\f110' => 'admin-users',
722
+ '\f111' => 'admin-generic',
723
+ '\f112' => 'admin-network',
724
+ '\f115' => 'welcome-view-site',
725
+ '\f116' => 'welcome-widgets-menus',
726
+ '\f117' => 'welcome-comments',
727
+ '\f118' => 'welcome-learn-more',
728
+ '\f120' => 'wordpress',
729
+ '\f122' => 'format-quote',
730
+ '\f123' => 'format-aside',
731
+ '\f125' => 'format-chat',
732
+ '\f126' => 'format-video',
733
+ '\f127' => 'format-audio',
734
+ '\f128' => 'format-image',
735
+ '\f130' => 'format-status',
736
+ '\f132' => 'plus',
737
+ '\f133' => 'welcome-add-page',
738
+ '\f134' => 'align-center',
739
+ '\f135' => 'align-left',
740
+ '\f136' => 'align-right',
741
+ '\f138' => 'align-none',
742
+ '\f139' => 'arrow-right',
743
+ '\f140' => 'arrow-down',
744
+ '\f141' => 'arrow-left',
745
+ '\f142' => 'arrow-up',
746
+ '\f145' => 'calendar',
747
+ '\f147' => 'yes',
748
+ '\f148' => 'admin-collapse',
749
+ '\f153' => 'dismiss',
750
+ '\f154' => 'star-empty',
751
+ '\f155' => 'star-filled',
752
+ '\f156' => 'sort',
753
+ '\f157' => 'pressthis',
754
+ '\f158' => 'no',
755
+ '\f159' => 'marker',
756
+ '\f160' => 'lock',
757
+ '\f161' => 'format-gallery',
758
+ '\f163' => 'list-view',
759
+ '\f165' => 'image-crop',
760
+ '\f166' => 'image-rotate-left',
761
+ '\f167' => 'image-rotate-right',
762
+ '\f168' => 'image-flip-vertical',
763
+ '\f169' => 'image-flip-horizontal',
764
+ '\f171' => 'undo',
765
+ '\f172' => 'redo',
766
+ '\f173' => 'post-status',
767
+ '\f174' => 'cart',
768
+ '\f175' => 'feedback',
769
+ '\f176' => 'cloud',
770
+ '\f177' => 'visibility',
771
+ '\f178' => 'vault',
772
+ '\f179' => 'search',
773
+ '\f180' => 'screenoptions',
774
+ '\f181' => 'slides',
775
+ '\f183' => 'analytics',
776
+ '\f184' => 'chart-pie',
777
+ '\f185' => 'chart-bar',
778
+ '\f200' => 'editor-bold',
779
+ '\f201' => 'editor-italic',
780
+ '\f203' => 'editor-ul',
781
+ '\f204' => 'editor-ol',
782
+ '\f205' => 'editor-quote',
783
+ '\f206' => 'editor-alignleft',
784
+ '\f207' => 'editor-aligncenter',
785
+ '\f208' => 'editor-alignright',
786
+ '\f209' => 'editor-insertmore',
787
+ '\f210' => 'editor-spellcheck',
788
+ '\f212' => 'editor-kitchensink',
789
+ '\f213' => 'editor-underline',
790
+ '\f214' => 'editor-justify',
791
+ '\f215' => 'editor-textcolor',
792
+ '\f216' => 'editor-paste-word',
793
+ '\f217' => 'editor-paste-text',
794
+ '\f218' => 'editor-removeformatting',
795
+ '\f219' => 'editor-video',
796
+ '\f220' => 'editor-customchar',
797
+ '\f221' => 'editor-outdent',
798
+ '\f222' => 'editor-indent',
799
+ '\f223' => 'editor-help',
800
+ '\f224' => 'editor-strikethrough',
801
+ '\f225' => 'editor-unlink',
802
+ '\f226' => 'dashboard',
803
+ '\f227' => 'flag',
804
+ '\f229' => 'leftright',
805
+ '\f230' => 'location',
806
+ '\f231' => 'location-alt',
807
+ '\f232' => 'images-alt',
808
+ '\f233' => 'images-alt2',
809
+ '\f234' => 'video-alt',
810
+ '\f235' => 'video-alt2',
811
+ '\f236' => 'video-alt3',
812
+ '\f237' => 'share1',
813
+ '\f238' => 'chart-line',
814
+ '\f239' => 'chart-area',
815
+ '\f240' => 'share-alt',
816
+ '\f242' => 'share-alt2',
817
+ '\f301' => 'twitter',
818
+ '\f303' => 'rss',
819
+ '\f304' => 'facebook',
820
+ '\f305' => 'facebook-alt',
821
+ '\f306' => 'camera',
822
+ '\f307' => 'groups',
823
+ '\f308' => 'hammer',
824
+ '\f309' => 'art',
825
+ '\f310' => 'migrate',
826
+ '\f311' => 'performance',
827
+ '\f312' => 'products',
828
+ '\f313' => 'awards',
829
+ '\f314' => 'forms',
830
+ '\f316' => 'download',
831
+ '\f317' => 'upload',
832
+ '\f318' => 'category',
833
+ '\f319' => 'admin-site',
834
+ '\f320' => 'editor-rtl',
835
+ '\f321' => 'backup',
836
+ '\f322' => 'portfolio',
837
+ '\f323' => 'tag',
838
+ '\f324' => 'wordpress-alt',
839
+ '\f325' => 'networking',
840
+ '\f326' => 'translation',
841
+ '\f328' => 'smiley',
842
+ '\f330' => 'book',
843
+ '\f331' => 'book-alt',
844
+ '\f332' => 'shield',
845
+ '\f333' => 'menu',
846
+ '\f334' => 'shield-alt',
847
+ '\f335' => 'no-alt',
848
+ '\f336' => 'id',
849
+ '\f337' => 'id-alt',
850
+ '\f338' => 'businessman',
851
+ '\f339' => 'lightbulb',
852
+ '\f340' => 'arrow-left-alt',
853
+ '\f341' => 'arrow-left-alt2',
854
+ '\f342' => 'arrow-up-alt',
855
+ '\f343' => 'arrow-up-alt2',
856
+ '\f344' => 'arrow-right-alt',
857
+ '\f345' => 'arrow-right-alt2',
858
+ '\f346' => 'arrow-down-alt',
859
+ '\f347' => 'arrow-down-alt2',
860
+ '\f348' => 'info',
861
+ '\f459' => 'star-half',
862
+ '\f460' => 'minus',
863
+ '\f462' => 'googleplus',
864
+ '\f463' => 'update',
865
+ '\f464' => 'edit',
866
+ '\f465' => 'email',
867
+ '\f466' => 'email-alt',
868
+ '\f468' => 'sos',
869
+ '\f469' => 'clock',
870
+ '\f470' => 'smartphone',
871
+ '\f471' => 'tablet',
872
+ '\f472' => 'desktop',
873
+ '\f473' => 'testimonial',
874
+ '\f474' => 'editor-break',
875
+ '\f475' => 'editor-code',
876
+ '\f476' => 'editor-paragraph',
877
+ '\f478' => 'text',
878
+ '\f479' => 'tagcloud',
879
+ '\f480' => 'archive',
880
+ '\f481' => 'clipboard',
881
+ '\f482' => 'microphone',
882
+ '\f483' => 'universal-access',
883
+ '\f484' => 'nametag',
884
+ '\f486' => 'tickets',
885
+ '\f487' => 'heart',
886
+ '\f488' => 'megaphone',
887
+ '\f489' => 'schedule',
888
+ '\f490' => 'media-video',
889
+ '\f491' => 'media-text',
890
+ '\f492' => 'playlist-audio',
891
+ '\f493' => 'playlist-video',
892
+ '\f495' => 'media-spreadsheet',
893
+ '\f496' => 'media-interactive',
894
+ '\f497' => 'media-document',
895
+ '\f498' => 'media-default',
896
+ '\f499' => 'media-code',
897
+ '\f500' => 'media-audio',
898
+ '\f501' => 'media-archive',
899
+ '\f502' => 'plus-alt',
900
+ '\f503' => 'randomize',
901
+ '\f504' => 'external',
902
+ '\f506' => 'editor-contract',
903
+ '\f507' => 'universal-access-alt',
904
+ '\f508' => 'calendar-alt',
905
+ '\f509' => 'grid-view',
906
+ '\f510' => 'index-card',
907
+ '\f511' => 'carrot',
908
+ '\f512' => 'building',
909
+ '\f513' => 'store',
910
+ '\f514' => 'album',
911
+ '\f515' => 'controls-repeat',
912
+ '\f516' => 'controls-skipback',
913
+ '\f517' => 'controls-skipforward',
914
+ '\f518' => 'controls-back',
915
+ '\f519' => 'controls-forward',
916
+ '\f520' => 'controls-volumeoff',
917
+ '\f521' => 'controls-volumeon',
918
+ '\f522' => 'controls-play',
919
+ '\f523' => 'controls-pause',
920
+ '\f524' => 'tickets-alt',
921
+ '\f525' => 'phone',
922
+ '\f526' => 'money',
923
+ '\f527' => 'palmtree',
924
+ '\f528' => 'unlock',
925
+ '\f529' => 'thumbs-up',
926
+ '\f530' => 'hidden',
927
+ '\f531' => 'image-rotate',
928
+ '\f533' => 'image-filter',
929
+ '\f534' => 'warning',
930
+ '\f535' => 'editor-table',
931
+ '\f536' => 'filter',
932
+ '\f537' => 'sticky',
933
+ '\f538' => 'layout',
934
+ '\f540' => 'admin-customizer',
935
+ '\f541' => 'admin-multisite',
936
+ '\f542' => 'thumbs-down',
937
+ '\f543' => 'plus-alt2',
938
+ '\f545' => 'move',
939
+ '\f546' => 'paperclip',
940
+ '\f547' => 'laptop',
941
+ ),
942
+ ),
943
+ );
944
+
945
+
946
+ /**
947
+ * Singleton implementation.
948
+ *
949
+ * @return YIT_Icons
950
+ */
951
+ public static function instance() {
952
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
953
+ }
954
+
955
+ /**
956
+ * Deprecated singleton implementation.
957
+ * Kept for backward compatibility.
958
+ *
959
+ * @return YIT_Icons
960
+ * @deprecated 3.5 | use YIT_Icons::get_instance() instead.
961
+ */
962
+ public static function get_instance() {
963
+ return self::instance();
964
+ }
965
+
966
+ /**
967
+ * YIT_Icons constructor.
968
+ */
969
+ private function __construct() {
970
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 99 );
971
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ), 99 );
972
+ }
973
+
974
+ /**
975
+ * __get function.
976
+ *
977
+ * @param string $key The key.
978
+ *
979
+ * @return mixed
980
+ */
981
+ public function __get( $key ) {
982
+ $value = isset( $this->data[ $key ] ) ? $this->data[ $key ] : false;
983
+
984
+ return $value;
985
+ }
986
+
987
+ /**
988
+ * __isset function.
989
+ *
990
+ * @param string $key The key.
991
+ *
992
+ * @return bool
993
+ */
994
+ public function __isset( $key ) {
995
+ return isset( $this->data[ $key ] );
996
+ }
997
+
998
+ /**
999
+ * Get the icons.
1000
+ *
1001
+ * @param string $filter_suffix The filter suffix.
1002
+ *
1003
+ * @return false|mixed|void
1004
+ */
1005
+ public function get_icons( $filter_suffix = '' ) {
1006
+ $icons = $this->icons;
1007
+ if ( ! empty( $filter_suffix ) ) {
1008
+ $icons = apply_filters( 'yith_plugin_fw_icons_field_icons_' . sanitize_key( $filter_suffix ), $icons );
1009
+ }
1010
+
1011
+ return $icons;
1012
+ }
1013
+
1014
+ /**
1015
+ * Get the icon data
1016
+ *
1017
+ * @param string $icon_string The icon string.
1018
+ * @param string $filter_suffix The filter suffix.
1019
+ *
1020
+ * @return string
1021
+ */
1022
+ public function get_icon_data( $icon_string, $filter_suffix = '' ) {
1023
+ return yith_plugin_fw_html_data_to_string( $this->get_icon_data_array( $icon_string, $filter_suffix ) );
1024
+ }
1025
+
1026
+ /**
1027
+ * Get the icon data array
1028
+ *
1029
+ * @param string $icon_string The icon string.
1030
+ * @param string $filter_suffix The filter suffix.
1031
+ *
1032
+ * @return array
1033
+ */
1034
+ public function get_icon_data_array( $icon_string, $filter_suffix = '' ) {
1035
+ $icon_data = array();
1036
+ if ( $icon_string ) {
1037
+ $icon_array = explode( ':', $icon_string );
1038
+
1039
+ if ( count( $icon_array ) < 2 ) {
1040
+ return $icon_data;
1041
+ }
1042
+
1043
+ $font_name = $icon_array[0];
1044
+ $icon_name = $icon_array[1];
1045
+
1046
+ $icons = $this->get_icons( $filter_suffix );
1047
+ if ( array_key_exists( $font_name, $icons ) ) {
1048
+ $icon_key = array_search( $icon_name, $icons[ $font_name ], true );
1049
+ $icon_code = '&#x' . str_replace( '\\', '', $icon_key );
1050
+ $icon_data = array(
1051
+ 'font' => $font_name,
1052
+ 'name' => $icon_name,
1053
+ 'key' => $icon_key,
1054
+ 'icon' => $icon_code,
1055
+ );
1056
+ }
1057
+ }
1058
+
1059
+ return $icon_data;
1060
+ }
1061
+
1062
+ /**
1063
+ * Retrieves the font awesome array
1064
+ * the first time retrieves the array by the Font Awesome CSS
1065
+ * [utility method]
1066
+ *
1067
+ * @return array
1068
+ */
1069
+ private function get_font_awesome_array() {
1070
+ $font_awesome_list = get_option( 'yit_font_awesome_list', array() );
1071
+ $font_awesome_version = $this->font_awesome_version;
1072
+
1073
+ $font_awesome_array = array();
1074
+
1075
+ if ( ! empty( $font_awesome_list[ $font_awesome_version ] ) ) {
1076
+ $font_awesome_array = $font_awesome_list[ $font_awesome_version ];
1077
+ } else {
1078
+ // Retrieve the array by the CSS file.
1079
+ $font_awesome_uri = "https://maxcdn.bootstrapcdn.com/font-awesome/{$font_awesome_version}/css/font-awesome.min.css";
1080
+ $pattern = '/\.(fa-(?:\w+(?:-)?)+):before{content:"\\\\(....)"}/';
1081
+
1082
+ $response = wp_remote_get( $font_awesome_uri );
1083
+
1084
+ if ( ! is_wp_error( $response ) && 200 === absint( $response['response']['code'] ) && 'OK' === $response['response']['message'] ) {
1085
+ $body = $response['body'];
1086
+
1087
+ preg_match_all( $pattern, $body, $matches, PREG_SET_ORDER );
1088
+ foreach ( $matches as $match ) {
1089
+ $font_awesome_array[ $match[2] ] = $match[1];
1090
+ }
1091
+ ksort( $font_awesome_array );
1092
+
1093
+ $font_awesome_list[ $font_awesome_version ] = $font_awesome_array;
1094
+ update_option( 'yit_font_awesome_list', $font_awesome_list );
1095
+ }
1096
+ }
1097
+
1098
+ return $font_awesome_array;
1099
+ }
1100
+
1101
+ /**
1102
+ * Retrieves the Dashicons array
1103
+ * the first time retrieves the array by the Dashicons CSS
1104
+ * [utility method]
1105
+ *
1106
+ * @return array
1107
+ */
1108
+ private function get_dashicons_array() {
1109
+ $dashicons_list = get_option( 'yit_dashicons_list', array() );
1110
+
1111
+ $dashicons_array = array();
1112
+ if ( ! empty( $dashicons_list ) ) {
1113
+ $dashicons_array = $dashicons_list;
1114
+ } else {
1115
+ // Retrieve the array by the CSS file.
1116
+ $uri = 'https://s.w.org/wp-includes/css/dashicons.min.css';
1117
+ $pattern = '/\.dashicons-((?:\w+(?:-)?)+):before{content:"\\\\(....)"/';
1118
+ $pattern = '/\.dashicons-((?:\w+(?:-)?)+):before.............../';
1119
+
1120
+ $response = wp_remote_get( $uri );
1121
+
1122
+ if ( ! is_wp_error( $response ) && 200 === absint( $response['response']['code'] ) && 'OK' === $response['response']['message'] ) {
1123
+ $body = $response['body'];
1124
+
1125
+ preg_match_all( $pattern, $body, $matches, PREG_SET_ORDER );
1126
+
1127
+ foreach ( $matches as $match ) {
1128
+ $code = str_replace( '.dashicons-' . $match[1] . ':before{content:"\\', '', $match[0] );
1129
+ if ( 4 === strlen( $code ) ) {
1130
+ $dashicons_array[ $code ] = $match[1];
1131
+ }
1132
+ }
1133
+ ksort( $dashicons_array );
1134
+ }
1135
+ }
1136
+
1137
+ return $dashicons_array;
1138
+ }
1139
+
1140
+ /**
1141
+ * Enqueue Scripts
1142
+ */
1143
+ public function enqueue_scripts() {
1144
+ wp_register_style( 'font-awesome', YIT_CORE_PLUGIN_URL . '/assets/fonts/font-awesome/font-awesome.min.css', array(), $this->font_awesome_version );
1145
+
1146
+ wp_add_inline_style( 'font-awesome', $this->get_inline_style( 'font-awesome' ) );
1147
+
1148
+ wp_add_inline_style( 'dashicons', $this->get_inline_style( 'dashicons' ) );
1149
+ }
1150
+
1151
+ /**
1152
+ * Return the icon HTML from icon_string passed
1153
+ *
1154
+ * @param string|array $icon The icon.
1155
+ * @param array $args Array of arguments (such as html_tag, class, style, filter_suffix).
1156
+ *
1157
+ * @return string
1158
+ */
1159
+ public function get_icon( $icon = '', $args = array() ) {
1160
+ $icon = is_array( $icon ) && isset( $icon['icon'] ) ? $icon['icon'] : $icon;
1161
+ $icon_html = '';
1162
+ if ( $icon ) {
1163
+ $default_args = array(
1164
+ 'html_tag' => 'span',
1165
+ 'class' => '',
1166
+ 'style' => '',
1167
+ 'filter_suffix' => '',
1168
+ );
1169
+ $args = wp_parse_args( $args, $default_args );
1170
+
1171
+ // back-ward compatibility: 'filter_icons' argument is deprecated; use 'filter_suffix' instead!
1172
+ if ( ! empty( $args['filter_icons'] ) && ! $args['filter_suffix'] ) {
1173
+ $args['filter_suffix'] = $args['filter_icons'];
1174
+ }
1175
+
1176
+ $html_tag = $args['html_tag'];
1177
+ $class = $args['class'];
1178
+ $style = $args['style'];
1179
+ $filter_suffix = $args['filter_suffix'];
1180
+
1181
+ $icon_data = $this->get_icon_data( $icon, $filter_suffix );
1182
+
1183
+ if ( $icon_data ) {
1184
+ $icon_html = "<$html_tag class=\"$class\" style=\"$style\" $icon_data></$html_tag>";
1185
+ }
1186
+ }
1187
+
1188
+ return $icon_html;
1189
+ }
1190
+
1191
+ /**
1192
+ * Get inline style.
1193
+ *
1194
+ * @param string $handle The handle.
1195
+ *
1196
+ * @return string
1197
+ */
1198
+ public function get_inline_style( $handle ) {
1199
+ $css = '';
1200
+ switch ( $handle ) {
1201
+ case 'font-awesome':
1202
+ $css = '[data-font="FontAwesome"]:before {font-family: \'FontAwesome\' !important;content: attr(data-icon) !important;speak: none !important;font-weight: normal !important;font-variant: normal !important;text-transform: none !important;line-height: 1 !important;font-style: normal !important;-webkit-font-smoothing: antialiased !important;-moz-osx-font-smoothing: grayscale !important;}';
1203
+ break;
1204
+ case 'dashicons':
1205
+ $css = '[data-font="Dashicons"]:before {font-family: \'Dashicons\' !important;content: attr(data-icon) !important;speak: none !important;font-weight: normal !important;font-variant: normal !important;text-transform: none !important;line-height: 1 !important;font-style: normal !important;-webkit-font-smoothing: antialiased !important;-moz-osx-font-smoothing: grayscale !important;}';
1206
+ }
1207
+
1208
+ return $css;
1209
+ }
1210
+
1211
+ /**
1212
+ * Get inline style
1213
+ * Deprecated for typo
1214
+ *
1215
+ * @param string $handle The handle.
1216
+ *
1217
+ * @return string
1218
+ * @deprecated 3.5 | use YIT_Icons::get_inline_style()
1219
+ */
1220
+ public function get_inline_scripts( $handle ) {
1221
+ return $this->get_inline_style( $handle );
1222
+ }
1223
+
1224
+ }
1225
+ }
1226
+ if ( ! function_exists( 'yit_icons' ) ) {
1227
+ /**
1228
+ * Return instance of YIT_Icons class.
1229
+ *
1230
+ * @return YIT_Icons
1231
+ */
1232
+ function yit_icons() {
1233
+ return YIT_Icons::instance();
1234
+ }
1235
+ }
1236
+
1237
+ yit_icons();
plugin-fw/includes/class-yit-plugin-licence 2.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Plugin License Class.
4
+ *
5
+ * @class YIT_Plugin_Licence
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YIT_Plugin_Licence' ) ) {
12
+ /**
13
+ * YIT_Plugin_Licence class.
14
+ * Set page to manage products.
15
+ *
16
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
17
+ */
18
+ class YIT_Plugin_Licence {
19
+ /**
20
+ * The single instance of the class.
21
+ *
22
+ * @var YIT_Plugin_Licence
23
+ */
24
+ private static $instance;
25
+
26
+ /**
27
+ * Singleton implementation.
28
+ *
29
+ * @return YIT_Plugin_Licence
30
+ */
31
+ public static function instance() {
32
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
33
+ }
34
+
35
+ /**
36
+ * YIT_Plugin_Licence constructor.
37
+ */
38
+ private function __construct() {
39
+ // Silence is golden.
40
+ }
41
+
42
+ /**
43
+ * Premium products registration
44
+ *
45
+ * @param string $init The product identifier.
46
+ * @param string $secret_key The secret key.
47
+ * @param string $product_id The product id.
48
+ *
49
+ * @return void
50
+ */
51
+ public function register( $init, $secret_key, $product_id ) {
52
+ if ( ! function_exists( 'YITH_Plugin_Licence' ) ) {
53
+ // Try to load YITH_Plugin_Licence class.
54
+ yith_plugin_fw_load_update_and_licence_files();
55
+ }
56
+
57
+ if ( function_exists( 'YITH_Plugin_Licence' ) && is_callable( array( YITH_Plugin_Licence(), 'register' ) ) ) {
58
+ YITH_Plugin_Licence()->register( $init, $secret_key, $product_id );
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Get license activation URL
64
+ *
65
+ * @param string $plugin_slug The plugin slug.
66
+ *
67
+ * @return string|false
68
+ * @since 3.0.17
69
+ */
70
+ public static function get_license_activation_url( $plugin_slug = '' ) {
71
+ return function_exists( 'YITH_Plugin_Licence' ) ? YITH_Plugin_Licence()->get_license_activation_url( $plugin_slug ) : false;
72
+ }
73
+
74
+ /**
75
+ * Retrieve the products
76
+ *
77
+ * @return array
78
+ */
79
+ public function get_products() {
80
+ return function_exists( 'YITH_Plugin_Licence' ) ? YITH_Plugin_Licence()->get_products() : array();
81
+ }
82
+ }
83
+ }
84
+
85
+ if ( ! function_exists( 'YIT_Plugin_Licence' ) ) {
86
+ /**
87
+ * Single instance of YIT_Plugin_Licence
88
+ *
89
+ * @return YIT_Plugin_Licence
90
+ */
91
+ function YIT_Plugin_Licence() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
92
+ return YIT_Plugin_Licence::instance();
93
+ }
94
+ }
plugin-fw/includes/class-yit-plugin-subpanel 2.php ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Plugin Sub-panel Class.
4
+ *
5
+ * @class YIT_Plugin_SubPanel
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YIT_Plugin_SubPanel' ) ) {
12
+ /**
13
+ * YIT_Plugin_SubPanel class.
14
+ *
15
+ * @author Emanuela Castorina <emanuela.castorina@yithemes.it>
16
+ */
17
+ class YIT_Plugin_SubPanel extends YIT_Plugin_Panel {
18
+
19
+ /**
20
+ * Version of the class.
21
+ *
22
+ * @var string
23
+ */
24
+ public $version = '1.0.0';
25
+
26
+ /**
27
+ * List of settings parameters.
28
+ *
29
+ * @var array
30
+ */
31
+ public $settings = array();
32
+
33
+ /**
34
+ * YIT_Plugin_SubPanel constructor.
35
+ *
36
+ * @param array $args The panel arguments.
37
+ */
38
+ public function __construct( $args = array() ) {
39
+ if ( ! empty( $args ) ) {
40
+ $this->settings = $args;
41
+ $this->settings['parent'] = $this->settings['page'];
42
+ $this->tabs_path_files = $this->get_tabs_path_files();
43
+
44
+ add_action( 'admin_init', array( $this, 'register_settings' ) );
45
+ add_action( 'admin_menu', array( &$this, 'add_setting_page' ) );
46
+ add_action( 'admin_bar_menu', array( &$this, 'add_admin_bar_menu' ), 100 );
47
+ add_action( 'admin_init', array( &$this, 'add_fields' ) );
48
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Register Settings
54
+ * Generate wp-admin settings pages by registering your settings and using a few callbacks to control the output
55
+ *
56
+ * @author Emanuela Castorina <emanuela.castorina@yithemes.it>
57
+ */
58
+ public function register_settings() {
59
+ register_setting( 'yit_' . $this->settings['page'] . '_options', 'yit_' . $this->settings['page'] . '_options', array( &$this, 'options_validate' ) );
60
+ }
61
+
62
+
63
+ /**
64
+ * Add Setting SubPage
65
+ * add Setting SubPage to WordPress administrator
66
+ *
67
+ * @author Emanuela Castorina <emanuela.castorina@yithemes.it>
68
+ */
69
+ public function add_setting_page() {
70
+ global $admin_page_hooks;
71
+ $logo = yith_plugin_fw_get_default_logo();
72
+
73
+ $admin_logo = function_exists( 'yit_get_option' ) ? yit_get_option( 'admin-logo-menu' ) : '';
74
+
75
+ if ( ! empty( $admin_logo ) ) {
76
+ $logo = $admin_logo;
77
+ }
78
+
79
+ if ( ! isset( $admin_page_hooks['yith_plugin_panel'] ) ) {
80
+ $position = apply_filters( 'yit_plugins_menu_item_position', '62.32' );
81
+ add_menu_page( 'yith_plugin_panel', 'YITH', 'nosuchcapability', 'yith_plugin_panel', null, $logo, $position );
82
+ // Prevent issues for backward compatibility.
83
+ $admin_page_hooks['yith_plugin_panel'] = 'yith-plugins'; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
84
+ }
85
+
86
+ add_submenu_page( 'yith_plugin_panel', $this->settings['label'], $this->settings['label'], 'manage_options', $this->settings['page'], array( $this, 'yit_panel' ) );
87
+ remove_submenu_page( 'yith_plugin_panel', 'yith_plugin_panel' );
88
+ }
89
+
90
+ /**
91
+ * Show a tabbed panel to setting page
92
+ * a callback function called by add_setting_page => add_submenu_page
93
+ *
94
+ * @author Emanuela Castorina <emanuela.castorina@yithemes.it>
95
+ */
96
+ public function yit_panel() {
97
+ $tabs = '';
98
+ $current_tab = $this->get_current_tab();
99
+ $yit_options = $this->get_main_array_options();
100
+
101
+ foreach ( $this->settings['admin-tabs'] as $tab => $tab_value ) {
102
+ $active_class = $current_tab === $tab ? ' nav-tab-active' : '';
103
+ $url = '?page=' . $this->settings['page'] . '&tab=' . $tab;
104
+
105
+ $tabs .= '<a class="nav-tab' . esc_attr( $active_class ) . '" href="' . esc_url( $url ) . '">' . wp_kses_post( $tab_value ) . '</a>';
106
+ }
107
+ ?>
108
+ <div id="icon-themes" class="icon32"><br/></div>
109
+ <h2 class="nav-tab-wrapper">
110
+ <?php echo $tabs; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
111
+ </h2>
112
+ <?php
113
+ $custom_tab_options = $this->get_custom_tab_options( $yit_options, $current_tab );
114
+ if ( $custom_tab_options ) {
115
+ $this->print_custom_tab( $custom_tab_options );
116
+
117
+ return;
118
+ }
119
+
120
+ $form_method = apply_filters( 'yit_admin_panel_form_method', 'POST', $current_tab );
121
+ $panel_content_class = apply_filters( 'yit_admin_panel_content_class', 'yit-admin-panel-content-wrap', $current_tab );
122
+ ?>
123
+ <div id="wrap" class="yith-plugin-fw plugin-option yit-admin-panel-container">
124
+ <?php $this->message(); ?>
125
+ <div class="<?php echo esc_attr( $panel_content_class ); ?>">
126
+ <h2><?php echo wp_kses_post( $this->get_tab_title() ); ?></h2>
127
+ <?php if ( $this->is_show_form() ) : ?>
128
+ <form id="yith-plugin-fw-panel" method="<?php echo esc_attr( $form_method ); ?>" action="options.php">
129
+ <?php do_settings_sections( 'yit' ); ?>
130
+ <p>&nbsp;</p>
131
+ <?php settings_fields( 'yit_' . $this->settings['parent'] . '_options' ); ?>
132
+ <input type="hidden" name="<?php echo esc_attr( $this->get_name_field( 'current_tab' ) ); ?>" value="<?php echo esc_attr( $current_tab ); ?>"/>
133
+ <input type="submit" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'yith-plugin-fw' ); ?>" style="float:left;margin-right:10px;"/>
134
+ <input type="hidden" name="page" value="<?php echo esc_attr( $this->settings['page'] ); ?>"/>
135
+ <input type="hidden" name="tab" value="<?php echo esc_attr( $this->get_current_tab() ); ?>"/>
136
+ <input type="hidden" name="sub_tab" value="<?php echo esc_attr( $this->get_current_sub_tab() ); ?>"/>
137
+ </form>
138
+ <form method="post">
139
+ <?php
140
+ $reset_warning = __( 'If you continue with this action, you will reset all options in this page.', 'yith-plugin-fw' ) . '\n' . __( 'Are you sure?', 'yith-plugin-fw' );
141
+ ?>
142
+ <input type="hidden" name="yit-action" value="reset"/>
143
+ <input type="submit" name="yit-reset" class="button-secondary" value="<?php esc_attr_e( 'Reset to default', 'yith-plugin-fw' ); ?>"
144
+ onclick="return confirm('<?php echo esc_attr( $reset_warning ); ?>');"/>
145
+ </form>
146
+ <p>&nbsp;</p>
147
+ <?php endif ?>
148
+ </div>
149
+ </div>
150
+ <?php
151
+ }
152
+ }
153
+ }
plugin-fw/includes/class-yit-pointers 2.php ADDED
@@ -0,0 +1,380 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Pointers Class.
4
+ *
5
+ * @class YIT_Pointers
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YIT_Pointers' ) ) {
12
+ /**
13
+ * YIT_Pointers class.
14
+ * Initializes the pointers.
15
+ */
16
+ class YIT_Pointers {
17
+
18
+ /**
19
+ * The single instance of the class.
20
+ *
21
+ * @var YIT_Pointers
22
+ */
23
+ private static $instance;
24
+
25
+ /**
26
+ * The screen IDs.
27
+ *
28
+ * @var array
29
+ */
30
+ public $screen_ids = array();
31
+
32
+ /**
33
+ * The pointers.
34
+ *
35
+ * @var array
36
+ */
37
+ public $pointers = array();
38
+
39
+ /**
40
+ * Special Screen Ids that require a particular action
41
+ *
42
+ * @var array|mixed|void
43
+ */
44
+ public $special_screen = array();
45
+
46
+ /**
47
+ * Default pointers.
48
+ *
49
+ * @var array|mixed
50
+ */
51
+ protected $default_pointer = array();
52
+
53
+ /**
54
+ * The default position
55
+ *
56
+ * @var string[]
57
+ */
58
+ protected $default_position = array(
59
+ 'edge' => 'left',
60
+ 'align' => 'center',
61
+ );
62
+
63
+ /**
64
+ * Singleton implementation.
65
+ *
66
+ * @return YIT_Pointers
67
+ */
68
+ public static function instance() {
69
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
70
+ }
71
+
72
+ /**
73
+ * Construct
74
+ *
75
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
76
+ * @since 1.0
77
+ */
78
+ private function __construct() {
79
+
80
+ $title = __( 'Plugins Activated', 'yith-plugin-fw' );
81
+ $message = __( 'From now on, you can find all plugin options in YITH menu. Plugin customization settings will be available as a new entry in YITH menu.', 'yith-plugin-fw' );
82
+ $discover_message = sprintf(
83
+ // translators: 1. YITH site link; 2. WordPress site link.
84
+ __( 'Discover all our plugins available on: %1$s and %2$s', 'yith-plugin-fw' ),
85
+ '<a href="https://yithemes.com/product-category/plugins/" target="_blank">yithemes.com</a>',
86
+ '<a href="https://profiles.wordpress.org/yithemes/" target="_blank">Wordpress.org</a>'
87
+ );
88
+
89
+ $this->default_pointer['plugins'] = array(
90
+ 'screen_id' => 'plugins',
91
+ 'options' => array(
92
+ 'content' => "<h3>{$title}</h3><p>{$message}</p><p>{$discover_message}</p>",
93
+ ),
94
+ );
95
+
96
+ $title = __( 'Plugins Upgraded', 'yith-plugin-fw' );
97
+ $message = __( 'From now on, you can find the option panel of YITH plugins in YITH menu. Every time one of our plugins is added, a new entry will be added to this menu. For example, after the update, plugin options (such as for YITH WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from previous location to YITH menu.', 'yith-plugin-fw' );
98
+ $discover_message = sprintf(
99
+ // translators: 1. YITH site link; 2. WordPress site link.
100
+ __( 'Discover all our plugins available on: %1$s and %2$s', 'yith-plugin-fw' ),
101
+ '<a href="https://yithemes.com/product-category/plugins/" target="_blank">yithemes.com</a>',
102
+ '<a href="https://profiles.wordpress.org/yithemes/" target="_blank">Wordpress.org</a>'
103
+ );
104
+
105
+ $this->default_pointer['update'] = array(
106
+ 'screen_id' => 'update',
107
+ 'options' => array(
108
+ 'content' => "<h3>{$title}</h3><p>{$message}</p><p>{$discover_message}</p>",
109
+ ),
110
+ );
111
+
112
+ $this->default_pointer = $this->parse_args( $this->default_pointer );
113
+
114
+ // DEPRECATED 'yit-pointer-special-screen' filter since 3.5 | use yith_plugin_fw_pointers_special_screens instead.
115
+ $this->special_screen = apply_filters( 'yit-pointer-special-screen', array( 'plugins', 'update' ) ); //phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
116
+ $this->special_screen = apply_filters( 'yith_plugin_fw_pointers_special_screens', array( 'plugins', 'update' ) );
117
+
118
+ add_action( 'admin_enqueue_scripts', array( $this, 'pointer_load' ) );
119
+ add_action( 'admin_init', array( $this, 'add_pointers' ), 100 );
120
+ }
121
+
122
+ /**
123
+ * Parse args for the default pointer.
124
+ *
125
+ * @param array $args The arguments to be parse.
126
+ *
127
+ * @return array
128
+ */
129
+ public function parse_args( $args ) {
130
+ $default = array(
131
+ 'pointer_id' => 'yith_default_pointer',
132
+ 'target' => '#toplevel_page_yit_plugin_panel',
133
+ 'init' => null,
134
+ );
135
+
136
+ foreach ( $args as $id => $pointer ) {
137
+ $args[ $id ] = wp_parse_args( $pointer, $default );
138
+ $args[ $id ]['options']['position'] = $this->default_position;
139
+ }
140
+
141
+ return $args;
142
+ }
143
+
144
+ /**
145
+ * Add pointers
146
+ */
147
+ public function add_pointers() {
148
+ if ( ! empty( $this->screen_ids ) ) {
149
+ foreach ( $this->screen_ids as $screen_id ) {
150
+ add_filter( "yit_pointers-{$screen_id}", array( $this, 'pointers' ) );
151
+ }
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Register pointers.
157
+ *
158
+ * @param array $pointers The pointers.
159
+ */
160
+ public function register( $pointers ) {
161
+ foreach ( $pointers as $id => $pointer ) {
162
+ $pointer_id = isset( $pointer['pointer_id'] ) ? $pointer['pointer_id'] : false;
163
+ $target = isset( $pointer['target'] ) ? $pointer['target'] : false;
164
+ $content = isset( $pointer['content'] ) ? $pointer['content'] : false;
165
+ $position = isset( $pointer['position'] ) ? $pointer['position'] : false;
166
+ $screen_id = isset( $pointer['screen_id'] ) ? $pointer['screen_id'] : false;
167
+ $init = isset( $pointer['init'] ) ? $pointer['init'] : false;
168
+
169
+ if ( ! $pointer_id || ! $target || ! $content || ! $position || ! $screen_id ) {
170
+ continue;
171
+ }
172
+
173
+ if ( ! in_array( $screen_id, $this->screen_ids, true ) ) {
174
+ $this->screen_ids[] = $screen_id;
175
+ }
176
+
177
+ $this->pointers[ $screen_id ][ $pointer_id ] = array(
178
+ 'target' => $target,
179
+ 'options' => array(
180
+ 'content' => $content,
181
+ 'position' => $position,
182
+ ),
183
+ 'init' => $init,
184
+ );
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Retrieve the registered pointers array where the keys will be the plugin init(s).
190
+ *
191
+ * @param string $screen_id The screen ID.
192
+ *
193
+ * @return array
194
+ */
195
+ public function get_plugins_init( $screen_id ) {
196
+
197
+ $registered = array();
198
+
199
+ foreach ( $this->pointers[ $screen_id ] as $pointer_id => $pointer ) {
200
+ $registered[ $pointer['init'] ] = $pointer_id;
201
+ }
202
+
203
+ return $registered;
204
+ }
205
+
206
+ /**
207
+ * Load the pointer.
208
+ *
209
+ * @param bool $deprecated Deprecated param.
210
+ */
211
+ public function pointer_load( $deprecated = false ) {
212
+ // phpcs:disable WordPress.Security.NonceVerification.Recommended
213
+ // phpcs:disable WordPress.Security.NonceVerification.Missing
214
+
215
+ // Retrieve the pointers for the current screen.
216
+ $screen = get_current_screen();
217
+ $pointers = apply_filters( "yit_pointers-{$screen->id}", array() ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
218
+
219
+ if ( ! $pointers || ! is_array( $pointers ) ) {
220
+ return;
221
+ }
222
+
223
+ // Get dismissed pointers.
224
+ $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
225
+ $valid_pointers = array();
226
+
227
+ // Show pointers only on plugin activate action.
228
+ if ( in_array( $screen->id, $this->special_screen, true ) ) {
229
+ $show = false;
230
+ $registered = $this->get_plugins_init( $screen->id );
231
+ $recently_activate = get_option( 'yit_recently_activated', array() );
232
+
233
+ // For "plugins" screen.
234
+ $is_single_activate = isset( $_GET['activate'] ) && 'true' === $_GET['activate'];
235
+ $is_multi_activate = isset( $_GET['activate-multi'] ) && 'true' === $_GET['activate-multi'];
236
+
237
+ /**
238
+ * For "update" screen
239
+ * Single plugin update use GET method
240
+ * Multi update plugins with bulk action send two post args called "action" and "action2"
241
+ * action refer to first bulk action button (at the top of plugins table)
242
+ * action2 refer to last bulk action button (at the bottom of plugins table)
243
+ */
244
+ $is_single_upgrade = isset( $_GET['action'] ) && 'upgrade-plugin' === $_GET['action'];
245
+ $is_multi_upgrade = ( isset( $_POST['action'] ) && 'update-selected' === $_POST['action'] ) || ( isset( $_POST['action2'] ) && 'update-selected' === $_POST['action2'] );
246
+
247
+ if ( $is_single_activate || $is_single_upgrade ) {
248
+ foreach ( $registered as $init => $p_id ) {
249
+ if ( in_array( $init, $recently_activate, true ) ) {
250
+ $point_id = $p_id;
251
+ $pointer = $pointers[ $point_id ];
252
+
253
+ if ( ! ( in_array( $point_id, $dismissed, true ) || empty( $pointer ) || empty( $point_id ) || empty( $pointer['target'] ) || empty( $pointer['options'] ) ) ) {
254
+ $pointer['pointer_id'] = $point_id;
255
+ $valid_pointers['pointers'][] = $pointer;
256
+ $show = true;
257
+ }
258
+ break;
259
+ }
260
+ }
261
+ } elseif ( $is_multi_activate || $is_multi_upgrade ) {
262
+ $point_id = array();
263
+ $screen_id = $screen->id;
264
+
265
+ if ( $is_multi_upgrade && isset( $_POST['checked'] ) && ( count( $_POST['checked'] ) > 0 ) ) {
266
+ $recently_activate = sanitize_file_name( wp_unslash( $_POST['checked'] ) );
267
+ $screen_id = 'update';
268
+ $pointers = apply_filters( "yit_pointers-{$screen_id}", array() ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
269
+ }
270
+
271
+ foreach ( $registered as $init => $p_id ) {
272
+ if ( in_array( $init, $recently_activate, true ) ) {
273
+ $point_id[] = $p_id;
274
+ }
275
+ }
276
+
277
+ /**
278
+ * Bulk Action: Activate Plugins
279
+ * count( $point_id ) is the number of YITH plugins that have registered specific pointers
280
+ * case 0 -> No pointers -> Exit
281
+ * case 1 -> Only one pointers to show -> Use the specific plugin pointer
282
+ * default -> Two or more plugins need to show a pointer -> use a generic pointers
283
+ */
284
+ switch ( count( $point_id ) ) {
285
+ case 0:
286
+ $show = false;
287
+ break;
288
+
289
+ case 1:
290
+ $point_id = array_pop( $point_id );
291
+ $pointer = $pointers[ $point_id ];
292
+ if ( ! ( in_array( $point_id, $dismissed, true ) || empty( $pointer ) || empty( $point_id ) || empty( $pointer['target'] ) || empty( $pointer['options'] ) ) ) {
293
+ $pointer['pointer_id'] = $point_id;
294
+ $valid_pointers['pointers'][] = $pointer;
295
+ $show = true;
296
+ }
297
+ break;
298
+
299
+ default:
300
+ $valid_pointers['pointers'][] = $this->default_pointer[ $screen_id ];
301
+ $show = true;
302
+ break;
303
+ }
304
+ }
305
+
306
+ update_option( 'yit_recently_activated', array() );
307
+
308
+ if ( ! $show ) {
309
+ return;
310
+ }
311
+ } else {
312
+ // Check pointers and remove dismissed ones.
313
+ foreach ( $pointers as $pointer_id => $pointer ) {
314
+
315
+ if ( in_array( $pointer_id, $dismissed, true ) || empty( $pointer ) || empty( $pointer_id ) || empty( $pointer['target'] ) || empty( $pointer['options'] ) ) {
316
+ continue;
317
+ }
318
+
319
+ $pointer['pointer_id'] = $pointer_id;
320
+
321
+ $valid_pointers['pointers'][] = $pointer;
322
+ }
323
+ }
324
+
325
+ if ( empty( $valid_pointers ) ) {
326
+ return;
327
+ }
328
+
329
+ $script_file = function_exists( 'yit_load_js_file' ) ? yit_load_js_file( 'yit-wp-pointer.js' ) : 'yit-wp-pointer.min.js';
330
+
331
+ // Enqueue pointer scripts and styles.
332
+ wp_enqueue_style( 'wp-pointer' );
333
+ wp_enqueue_script( 'wp-pointer' );
334
+
335
+ wp_enqueue_script( 'yit-wp-pointer', YIT_CORE_PLUGIN_URL . '/assets/js/' . $script_file, array( 'wp-pointer' ), yith_plugin_fw_get_version(), true );
336
+ wp_localize_script( 'yit-wp-pointer', 'custom_pointer', $valid_pointers );
337
+
338
+ // phpcs:enable
339
+ }
340
+
341
+ /**
342
+ * Filter pointers.
343
+ *
344
+ * @param array $pointers The pointers.
345
+ *
346
+ * @return array
347
+ */
348
+ public function pointers( $pointers ) {
349
+ $screen_id = str_replace( 'yit_pointers-', '', current_filter() );
350
+ $pointers_to_add = $this->get_pointers( $screen_id );
351
+
352
+ return ! empty( $pointers_to_add ) ? array_merge( $pointers, $pointers_to_add ) : $pointers;
353
+ }
354
+
355
+ /**
356
+ * Retrieve pointers for the specified screen ID.
357
+ *
358
+ * @param string $screen_id The Screen ID.
359
+ *
360
+ * @return array|mixed
361
+ */
362
+ public function get_pointers( $screen_id ) {
363
+ return isset( $this->pointers[ $screen_id ] ) ? $this->pointers[ $screen_id ] : array();
364
+ }
365
+ }
366
+ }
367
+
368
+ if ( ! function_exists( 'YIT_Pointers' ) ) {
369
+
370
+ /**
371
+ * Single instance of YIT_Pointers
372
+ *
373
+ * @return YIT_Pointers
374
+ */
375
+ function YIT_Pointers() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
376
+ return YIT_Pointers::instance();
377
+ }
378
+ }
379
+
380
+ YIT_Pointers();
plugin-fw/includes/class-yit-theme-licence 2.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Theme License Class.
4
+ *
5
+ * @class YIT_Theme_Licence
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YIT_Theme_Licence' ) ) {
12
+ /**
13
+ * YIT_Theme_Licence class.
14
+ *
15
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
16
+ */
17
+ class YIT_Theme_Licence {
18
+ /**
19
+ * The single instance of the class.
20
+ *
21
+ * @var YIT_Theme_Licence
22
+ */
23
+ private static $instance;
24
+
25
+ /**
26
+ * Singleton implementation.
27
+ *
28
+ * @return YIT_Theme_Licence
29
+ */
30
+ public static function instance() {
31
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
32
+ }
33
+
34
+ /**
35
+ * YIT_Theme_Licence constructor.
36
+ */
37
+ private function __construct() {
38
+ // Silence is golden.
39
+ }
40
+
41
+ /**
42
+ * Premium products registration.
43
+ *
44
+ * @param string $init The product init identifier.
45
+ * @param string $secret_key The secret key.
46
+ * @param string $product_id The product ID.
47
+ *
48
+ * @return void
49
+ * @since 1.0
50
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
51
+ */
52
+ public function register( $init, $secret_key, $product_id ) {
53
+ if ( ! function_exists( 'YITH_Theme_Licence' ) ) {
54
+ // Try to load YITH_Theme_Licence class.
55
+ yith_plugin_fw_load_update_and_licence_files();
56
+ }
57
+
58
+ if ( function_exists( 'YITH_Theme_Licence' ) && is_callable( array( YITH_Theme_Licence(), 'register' ) ) ) {
59
+ YITH_Theme_Licence()->register( $init, $secret_key, $product_id );
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ if ( ! function_exists( 'YIT_Theme_Licence' ) ) {
66
+ /**
67
+ * Single instance of YIT_Theme_Licence
68
+ *
69
+ * @return YIT_Theme_Licence
70
+ */
71
+ function YIT_Theme_Licence() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
72
+ return YIT_Theme_Licence::instance();
73
+ }
74
+ }
plugin-fw/includes/class-yit-upgrade 2.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Upgrade Class
4
+ * handle notifications and plugin updates.
5
+ *
6
+ * @class YIT_Upgrade
7
+ * @package YITH\PluginFramework\Classes
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YIT_Upgrade' ) ) {
13
+ /**
14
+ * YIT_Upgrade class.
15
+ */
16
+ class YIT_Upgrade {
17
+ /**
18
+ * The single instance of the class.
19
+ *
20
+ * @var YIT_Upgrade
21
+ */
22
+ private static $instance;
23
+
24
+ /**
25
+ * Singleton implementation.
26
+ *
27
+ * @return YIT_Upgrade
28
+ */
29
+ public static function instance() {
30
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
31
+ }
32
+
33
+ /**
34
+ * YIT_Upgrade constructor.
35
+ */
36
+ private function __construct() {
37
+ // Silence is golden.
38
+ }
39
+
40
+ /**
41
+ * Premium products registration.
42
+ *
43
+ * @param string $plugin_slug The plugin slug.
44
+ * @param string $plugin_init The plugin init file.
45
+ */
46
+ public function register( $plugin_slug, $plugin_init ) {
47
+ if ( ! function_exists( 'YITH_Plugin_Upgrade' ) ) {
48
+ // Try to load YITH_Plugin_Upgrade class.
49
+ yith_plugin_fw_load_update_and_licence_files();
50
+ }
51
+
52
+ if ( function_exists( 'YITH_Plugin_Upgrade' ) && is_callable( array( YITH_Plugin_Upgrade(), 'register' ) ) ) {
53
+ YITH_Plugin_Upgrade()->register( $plugin_slug, $plugin_init );
54
+ }
55
+ }
56
+ }
57
+ }
58
+
59
+ if ( ! function_exists( 'YIT_Upgrade' ) ) {
60
+ /**
61
+ * Single instance of YIT_Upgrade
62
+ *
63
+ * @return YIT_Upgrade
64
+ */
65
+ function YIT_Upgrade() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
66
+ return YIT_Upgrade::instance();
67
+ }
68
+ }
69
+
70
+ YIT_Upgrade();
plugin-fw/includes/class-yit-video 2.php ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Video Class
4
+ * manage videos from youtube, vimeo and other services.
5
+ *
6
+ * @class YIT_Video
7
+ * @package YITH\PluginFramework\Classes
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YIT_Video' ) ) {
13
+ /**
14
+ * YIT_Video class.
15
+ *
16
+ * @deprecated 3.5
17
+ */
18
+ class YIT_Video {
19
+
20
+ /**
21
+ * Generate the HTML for a youtube video
22
+ *
23
+ * @param array $args Array of arguments to configure the video to generate.
24
+ *
25
+ * @return string
26
+ */
27
+ public static function youtube( $args = array() ) {
28
+ $defaults = array(
29
+ 'id' => '',
30
+ 'url' => '',
31
+ 'width' => 425,
32
+ 'height' => 356,
33
+ 'echo' => false,
34
+ );
35
+ $args = wp_parse_args( $args, $defaults );
36
+
37
+ $id = $args['id'];
38
+ $url = $args['url'];
39
+ $width = $args['width'];
40
+ $height = $args['height'];
41
+ $echo = $args['echo'];
42
+ $html = '';
43
+
44
+ // Retrieve the video ID if we have only the URL.
45
+ if ( ! $id && ! ! $url ) {
46
+ $id = self::video_id_by_url( $url );
47
+ }
48
+
49
+ if ( $id ) {
50
+ $id = preg_replace( '/[&|&amp;]feature=([\w\-]*)/', '', $id );
51
+ $id = preg_replace( '/(youtube|vimeo):/', '', $id );
52
+ $url = "https://www.youtube.com/embed/{$id}?wmode=transparent";
53
+
54
+ $html = '<div class="post_video youtube">' .
55
+ '<iframe wmode="transparent" width="' . esc_attr( $width ) . '" height="' . esc_attr( $height ) . '" src="' . esc_url( $url ) . '" frameborder="0" allowfullscreen></iframe>' .
56
+ '</div>';
57
+ $html = apply_filters( 'yit_video_youtube', $html );
58
+ }
59
+
60
+ if ( $echo ) {
61
+ echo wp_kses_post( $html );
62
+ }
63
+
64
+ return $html;
65
+ }
66
+
67
+ /**
68
+ * Generate the HTML for a vimeo video
69
+ *
70
+ * @param array $args Array of arguments to configure the video to generate.
71
+ *
72
+ * @return string
73
+ */
74
+ public static function vimeo( $args = array() ) {
75
+ $defaults = array(
76
+ 'id' => '',
77
+ 'url' => '',
78
+ 'width' => 425,
79
+ 'height' => 356,
80
+ 'echo' => false,
81
+ );
82
+ $args = wp_parse_args( $args, $defaults );
83
+
84
+ $id = $args['id'];
85
+ $url = $args['url'];
86
+ $width = $args['width'];
87
+ $height = $args['height'];
88
+ $echo = $args['echo'];
89
+ $html = '';
90
+
91
+ // Retrieve the video ID if we have only the URL.
92
+ if ( ! $id && ! ! $url ) {
93
+ $id = self::video_id_by_url( $url );
94
+ }
95
+
96
+ if ( $id ) {
97
+ $id = preg_replace( '/[&|&amp;]feature=([\w\-]*)/', '', $id );
98
+ $id = preg_replace( '/(youtube|vimeo):/', '', $id );
99
+ $protocol = is_ssl() ? 'https' : 'http';
100
+ $url = "{$protocol}://player.vimeo.com/video/{$id}?title=0&amp;byline=0&amp;portrait=0";
101
+
102
+ $html = '<div class="post_video youtube">' .
103
+ '<iframe wmode="transparent" width="' . esc_attr( $width ) . '" height="' . esc_attr( $height ) . '" src="' . esc_url( $url ) . '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>' .
104
+ '</div>';
105
+ $html = apply_filters( 'yit_video_vimeo', $html );
106
+ }
107
+
108
+ if ( $echo ) {
109
+ echo wp_kses_post( $html );
110
+ }
111
+
112
+ return $html;
113
+ }
114
+
115
+ /**
116
+ * Retrieve video ID from URL
117
+ *
118
+ * @param string $url URL of the video.
119
+ *
120
+ * @return bool|string
121
+ */
122
+ public static function video_id_by_url( $url ) {
123
+ $parsed = wp_parse_url( esc_url( $url ) );
124
+ $host = isset( $parsed['host'] ) ? $parsed['host'] : false;
125
+
126
+ switch ( $host ) {
127
+ case 'youtube.com':
128
+ case 'www.youtube.com':
129
+ case 'youtu.be':
130
+ case 'www.youtu.be':
131
+ $id = self::youtube_id_by_url( $url );
132
+ $video_id = "youtube:$id";
133
+ break;
134
+
135
+ case 'www.vimeo.com':
136
+ case 'vimeo.com':
137
+ preg_match( '/http(s)?:\/\/(\w+.)?vimeo\.com\/(.*\/)?([0-9]+)/', $url, $matches );
138
+
139
+ $id = trim( $matches[4], '/' );
140
+ $video_id = "vimeo:$id";
141
+ break;
142
+
143
+ default:
144
+ $video_id = false;
145
+
146
+ }
147
+
148
+ return $video_id;
149
+ }
150
+
151
+ /**
152
+ * Retrieve video ID from URL
153
+ *
154
+ * @param string $url URL of the video.
155
+ *
156
+ * @return bool|string
157
+ */
158
+ protected static function youtube_id_by_url( $url ) {
159
+ if ( preg_match( '/http(s)?:\/\/youtu.be/', $url, $matches ) ) {
160
+ $url = wp_parse_url( $url, PHP_URL_PATH );
161
+ $url = str_replace( '/', '', $url );
162
+
163
+ return $url;
164
+
165
+ } elseif ( preg_match( '/watch/', $url, $matches ) ) {
166
+ $arr = wp_parse_url( $url );
167
+ $url = str_replace( 'v=', '', $arr['query'] );
168
+
169
+ return $url;
170
+
171
+ } elseif ( preg_match( '/http(s)?:\/\/(\w+.)?youtube.com\/v/', $url, $matches ) ) {
172
+ $arr = wp_parse_url( $url );
173
+ $url = str_replace( '/v/', '', $arr['path'] );
174
+
175
+ return $url;
176
+
177
+ } elseif ( preg_match( '/http(s)?:\/\/(\w+.)?youtube.com\/embed/', $url, $matches ) ) {
178
+ $arr = wp_parse_url( $url );
179
+ $url = str_replace( '/embed/', '', $arr['path'] );
180
+
181
+ return $url;
182
+
183
+ } elseif ( preg_match( "#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches ) ) {
184
+ return $matches[0];
185
+
186
+ } else {
187
+ return false;
188
+ }
189
+ }
190
+
191
+ }
192
+ }
plugin-fw/includes/class-yith-bh-onboarding 2.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH BH Onboarding Class
4
+ *
5
+ * @class YITH_BH_Onboarding
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YITH_BH_Onboarding' ) ) {
12
+ /**
13
+ * Main Class
14
+ */
15
+ class YITH_BH_Onboarding {
16
+ /**
17
+ * The single instance of the class.
18
+ *
19
+ * @var self
20
+ */
21
+ protected static $instance = null;
22
+
23
+ /**
24
+ * Get class instance.
25
+ *
26
+ * @return self
27
+ */
28
+ public static function get_instance() {
29
+ return ! is_null( static::$instance ) ? static::$instance : static::$instance = new static();
30
+ }
31
+
32
+ /**
33
+ * Constructor
34
+ */
35
+ protected function __construct() {
36
+ add_action( 'yith_bh_onboarding', array( $this, 'show_onboarding_content' ), 10, 1 );
37
+ add_action( 'wp_ajax_yith_bh_onboarding', array( $this, 'save_options' ) );
38
+ }
39
+
40
+ /**
41
+ * Show onboarding content
42
+ *
43
+ * @param string $slug Slug of current plugin modal.
44
+ */
45
+ public function show_onboarding_content( $slug ) {
46
+
47
+ $options = apply_filters( 'yith_bh_onboarding_' . $slug, array() );
48
+
49
+ if ( empty( $options ) || ! isset( $options['tabs'], $options['slug'] ) ) {
50
+ return;
51
+ }
52
+
53
+ define( 'DOING_YITH_BH_ONBOARDING', true );
54
+
55
+ if ( ! wp_script_is( 'yith-plugin-fw-fields', 'registered' ) || ! wp_style_is( 'yith-plugin-fw-fields', 'registered' ) ) {
56
+ YIT_Assets::instance()->register_styles_and_scripts();
57
+ }
58
+
59
+ if ( isset( $options['enqueue_script'] ) ) {
60
+ foreach ( $options['enqueue_script'] as $handle ) {
61
+ wp_enqueue_script( $handle );
62
+ }
63
+ }
64
+
65
+ if ( isset( $options['enqueue_style'] ) ) {
66
+ foreach ( $options['enqueue_style'] as $handle ) {
67
+ wp_enqueue_style( $handle );
68
+ }
69
+ }
70
+
71
+ wp_enqueue_script( 'yith-bh-onboarding' );
72
+ wp_enqueue_style( 'yith-bh-onboarding' );
73
+
74
+ include YIT_CORE_PLUGIN_TEMPLATE_PATH . '/bh-onboarding/onboarding-tabs.php';
75
+ }
76
+
77
+ /**
78
+ * Save options
79
+ *
80
+ * @return void
81
+ */
82
+ public function save_options() {
83
+ check_ajax_referer( 'yith-bh-onboarding-save-options' );
84
+ if ( ! isset( $_REQUEST['yith-plugin'], $_REQUEST['tab'] ) ) {
85
+ wp_send_json_error( __( 'It is not possible save the options', 'yith-plugin-fw' ) );
86
+ }
87
+
88
+ $slug = sanitize_text_field( wp_unslash( $_REQUEST['yith-plugin'] ) );
89
+ $posted = $_REQUEST;
90
+ // the options are filtered by each plugin.
91
+ $options = apply_filters( 'yith_bh_onboarding_' . $slug, array() );
92
+ $tab = $posted['tab'];
93
+
94
+ if ( apply_filters( 'yith_bh_onboarding_save_options_' . $slug, isset( $options['tabs'][ $tab ]['options'] ), $posted ) ) {
95
+ foreach ( $options['tabs'][ $tab ]['options'] as $single_option ) {
96
+ if ( isset( $posted[ $single_option['id'] ] ) ) {
97
+ $value = $posted[ $single_option['id'] ] ?? false;
98
+ $value = YIT_Plugin_Panel_WooCommerce::sanitize_option( $value, $single_option, $value );
99
+ $value = apply_filters( 'yith_bh_onboarding_save_option_value', $value, $single_option, $slug );
100
+ update_option( $single_option['id'], $value );
101
+ }
102
+ }
103
+ }
104
+
105
+ wp_send_json_success();
106
+ }
107
+ }
108
+ }
109
+
110
+ YITH_BH_Onboarding::get_instance();
plugin-fw/includes/class-yith-dashboard 2.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Dashboard Class
4
+ * handle WordPress Admin Dashboard
5
+ *
6
+ * @class YITH_Dashboard
7
+ * @package YITH\PluginFramework\Classes
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YITH_Dashboard' ) ) {
13
+ /**
14
+ * YITH_Dashboard class.
15
+ */
16
+ class YITH_Dashboard {
17
+ /**
18
+ * Products Feed URL
19
+ *
20
+ * @var string
21
+ */
22
+ private static $products_feed = 'https://yithemes.com/latest-updates/feeds/';
23
+
24
+ /**
25
+ * Blog Feed URL
26
+ *
27
+ * @var string
28
+ */
29
+ private static $blog_feed = 'https://yithemes.com/feed/';
30
+
31
+ /**
32
+ * Dashboard widget setup.
33
+ */
34
+ public static function dashboard_widget_setup() {
35
+ wp_add_dashboard_widget( 'yith_dashboard_products_news', __( 'YITH Latest Updates', 'yith-plugin-fw' ), 'YITH_Dashboard::dashboard_products_news' );
36
+ wp_add_dashboard_widget( 'yith_dashboard_blog_news', __( 'Latest news from YITH Blog', 'yith-plugin-fw' ), 'YITH_Dashboard::dashboard_blog_news' );
37
+ }
38
+
39
+
40
+ /**
41
+ * Product news Widget
42
+ */
43
+ public static function dashboard_products_news() {
44
+ $items = 10;
45
+ $rss = static::$products_feed;
46
+ if ( is_string( $rss ) ) {
47
+ $rss = fetch_feed( $rss );
48
+ } elseif ( is_array( $rss ) && isset( $rss['url'] ) ) {
49
+ $rss = fetch_feed( $rss['url'] );
50
+ } elseif ( ! is_object( $rss ) ) {
51
+ return;
52
+ }
53
+
54
+ if ( is_wp_error( $rss ) ) {
55
+ if ( is_admin() || current_user_can( 'manage_options' ) ) {
56
+ echo '<p><strong>' . esc_html__( 'RSS Error:', 'yith-plugin-fw' ) . '</strong> ' . wp_kses_post( $rss->get_error_message() ) . '</p>';
57
+ }
58
+
59
+ return;
60
+ }
61
+
62
+ if ( ! $rss->get_item_quantity() ) {
63
+ echo '<ul><li>' . esc_html__( 'An error has occurred, which probably means the feed is down. Try again later.', 'yith-plugin-fw' ) . '</li></ul>';
64
+ $rss->__destruct();
65
+ unset( $rss );
66
+
67
+ return;
68
+ }
69
+
70
+ /**
71
+ * The feed items.
72
+ *
73
+ * @var SimplePie_Item[] $last_updates
74
+ */
75
+ $last_updates = $rss->get_items( 0, $items );
76
+ $html_classes = 'rsswidget yith-update-feeds';
77
+ $output = '';
78
+
79
+ if ( count( $last_updates ) > 0 ) {
80
+ $output = '<ul class="yith-update-feeds">';
81
+ }
82
+
83
+ foreach ( $last_updates as $last_update ) {
84
+ $output .= '<li class="yith-update-feed">';
85
+
86
+ $date = $last_update->get_date( 'U' );
87
+ $date_i18n = ! empty( $date ) ? date_i18n( get_option( 'date_format' ), $date ) : '';
88
+ $html_date = ! empty( $date_i18n ) ? ' <span class="rss-date">' . date_i18n( get_option( 'date_format' ), $date ) . '</span>' : '';
89
+
90
+ $output .= sprintf( '<a target="_blank" href="%s" class="%s">%s</a> %s', $last_update->get_permalink(), $html_classes, $last_update->get_title(), $html_date );
91
+
92
+ $changelog = $last_update->get_description();
93
+
94
+ if ( ! empty( $changelog ) ) {
95
+ $output .= ' - ';
96
+ $output .= sprintf( '<a class="yith-last-changelog" href="#" data-changelogid="%s" data-plugininfo="%s">%s</a>', $last_update->get_id( true ), $last_update->get_title(), _x( 'View Changelog', 'Plugin FW', 'yith-plugin-fw' ) );
97
+ $output .= sprintf( '<div class="yith-feeds-wrapper" id="%s"><div class="yith-feeds-changelog-plugin-name"><img class="yith-feeds-logo" src="%s" /><h3 class="yith-feeds-plugin-name"><span style="font-weight: normal;">%s</span> %s</h3></div><p>%s</p></div>', $last_update->get_id( true ), yith_plugin_fw_get_default_logo(), _x( 'Latest update released on', 'Plugin FW', 'yith-plugin-fw' ), $date_i18n, $changelog );
98
+ }
99
+
100
+ $output .= '</li>';
101
+ }
102
+
103
+ if ( ! empty( $output ) ) {
104
+ $output .= '</ul>';
105
+ }
106
+
107
+ echo wp_kses_post( $output );
108
+ $rss->__destruct();
109
+ unset( $rss );
110
+ }
111
+
112
+ /**
113
+ * Blog news Widget
114
+ */
115
+ public static function dashboard_blog_news() {
116
+ $args = array(
117
+ 'show_author' => 0,
118
+ 'show_date' => 1,
119
+ 'show_summary' => 1,
120
+ 'items' => 3,
121
+ );
122
+ $feed = static::$blog_feed;
123
+ wp_widget_rss_output( $feed, $args );
124
+ }
125
+
126
+ /**
127
+ * Enqueue Styles and Scripts for View Last Changelog widget
128
+ */
129
+ public static function enqueue_scripts() {
130
+ if ( function_exists( 'get_current_screen' ) && get_current_screen() && 'dashboard' === get_current_screen()->id ) {
131
+ $script_path = defined( 'YIT_CORE_PLUGIN_URL' ) ? YIT_CORE_PLUGIN_URL : get_template_directory_uri() . '/core/plugin-fw';
132
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
133
+ wp_enqueue_script( 'yith-dashboard', $script_path . '/assets/js/yith-dashboard' . $suffix . '.js', array( 'jquery-ui-dialog' ), yith_plugin_fw_get_version(), true );
134
+ wp_enqueue_style( 'wp-jquery-ui-dialog' );
135
+ $l10n = array(
136
+ 'buttons' => array(
137
+ 'close' => _x( 'Close', 'Button label', 'yith-plugin-fw' ),
138
+ ),
139
+ );
140
+ wp_localize_script( 'yith-dashboard', 'yith_dashboard', $l10n );
141
+ }
142
+ }
143
+ }
144
+
145
+ if ( apply_filters( 'yith_plugin_fw_show_dashboard_widgets', true ) ) {
146
+ add_action( 'wp_dashboard_setup', 'YITH_Dashboard::dashboard_widget_setup' );
147
+ add_action( 'admin_enqueue_scripts', 'YITH_Dashboard::enqueue_scripts', 20 );
148
+ }
149
+ }
plugin-fw/includes/class-yith-debug 2.php ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Debug Class.
4
+ *
5
+ * @class YITH_Debug
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YITH_Debug' ) ) {
12
+ /**
13
+ * YITH_Debug class.
14
+ *
15
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
16
+ * @deprecated 3.7.7
17
+ */
18
+ class YITH_Debug {
19
+
20
+ /**
21
+ * The single instance of the class.
22
+ *
23
+ * @var YITH_Debug
24
+ */
25
+ private static $instance;
26
+
27
+ /**
28
+ * Singleton implementation.
29
+ *
30
+ * @return YITH_Debug
31
+ */
32
+ public static function instance() {
33
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
34
+ }
35
+
36
+ /**
37
+ * Deprecated singleton implementation.
38
+ * Kept for backward compatibility.
39
+ *
40
+ * @return YITH_Debug
41
+ * @deprecated 3.5 | use YITH_Debug::get_instance() instead.
42
+ */
43
+ public static function get_instance() {
44
+ return self::instance();
45
+ }
46
+
47
+ /**
48
+ * YITH_Debug constructor.
49
+ */
50
+ private function __construct() {
51
+
52
+ }
53
+
54
+ /**
55
+ * Init
56
+ */
57
+ public function init() {
58
+
59
+ }
60
+
61
+ /**
62
+ * Add debug node in admin bar.
63
+ *
64
+ * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance.
65
+ */
66
+ public function add_debug_in_admin_bar( $wp_admin_bar ) {
67
+ // Do nothing.
68
+ }
69
+
70
+
71
+ /**
72
+ * Return an array of debug information.
73
+ *
74
+ * @return array
75
+ */
76
+ public function get_debug_information() {
77
+ return array();
78
+ }
79
+
80
+ /**
81
+ * Return the current screen ID.
82
+ *
83
+ * @return string
84
+ */
85
+ public function get_current_screen_info() {
86
+ $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false;
87
+
88
+ return ! ! $screen ? $screen->id : 'null';
89
+ }
90
+
91
+ /**
92
+ * Return the current theme name and version.
93
+ *
94
+ * @return string
95
+ */
96
+ public function get_theme_info() {
97
+ $theme = function_exists( 'wp_get_theme' ) ? wp_get_theme() : false;
98
+
99
+ return ! ! $theme ? $theme->get( 'Name' ) . ' (' . $theme->get( 'Version' ) . ')' : 'null';
100
+ }
101
+
102
+ /**
103
+ * Return the WooCommerce version if active.
104
+ *
105
+ * @return string
106
+ */
107
+ public function get_woocommerce_version_info() {
108
+ return function_exists( 'WC' ) ? WC()->version : 'not active';
109
+ }
110
+
111
+ /**
112
+ * Return plugin framework information (version and loaded_by).
113
+ *
114
+ * @return string
115
+ */
116
+ public function get_plugin_framework_info() {
117
+ $plugin_fw_version = yith_plugin_fw_get_version();
118
+ $plugin_fw_loaded_by = basename( dirname( YIT_CORE_PLUGIN_PATH ) );
119
+
120
+ return "$plugin_fw_version (by $plugin_fw_loaded_by)";
121
+ }
122
+
123
+ /**
124
+ * Return premium plugins list with versions.
125
+ *
126
+ * @return array
127
+ */
128
+ public function get_premium_plugins_info() {
129
+ $plugins = YIT_Plugin_Licence()->get_products();
130
+ $plugins_info = array();
131
+
132
+ if ( ! ! $plugins ) {
133
+ foreach ( $plugins as $plugin ) {
134
+ $plugins_info[ $plugin['product_id'] ] = array( 'title' => $plugin['Name'] . ' (' . $plugin['Version'] . ')' );
135
+ }
136
+
137
+ sort( $plugins_info );
138
+ }
139
+
140
+ return $plugins_info;
141
+ }
142
+ }
143
+ }
144
+ if ( ! function_exists( 'yith_debug' ) ) {
145
+ /**
146
+ * Single instance of YITH_Debug
147
+ *
148
+ * @return YITH_Debug
149
+ * @deprecated 3.7.7
150
+ */
151
+ function yith_debug() {
152
+ return YITH_Debug::instance();
153
+ }
154
+ }
plugin-fw/includes/class-yith-post-type-admin 2.php ADDED
@@ -0,0 +1,474 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Post Type Admin
4
+ *
5
+ * @class YITH_Post_Type_Admin
6
+ * @package YITH\PluginFramework\Classes
7
+ */
8
+
9
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
10
+
11
+ if ( ! class_exists( 'YITH_Post_Type_Admin' ) ) {
12
+ /**
13
+ * YITH_Post_Type_Admin class.
14
+ *
15
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
16
+ */
17
+ abstract class YITH_Post_Type_Admin {
18
+
19
+ /**
20
+ * The post type.
21
+ *
22
+ * @var string
23
+ */
24
+ protected $post_type = '';
25
+
26
+ /**
27
+ * The object to be shown for each row.
28
+ *
29
+ * @var object|null
30
+ */
31
+ protected $object = null;
32
+
33
+ /**
34
+ * The ID of the Post to be shown for each row.
35
+ *
36
+ * @var int|null
37
+ */
38
+ protected $post_id = null;
39
+
40
+ /**
41
+ * The single instance of the class.
42
+ *
43
+ * @var YITH_Post_Type_Admin[]
44
+ */
45
+ private static $instances = array();
46
+
47
+ /**
48
+ * Singleton implementation.
49
+ *
50
+ * @return YITH_Post_Type_Admin
51
+ */
52
+ public static function instance() {
53
+ $class = get_called_class();
54
+
55
+ return ! empty( self::$instances[ $class ] ) ? self::$instances[ $class ] : self::$instances[ $class ] = new $class();
56
+ }
57
+
58
+ /**
59
+ * YITH_Admin_Post_List_Table constructor.
60
+ */
61
+ protected function __construct() {
62
+ if ( $this->post_type && $this->is_enabled() ) {
63
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
64
+ // use "admin_init" for AJAX calls, since in case of AJAX, "current_screen" is not fired.
65
+ add_action( 'admin_init', array( $this, 'init_wp_list_handlers' ) );
66
+ } else {
67
+ add_action( 'current_screen', array( $this, 'init_wp_list_handlers' ) );
68
+ }
69
+
70
+ add_action( 'edit_form_top', array( $this, 'print_back_to_wp_list_button' ) );
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Return true if it's enabled.
76
+ *
77
+ * @return bool
78
+ */
79
+ protected function is_enabled() {
80
+ return is_admin();
81
+ }
82
+
83
+ /**
84
+ * Return true if you want to use the object when you render columns. False otherwise.
85
+ * This is useful if you have an object representing your Custom Post Type that handles the CRUD.
86
+ * Note: if you use the object, you should set it by overriding the YITH_Post_Type_Admin::prepare_row_data method.
87
+ *
88
+ * @return bool
89
+ */
90
+ protected function use_object() {
91
+ return true;
92
+ }
93
+
94
+ /**
95
+ * Return true if the wp-list handlers should be loaded.
96
+ *
97
+ * @return bool
98
+ */
99
+ protected function should_wp_list_handlers_be_loaded() {
100
+ $screen_id = false;
101
+
102
+ if ( function_exists( 'get_current_screen' ) ) {
103
+ $screen = get_current_screen();
104
+ $screen_id = isset( $screen, $screen->id ) ? $screen->id : '';
105
+ }
106
+
107
+ if ( ! empty( $_REQUEST['screen'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
108
+ $screen_id = sanitize_text_field( wp_unslash( $_REQUEST['screen'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
109
+ }
110
+
111
+ return ! ! $screen_id && ( 'edit-' . $this->post_type === $screen_id );
112
+ }
113
+
114
+ /**
115
+ * Initialize the WP List handlers.
116
+ */
117
+ public function init_wp_list_handlers() {
118
+ if ( $this->should_wp_list_handlers_be_loaded() ) {
119
+ add_action( 'manage_posts_extra_tablenav', array( $this, 'maybe_render_blank_state' ) );
120
+
121
+ add_action( 'restrict_manage_posts', array( $this, 'maybe_render_filters' ) );
122
+ add_filter( 'request', array( $this, 'request_query' ) );
123
+
124
+ add_filter( 'list_table_primary_column', array( $this, 'list_table_primary_column' ), 10, 2 );
125
+ add_filter( 'post_row_actions', array( $this, 'row_actions' ), 100, 2 );
126
+
127
+ add_filter( 'default_hidden_columns', array( $this, 'default_hidden_columns' ), 10, 2 );
128
+ add_filter( 'manage_edit-' . $this->post_type . '_sortable_columns', array( $this, 'define_sortable_columns' ) );
129
+ add_filter( 'manage_' . $this->post_type . '_posts_columns', array( $this, 'define_columns' ) );
130
+ add_filter( 'bulk_actions-edit-' . $this->post_type, array( $this, 'define_bulk_actions' ) );
131
+
132
+ add_action( 'manage_' . $this->post_type . '_posts_custom_column', array( $this, 'render_columns' ), 10, 2 );
133
+ add_filter( 'handle_bulk_actions-edit-' . $this->post_type, array( $this, 'handle_bulk_actions' ), 10, 3 );
134
+
135
+ add_action( 'disable_months_dropdown', array( $this, 'disable_months_dropdown' ), 10, 2 );
136
+ }
137
+ }
138
+
139
+ /**
140
+ * --------------------------------------------------------------------------
141
+ * Getters and definers methods
142
+ * --------------------------------------------------------------------------
143
+ *
144
+ * Methods for getting data from the objects. Usually you need to override them in your class.
145
+ */
146
+
147
+ /**
148
+ * Get actions to show in the list table as action-buttons
149
+ *
150
+ * @return array
151
+ */
152
+ protected function get_item_actions() {
153
+ return array();
154
+ }
155
+
156
+ /**
157
+ * Retrieve an array of parameters for blank state.
158
+ *
159
+ * @return array{
160
+ * @type string $icon The YITH icon. You can use this one (to use an YITH icon) or icon_class or icon_url.
161
+ * @type string $icon_class The icon class. You can use this one (to use a custom class for your icon) or icon or icon_url.
162
+ * @type string $icon_url The icon URL. You can use this one (to specify an icon URL) or icon_icon or icon_class.
163
+ * @type string $message The message to be shown.
164
+ * @type string $cta {
165
+ * The call-to-action button params.
166
+ * @type string $title The call-to-action button title.
167
+ * @type string $icon The call-to-action button icon.
168
+ * @type string $url The call-to-action button URL.
169
+ * @type string $class The call-to-action button class.
170
+ * }
171
+ * }
172
+ */
173
+ protected function get_blank_state_params() {
174
+ return array();
175
+ }
176
+
177
+ /**
178
+ * Define primary column.
179
+ *
180
+ * @return string
181
+ */
182
+ protected function get_primary_column() {
183
+ return '';
184
+ }
185
+
186
+ /**
187
+ * Define hidden columns.
188
+ *
189
+ * @return array
190
+ */
191
+ protected function get_default_hidden_columns() {
192
+ return array();
193
+ }
194
+
195
+ /**
196
+ * Define which columns are sortable.
197
+ *
198
+ * @param array $columns Existing columns.
199
+ *
200
+ * @return array
201
+ */
202
+ public function define_sortable_columns( $columns ) {
203
+ return $columns;
204
+ }
205
+
206
+ /**
207
+ * Define which columns to show on this screen.
208
+ *
209
+ * @param array $columns Existing columns.
210
+ *
211
+ * @return array
212
+ */
213
+ public function define_columns( $columns ) {
214
+ return $columns;
215
+ }
216
+
217
+ /**
218
+ * Define bulk actions.
219
+ *
220
+ * @param array $actions Existing actions.
221
+ *
222
+ * @return array
223
+ */
224
+ public function define_bulk_actions( $actions ) {
225
+ return $actions;
226
+ }
227
+
228
+ /**
229
+ * Pre-fetch any data for the row each column has access to it, by loading $this->object.
230
+ *
231
+ * @param int $post_id Post ID being shown.
232
+ */
233
+ protected function prepare_row_data( $post_id ) {
234
+ }
235
+
236
+ /**
237
+ * Render any custom filters and search inputs for the list table.
238
+ */
239
+ protected function render_filters() {
240
+ }
241
+
242
+ /**
243
+ * Handle any custom filters.
244
+ *
245
+ * @param array $query_vars Query vars.
246
+ *
247
+ * @return array
248
+ */
249
+ protected function query_filters( $query_vars ) {
250
+ return $query_vars;
251
+ }
252
+
253
+ /**
254
+ * Handle bulk actions.
255
+ *
256
+ * @param string $redirect_to URL to redirect to.
257
+ * @param string $action Action name.
258
+ * @param array $ids List of ids.
259
+ *
260
+ * @return string
261
+ */
262
+ public function handle_bulk_actions( $redirect_to, $action, $ids ) {
263
+ return esc_url_raw( $redirect_to );
264
+ }
265
+
266
+ /**
267
+ * Has the months dropdown enabled?
268
+ *
269
+ * @return bool
270
+ */
271
+ protected function has_months_dropdown_enabled() {
272
+ return false;
273
+ }
274
+
275
+ /**
276
+ * Return the text of the "back to WP List" button.
277
+ * Return empty string if you want to hide the button.
278
+ *
279
+ * @return string
280
+ */
281
+ protected function get_back_to_wp_list_text() {
282
+ $post_type_object = get_post_type_object( $this->post_type );
283
+ $name = ! ! $post_type_object ? get_post_type_labels( $post_type_object )->name : '';
284
+
285
+ // translators: %s is the name of the post type (example Back to "Membership Plans").
286
+ return ! ! $name ? sprintf( __( 'Back to "%s"', 'yith-plugin-fw' ), $name ) : __( 'Back to the list', 'yith-plugin-fw' );
287
+ }
288
+
289
+ /**
290
+ * --------------------------------------------------------------------------
291
+ * Utils hook handlers
292
+ * --------------------------------------------------------------------------
293
+ *
294
+ * Methods for handling hooks.
295
+ */
296
+
297
+ /**
298
+ * Adjust which columns are displayed by default.
299
+ *
300
+ * @param array $hidden Current hidden columns.
301
+ * @param object $screen Current screen.
302
+ *
303
+ * @return array
304
+ */
305
+ public function default_hidden_columns( $hidden, $screen ) {
306
+ if ( isset( $screen->id ) && 'edit-' . $this->post_type === $screen->id ) {
307
+ $hidden = array_merge( $hidden, $this->get_default_hidden_columns() );
308
+ }
309
+
310
+ return $hidden;
311
+ }
312
+
313
+ /**
314
+ * Set list table primary column.
315
+ *
316
+ * @param string $default Default value.
317
+ * @param string $screen_id Current screen ID.
318
+ *
319
+ * @return string
320
+ */
321
+ public function list_table_primary_column( $default, $screen_id ) {
322
+ if ( 'edit-' . $this->post_type === $screen_id && $this->get_primary_column() ) {
323
+ return $this->get_primary_column();
324
+ }
325
+
326
+ return $default;
327
+ }
328
+
329
+ /**
330
+ * Show blank slate.
331
+ *
332
+ * @param string $which String which table-nav is being shown.
333
+ */
334
+ public function maybe_render_blank_state( $which ) {
335
+ global $post_type;
336
+
337
+ if ( $this->get_blank_state_params() && $post_type === $this->post_type && 'bottom' === $which ) {
338
+ $counts = (array) wp_count_posts( $post_type );
339
+ unset( $counts['auto-draft'] );
340
+ $count = array_sum( $counts );
341
+
342
+ if ( 0 < $count ) {
343
+ return;
344
+ }
345
+
346
+ $this->render_blank_state();
347
+
348
+ echo '<style type="text/css">#posts-filter .wp-list-table, #posts-filter .tablenav.top, .tablenav.bottom > *, .wrap .subsubsub { display: none; } #posts-filter .tablenav.bottom { height: auto; display: block } </style>';
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Render blank state. Extend to add content.
354
+ */
355
+ protected function render_blank_state() {
356
+ $component = $this->get_blank_state_params();
357
+ $component['type'] = 'list-table-blank-state';
358
+
359
+ yith_plugin_fw_get_component( $component, true );
360
+ }
361
+
362
+ /**
363
+ * Render individual columns.
364
+ *
365
+ * @param string $column Column ID to render.
366
+ * @param int $post_id Post ID being shown.
367
+ */
368
+ public function render_columns( $column, $post_id ) {
369
+ if ( empty( $this->post_id ) || $this->post_id !== $post_id ) {
370
+ $this->post_id = $post_id;
371
+ $this->prepare_row_data( $post_id );
372
+ }
373
+
374
+ if ( $this->use_object() && ! $this->object ) {
375
+ return;
376
+ }
377
+
378
+ $render_method = 'render_' . str_replace( '-', '_', $column ) . '_column';
379
+
380
+ if ( is_callable( array( $this, $render_method ) ) ) {
381
+ $this->{$render_method}();
382
+ }
383
+ }
384
+
385
+ /**
386
+ * Set row actions: remove row actions, since we show actions through action-buttons.
387
+ *
388
+ * @param array $actions Array of actions.
389
+ * @param WP_Post $post Current post object.
390
+ *
391
+ * @return array
392
+ */
393
+ public function row_actions( $actions, $post ) {
394
+ if ( $this->post_type === $post->post_type ) {
395
+ return array();
396
+ }
397
+
398
+ return $actions;
399
+ }
400
+
401
+ /**
402
+ * See if we should render search filters or not.
403
+ */
404
+ public function maybe_render_filters() {
405
+ global $typenow;
406
+
407
+ if ( $this->post_type === $typenow ) {
408
+ $this->render_filters();
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Handle any filters.
414
+ *
415
+ * @param array $query_vars Query vars.
416
+ *
417
+ * @return array
418
+ */
419
+ public function request_query( $query_vars ) {
420
+ global $typenow;
421
+
422
+ if ( $this->post_type === $typenow ) {
423
+ return $this->query_filters( $query_vars );
424
+ }
425
+
426
+ return $query_vars;
427
+ }
428
+
429
+ /**
430
+ * Disable Months dropdown
431
+ *
432
+ * @param bool $disable Set true to disable.
433
+ * @param string $post_type The post type.
434
+ *
435
+ * @return bool
436
+ */
437
+ public function disable_months_dropdown( $disable, $post_type ) {
438
+ if ( $this->post_type === $post_type ) {
439
+ $disable = ! $this->has_months_dropdown_enabled();
440
+ }
441
+
442
+ return $disable;
443
+ }
444
+
445
+ /**
446
+ * Print the "Back to WP List" button in Edit Post pages
447
+ */
448
+ public function print_back_to_wp_list_button() {
449
+ $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : false;
450
+ $screen_id = $screen ? $screen->id : false;
451
+
452
+ if ( $screen_id === $this->post_type ) {
453
+ $url = add_query_arg( array( 'post_type' => $this->post_type ), admin_url( 'edit.php' ) );
454
+ $text = $this->get_back_to_wp_list_text();
455
+ if ( $text ) {
456
+ ?>
457
+ <div id='yith-plugin-fw__back-to-wp-list__wrapper' class='yith-plugin-fw__back-to-wp-list__wrapper'>
458
+ <a id='yith-plugin-fw__back-to-wp-list' class='yith-plugin-fw__back-to-wp-list' href='<?php echo esc_url( $url ); ?>'><?php echo esc_html( $text ); ?></a>
459
+ </div>
460
+ <script type="text/javascript">
461
+ ( function () {
462
+ var wrap = document.querySelector( '.wrap' ),
463
+ backTo = document.querySelector( '#yith-plugin-fw__back-to-wp-list__wrapper' );
464
+
465
+ wrap.insertBefore( backTo, wrap.childNodes[ 0 ] );
466
+ } )();
467
+ </script>
468
+ <?php
469
+ }
470
+ }
471
+ }
472
+
473
+ }
474
+ }
plugin-fw/includes/class-yith-system-status 2.php ADDED
@@ -0,0 +1,821 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH System Status Class
4
+ * handle System Status panel
5
+ *
6
+ * @class YITH_System_Status
7
+ * @package YITH\PluginFramework\Classes
8
+ */
9
+
10
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
11
+
12
+ if ( ! class_exists( 'YITH_System_Status' ) ) {
13
+ /**
14
+ * YITH_System_Status class.
15
+ *
16
+ * @author Alberto Ruggiero
17
+ */
18
+ class YITH_System_Status {
19
+ /**
20
+ * The page slug
21
+ *
22
+ * @var string
23
+ */
24
+ protected $page = 'yith_system_info';
25
+
26
+ /**
27
+ * Plugins requirements list
28
+ *
29
+ * @var array
30
+ */
31
+ protected $plugins_requirements = array();
32
+
33
+ /**
34
+ * Requirements labels
35
+ *
36
+ * @var array
37
+ */
38
+ public $requirement_labels = array();
39
+
40
+ /**
41
+ * Recommended memory amount 134217728 = 128M
42
+ *
43
+ * @var integer
44
+ */
45
+ private $recommended_memory = 134217728;
46
+
47
+ /**
48
+ * Single instance of the class
49
+ *
50
+ * @since 1.0.0
51
+ * @var YITH_System_Status
52
+ */
53
+ protected static $instance = null;
54
+
55
+ /**
56
+ * Main plugin Instance
57
+ *
58
+ * @author Alberto Ruggiero
59
+ * @return YITH_System_Status
60
+ * @since 1.0.0
61
+ */
62
+ public static function instance() {
63
+ if ( is_null( self::$instance ) ) {
64
+ self::$instance = new self();
65
+ }
66
+
67
+ return self::$instance;
68
+ }
69
+
70
+ /**
71
+ * Constructor
72
+ *
73
+ * @author Alberto Ruggiero
74
+ * @return void
75
+ * @since 1.0.0
76
+ */
77
+ public function __construct() {
78
+
79
+ if ( ! is_admin() ) {
80
+ return;
81
+ }
82
+
83
+ /**
84
+ * Add to prevent trigger admin_init called directly
85
+ * wp-admin/admin-post.php?page=yith_system_info
86
+ */
87
+ if ( ! is_user_logged_in() ) {
88
+ return;
89
+ }
90
+
91
+ add_action( 'admin_menu', array( $this, 'add_submenu_page' ), 99 );
92
+ add_action( 'admin_init', array( $this, 'check_system_status' ) );
93
+ add_action( 'admin_notices', array( $this, 'activate_system_notice' ), 15 );
94
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 20 );
95
+ add_action( 'init', array( $this, 'set_requirements_labels' ) );
96
+ add_action( 'wp_ajax_yith_create_log_file', array( $this, 'create_log_file' ) );
97
+
98
+ }
99
+
100
+ /**
101
+ * Set requirements labels
102
+ *
103
+ * @author Alberto Ruggiero
104
+ * @return void
105
+ * @since 1.0.0
106
+ */
107
+ public function set_requirements_labels() {
108
+
109
+ $this->requirement_labels = array(
110
+ 'min_wp_version' => esc_html__( 'WordPress Version', 'yith-plugin-fw' ),
111
+ 'min_wc_version' => esc_html__( 'WooCommerce Version', 'yith-plugin-fw' ),
112
+ 'wp_memory_limit' => esc_html__( 'Available Memory', 'yith-plugin-fw' ),
113
+ 'min_php_version' => esc_html__( 'PHP Version', 'yith-plugin-fw' ),
114
+ 'min_tls_version' => esc_html__( 'TLS Version', 'yith-plugin-fw' ),
115
+ 'wp_cron_enabled' => esc_html__( 'WordPress Cron', 'yith-plugin-fw' ),
116
+ 'simplexml_enabled' => esc_html__( 'SimpleXML', 'yith-plugin-fw' ),
117
+ 'mbstring_enabled' => esc_html__( 'MultiByte String', 'yith-plugin-fw' ),
118
+ 'imagick_version' => esc_html__( 'ImageMagick Version', 'yith-plugin-fw' ),
119
+ 'gd_enabled' => esc_html__( 'GD Library', 'yith-plugin-fw' ),
120
+ 'iconv_enabled' => esc_html__( 'Iconv Module', 'yith-plugin-fw' ),
121
+ 'opcache_enabled' => esc_html__( 'OPCache Save Comments', 'yith-plugin-fw' ),
122
+ 'url_fopen_enabled' => esc_html__( 'URL FOpen', 'yith-plugin-fw' ),
123
+ );
124
+
125
+ }
126
+
127
+ /**
128
+ * Add "System Information" submenu page under YITH Plugins
129
+ *
130
+ * @author Alberto Ruggiero
131
+ * @return void
132
+ * @since 1.0.0
133
+ */
134
+ public function add_submenu_page() {
135
+
136
+ $system_info = get_option( 'yith_system_info', array() );
137
+ $error_notice = ( isset( $system_info['errors'] ) && true === $system_info['errors'] ? ' <span class="yith-system-info-menu update-plugins">!</span>' : '' );
138
+ $settings = array(
139
+ 'parent_page' => 'yith_plugin_panel',
140
+ 'page_title' => esc_html__( 'System Status', 'yith-plugin-fw' ),
141
+ 'menu_title' => esc_html__( 'System Status', 'yith-plugin-fw' ) . $error_notice,
142
+ 'capability' => 'manage_options',
143
+ 'page' => $this->page,
144
+ );
145
+
146
+ add_submenu_page(
147
+ $settings['parent_page'],
148
+ $settings['page_title'],
149
+ $settings['menu_title'],
150
+ $settings['capability'],
151
+ $settings['page'],
152
+ array( $this, 'show_information_panel' )
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Add "System Information" page template under YITH Plugins
158
+ *
159
+ * @author Alberto Ruggiero
160
+ * @return void
161
+ * @since 1.0.0
162
+ */
163
+ public function show_information_panel() {
164
+
165
+ $path = defined( 'YIT_CORE_PLUGIN_PATH' ) ? YIT_CORE_PLUGIN_PATH : get_template_directory() . '/core/plugin-fw/';
166
+
167
+ require_once $path . '/templates/sysinfo/system-information-panel.php';
168
+
169
+ }
170
+
171
+ /**
172
+ * Perform system status check
173
+ *
174
+ * @author Alberto Ruggiero
175
+ * @return void
176
+ * @since 1.0.0
177
+ */
178
+ public function check_system_status() {
179
+
180
+ if ( '' === get_option( 'yith_system_info' ) || ( isset( $_GET['page'] ) && $_GET['page'] === $this->page ) ) { //phpcs:ignore
181
+
182
+ $this->add_requirements(
183
+ esc_html__( 'YITH Plugins', 'yith-plugin-fw' ),
184
+ array(
185
+ 'min_wp_version' => '5.6',
186
+ 'min_wc_version' => '5.3',
187
+ 'min_php_version' => '7.0',
188
+ )
189
+ );
190
+ $this->add_requirements(
191
+ esc_html__( 'WooCommerce', 'yith-plugin-fw' ),
192
+ array(
193
+ 'wp_memory_limit' => '64M',
194
+ )
195
+ );
196
+
197
+ $system_info = $this->get_system_info();
198
+ $check_results = array();
199
+ $errors = 0;
200
+
201
+ foreach ( $system_info as $key => $value ) {
202
+ $check_results[ $key ] = array( 'value' => $value );
203
+
204
+ if ( isset( $this->plugins_requirements[ $key ] ) ) {
205
+
206
+ foreach ( $this->plugins_requirements[ $key ] as $plugin_name => $required_value ) {
207
+
208
+ switch ( $key ) {
209
+ case 'wp_cron_enabled':
210
+ case 'mbstring_enabled':
211
+ case 'simplexml_enabled':
212
+ case 'gd_enabled':
213
+ case 'iconv_enabled':
214
+ case 'url_fopen_enabled':
215
+ case 'opcache_enabled':
216
+ if ( ! $value ) {
217
+ $check_results[ $key ]['errors'][ $plugin_name ] = $required_value;
218
+ $errors ++;
219
+ }
220
+ break;
221
+
222
+ case 'wp_memory_limit':
223
+ $required_memory = $this->memory_size_to_num( $required_value );
224
+
225
+ if ( $required_memory > $value ) {
226
+ $check_results[ $key ]['errors'][ $plugin_name ] = $required_value;
227
+ $errors ++;
228
+
229
+ } elseif ( $this->recommended_memory > $value && $value > $required_value ) {
230
+ $check_results[ $key ]['warnings'] = 'yes';
231
+ }
232
+ break;
233
+
234
+ default:
235
+ if ( 'imagick_version' === $key ) {
236
+ if ( ! version_compare( $value, $required_value, '>=' ) ) {
237
+ $check_results[ $key ]['errors'][ $plugin_name ] = $required_value;
238
+ $errors ++;
239
+ }
240
+ } else {
241
+ if ( 'n/a' !== $value ) {
242
+ if ( ! version_compare( $value, $required_value, '>=' ) ) {
243
+ $check_results[ $key ]['errors'][ $plugin_name ] = $required_value;
244
+ $errors ++;
245
+ }
246
+ } else {
247
+ if ( 'min_wc_version' !== $key ) {
248
+ $check_results[ $key ]['warnings'][ $plugin_name ] = $required_value;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
256
+
257
+ update_option(
258
+ 'yith_system_info',
259
+ array(
260
+ 'system_info' => $check_results,
261
+ 'errors' => $errors > 0,
262
+ )
263
+ );
264
+
265
+ }
266
+
267
+ }
268
+
269
+ /**
270
+ * Handle plugin requirements
271
+ *
272
+ * @param string $plugin_name The name of the plugin.
273
+ * @param array $requirements Array of plugin requirements.
274
+ *
275
+ * @author Alberto Ruggiero
276
+ * @return void
277
+ * @since 1.0.0
278
+ */
279
+ public function add_requirements( $plugin_name, $requirements ) {
280
+
281
+ $allowed_requirements = array_keys( $this->requirement_labels );
282
+
283
+ foreach ( $requirements as $requirement => $value ) {
284
+
285
+ if ( in_array( $requirement, $allowed_requirements, true ) ) {
286
+ $this->plugins_requirements[ $requirement ][ $plugin_name ] = $value;
287
+ }
288
+ }
289
+
290
+ }
291
+
292
+ /**
293
+ * Manages notice dismissing
294
+ *
295
+ * @author Alberto Ruggiero
296
+ * @return void
297
+ * @since 1.0.0
298
+ */
299
+ public function enqueue_scripts() {
300
+ $script_path = defined( 'YIT_CORE_PLUGIN_URL' ) ? YIT_CORE_PLUGIN_URL : get_template_directory_uri() . '/core/plugin-fw';
301
+ wp_register_script( 'yith-system-info', yit_load_js_file( $script_path . '/assets/js/yith-system-info.js' ), array( 'jquery' ), '1.0.0', true );
302
+
303
+ if ( isset( $_GET['page'] ) && 'yith_system_info' === $_GET['page'] ) { //phpcs:ignore
304
+ wp_enqueue_style( 'yit-plugin-style' );
305
+ wp_enqueue_style( 'yith-plugin-fw-fields' );
306
+ wp_enqueue_script( 'yith-system-info' );
307
+
308
+ $params = array(
309
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
310
+ );
311
+
312
+ wp_localize_script( 'yith-system-info', 'yith_sysinfo', $params );
313
+
314
+ }
315
+
316
+ }
317
+
318
+ /**
319
+ * Show system notice
320
+ *
321
+ * @author Alberto Ruggiero
322
+ * @return void
323
+ * @since 1.0.0
324
+ */
325
+ public function activate_system_notice() {
326
+
327
+ $system_info = get_option( 'yith_system_info', '' );
328
+
329
+ if ( ( isset( $_GET['page'] ) && $_GET['page'] === $this->page ) || ( ! empty( $_COOKIE['hide_yith_system_alert'] ) && 'yes' === $_COOKIE['hide_yith_system_alert'] ) || ( '' === $system_info ) || ( '' !== $system_info && false === $system_info['errors'] ) ) { //phpcs:ignore
330
+ return;
331
+ }
332
+
333
+ $show_notice = true;
334
+
335
+ if ( true === $show_notice ) {
336
+ wp_enqueue_script( 'yith-system-info' );
337
+ ?>
338
+ <div id="yith-system-alert" class="notice notice-error is-dismissible" style="position: relative;">
339
+ <p>
340
+ <span class="yith-logo"><img src="<?php echo esc_attr( yith_plugin_fw_get_default_logo() ); ?>"/></span>
341
+ <b>
342
+ <?php esc_html_e( 'Warning!', 'yith-plugin-fw' ); ?>
343
+ </b><br/>
344
+ <?php
345
+ /* translators: %1$s open link tag, %2$s open link tag*/
346
+ echo sprintf( esc_html__( 'The system check has detected some compatibility issues on your installation.%1$sClick here%2$s to know more', 'yith-plugin-fw' ), '<a href="' . esc_url( add_query_arg( array( 'page' => $this->page ), admin_url( 'admin.php' ) ) ) . '">', '</a>' );
347
+ ?>
348
+ </p>
349
+ <span class="notice-dismiss"></span>
350
+
351
+ </div>
352
+ <?php
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Get system information
358
+ *
359
+ * @author Alberto Ruggiero
360
+ * @return array
361
+ * @since 1.0.0
362
+ */
363
+ public function get_system_info() {
364
+ $tls = $this->get_tls_version();
365
+ $imagick_version = 'n/a';
366
+
367
+ // Get PHP version.
368
+ preg_match( '#^\d+(\.\d+)*#', PHP_VERSION, $match );
369
+ $php_version = $match[0];
370
+
371
+ // WP memory limit.
372
+ $wp_memory_limit = $this->memory_size_to_num( WP_MEMORY_LIMIT );
373
+ if ( function_exists( 'memory_get_usage' ) ) {
374
+ $wp_memory_limit = max( $wp_memory_limit, $this->memory_size_to_num( @ini_get( 'memory_limit' ) ) ); //phpcs:ignore
375
+ }
376
+
377
+ if ( class_exists( 'Imagick' ) && is_callable( array( 'Imagick', 'getVersion' ) ) ) {
378
+ preg_match( '/([0-9]+\.[0-9]+\.[0-9]+)/', Imagick::getVersion()['versionString'], $imatch );
379
+ $imagick_version = $imatch[0];
380
+ }
381
+
382
+ return apply_filters(
383
+ 'yith_system_additional_check',
384
+ array(
385
+ 'min_wp_version' => get_bloginfo( 'version' ),
386
+ 'min_wc_version' => function_exists( 'WC' ) ? WC()->version : 'n/a',
387
+ 'wp_memory_limit' => $wp_memory_limit,
388
+ 'min_php_version' => $php_version,
389
+ 'min_tls_version' => $tls,
390
+ 'imagick_version' => $imagick_version,
391
+ 'wp_cron_enabled' => ( ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) || apply_filters( 'yith_system_status_server_cron', false ) ),
392
+ 'mbstring_enabled' => extension_loaded( 'mbstring' ),
393
+ 'simplexml_enabled' => extension_loaded( 'simplexml' ),
394
+ 'gd_enabled' => extension_loaded( 'gd' ) && function_exists( 'gd_info' ),
395
+ 'iconv_enabled' => extension_loaded( 'iconv' ),
396
+ 'opcache_enabled' => ini_get( 'opcache.save_comments' ),
397
+ 'url_fopen_enabled' => ini_get( 'allow_url_fopen' ),
398
+ )
399
+ );
400
+
401
+ }
402
+
403
+ /**
404
+ * Get log file
405
+ *
406
+ * @author Alberto Ruggiero
407
+ * @return void
408
+ * @since 1.0.0
409
+ */
410
+ public function create_log_file() {
411
+ if ( ! current_user_can( 'manage_options' ) || ! isset( $_POST['nonce'], $_POST['file'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'yith-export-log' ) ) {
412
+ wp_send_json( array( 'file' => false ) );
413
+ exit;
414
+ }
415
+
416
+ try {
417
+
418
+ global $wp_filesystem;
419
+
420
+ if ( empty( $wp_filesystem ) ) {
421
+ require_once ABSPATH . '/wp-admin/includes/file.php';
422
+ WP_Filesystem();
423
+ }
424
+
425
+ $download_file = false;
426
+ $file_content = '';
427
+ $requested_file = sanitize_text_field( wp_unslash( $_POST['file'] ) );
428
+
429
+ switch ( $requested_file ) {
430
+ case 'error_log':
431
+ $file_content = $wp_filesystem->get_contents( ABSPATH . 'error_log' );
432
+ break;
433
+ case 'debug.log':
434
+ $file_content = $wp_filesystem->get_contents( WP_CONTENT_DIR . '/debug.log' );
435
+ break;
436
+ }
437
+
438
+ if ( '' !== $file_content ) {
439
+ $domain = str_replace( array( 'http://', 'https://' ), '', network_site_url() );
440
+ $hash = substr( wp_hash( $domain ), 0, 16 );
441
+ $file = wp_upload_dir()['basedir'] . '/log-' . $hash . '.txt';
442
+ $download_file = wp_upload_dir()['baseurl'] . '/log-' . $hash . '.txt';
443
+
444
+ $r = $wp_filesystem->put_contents( $file, $file_content );
445
+ }
446
+
447
+ wp_send_json( array( 'file' => $download_file ) );
448
+ } catch ( Exception $e ) {
449
+ wp_send_json( array( 'file' => false ) );
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Convert size into number
455
+ *
456
+ * @param string $memory_size Memory size to convert.
457
+ *
458
+ * @author Alberto Ruggiero
459
+ * @return integer
460
+ * @since 1.0.0
461
+ */
462
+ public function memory_size_to_num( $memory_size ) {
463
+ $unit = strtoupper( substr( $memory_size, - 1 ) );
464
+ $size = substr( $memory_size, 0, - 1 );
465
+
466
+ $multiplier = array(
467
+ 'P' => 5,
468
+ 'T' => 4,
469
+ 'G' => 3,
470
+ 'M' => 2,
471
+ 'K' => 1,
472
+ );
473
+
474
+ if ( isset( $multiplier[ $unit ] ) ) {
475
+ for ( $i = 1; $i <= $multiplier[ $unit ]; $i ++ ) {
476
+ $size *= 1024;
477
+ }
478
+ }
479
+
480
+ return $size;
481
+ }
482
+
483
+ /**
484
+ * Format requirement value
485
+ *
486
+ * @param string $key Requirement Key.
487
+ * @param mixed $value Requirement value.
488
+ *
489
+ * @author Alberto Ruggiero
490
+ * @return void
491
+ * @since 1.0.0
492
+ */
493
+ public function format_requirement_value( $key, $value ) {
494
+
495
+ if ( strpos( $key, '_enabled' ) !== false ) {
496
+ echo esc_attr( $value ) ? esc_html__( 'Enabled', 'yith-plugin-fw' ) : esc_html__( 'Disabled', 'yith-plugin-fw' );
497
+ } elseif ( 'wp_memory_limit' === $key ) {
498
+ echo esc_html( size_format( $value ) );
499
+ } else {
500
+ if ( 'n/a' === $value ) {
501
+ echo esc_html__( 'N/A', 'yith-plugin-fw' );
502
+ } else {
503
+ echo esc_attr( $value );
504
+ }
505
+ }
506
+
507
+ }
508
+
509
+ /**
510
+ * Print error messages
511
+ *
512
+ * @param string $key Requirement key.
513
+ * @param array $item Requirement item.
514
+ * @param string $label Requirement label.
515
+ *
516
+ * @author Alberto Ruggiero
517
+ * @return void
518
+ * @since 1.0.0
519
+ */
520
+ public function print_error_messages( $key, $item, $label ) {
521
+ ?>
522
+ <ul>
523
+ <?php foreach ( $item['errors'] as $plugin => $requirement ) : ?>
524
+ <li>
525
+ <?php
526
+ if ( strpos( $key, '_enabled' ) !== false ) {
527
+ /* translators: %1$s plugin name, %2$s requirement name */
528
+ echo sprintf( esc_html__( '%1$s needs %2$s enabled', 'yith-plugin-fw' ), '<b>' . esc_attr( $plugin ) . '</b>', '<b>' . esc_attr( $label ) . '</b>' );
529
+ } elseif ( 'wp_memory_limit' === $key ) {
530
+ /* translators: %1$s plugin name, %2$s required memory amount */
531
+ echo sprintf( esc_html__( '%1$s needs at least %2$s of available memory', 'yith-plugin-fw' ), '<b>' . esc_attr( $plugin ) . '</b>', '<span class="error">' . esc_html( size_format( $this->memory_size_to_num( $requirement ) ) ) . '</span>' );
532
+ } else {
533
+ /* translators: %1$s plugin name, %2$s version number */
534
+ echo sprintf( esc_html__( '%1$s needs at least %2$s version', 'yith-plugin-fw' ), '<b>' . esc_attr( $plugin ) . '</b>', '<span class="error">' . esc_attr( $requirement ) . '</span>' );
535
+ }
536
+ ?>
537
+ </li>
538
+ <?php endforeach; ?>
539
+ </ul>
540
+ <?php
541
+ }
542
+
543
+ /**
544
+ * Print solution suggestions
545
+ *
546
+ * @param string $key Requirement key.
547
+ * @param array $item Requirement item.
548
+ * @param string $label Requirement label.
549
+ *
550
+ * @author Alberto Ruggiero
551
+ * @return void
552
+ * @since 1.0.0
553
+ */
554
+ public function print_solution_suggestion( $key, $item, $label ) {
555
+ switch ( $key ) {
556
+ case 'min_wp_version':
557
+ case 'min_wc_version':
558
+ esc_html_e( 'Update it to the latest version in order to benefit of all new features and security updates.', 'yith-plugin-fw' );
559
+ break;
560
+ case 'min_php_version':
561
+ case 'min_tls_version':
562
+ esc_html_e( 'Contact your hosting company in order to update it.', 'yith-plugin-fw' );
563
+ break;
564
+ case 'imagick_version':
565
+ if ( 'n/a' === $item['value'] ) {
566
+ esc_html_e( 'Contact your hosting company in order to install it.', 'yith-plugin-fw' );
567
+ } else {
568
+ esc_html_e( 'Contact your hosting company in order to update it.', 'yith-plugin-fw' );
569
+ }
570
+ break;
571
+ case 'wp_cron_enabled':
572
+ /* translators: %1$s code, %2$s file name */
573
+ echo sprintf( esc_html__( 'Remove %1$s from %2$s file', 'yith-plugin-fw' ), '<code>define( \'DISABLE_WP_CRON\', true );</code>', '<b>wp-config.php</b>' );
574
+ break;
575
+ case 'mbstring_enabled':
576
+ case 'simplexml_enabled':
577
+ case 'gd_enabled':
578
+ case 'iconv_enabled':
579
+ case 'opcache_enabled':
580
+ case 'url_fopen_enabled':
581
+ esc_html_e( 'Contact your hosting company in order to enable it.', 'yith-plugin-fw' );
582
+ break;
583
+ case 'wp_memory_limit':
584
+ /* translators: %1$s opening link tag, %2$s closing link tag */
585
+ echo sprintf( esc_html__( 'Read more %1$shere%2$s or contact your hosting company in order to increase it.', 'yith-plugin-fw' ), '<a href="https://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP" target="_blank">', '</a>' );
586
+ break;
587
+ default:
588
+ echo esc_attr( apply_filters( 'yith_system_generic_message', '', $key, $item, $label ) );
589
+ }
590
+ }
591
+
592
+ /**
593
+ * Print warning messages
594
+ *
595
+ * @param string $key Requirement Key.
596
+ *
597
+ * @author Alberto Ruggiero
598
+ * @return void
599
+ * @since 1.0.0
600
+ */
601
+ public function print_warning_messages( $key ) {
602
+ switch ( $key ) {
603
+ case 'wp_memory_limit':
604
+ /* translators: %s recommended memory amount */
605
+ echo sprintf( esc_html__( 'For optimal functioning of our plugins, we suggest setting at least %s of available memory', 'yith-plugin-fw' ), '<span class="warning">' . esc_html( size_format( $this->recommended_memory ) ) . '</span>' );
606
+ echo '<br/>';
607
+ /* translators: %1$s opening link tag, %2$s closing link tag */
608
+ echo sprintf( esc_html__( 'Read more %1$shere%2$s or contact your hosting company in order to increase it.', 'yith-plugin-fw' ), '<a href="https://codex.wordpress.org/Editing_wp-config.php#Increasing_memory_allocated_to_PHP" target="_blank">', '</a>' );
609
+ break;
610
+ case 'min_tls_version':
611
+ if ( ! function_exists( 'curl_init' ) ) {
612
+ /* translators: %1$s TLS label, %2$s cURL label */
613
+ echo sprintf( esc_html__( 'The system check cannot determine which %1$s version is installed because %2$s module is disabled. Ask your hosting company to enable it.', 'yith-plugin-fw' ), '<b>TLS</b>', '<b>cURL</b>' );
614
+ } else {
615
+ /* translators: %1$s TLS label */
616
+ echo sprintf( esc_html__( 'The system check cannot determine which %1$s version is installed due to a connection issue between your site and our server.', 'yith-plugin-fw' ), '<b>TLS</b>' );
617
+ }
618
+ break;
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Retrieve the TLS Version
624
+ *
625
+ * @return string
626
+ * @since 3.5
627
+ */
628
+ public function get_tls_version() {
629
+ $tls = get_transient( 'yith-plugin-fw-system-status-tls-version' );
630
+
631
+ if ( ! $tls && apply_filters( 'yith_system_status_check_ssl', true ) ) {
632
+ $services = array(
633
+ array(
634
+ 'url' => 'https://www.howsmyssl.com/a/check',
635
+ 'string_to_remove' => 'TLS ',
636
+ 'prop' => 'tls_version',
637
+ ),
638
+ array(
639
+ 'url' => 'https://ttl-version.yithemes.workers.dev/',
640
+ 'string_to_remove' => 'TLSv',
641
+ 'prop' => 'tlsVersion',
642
+ ),
643
+ );
644
+ $params = array(
645
+ 'sslverify' => false,
646
+ 'timeout' => 60,
647
+ 'headers' => array( 'Content-Type' => 'application/json' ),
648
+ );
649
+
650
+ foreach ( $services as $service ) {
651
+ $url = $service['url'];
652
+ $string_to_remove = $service['string_to_remove'];
653
+ $prop = $service['prop'];
654
+
655
+ $response = wp_remote_get( $url, $params );
656
+
657
+ if ( ! is_wp_error( $response ) && 200 === absint( $response['response']['code'] ) && 'OK' === $response['response']['message'] ) {
658
+ $body = json_decode( $response['body'] );
659
+ $version = $body && is_object( $body ) && property_exists( $body, $prop ) ? $body->{$prop} : false;
660
+ if ( $version ) {
661
+ $tls = str_replace( $string_to_remove, '', $version );
662
+ break;
663
+ }
664
+ }
665
+ }
666
+ $tls = ! ! $tls ? $tls : 'n/a';
667
+
668
+ set_transient( 'yith-plugin-fw-system-status-tls-version', $tls, 300 );
669
+ }
670
+
671
+ return ! ! $tls ? $tls : 'n/a';
672
+ }
673
+
674
+ /**
675
+ * Retrieve the output IP Address.
676
+ *
677
+ * @return string
678
+ * @since 3.5
679
+ */
680
+ public function get_output_ip() {
681
+ $ip = get_transient( 'yith-plugin-fw-system-status-output-ip' );
682
+
683
+ if ( ! $ip && apply_filters( 'yith_system_status_check_ip', true ) ) {
684
+ $url = 'https://ifconfig.co/ip';
685
+ $params = array(
686
+ 'sslverify' => false,
687
+ 'timeout' => 60,
688
+ );
689
+
690
+ $response = wp_remote_get( $url, $params );
691
+
692
+ if ( ! is_wp_error( $response ) && 200 === absint( $response['response']['code'] ) && 'OK' === $response['response']['message'] ) {
693
+ $body = $response['body'];
694
+
695
+ // Check for IPv4.
696
+ preg_match( '/((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])/', $body, $matches );
697
+ // Check for IPv6.
698
+ if ( empty( $matches ) ) {
699
+ preg_match( '/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/', $body, $matches );
700
+ }
701
+
702
+ $ip = ! empty( $matches ) ? $matches[0] : 'n/a';
703
+ }
704
+
705
+ $ip = ! ! $ip ? $ip : 'n/a';
706
+
707
+ set_transient( 'yith-plugin-fw-system-status-output-ip', $ip, 300 );
708
+ }
709
+
710
+ return ! ! $ip ? $ip : 'n/a';
711
+ }
712
+
713
+ /**
714
+ * Retrieve plugin-fw info, such as version and loaded-by.
715
+ *
716
+ * @return array
717
+ */
718
+ public function get_plugin_fw_info() {
719
+ $version = yith_plugin_fw_get_version();
720
+ $loaded_by = basename( dirname( YIT_CORE_PLUGIN_PATH ) );
721
+ $loaded_by_init = trailingslashit( dirname( YIT_CORE_PLUGIN_PATH ) ) . 'init.php';
722
+ if ( file_exists( $loaded_by_init ) ) {
723
+ $plugin_data = get_plugin_data( $loaded_by_init );
724
+ $loaded_by = $plugin_data['Name'] ?? $loaded_by;
725
+ }
726
+
727
+ return compact( 'version', 'loaded_by' );
728
+ }
729
+
730
+ /**
731
+ * Retrieve database info, such as MySQL version and database size.
732
+ *
733
+ * @return array
734
+ */
735
+ public function get_database_info() {
736
+
737
+ global $wpdb;
738
+
739
+ $database_version = $wpdb->get_row( //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
740
+ 'SELECT
741
+ @@GLOBAL.version_comment AS string,
742
+ @@GLOBAL.version AS number',
743
+ ARRAY_A
744
+ );
745
+
746
+ $tables = array();
747
+ $database_size = array();
748
+
749
+ // It is not possible to get the database name from some classes that replace wpdb (e.g., HyperDB)
750
+ // and that is why this if condition is needed.
751
+ if ( defined( 'DB_NAME' ) ) {
752
+ $database_table_information = $wpdb->get_results( //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
753
+ $wpdb->prepare(
754
+ "SELECT
755
+ table_name AS 'name',
756
+ engine AS 'engine',
757
+ round( ( data_length / 1024 / 1024 ), 2 ) 'data',
758
+ round( ( index_length / 1024 / 1024 ), 2 ) 'index',
759
+ round( ( data_free / 1024 / 1024 ), 2 ) 'free'
760
+ FROM information_schema.TABLES
761
+ WHERE table_schema = %s
762
+ ORDER BY name ASC;",
763
+ DB_NAME
764
+ )
765
+ );
766
+
767
+ $database_size = array(
768
+ 'data' => 0,
769
+ 'index' => 0,
770
+ 'free' => 0,
771
+ );
772
+
773
+ $site_tables_prefix = $wpdb->get_blog_prefix( get_current_blog_id() );
774
+ $global_tables = $wpdb->tables( 'global', true );
775
+ foreach ( $database_table_information as $table ) {
776
+ // Only include tables matching the prefix of the current site, this is to prevent displaying all tables on a MS install not relating to the current.
777
+ if ( is_multisite() && 0 !== strpos( $table->name, $site_tables_prefix ) && ! in_array( $table->name, $global_tables, true ) ) {
778
+ continue;
779
+ }
780
+
781
+ $tables[ $table->name ] = array(
782
+ 'data' => $table->data,
783
+ 'index' => $table->index,
784
+ 'free' => $table->free,
785
+ 'engine' => $table->engine,
786
+ );
787
+
788
+ $database_size['data'] += $table->data;
789
+ $database_size['index'] += $table->index;
790
+ $database_size['free'] += $table->free;
791
+ }
792
+ }
793
+
794
+ return apply_filters(
795
+ 'yith_database_info',
796
+ array(
797
+ 'mysql_version' => $database_version['number'],
798
+ 'mysql_version_string' => $database_version['string'],
799
+ 'database_tables' => $tables,
800
+ 'database_size' => $database_size,
801
+ )
802
+ );
803
+ }
804
+
805
+ }
806
+ }
807
+
808
+ if ( ! function_exists( 'YITH_System_Status' ) ) {
809
+ /**
810
+ * Single instance of YITH_System_Status
811
+ *
812
+ * @author Alberto Ruggiero
813
+ * @return YITH_System_Status
814
+ * @since 1.0
815
+ */
816
+ function YITH_System_Status() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
817
+ return YITH_System_Status::instance();
818
+ }
819
+ }
820
+
821
+ YITH_System_Status();
plugin-fw/includes/privacy/class-yith-privacy 2.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Privacy Class
4
+ * handle privacy for GDPR
5
+ *
6
+ * @class YITH_Privacy
7
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
8
+ * @package YITH\PluginFramework\Classes
9
+ */
10
+
11
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
12
+
13
+ if ( ! class_exists( 'YITH_Privacy' ) ) {
14
+ /**
15
+ * Class YITH_Privacy
16
+ */
17
+ class YITH_Privacy {
18
+
19
+ /**
20
+ * The single instance of the class.
21
+ *
22
+ * @var YITH_Privacy
23
+ */
24
+ private static $instance;
25
+
26
+ /**
27
+ * Singleton implementation.
28
+ *
29
+ * @return YITH_Privacy
30
+ */
31
+ public static function instance() {
32
+ return ! is_null( self::$instance ) ? self::$instance : self::$instance = new self();
33
+ }
34
+
35
+ /**
36
+ * Deprecated singleton implementation.
37
+ * Kept for backward compatibility.
38
+ *
39
+ * @return YITH_Privacy
40
+ * @deprecated 3.5 | use YITH_Privacy::get_instance() instead.
41
+ */
42
+ public static function get_instance() {
43
+ return self::instance();
44
+ }
45
+
46
+ /**
47
+ * YITH_Privacy constructor.
48
+ */
49
+ private function __construct() {
50
+ add_action( 'admin_init', array( $this, 'add_privacy_message' ) );
51
+ }
52
+
53
+ /**
54
+ * Adds the privacy message on YITH privacy page.
55
+ */
56
+ public function add_privacy_message() {
57
+ if ( function_exists( 'wp_add_privacy_policy_content' ) ) {
58
+ $content = $this->get_privacy_message();
59
+
60
+ if ( $content ) {
61
+ $title = apply_filters( 'yith_plugin_fw_privacy_policy_guide_title', _x( 'YITH Plugins', 'Privacy Policy Guide Title', 'yith-plugin-fw' ) );
62
+ wp_add_privacy_policy_content( $title, $content );
63
+ }
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Get the privacy message.
69
+ *
70
+ * @return string
71
+ */
72
+ public function get_privacy_message() {
73
+ $privacy_content_path = YIT_CORE_PLUGIN_TEMPLATE_PATH . '/privacy/html-policy-content.php';
74
+ ob_start();
75
+ $sections = $this->get_sections();
76
+ if ( file_exists( $privacy_content_path ) ) {
77
+ include $privacy_content_path;
78
+ }
79
+
80
+ return apply_filters( 'yith_plugin_fw_privacy_policy_content', ob_get_clean() );
81
+ }
82
+
83
+ /**
84
+ * Get the sections.
85
+ *
86
+ * @return array
87
+ */
88
+ public function get_sections() {
89
+ return apply_filters(
90
+ 'yith_plugin_fw_privacy_policy_content_sections',
91
+ array(
92
+ 'general' => array(
93
+ 'tutorial' => _x( 'This sample language includes the basics around what personal data your store may be collecting, storing and sharing, as well as who may have access to that data. Depending on what settings are enabled and which additional plugins are used, the specific information shared by your store will vary. We recommend consulting with a lawyer when deciding what information to disclose on your privacy policy.', 'Privacy Policy Content', 'yith-plugin-fw' ),
94
+ 'description' => '',
95
+ ),
96
+ 'collect_and_store' => array(
97
+ 'title' => _x( 'What we collect and store', 'Privacy Policy Content', 'yith-plugin-fw' ),
98
+ ),
99
+ 'has_access' => array(
100
+ 'title' => _x( 'Who on our team has access', 'Privacy Policy Content', 'yith-plugin-fw' ),
101
+ ),
102
+ 'share' => array(
103
+ 'title' => _x( 'What we share with others', 'Privacy Policy Content', 'yith-plugin-fw' ),
104
+ ),
105
+ 'payments' => array(
106
+ 'title' => _x( 'Payments', 'Privacy Policy Content', 'yith-plugin-fw' ),
107
+ ),
108
+ )
109
+ );
110
+ }
111
+ }
112
+ }
113
+
114
+ YITH_Privacy::instance();
plugin-fw/includes/privacy/class-yith-privacy-plugin-abstract 2.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * YITH Privacy Abstract Class
4
+ * abstract class to handle privacy in plugins
5
+ *
6
+ * @class YITH_Privacy_Plugin_Abstract
7
+ * @author Leanza Francesco <leanzafrancesco@gmail.com>
8
+ * @package YITH\PluginFramework\Classes
9
+ */
10
+
11
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
12
+
13
+ if ( ! class_exists( 'YITH_Privacy_Plugin_Abstract' ) ) {
14
+ /**
15
+ * Class YITH_Privacy_Plugin_Abstract
16
+ */
17
+ class YITH_Privacy_Plugin_Abstract {
18
+ /**
19
+ * The plugin name.
20
+ *
21
+ * @var string
22
+ */
23
+ private $plugin_name;
24
+
25
+ /**
26
+ * YITH_Privacy_Plugin_Abstract constructor.
27
+ *
28
+ * @param string $plugin_name The plugin name.
29
+ */
30
+ public function __construct( $plugin_name ) {
31
+ $this->plugin_name = $plugin_name;
32
+ $this->init();
33
+ }
34
+
35
+ /**
36
+ * Let's initialize the privacy.
37
+ */
38
+ protected function init() {
39
+ add_filter( 'yith_plugin_fw_privacy_guide_content', array( $this, 'add_message_in_section' ), 10, 2 );
40
+ }
41
+
42
+ /**
43
+ * Add message in a specific section.
44
+ *
45
+ * @param string $html The HTML of the section.
46
+ * @param string $section The section.
47
+ *
48
+ * @return string
49
+ */
50
+ public function add_message_in_section( $html, $section ) {
51
+ $message = $this->get_privacy_message( $section );
52
+ if ( $message ) {
53
+ $html .= "<p class='privacy-policy-tutorial'><strong>{$this->plugin_name}</strong></p>";
54
+ $html .= $message;
55
+ }
56
+
57
+ return $html;
58
+ }
59
+
60
+ /**
61
+ * Retrieve the privacy message.
62
+ * Override me to customize the messages for each section.
63
+ *
64
+ * @param string $section The section.
65
+ *
66
+ * @return string
67
+ */
68
+ public function get_privacy_message( $section ) {
69
+ return '';
70
+ }
71
+ }
72
+ }
plugin-fw/init 2.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Framework Name: YIT Plugin Framework
4
+ * Version: 3.9.17
5
+ * Author: YITH
6
+ * Text Domain: yith-plugin-fw
7
+ * Domain Path: /languages/
8
+ *
9
+ * @author YITH
10
+ * @version 3.9.17
11
+ * @package YITH\PluginFramework
12
+ */
13
+
14
+ defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
15
+
16
+ if ( ! function_exists( 'yit_maybe_plugin_fw_loader' ) ) {
17
+ /**
18
+ * Load the framework if it's not yet loaded.
19
+ *
20
+ * @param string $plugin_path The plugin path.
21
+ */
22
+ function yit_maybe_plugin_fw_loader( $plugin_path ) {
23
+ global $plugin_fw_data, $plugin_upgrade_fw_data;
24
+
25
+ $default_headers = array(
26
+ 'Name' => 'Framework Name',
27
+ 'Version' => 'Version',
28
+ 'Author' => 'Author',
29
+ 'TextDomain' => 'Text Domain',
30
+ 'DomainPath' => 'Domain Path',
31
+ );
32
+
33
+ $plugin_path = trailingslashit( $plugin_path );
34
+ $framework_data = get_file_data( $plugin_path . 'plugin-fw/init.php', $default_headers );
35
+ $plugin_fw_main_file = $plugin_path . 'plugin-fw/yit-plugin.php';
36
+
37
+ if ( ! empty( $plugin_fw_data ) ) {
38
+ foreach ( $plugin_fw_data as $version => $path ) {
39
+ if ( version_compare( $version, $framework_data['Version'], '<' ) ) {
40
+ $plugin_fw_data = array( $framework_data['Version'] => $plugin_fw_main_file );
41
+ }
42
+ }
43
+ } else {
44
+ $plugin_fw_data = array( $framework_data['Version'] => $plugin_fw_main_file );
45
+ }
46
+
47
+ // Check for license & upgrade classes.
48
+ $upgrade_fw_init_file = $plugin_path . 'plugin-upgrade/init.php';
49
+ $framework_data = file_exists( $upgrade_fw_init_file ) ? get_file_data( $upgrade_fw_init_file, $default_headers ) : $framework_data;
50
+ $plugin_license_path = $plugin_path . 'plugin-upgrade';
51
+ $plugin_upgrade_path = $plugin_path . 'plugin-upgrade';
52
+
53
+ if ( ! file_exists( $plugin_upgrade_path ) ) {
54
+ // Check path for OLD plugin framework version.
55
+ if ( file_exists( $plugin_path . 'plugin-fw/licence' ) ) {
56
+ $plugin_license_path = $plugin_path . 'plugin-fw/licence';
57
+ $plugin_upgrade_path = $plugin_path . 'plugin-fw/';
58
+ } else {
59
+ $plugin_upgrade_path = false;
60
+ $plugin_license_path = false;
61
+ }
62
+ }
63
+
64
+ if ( file_exists( $plugin_upgrade_path ) ) {
65
+ if ( ! empty( $plugin_upgrade_fw_data ) ) {
66
+ foreach ( $plugin_upgrade_fw_data as $version => $files ) {
67
+ if ( version_compare( $version, $framework_data['Version'], '<' ) ) {
68
+ $plugin_upgrade_fw_data = array( $framework_data['Version'] => yit_get_upgrade_files( $plugin_license_path, $plugin_upgrade_path ) );
69
+ }
70
+ }
71
+ } else {
72
+ $plugin_upgrade_fw_data = array( $framework_data['Version'] => yit_get_upgrade_files( $plugin_license_path, $plugin_upgrade_path ) );
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ if ( ! function_exists( 'yit_get_upgrade_files' ) ) {
79
+ /**
80
+ * Retrieve the core files to include to manage license and upgrade if exists.
81
+ *
82
+ * @param string $plugin_license_path The license path.
83
+ * @param string $plugin_upgrade_path The upgrade path.
84
+ *
85
+ * @return array to files to include
86
+ */
87
+ function yit_get_upgrade_files( $plugin_license_path, $plugin_upgrade_path = '' ) {
88
+ $to_include = array();
89
+
90
+ if ( ! ! $plugin_license_path ) {
91
+ $plugin_upgrade_path = empty( $plugin_upgrade_path ) ? $plugin_license_path : $plugin_upgrade_path;
92
+ $license_files = array(
93
+ '%yith-license-path%/lib/yit-licence.php',
94
+ '%yith-license-path%/lib/yit-plugin-licence.php',
95
+ '%yith-license-path%/lib/yit-theme-licence.php',
96
+ );
97
+
98
+ $upgrade_files = array( '%yith-upgrade-path%/lib/yit-plugin-upgrade.php' );
99
+
100
+ $to_include_license = str_replace( '%yith-license-path%', $plugin_license_path, $license_files );
101
+ $to_include_upgrade = str_replace( '%yith-upgrade-path%', $plugin_upgrade_path, $upgrade_files );
102
+
103
+ $to_include = array_merge( $to_include_license, $to_include_upgrade );
104
+ }
105
+
106
+ return $to_include;
107
+ }
108
+ }
plugin-fw/languages/yith-plugin-fw 2.pot ADDED
@@ -0,0 +1,1119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2022
2
+ # This file is distributed under the same license as the package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2022-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: YITH <info@yithemes.com>\n"
14
+ "Language: en\n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+ "X-Poedit-Country: United States\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: "
19
+ "__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_"
20
+ "attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n"
21
+ "X-Poedit-Basepath: ../\n"
22
+ "X-Poedit-SearchPath-0: .\n"
23
+ "X-Poedit-Bookmarks: \n"
24
+ "X-Textdomain-Support: yes\n"
25
+ "X-Generator: grunt-wp-i18n 1.0.3\n"
26
+
27
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
28
+ msgid "Confirm trash"
29
+ msgstr ""
30
+
31
+ #: includes/class-yit-assets.php:149
32
+ msgid "Are you sure you want to trash the selected items?"
33
+ msgstr ""
34
+
35
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
36
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
37
+ #: yit-functions.php:2008 yit-functions.php:2026
38
+ msgid "No"
39
+ msgstr ""
40
+
41
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
42
+ #: yit-functions.php:2152
43
+ msgid "Confirm delete"
44
+ msgstr ""
45
+
46
+ #: includes/class-yit-assets.php:153
47
+ msgid "Are you sure you want to delete the selected items?"
48
+ msgstr ""
49
+
50
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
51
+ #: yit-functions.php:2100
52
+ msgid "This action cannot be undone and you will not be able to recover this data."
53
+ msgstr ""
54
+
55
+ #: includes/class-yit-assets.php:174
56
+ msgid "Clear"
57
+ msgstr ""
58
+
59
+ #: includes/class-yit-assets.php:175
60
+ msgid "Clear color"
61
+ msgstr ""
62
+
63
+ #: includes/class-yit-assets.php:176
64
+ msgid "Default"
65
+ msgstr ""
66
+
67
+ #: includes/class-yit-assets.php:177
68
+ msgid "Select default color"
69
+ msgstr ""
70
+
71
+ #: includes/class-yit-assets.php:178
72
+ msgid "Select Color"
73
+ msgstr ""
74
+
75
+ #: includes/class-yit-assets.php:179
76
+ msgid "Color value"
77
+ msgstr ""
78
+
79
+ #: includes/class-yit-help-desk.php:152
80
+ msgid "There was an error with your request; please try again later."
81
+ msgstr ""
82
+
83
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
84
+ msgid "The changes you have made will be lost if you leave this page."
85
+ msgstr ""
86
+
87
+ #: includes/class-yit-plugin-panel.php:83
88
+ msgid "Plugin Settings"
89
+ msgstr ""
90
+
91
+ #: includes/class-yit-plugin-panel.php:84
92
+ msgid "Settings"
93
+ msgstr ""
94
+
95
+ #: includes/class-yit-plugin-panel.php:456
96
+ #: includes/class-yit-plugin-panel.php:459
97
+ msgid "How to install premium version"
98
+ msgstr ""
99
+
100
+ #: includes/class-yit-plugin-panel.php:656
101
+ #: includes/class-yit-plugin-subpanel.php:133
102
+ msgid "Save Changes"
103
+ msgstr ""
104
+
105
+ #: includes/class-yit-plugin-panel.php:664
106
+ #: includes/class-yit-plugin-subpanel.php:140
107
+ #: templates/panel/woocommerce/woocommerce-form.php:15
108
+ msgid "If you continue with this action, you will reset all options in this page."
109
+ msgstr ""
110
+
111
+ #: includes/class-yit-plugin-panel.php:664
112
+ #: includes/class-yit-plugin-subpanel.php:140
113
+ #: templates/panel/woocommerce/woocommerce-form.php:15
114
+ msgid "Are you sure?"
115
+ msgstr ""
116
+
117
+ #: includes/class-yit-plugin-panel.php:668
118
+ #: includes/class-yit-plugin-subpanel.php:143
119
+ msgid "Reset to default"
120
+ msgstr ""
121
+
122
+ #: includes/class-yit-plugin-panel.php:1039
123
+ msgid "Read the <mark>plugin documentation</mark>"
124
+ msgstr ""
125
+
126
+ #: includes/class-yit-plugin-panel.php:1040
127
+ msgid "Learn what you can really do with this powerful tool"
128
+ msgstr ""
129
+
130
+ #: includes/class-yit-plugin-panel.php:1050
131
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
132
+ msgstr ""
133
+
134
+ #: includes/class-yit-plugin-panel.php:1051
135
+ msgid "See how it works before you start using it"
136
+ msgstr ""
137
+
138
+ #: includes/class-yit-plugin-panel.php:1307
139
+ msgid "The element you have entered already exists. Please, enter another name."
140
+ msgstr ""
141
+
142
+ #: includes/class-yit-plugin-panel.php:1308
143
+ msgid "Settings saved"
144
+ msgstr ""
145
+
146
+ #: includes/class-yit-plugin-panel.php:1309
147
+ msgid "Settings reset"
148
+ msgstr ""
149
+
150
+ #: includes/class-yit-plugin-panel.php:1310
151
+ msgid "Element deleted correctly."
152
+ msgstr ""
153
+
154
+ #: includes/class-yit-plugin-panel.php:1311
155
+ #: includes/class-yit-plugin-panel.php:1312
156
+ msgid "Element updated correctly."
157
+ msgstr ""
158
+
159
+ #: includes/class-yit-plugin-panel.php:1313
160
+ msgid "Database imported correctly."
161
+ msgstr ""
162
+
163
+ #: includes/class-yit-plugin-panel.php:1314
164
+ msgid "An error has occurred during import. Please try again."
165
+ msgstr ""
166
+
167
+ #: includes/class-yit-plugin-panel.php:1315
168
+ msgid "The added file is not valid."
169
+ msgstr ""
170
+
171
+ #: includes/class-yit-plugin-panel.php:1316
172
+ msgid "Sorry, import is disabled."
173
+ msgstr ""
174
+
175
+ #: includes/class-yit-plugin-panel.php:1317
176
+ msgid "Sorting successful."
177
+ msgstr ""
178
+
179
+ #: includes/class-yit-plugin-panel.php:1806
180
+ msgid "We need your support"
181
+ msgstr ""
182
+
183
+ #: includes/class-yit-plugin-panel.php:1807
184
+ msgid "to keep updating and improving the plugin. Please,"
185
+ msgstr ""
186
+
187
+ #: includes/class-yit-plugin-panel.php:1809
188
+ msgid "help us by leaving a good review"
189
+ msgstr ""
190
+
191
+ #: includes/class-yit-plugin-panel.php:1810
192
+ msgid ":) Thanks!"
193
+ msgstr ""
194
+
195
+ #: includes/class-yit-pointers.php:80
196
+ msgid "Plugins Activated"
197
+ msgstr ""
198
+
199
+ #: includes/class-yit-pointers.php:81
200
+ msgid ""
201
+ "From now on, you can find all plugin options in YITH menu. Plugin "
202
+ "customization settings will be available as a new entry in YITH menu."
203
+ msgstr ""
204
+
205
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
206
+ #. translators: 1. YITH site link; 2. WordPress site link.
207
+ msgid "Discover all our plugins available on: %1$s and %2$s"
208
+ msgstr ""
209
+
210
+ #: includes/class-yit-pointers.php:96
211
+ msgid "Plugins Upgraded"
212
+ msgstr ""
213
+
214
+ #: includes/class-yit-pointers.php:97
215
+ msgid ""
216
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
217
+ "Every time one of our plugins is added, a new entry will be added to this "
218
+ "menu. For example, after the update, plugin options (such as for YITH "
219
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved "
220
+ "from previous location to YITH menu."
221
+ msgstr ""
222
+
223
+ #: includes/class-yith-bh-onboarding.php:85
224
+ msgid "It is not possible save the options"
225
+ msgstr ""
226
+
227
+ #: includes/class-yith-dashboard.php:35
228
+ msgid "YITH Latest Updates"
229
+ msgstr ""
230
+
231
+ #: includes/class-yith-dashboard.php:36
232
+ msgid "Latest news from YITH Blog"
233
+ msgstr ""
234
+
235
+ #: includes/class-yith-dashboard.php:56
236
+ msgid "RSS Error:"
237
+ msgstr ""
238
+
239
+ #: includes/class-yith-dashboard.php:63
240
+ msgid ""
241
+ "An error has occurred, which probably means the feed is down. Try again "
242
+ "later."
243
+ msgstr ""
244
+
245
+ #: includes/class-yith-post-type-admin.php:286
246
+ #. translators: %s is the name of the post type (example Back to "Membership
247
+ #. Plans").
248
+ msgid "Back to \"%s\""
249
+ msgstr ""
250
+
251
+ #: includes/class-yith-post-type-admin.php:286
252
+ msgid "Back to the list"
253
+ msgstr ""
254
+
255
+ #: includes/class-yith-system-status.php:110
256
+ msgid "WordPress Version"
257
+ msgstr ""
258
+
259
+ #: includes/class-yith-system-status.php:111
260
+ msgid "WooCommerce Version"
261
+ msgstr ""
262
+
263
+ #: includes/class-yith-system-status.php:112
264
+ msgid "Available Memory"
265
+ msgstr ""
266
+
267
+ #: includes/class-yith-system-status.php:113
268
+ msgid "PHP Version"
269
+ msgstr ""
270
+
271
+ #: includes/class-yith-system-status.php:114
272
+ msgid "TLS Version"
273
+ msgstr ""
274
+
275
+ #: includes/class-yith-system-status.php:115
276
+ msgid "WordPress Cron"
277
+ msgstr ""
278
+
279
+ #: includes/class-yith-system-status.php:116
280
+ msgid "SimpleXML"
281
+ msgstr ""
282
+
283
+ #: includes/class-yith-system-status.php:117
284
+ msgid "MultiByte String"
285
+ msgstr ""
286
+
287
+ #: includes/class-yith-system-status.php:118
288
+ msgid "ImageMagick Version"
289
+ msgstr ""
290
+
291
+ #: includes/class-yith-system-status.php:119
292
+ msgid "GD Library"
293
+ msgstr ""
294
+
295
+ #: includes/class-yith-system-status.php:120
296
+ msgid "Iconv Module"
297
+ msgstr ""
298
+
299
+ #: includes/class-yith-system-status.php:121
300
+ msgid "OPCache Save Comments"
301
+ msgstr ""
302
+
303
+ #: includes/class-yith-system-status.php:122
304
+ msgid "URL FOpen"
305
+ msgstr ""
306
+
307
+ #: includes/class-yith-system-status.php:140
308
+ #: includes/class-yith-system-status.php:141
309
+ #: templates/sysinfo/system-information-panel.php:11
310
+ msgid "System Status"
311
+ msgstr ""
312
+
313
+ #: includes/class-yith-system-status.php:183
314
+ msgid "YITH Plugins"
315
+ msgstr ""
316
+
317
+ #: includes/class-yith-system-status.php:191
318
+ msgid "WooCommerce"
319
+ msgstr ""
320
+
321
+ #: includes/class-yith-system-status.php:342
322
+ msgid "Warning!"
323
+ msgstr ""
324
+
325
+ #: includes/class-yith-system-status.php:346
326
+ #. translators: %1$s open link tag, %2$s open link tag
327
+ msgid ""
328
+ "The system check has detected some compatibility issues on your "
329
+ "installation.%1$sClick here%2$s to know more"
330
+ msgstr ""
331
+
332
+ #: includes/class-yith-system-status.php:496
333
+ msgid "Enabled"
334
+ msgstr ""
335
+
336
+ #: includes/class-yith-system-status.php:496
337
+ msgid "Disabled"
338
+ msgstr ""
339
+
340
+ #: includes/class-yith-system-status.php:501
341
+ msgid "N/A"
342
+ msgstr ""
343
+
344
+ #: includes/class-yith-system-status.php:528
345
+ #. translators: %1$s plugin name, %2$s requirement name
346
+ msgid "%1$s needs %2$s enabled"
347
+ msgstr ""
348
+
349
+ #: includes/class-yith-system-status.php:531
350
+ #. translators: %1$s plugin name, %2$s required memory amount
351
+ msgid "%1$s needs at least %2$s of available memory"
352
+ msgstr ""
353
+
354
+ #: includes/class-yith-system-status.php:534
355
+ #. translators: %1$s plugin name, %2$s version number
356
+ msgid "%1$s needs at least %2$s version"
357
+ msgstr ""
358
+
359
+ #: includes/class-yith-system-status.php:558
360
+ msgid ""
361
+ "Update it to the latest version in order to benefit of all new features and "
362
+ "security updates."
363
+ msgstr ""
364
+
365
+ #: includes/class-yith-system-status.php:562
366
+ #: includes/class-yith-system-status.php:568
367
+ msgid "Contact your hosting company in order to update it."
368
+ msgstr ""
369
+
370
+ #: includes/class-yith-system-status.php:566
371
+ msgid "Contact your hosting company in order to install it."
372
+ msgstr ""
373
+
374
+ #: includes/class-yith-system-status.php:573
375
+ #. translators: %1$s code, %2$s file name
376
+ msgid "Remove %1$s from %2$s file"
377
+ msgstr ""
378
+
379
+ #: includes/class-yith-system-status.php:581
380
+ msgid "Contact your hosting company in order to enable it."
381
+ msgstr ""
382
+
383
+ #: includes/class-yith-system-status.php:585
384
+ #: includes/class-yith-system-status.php:608
385
+ #. translators: %1$s opening link tag, %2$s closing link tag
386
+ msgid ""
387
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
388
+ "it."
389
+ msgstr ""
390
+
391
+ #: includes/class-yith-system-status.php:605
392
+ #. translators: %s recommended memory amount
393
+ msgid ""
394
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
395
+ "available memory"
396
+ msgstr ""
397
+
398
+ #: includes/class-yith-system-status.php:613
399
+ #. translators: %1$s TLS label, %2$s cURL label
400
+ msgid ""
401
+ "The system check cannot determine which %1$s version is installed because "
402
+ "%2$s module is disabled. Ask your hosting company to enable it."
403
+ msgstr ""
404
+
405
+ #: includes/class-yith-system-status.php:616
406
+ #. translators: %1$s TLS label
407
+ msgid ""
408
+ "The system check cannot determine which %1$s version is installed due to a "
409
+ "connection issue between your site and our server."
410
+ msgstr ""
411
+
412
+ #: templates/bh-onboarding/onboarding-tabs.php:63
413
+ msgid "Save"
414
+ msgstr ""
415
+
416
+ #: templates/fields/ajax-customers.php:41
417
+ msgid "Search for a customer..."
418
+ msgstr ""
419
+
420
+ #: templates/fields/ajax-customers.php:68
421
+ #: templates/fields/ajax-customers.php:79
422
+ #. translators: 1. user display name; 2. user ID; 3. user email.
423
+ msgid "%1$s (#%2$s &ndash; %3$s)"
424
+ msgstr ""
425
+
426
+ #: templates/fields/ajax-posts.php:41
427
+ msgid "Search for a post..."
428
+ msgstr ""
429
+
430
+ #: templates/fields/ajax-products.php:16
431
+ msgid "Search for a product..."
432
+ msgstr ""
433
+
434
+ #: templates/fields/ajax-terms.php:41
435
+ msgid "Search for a category..."
436
+ msgstr ""
437
+
438
+ #: templates/fields/customtabs.php:17
439
+ msgid "Close all"
440
+ msgstr ""
441
+
442
+ #: templates/fields/customtabs.php:17
443
+ msgid "Expand all"
444
+ msgstr ""
445
+
446
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
447
+ msgid "Remove"
448
+ msgstr ""
449
+
450
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
451
+ msgid "Name"
452
+ msgstr ""
453
+
454
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
455
+ msgid "Value"
456
+ msgstr ""
457
+
458
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
459
+ msgid "Content of the tab. (HTML is supported)"
460
+ msgstr ""
461
+
462
+ #: templates/fields/customtabs.php:52
463
+ msgid "Add custom product tab"
464
+ msgstr ""
465
+
466
+ #: templates/fields/customtabs.php:93
467
+ msgid "Do you want to remove the custom tab?"
468
+ msgstr ""
469
+
470
+ #: templates/fields/date-format.php:65
471
+ msgid "Custom:"
472
+ msgstr ""
473
+
474
+ #: templates/fields/date-format.php:70
475
+ msgid "Preview:"
476
+ msgstr ""
477
+
478
+ #: templates/fields/icons.php:78
479
+ msgid "Set Default"
480
+ msgstr ""
481
+
482
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
483
+ msgid "Delete image"
484
+ msgstr ""
485
+
486
+ #: templates/fields/image-gallery.php:37
487
+ msgid "Add Images to Gallery"
488
+ msgstr ""
489
+
490
+ #: templates/fields/image-gallery.php:38
491
+ msgid "Add to gallery"
492
+ msgstr ""
493
+
494
+ #: templates/fields/image-gallery.php:39
495
+ msgid "Add images"
496
+ msgstr ""
497
+
498
+ #: templates/fields/image-gallery.php:41
499
+ msgid "Delete"
500
+ msgstr ""
501
+
502
+ #: templates/fields/select-buttons.php:19
503
+ msgid "Add All"
504
+ msgstr ""
505
+
506
+ #: templates/fields/select-buttons.php:20
507
+ msgid "Remove All"
508
+ msgstr ""
509
+
510
+ #: templates/fields/sidebars.php:20
511
+ msgid "Left sidebar"
512
+ msgstr ""
513
+
514
+ #: templates/fields/sidebars.php:23
515
+ msgid "Right sidebar"
516
+ msgstr ""
517
+
518
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
519
+ msgid "No sidebar"
520
+ msgstr ""
521
+
522
+ #: templates/fields/sidebars.php:39
523
+ msgid "Left Sidebar"
524
+ msgstr ""
525
+
526
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
527
+ msgid "Choose a sidebar"
528
+ msgstr ""
529
+
530
+ #: templates/fields/sidebars.php:54
531
+ msgid "Right Sidebar"
532
+ msgstr ""
533
+
534
+ #: templates/fields/upload.php:34
535
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
536
+ msgid "Upload"
537
+ msgstr ""
538
+
539
+ #: templates/fields/upload.php:39
540
+ msgid "Reset"
541
+ msgstr ""
542
+
543
+ #: templates/panel/welcome-modals/update.php:34
544
+ #. translators: %s is the plugin version.
545
+ msgid "is successfully updated to version %s."
546
+ msgstr ""
547
+
548
+ #: templates/panel/welcome-modals/update.php:44
549
+ #. translators: %s is the plugin version.
550
+ msgid "What's new in version %s"
551
+ msgstr ""
552
+
553
+ #: templates/panel/welcome-modals/update.php:49
554
+ msgid "Check the changelog >"
555
+ msgstr ""
556
+
557
+ #: templates/panel/welcome-modals/update.php:64
558
+ #: templates/panel/welcome-modals/welcome.php:60
559
+ msgid "Got it, close this window"
560
+ msgstr ""
561
+
562
+ #: templates/panel/welcome-modals/welcome.php:30
563
+ msgid "Thank you for using our plugin"
564
+ msgstr ""
565
+
566
+ #: templates/panel/welcome-modals/welcome.php:45
567
+ #. translators: %s is the number of steps.
568
+ msgid "Start with these %s steps:"
569
+ msgstr ""
570
+
571
+ #: templates/panel/woocommerce/woocommerce-form.php:29
572
+ #: templates/panel/woocommerce/woocommerce-form.php:33
573
+ msgid "Save Options"
574
+ msgstr ""
575
+
576
+ #: templates/panel/woocommerce/woocommerce-form.php:33
577
+ msgid "Options Saved"
578
+ msgstr ""
579
+
580
+ #: templates/panel/woocommerce/woocommerce-form.php:43
581
+ msgid "Reset Defaults"
582
+ msgstr ""
583
+
584
+ #: templates/sysinfo/system-information-panel.php:12
585
+ msgid "PHPInfo"
586
+ msgstr ""
587
+
588
+ #: templates/sysinfo/system-information-panel.php:13
589
+ #: templates/sysinfo/tabs/error-log.php:25
590
+ msgid "Log Files"
591
+ msgstr ""
592
+
593
+ #: templates/sysinfo/system-information-panel.php:22
594
+ msgid "YITH System Information"
595
+ msgstr ""
596
+
597
+ #: templates/sysinfo/tabs/error-log.php:13
598
+ msgid "WP debug.log file"
599
+ msgstr ""
600
+
601
+ #: templates/sysinfo/tabs/error-log.php:18
602
+ msgid "PHP error_log file"
603
+ msgstr ""
604
+
605
+ #: templates/sysinfo/tabs/error-log.php:60
606
+ msgid "Download"
607
+ msgstr ""
608
+
609
+ #: templates/sysinfo/tabs/error-log.php:73
610
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
611
+ msgstr ""
612
+
613
+ #: templates/sysinfo/tabs/error-log.php:97
614
+ #. translators: %s file name.
615
+ msgid ""
616
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
617
+ "file of your installation"
618
+ msgstr ""
619
+
620
+ #: templates/sysinfo/tabs/error-log.php:106
621
+ msgid "Copied!"
622
+ msgstr ""
623
+
624
+ #: templates/sysinfo/tabs/error-log.php:106
625
+ msgid "Copy Code"
626
+ msgstr ""
627
+
628
+ #: templates/sysinfo/tabs/main.php:17
629
+ msgid "Site Info"
630
+ msgstr ""
631
+
632
+ #: templates/sysinfo/tabs/main.php:22
633
+ msgid "Site URL"
634
+ msgstr ""
635
+
636
+ #: templates/sysinfo/tabs/main.php:31
637
+ msgid "Output IP Address"
638
+ msgstr ""
639
+
640
+ #: templates/sysinfo/tabs/main.php:39
641
+ msgid "Defined WP_CACHE"
642
+ msgstr ""
643
+
644
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
645
+ msgid "Yes"
646
+ msgstr ""
647
+
648
+ #: templates/sysinfo/tabs/main.php:47
649
+ msgid "External object cache"
650
+ msgstr ""
651
+
652
+ #: templates/sysinfo/tabs/main.php:55
653
+ msgid "YITH Plugin Framework Version"
654
+ msgstr ""
655
+
656
+ #: templates/sysinfo/tabs/main.php:64
657
+ #. translators: %s is the name of the plugin that is loading the framework.
658
+ msgid "loaded by %s"
659
+ msgstr ""
660
+
661
+ #: templates/sysinfo/tabs/main.php:73
662
+ msgid "Plugins Requirements"
663
+ msgstr ""
664
+
665
+ #: templates/sysinfo/tabs/main.php:108
666
+ msgid "Database Info"
667
+ msgstr ""
668
+
669
+ #: templates/sysinfo/tabs/main.php:113
670
+ msgid "MySQL version"
671
+ msgstr ""
672
+
673
+ #: templates/sysinfo/tabs/main.php:123
674
+ #. Translators: %s: Codex link.
675
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
676
+ msgstr ""
677
+
678
+ #: templates/sysinfo/tabs/main.php:123
679
+ msgid "WordPress requirements"
680
+ msgstr ""
681
+
682
+ #: templates/sysinfo/tabs/main.php:130
683
+ msgid "Total Database Size"
684
+ msgstr ""
685
+
686
+ #: templates/sysinfo/tabs/main.php:138
687
+ msgid "Database Data Size"
688
+ msgstr ""
689
+
690
+ #: templates/sysinfo/tabs/main.php:146
691
+ msgid "Database Index Size"
692
+ msgstr ""
693
+
694
+ #: templates/sysinfo/tabs/main.php:154
695
+ msgid "Database Free Size"
696
+ msgstr ""
697
+
698
+ #: templates/sysinfo/tabs/main.php:168
699
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
700
+ #. Engine.
701
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
702
+ msgstr ""
703
+
704
+ #: yit-functions.php:1938
705
+ #. translators: %s is the title of the post object.
706
+ msgid "Are you sure you want to move \"%s\" to trash?"
707
+ msgstr ""
708
+
709
+ #: yit-functions.php:1940 yit-functions.php:2100
710
+ #. translators: %s is the title of the post object.
711
+ msgid "Are you sure you want to delete \"%s\"?"
712
+ msgstr ""
713
+
714
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
715
+ msgid "Further actions"
716
+ msgstr ""
717
+
718
+ #: yit-plugin.php:233
719
+ msgid "License"
720
+ msgstr ""
721
+
722
+ #: yit-plugin.php:272
723
+ #. translators: 1. Plugin(s) name(s).
724
+ msgid ""
725
+ "%s was deactivated as you're running an higher tier version of the same "
726
+ "plugin."
727
+ msgid_plural ""
728
+ "%s were deactivated as you're running higher tier versions of the same "
729
+ "plugins."
730
+ msgstr[0] ""
731
+ msgstr[1] ""
732
+
733
+ #. Author of the plugin/theme
734
+ msgid "YITH"
735
+ msgstr ""
736
+
737
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
738
+ #. translators: %s it the Elementor Widget title.
739
+ msgctxt "Elementor Widget - section title"
740
+ msgid "%s - Options"
741
+ msgstr ""
742
+
743
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
744
+ msgctxt "[gutenberg]: Category Name"
745
+ msgid "YITH"
746
+ msgstr ""
747
+
748
+ #: includes/class-yit-assets.php:136
749
+ msgctxt "Button text"
750
+ msgid "Confirm"
751
+ msgstr ""
752
+
753
+ #: includes/class-yit-assets.php:137
754
+ msgctxt "Button text"
755
+ msgid "Cancel"
756
+ msgstr ""
757
+
758
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
759
+ msgctxt "Trash confirmation action"
760
+ msgid "Yes, move to trash"
761
+ msgstr ""
762
+
763
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
764
+ #: yit-functions.php:2154
765
+ msgctxt "Delete confirmation action"
766
+ msgid "Yes, delete"
767
+ msgstr ""
768
+
769
+ #: includes/class-yit-plugin-panel.php:804
770
+ #. translators: 1. Plugin name.
771
+ msgctxt "Help tab default title"
772
+ msgid "Thank you for purchasing %s!"
773
+ msgstr ""
774
+
775
+ #: includes/class-yit-plugin-panel.php:804
776
+ msgctxt "Help tab default title"
777
+ msgid "Thank you for using %s!"
778
+ msgstr ""
779
+
780
+ #: includes/class-yit-plugin-panel.php:812
781
+ msgctxt "Help tab default description"
782
+ msgid "We want to help you enjoy a wonderful experience with all of our products."
783
+ msgstr ""
784
+
785
+ #: includes/class-yit-plugin-panel.php:863
786
+ msgctxt "Premium tab name"
787
+ msgid "Get premium"
788
+ msgstr ""
789
+
790
+ #: includes/class-yit-plugin-panel.php:875
791
+ msgctxt "Help tab name"
792
+ msgid "Help"
793
+ msgstr ""
794
+
795
+ #: includes/class-yith-dashboard.php:96
796
+ msgctxt "Plugin FW"
797
+ msgid "View Changelog"
798
+ msgstr ""
799
+
800
+ #: includes/class-yith-dashboard.php:97
801
+ msgctxt "Plugin FW"
802
+ msgid "Latest update released on"
803
+ msgstr ""
804
+
805
+ #: includes/class-yith-dashboard.php:137
806
+ msgctxt "Button label"
807
+ msgid "Close"
808
+ msgstr ""
809
+
810
+ #: includes/privacy/class-yith-privacy.php:61
811
+ msgctxt "Privacy Policy Guide Title"
812
+ msgid "YITH Plugins"
813
+ msgstr ""
814
+
815
+ #: includes/privacy/class-yith-privacy.php:93
816
+ msgctxt "Privacy Policy Content"
817
+ msgid ""
818
+ "This sample language includes the basics around what personal data your "
819
+ "store may be collecting, storing and sharing, as well as who may have "
820
+ "access to that data. Depending on what settings are enabled and which "
821
+ "additional plugins are used, the specific information shared by your store "
822
+ "will vary. We recommend consulting with a lawyer when deciding what "
823
+ "information to disclose on your privacy policy."
824
+ msgstr ""
825
+
826
+ #: includes/privacy/class-yith-privacy.php:97
827
+ msgctxt "Privacy Policy Content"
828
+ msgid "What we collect and store"
829
+ msgstr ""
830
+
831
+ #: includes/privacy/class-yith-privacy.php:100
832
+ msgctxt "Privacy Policy Content"
833
+ msgid "Who on our team has access"
834
+ msgstr ""
835
+
836
+ #: includes/privacy/class-yith-privacy.php:103
837
+ msgctxt "Privacy Policy Content"
838
+ msgid "What we share with others"
839
+ msgstr ""
840
+
841
+ #: includes/privacy/class-yith-privacy.php:106
842
+ msgctxt "Privacy Policy Content"
843
+ msgid "Payments"
844
+ msgstr ""
845
+
846
+ #: templates/fields/copy-to-clipboard.php:41
847
+ msgctxt "Copy-to-clipboard message"
848
+ msgid "Copied!"
849
+ msgstr ""
850
+
851
+ #: templates/fields/copy-to-clipboard.php:45
852
+ msgctxt "Copy-to-clipboard button text"
853
+ msgid "Copy"
854
+ msgstr ""
855
+
856
+ #: templates/fields/dimensions.php:13
857
+ msgctxt "Position in the \"Dimensions\" field"
858
+ msgid "Top"
859
+ msgstr ""
860
+
861
+ #: templates/fields/dimensions.php:14
862
+ msgctxt "Position in the \"Dimensions\" field"
863
+ msgid "Right"
864
+ msgstr ""
865
+
866
+ #: templates/fields/dimensions.php:15
867
+ msgctxt "Position in the \"Dimensions\" field"
868
+ msgid "Bottom"
869
+ msgstr ""
870
+
871
+ #: templates/fields/dimensions.php:16
872
+ msgctxt "Position in the \"Dimensions\" field"
873
+ msgid "Left"
874
+ msgstr ""
875
+
876
+ #: templates/fields/dimensions.php:94
877
+ msgctxt "Tooltip in the \"Dimensions\" field"
878
+ msgid "Link values together"
879
+ msgstr ""
880
+
881
+ #: templates/fields/image-dimensions.php:18
882
+ msgctxt "Image width field label"
883
+ msgid "Width"
884
+ msgstr ""
885
+
886
+ #: templates/fields/image-dimensions.php:23
887
+ msgctxt "Image height field label"
888
+ msgid "Height"
889
+ msgstr ""
890
+
891
+ #: templates/fields/onoff.php:28
892
+ msgctxt "YES/NO button: use MAX 4 characters!"
893
+ msgid "YES"
894
+ msgstr ""
895
+
896
+ #: templates/fields/onoff.php:29
897
+ msgctxt "YES/NO button: use MAX 4 characters!"
898
+ msgid "NO"
899
+ msgstr ""
900
+
901
+ #: templates/panel/help-tab.php:89
902
+ #. translators: 1. Url to EN playlist.
903
+ msgctxt "Help tab view all video link"
904
+ msgid ""
905
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
906
+ "learn more >"
907
+ msgstr ""
908
+
909
+ #: templates/panel/help-tab.php:96
910
+ msgctxt "Help tab Watch Videotutorials link"
911
+ msgid "Videos are also available in:"
912
+ msgstr ""
913
+
914
+ #: templates/panel/help-tab.php:126
915
+ msgctxt "Help tab Read Documentation link"
916
+ msgid "Read the documentation"
917
+ msgstr ""
918
+
919
+ #: templates/panel/help-tab.php:129
920
+ msgctxt "Help tab Read Documentation link"
921
+ msgid "to learn how the plugin works from the basics."
922
+ msgstr ""
923
+
924
+ #: templates/panel/help-tab.php:139
925
+ msgctxt "Help tab Watch video tutorials link"
926
+ msgid "Watch our video tutorials"
927
+ msgstr ""
928
+
929
+ #: templates/panel/help-tab.php:142
930
+ msgctxt "Help tab Watch video tutorials link"
931
+ msgid "to see some helpful use cases."
932
+ msgstr ""
933
+
934
+ #: templates/panel/help-tab.php:152
935
+ msgctxt "Help tab view FAQs link"
936
+ msgid "Check the FAQs"
937
+ msgstr ""
938
+
939
+ #: templates/panel/help-tab.php:155
940
+ msgctxt "Help tab view FAQs link"
941
+ msgid "to find answers to your doubts."
942
+ msgstr ""
943
+
944
+ #: templates/panel/help-tab.php:170
945
+ msgctxt "Help tab FAQ title"
946
+ msgid "Last FAQs in our Help Center"
947
+ msgstr ""
948
+
949
+ #: templates/panel/help-tab.php:184
950
+ msgctxt "Help tab FAQ link"
951
+ msgid "View all FAQs >"
952
+ msgstr ""
953
+
954
+ #: templates/panel/help-tab.php:193
955
+ msgctxt "Help tab submit ticket title"
956
+ msgid "Need help?"
957
+ msgstr ""
958
+
959
+ #: templates/panel/help-tab.php:196
960
+ msgctxt "Help tab submit ticket description"
961
+ msgid ""
962
+ "If you are experiencing any technical issues, ask for help from our "
963
+ "developers. Submit a ticket through our support desk and we will help you "
964
+ "as soon as possible."
965
+ msgstr ""
966
+
967
+ #: templates/panel/help-tab.php:204
968
+ msgctxt "Help tab submit ticket button"
969
+ msgid "Submit a ticket"
970
+ msgstr ""
971
+
972
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
973
+ #: templates/panel/help-tab.php:223
974
+ msgctxt "Help tab documentation"
975
+ msgid "Read the plugin documentation"
976
+ msgstr ""
977
+
978
+ #: templates/panel/help-tab.php:220
979
+ msgctxt "Help tab documentation"
980
+ msgid "to learn how it works from the basics."
981
+ msgstr ""
982
+
983
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
984
+ msgctxt "Help tab support"
985
+ msgid "Need some help?"
986
+ msgstr ""
987
+
988
+ #: templates/panel/help-tab.php:235
989
+ msgctxt "Help tab support"
990
+ msgid "From DIY to full-service help"
991
+ msgstr ""
992
+
993
+ #: templates/panel/help-tab.php:238
994
+ msgctxt "Help tab support"
995
+ msgid ""
996
+ "Call or chat 24/7 with our support agents, or let our experts build your "
997
+ "site."
998
+ msgstr ""
999
+
1000
+ #: templates/panel/help-tab.php:241
1001
+ msgctxt "Help tab support"
1002
+ msgid "Yes, I need help"
1003
+ msgstr ""
1004
+
1005
+ #: templates/panel/premium-tab.php:30
1006
+ msgctxt "Premium Tab"
1007
+ msgid "Get the premium version to unlock advanced features"
1008
+ msgstr ""
1009
+
1010
+ #: templates/panel/premium-tab.php:34
1011
+ msgctxt "Premium Tab"
1012
+ msgid "Get premium"
1013
+ msgstr ""
1014
+
1015
+ #: templates/panel/premium-tab.php:39
1016
+ msgctxt "Premium Tab"
1017
+ msgid "Plugin premium features images"
1018
+ msgstr ""
1019
+
1020
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1021
+ #. translators: alt attribute of main image tag.
1022
+ msgctxt "Premium Tab"
1023
+ msgid "And so much more!"
1024
+ msgstr ""
1025
+
1026
+ #: templates/panel/premium-tab.php:53
1027
+ msgctxt "Premium Tab"
1028
+ msgid "Check the premium features >"
1029
+ msgstr ""
1030
+
1031
+ #: templates/panel/premium-tab.php:60
1032
+ msgctxt "Premium Tab"
1033
+ msgid "Check the free vs premium features >"
1034
+ msgstr ""
1035
+
1036
+ #: templates/panel/premium-tab.php:65
1037
+ msgctxt "Premium Tab"
1038
+ msgid "Get the premium version"
1039
+ msgstr ""
1040
+
1041
+ #: yit-functions.php:1952
1042
+ msgctxt "Post action"
1043
+ msgid "Preview"
1044
+ msgstr ""
1045
+
1046
+ #: yit-functions.php:1961
1047
+ msgctxt "Post action"
1048
+ msgid "View"
1049
+ msgstr ""
1050
+
1051
+ #: yit-functions.php:1972
1052
+ msgctxt "Post action"
1053
+ msgid "Edit"
1054
+ msgstr ""
1055
+
1056
+ #: yit-functions.php:1980
1057
+ msgctxt "Post action"
1058
+ msgid "Duplicate"
1059
+ msgstr ""
1060
+
1061
+ #: yit-functions.php:1992
1062
+ msgctxt "Post action"
1063
+ msgid "Restore"
1064
+ msgstr ""
1065
+
1066
+ #: yit-functions.php:2000
1067
+ msgctxt "Post action"
1068
+ msgid "Trash"
1069
+ msgstr ""
1070
+
1071
+ #: yit-functions.php:2017
1072
+ msgctxt "Post action"
1073
+ msgid "Delete Permanently"
1074
+ msgstr ""
1075
+
1076
+ #: yit-functions.php:2114
1077
+ msgctxt "Term action"
1078
+ msgid "View"
1079
+ msgstr ""
1080
+
1081
+ #: yit-functions.php:2124
1082
+ msgctxt "Term action"
1083
+ msgid "Edit"
1084
+ msgstr ""
1085
+
1086
+ #: yit-functions.php:2132
1087
+ msgctxt "Term action"
1088
+ msgid "Duplicate"
1089
+ msgstr ""
1090
+
1091
+ #: yit-functions.php:2145
1092
+ msgctxt "Term action"
1093
+ msgid "Delete"
1094
+ msgstr ""
1095
+
1096
+ #: yit-plugin.php:85
1097
+ msgctxt "Plugin Row Meta"
1098
+ msgid "Live Demo"
1099
+ msgstr ""
1100
+
1101
+ #: yit-plugin.php:89
1102
+ msgctxt "Plugin Row Meta"
1103
+ msgid "Documentation"
1104
+ msgstr ""
1105
+
1106
+ #: yit-plugin.php:93
1107
+ msgctxt "Plugin Row Meta"
1108
+ msgid "Support"
1109
+ msgstr ""
1110
+
1111
+ #: yit-plugin.php:97
1112
+ msgctxt "Plugin Row Meta"
1113
+ msgid "Premium version"
1114
+ msgstr ""
1115
+
1116
+ #: yit-plugin.php:229
1117
+ msgctxt "Action links"
1118
+ msgid "Settings"
1119
+ msgstr ""
plugin-fw/languages/yith-plugin-fw-el 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-el 2.po ADDED
@@ -0,0 +1,1143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Greek
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2021-02-11 18:07:46+0000\n"
9
+ "Language: el_GR\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
15
+
16
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
17
+ msgid "Confirm trash"
18
+ msgstr ""
19
+
20
+ #: includes/class-yit-assets.php:149
21
+ msgid "Are you sure you want to trash the selected items?"
22
+ msgstr ""
23
+
24
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
25
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
26
+ #: yit-functions.php:2008 yit-functions.php:2026
27
+ msgid "No"
28
+ msgstr "Όχι"
29
+
30
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
31
+ #: yit-functions.php:2152
32
+ msgid "Confirm delete"
33
+ msgstr ""
34
+
35
+ #: includes/class-yit-assets.php:153
36
+ msgid "Are you sure you want to delete the selected items?"
37
+ msgstr ""
38
+
39
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
40
+ #: yit-functions.php:2100
41
+ msgid ""
42
+ "This action cannot be undone and you will not be able to recover this data."
43
+ msgstr ""
44
+
45
+ #: includes/class-yit-assets.php:174
46
+ msgid "Clear"
47
+ msgstr "Καθαρισμός"
48
+
49
+ #: includes/class-yit-assets.php:175
50
+ msgid "Clear color"
51
+ msgstr "Καθαρισμός χρώματος"
52
+
53
+ #: includes/class-yit-assets.php:176
54
+ msgid "Default"
55
+ msgstr "Προεπιλεγμένο"
56
+
57
+ #: includes/class-yit-assets.php:177
58
+ msgid "Select default color"
59
+ msgstr "Επιλογή προεπιλεγμένου χρώματος"
60
+
61
+ #: includes/class-yit-assets.php:178
62
+ msgid "Select Color"
63
+ msgstr "Επιλογή Χρώματος"
64
+
65
+ #: includes/class-yit-assets.php:179
66
+ msgid "Color value"
67
+ msgstr "Αξία χρώματος"
68
+
69
+ #: includes/class-yit-help-desk.php:152
70
+ msgid "There was an error with your request; please try again later."
71
+ msgstr ""
72
+
73
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
74
+ msgid "The changes you have made will be lost if you leave this page."
75
+ msgstr ""
76
+ "Οι αλλαγές που έχετε δημιουργήσει θα χαθούν αν αφήσετε αυτήν την σελίδα."
77
+
78
+ #: includes/class-yit-plugin-panel.php:83
79
+ msgid "Plugin Settings"
80
+ msgstr "Ρυθμίσεις Προσθέτου"
81
+
82
+ #: includes/class-yit-plugin-panel.php:84
83
+ msgid "Settings"
84
+ msgstr "Ρυθμίσεις"
85
+
86
+ #: includes/class-yit-plugin-panel.php:456
87
+ #: includes/class-yit-plugin-panel.php:459
88
+ msgid "How to install premium version"
89
+ msgstr "Πώς να εγκαταστήσετε την προηγμένη έκδοση"
90
+
91
+ #: includes/class-yit-plugin-panel.php:656
92
+ #: includes/class-yit-plugin-subpanel.php:133
93
+ msgid "Save Changes"
94
+ msgstr "Αποθήκευση Αλλαγών"
95
+
96
+ #: includes/class-yit-plugin-panel.php:664
97
+ #: includes/class-yit-plugin-subpanel.php:140
98
+ #: templates/panel/woocommerce/woocommerce-form.php:15
99
+ msgid ""
100
+ "If you continue with this action, you will reset all options in this page."
101
+ msgstr ""
102
+ "Αν συνεχίσετε με αυτή την ενέργεια θα επαναφέρετε όλες τις επιλογές στη "
103
+ "σελίδα."
104
+
105
+ #: includes/class-yit-plugin-panel.php:664
106
+ #: includes/class-yit-plugin-subpanel.php:140
107
+ #: templates/panel/woocommerce/woocommerce-form.php:15
108
+ msgid "Are you sure?"
109
+ msgstr "Είστε σίγουρος;"
110
+
111
+ #: includes/class-yit-plugin-panel.php:668
112
+ #: includes/class-yit-plugin-subpanel.php:143
113
+ msgid "Reset to default"
114
+ msgstr "Επαναφορά σε προεπιλεγμένο"
115
+
116
+ #: includes/class-yit-plugin-panel.php:1039
117
+ msgid "Read the <mark>plugin documentation</mark>"
118
+ msgstr ""
119
+
120
+ #: includes/class-yit-plugin-panel.php:1040
121
+ msgid "Learn what you can really do with this powerful tool"
122
+ msgstr ""
123
+
124
+ #: includes/class-yit-plugin-panel.php:1050
125
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
126
+ msgstr ""
127
+
128
+ #: includes/class-yit-plugin-panel.php:1051
129
+ msgid "See how it works before you start using it"
130
+ msgstr ""
131
+
132
+ #: includes/class-yit-plugin-panel.php:1307
133
+ msgid ""
134
+ "The element you have entered already exists. Please, enter another name."
135
+ msgstr "Το στοιχείο που εισάγατε υπάρχει ήδη. Παρακαλώ, εισάγετε άλλο όνομα."
136
+
137
+ #: includes/class-yit-plugin-panel.php:1308
138
+ msgid "Settings saved"
139
+ msgstr "Ρυθμίσεις αποθηκεύτηκαν"
140
+
141
+ #: includes/class-yit-plugin-panel.php:1309
142
+ msgid "Settings reset"
143
+ msgstr "Επαναφορά ρυθμίσεων"
144
+
145
+ #: includes/class-yit-plugin-panel.php:1310
146
+ msgid "Element deleted correctly."
147
+ msgstr "Το στοιχείο διαγράφηκε επιτυχώς."
148
+
149
+ #: includes/class-yit-plugin-panel.php:1311
150
+ #: includes/class-yit-plugin-panel.php:1312
151
+ msgid "Element updated correctly."
152
+ msgstr "Το στοιχείο αναβαθμίστηκε επιτυχώς."
153
+
154
+ #: includes/class-yit-plugin-panel.php:1313
155
+ msgid "Database imported correctly."
156
+ msgstr "Επιτυχής εισαγωγή βάσης δεδομένων."
157
+
158
+ #: includes/class-yit-plugin-panel.php:1314
159
+ msgid "An error has occurred during import. Please try again."
160
+ msgstr "Παρουσιάστηκε σφάλμα κατά την εισαγωγή. Παρακαλώ προσπαθήστε ξανά."
161
+
162
+ #: includes/class-yit-plugin-panel.php:1315
163
+ msgid "The added file is not valid."
164
+ msgstr "Το προστιθέμενο αρχείο δεν είναι έγκυρο."
165
+
166
+ #: includes/class-yit-plugin-panel.php:1316
167
+ msgid "Sorry, import is disabled."
168
+ msgstr "Συγνώμη, η εισαγωγή είναι απενεργοποιημένη."
169
+
170
+ #: includes/class-yit-plugin-panel.php:1317
171
+ msgid "Sorting successful."
172
+ msgstr "Διαλογή επιτυχής."
173
+
174
+ #: includes/class-yit-plugin-panel.php:1806
175
+ msgid "We need your support"
176
+ msgstr "Χρειαζόμαστε την υποστήριξή σας"
177
+
178
+ #: includes/class-yit-plugin-panel.php:1807
179
+ msgid "to keep updating and improving the plugin. Please,"
180
+ msgstr ""
181
+ "για να διατηρήσετε την ενημέρωση και τη βελτίωση του πρόσθετου. Παρακαλώ,"
182
+
183
+ #: includes/class-yit-plugin-panel.php:1809
184
+ msgid "help us by leaving a good review"
185
+ msgstr ""
186
+
187
+ #: includes/class-yit-plugin-panel.php:1810
188
+ msgid ":) Thanks!"
189
+ msgstr ":) Ευχαριστώ!"
190
+
191
+ #: includes/class-yit-pointers.php:80
192
+ msgid "Plugins Activated"
193
+ msgstr "Ενεργοποιημένα Πρόσθετα"
194
+
195
+ #: includes/class-yit-pointers.php:81
196
+ msgid ""
197
+ "From now on, you can find all plugin options in YITH menu. Plugin "
198
+ "customization settings will be available as a new entry in YITH menu."
199
+ msgstr ""
200
+
201
+ #. translators: 1. YITH site link; 2. WordPress site link.
202
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
203
+ msgid "Discover all our plugins available on: %1$s and %2$s"
204
+ msgstr "Ανακαλύψτε όλα τα διαθέσιμά μας πρόσθετα στο: %1$s και %2$s"
205
+
206
+ #: includes/class-yit-pointers.php:96
207
+ msgid "Plugins Upgraded"
208
+ msgstr "Αναβαθμισμένα Πρόσθετα"
209
+
210
+ #: includes/class-yit-pointers.php:97
211
+ msgid ""
212
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
213
+ "Every time one of our plugins is added, a new entry will be added to this "
214
+ "menu. For example, after the update, plugin options (such as for YITH "
215
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
216
+ "previous location to YITH menu."
217
+ msgstr ""
218
+
219
+ #: includes/class-yith-bh-onboarding.php:85
220
+ msgid "It is not possible save the options"
221
+ msgstr ""
222
+
223
+ #: includes/class-yith-dashboard.php:35
224
+ msgid "YITH Latest Updates"
225
+ msgstr "Τελευταίες Αναβαθμίσεις YITH"
226
+
227
+ #: includes/class-yith-dashboard.php:36
228
+ msgid "Latest news from YITH Blog"
229
+ msgstr "Τελευταία νέα από YITH Blog"
230
+
231
+ #: includes/class-yith-dashboard.php:56
232
+ msgid "RSS Error:"
233
+ msgstr "Σφάλμα RSS:"
234
+
235
+ #: includes/class-yith-dashboard.php:63
236
+ msgid ""
237
+ "An error has occurred, which probably means the feed is down. Try again "
238
+ "later."
239
+ msgstr ""
240
+ "Παρουσιάστηκε σφάλμα, που πιθανότατα σημαίνει ότι έπεσε το τροφοδοτικό. "
241
+ "Προσπαθήστε ξανά αργότερα."
242
+
243
+ #. translators: %s is the name of the post type (example Back to "Membership
244
+ #. Plans").
245
+ #: includes/class-yith-post-type-admin.php:286
246
+ msgid "Back to \"%s\""
247
+ msgstr ""
248
+
249
+ #: includes/class-yith-post-type-admin.php:286
250
+ msgid "Back to the list"
251
+ msgstr ""
252
+
253
+ #: includes/class-yith-system-status.php:110
254
+ msgid "WordPress Version"
255
+ msgstr "Έκδοση WordPress"
256
+
257
+ #: includes/class-yith-system-status.php:111
258
+ msgid "WooCommerce Version"
259
+ msgstr "Έκδοση WooCommerce"
260
+
261
+ #: includes/class-yith-system-status.php:112
262
+ msgid "Available Memory"
263
+ msgstr "Διαθέσιμη Μνήμη"
264
+
265
+ #: includes/class-yith-system-status.php:113
266
+ msgid "PHP Version"
267
+ msgstr "Έκδοση PHP"
268
+
269
+ #: includes/class-yith-system-status.php:114
270
+ msgid "TLS Version"
271
+ msgstr "Έκδοση TLS"
272
+
273
+ #: includes/class-yith-system-status.php:115
274
+ msgid "WordPress Cron"
275
+ msgstr "WordPress Cron"
276
+
277
+ #: includes/class-yith-system-status.php:116
278
+ msgid "SimpleXML"
279
+ msgstr "SimpleXML"
280
+
281
+ #: includes/class-yith-system-status.php:117
282
+ msgid "MultiByte String"
283
+ msgstr "MultiByte String"
284
+
285
+ #: includes/class-yith-system-status.php:118
286
+ msgid "ImageMagick Version"
287
+ msgstr "Έκδοση ImageMagick"
288
+
289
+ #: includes/class-yith-system-status.php:119
290
+ msgid "GD Library"
291
+ msgstr "Βιβλιοθήκη GD"
292
+
293
+ #: includes/class-yith-system-status.php:120
294
+ msgid "Iconv Module"
295
+ msgstr "Άρθρωμα Iconv"
296
+
297
+ #: includes/class-yith-system-status.php:121
298
+ msgid "OPCache Save Comments"
299
+ msgstr "OPCache Save Comments"
300
+
301
+ #: includes/class-yith-system-status.php:122
302
+ msgid "URL FOpen"
303
+ msgstr "URL FOpen"
304
+
305
+ #: includes/class-yith-system-status.php:140
306
+ #: includes/class-yith-system-status.php:141
307
+ #: templates/sysinfo/system-information-panel.php:11
308
+ msgid "System Status"
309
+ msgstr "Κατάσταση Συστήματος"
310
+
311
+ #: includes/class-yith-system-status.php:183
312
+ msgid "YITH Plugins"
313
+ msgstr "Πρόσθετα YITH"
314
+
315
+ #: includes/class-yith-system-status.php:191
316
+ msgid "WooCommerce"
317
+ msgstr "WooCommerce"
318
+
319
+ #: includes/class-yith-system-status.php:342
320
+ msgid "Warning!"
321
+ msgstr "Προσοχή!"
322
+
323
+ #. translators: %1$s open link tag, %2$s open link tag
324
+ #: includes/class-yith-system-status.php:346
325
+ msgid ""
326
+ "The system check has detected some compatibility issues on your installation."
327
+ "%1$sClick here%2$s to know more"
328
+ msgstr ""
329
+ "Ο έλεγχος συστήματος έχει εντοπίσει κάποια προβλήματα συμβατότητας στην "
330
+ "εγκατάστασή σας.%1$sΚάντε κλικ εδώ%2$s για να μάθετε περισσότερα"
331
+
332
+ #: includes/class-yith-system-status.php:496
333
+ msgid "Enabled"
334
+ msgstr "Ενεργοποιημένο"
335
+
336
+ #: includes/class-yith-system-status.php:496
337
+ msgid "Disabled"
338
+ msgstr "Απενεργοποιημένο"
339
+
340
+ #: includes/class-yith-system-status.php:501
341
+ msgid "N/A"
342
+ msgstr "N/A"
343
+
344
+ #. translators: %1$s plugin name, %2$s requirement name
345
+ #: includes/class-yith-system-status.php:528
346
+ msgid "%1$s needs %2$s enabled"
347
+ msgstr "%1$s χρειάζεται %2$s ενεργοποιημένο"
348
+
349
+ #. translators: %1$s plugin name, %2$s required memory amount
350
+ #: includes/class-yith-system-status.php:531
351
+ msgid "%1$s needs at least %2$s of available memory"
352
+ msgstr "%1$s χρειάζεται τουλάχιστον %2$s διαθέσιμης μνήμης"
353
+
354
+ #. translators: %1$s plugin name, %2$s version number
355
+ #: includes/class-yith-system-status.php:534
356
+ msgid "%1$s needs at least %2$s version"
357
+ msgstr "%1$s χρειάζεται τουλάχιστον %2$s έκδοση"
358
+
359
+ #: includes/class-yith-system-status.php:558
360
+ msgid ""
361
+ "Update it to the latest version in order to benefit of all new features and "
362
+ "security updates."
363
+ msgstr ""
364
+ "Κάντε αναβάθμιση της τελευταίας έκδοσης για να επωφεληθείτε από τα νέα "
365
+ "χαρακτηριστικά και τις αναβαθμίσεις προστασίας."
366
+
367
+ #: includes/class-yith-system-status.php:562
368
+ #: includes/class-yith-system-status.php:568
369
+ msgid "Contact your hosting company in order to update it."
370
+ msgstr "Επικοινωνήστε με την εταιρεία hosting σας για να αναβαθμίσετε."
371
+
372
+ #: includes/class-yith-system-status.php:566
373
+ msgid "Contact your hosting company in order to install it."
374
+ msgstr "Επικοινωνήστε με την εταιρεία hosting σας για να το ενεργοποιήσετε."
375
+
376
+ #. translators: %1$s code, %2$s file name
377
+ #: includes/class-yith-system-status.php:573
378
+ msgid "Remove %1$s from %2$s file"
379
+ msgstr "Αφαίρεση %1$s από αρχείο %2$s"
380
+
381
+ #: includes/class-yith-system-status.php:581
382
+ msgid "Contact your hosting company in order to enable it."
383
+ msgstr "Επικοινωνήστε με την εταιρεία hosting σας για να ενεργοποιήσετε."
384
+
385
+ #. translators: %1$s opening link tag, %2$s closing link tag
386
+ #: includes/class-yith-system-status.php:585
387
+ #: includes/class-yith-system-status.php:608
388
+ msgid ""
389
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
390
+ "it."
391
+ msgstr ""
392
+ "Μάθετε περισσότερα %1$sεδώ%2$s ή επικοινωνήστε με την εταιρεία hosting σας "
393
+ "για να το βελτιώσετε."
394
+
395
+ #. translators: %s recommended memory amount
396
+ #: includes/class-yith-system-status.php:605
397
+ msgid ""
398
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
399
+ "available memory"
400
+ msgstr ""
401
+ "Για την βέλτιστη λειτουργικότητα των προσθέτων μας, προτείνουμε να ορίσετε "
402
+ "τουλάχιστον %s διαθέσιμης μνήμης"
403
+
404
+ #. translators: %1$s TLS label, %2$s cURL label
405
+ #: includes/class-yith-system-status.php:613
406
+ msgid ""
407
+ "The system check cannot determine which %1$s version is installed because "
408
+ "%2$s module is disabled. Ask your hosting company to enable it."
409
+ msgstr ""
410
+ "Το σύστημα δεν μπορεί να καθορίσει ποια %1$s έκδοση έχει εγκατασταθεί γιατί "
411
+ "το %2$s άρθρωμα είναι απενεργοποιημένο. Ζητήστε από την εταιρεία hosting σας "
412
+ "να το ενεργοποιήσει."
413
+
414
+ #. translators: %1$s TLS label
415
+ #: includes/class-yith-system-status.php:616
416
+ msgid ""
417
+ "The system check cannot determine which %1$s version is installed due to a "
418
+ "connection issue between your site and our server."
419
+ msgstr ""
420
+ "Ο έλεγχος συστήματος δεν μπορεί να διευκρινήσει ποια έκδοση %1$s έχει "
421
+ "εγκατασταθεί λόγω προβλήματος σύνδεσης ανάμεσα στον ιστότοπο σας και τον "
422
+ "διακομιστή μας."
423
+
424
+ #: templates/bh-onboarding/onboarding-tabs.php:63
425
+ msgid "Save"
426
+ msgstr ""
427
+
428
+ #: templates/fields/ajax-customers.php:41
429
+ msgid "Search for a customer..."
430
+ msgstr ""
431
+
432
+ #. translators: 1. user display name; 2. user ID; 3. user email.
433
+ #: templates/fields/ajax-customers.php:68
434
+ #: templates/fields/ajax-customers.php:79
435
+ msgid "%1$s (#%2$s &ndash; %3$s)"
436
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
437
+
438
+ #: templates/fields/ajax-posts.php:41
439
+ msgid "Search for a post..."
440
+ msgstr ""
441
+
442
+ #: templates/fields/ajax-products.php:16
443
+ msgid "Search for a product..."
444
+ msgstr ""
445
+
446
+ #: templates/fields/ajax-terms.php:41
447
+ msgid "Search for a category..."
448
+ msgstr ""
449
+
450
+ #: templates/fields/customtabs.php:17
451
+ msgid "Close all"
452
+ msgstr "Απενεργοποίηση όλων"
453
+
454
+ #: templates/fields/customtabs.php:17
455
+ msgid "Expand all"
456
+ msgstr "Ανάπτυξη όλων"
457
+
458
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
459
+ msgid "Remove"
460
+ msgstr "Αφαίρεση"
461
+
462
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
463
+ msgid "Name"
464
+ msgstr "Όνομα"
465
+
466
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
467
+ msgid "Value"
468
+ msgstr "Τιμή"
469
+
470
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
471
+ msgid "Content of the tab. (HTML is supported)"
472
+ msgstr "Περιεχόμενο καρτέλας. (Υποστηρίζεται HTML)"
473
+
474
+ #: templates/fields/customtabs.php:52
475
+ msgid "Add custom product tab"
476
+ msgstr "Προσθέστε καρτέλα προσαρμοσμένου προϊόντος"
477
+
478
+ #: templates/fields/customtabs.php:93
479
+ msgid "Do you want to remove the custom tab?"
480
+ msgstr "Θέλετε να αφαιρέσετε την προσαρμοσμένη καρτέλα;"
481
+
482
+ #: templates/fields/date-format.php:65
483
+ msgid "Custom:"
484
+ msgstr "Προσαρμογή:"
485
+
486
+ #: templates/fields/date-format.php:70
487
+ msgid "Preview:"
488
+ msgstr "Προεπισκόπηση:"
489
+
490
+ #: templates/fields/icons.php:78
491
+ msgid "Set Default"
492
+ msgstr "Ορίστε Προεπιλεγμένο"
493
+
494
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
495
+ msgid "Delete image"
496
+ msgstr "Διαγραφή εικόνας"
497
+
498
+ #: templates/fields/image-gallery.php:37
499
+ msgid "Add Images to Gallery"
500
+ msgstr "Προσθέστε Εικόνες στη Συλλογή"
501
+
502
+ #: templates/fields/image-gallery.php:38
503
+ msgid "Add to gallery"
504
+ msgstr "Προσθέστε στη συλλογή"
505
+
506
+ #: templates/fields/image-gallery.php:39
507
+ msgid "Add images"
508
+ msgstr "Προσθέστε εικόνες"
509
+
510
+ #: templates/fields/image-gallery.php:41
511
+ msgid "Delete"
512
+ msgstr "Διαγραφή"
513
+
514
+ #: templates/fields/select-buttons.php:19
515
+ msgid "Add All"
516
+ msgstr "Προσθήκη Όλων"
517
+
518
+ #: templates/fields/select-buttons.php:20
519
+ msgid "Remove All"
520
+ msgstr "Αφαίρεση Όλων"
521
+
522
+ #: templates/fields/sidebars.php:20
523
+ msgid "Left sidebar"
524
+ msgstr "Αριστερή πλευρική στήλη"
525
+
526
+ #: templates/fields/sidebars.php:23
527
+ msgid "Right sidebar"
528
+ msgstr "Δεξιά πλευρική στήλη"
529
+
530
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
531
+ msgid "No sidebar"
532
+ msgstr "Χωρίς πλευρική στήλη"
533
+
534
+ #: templates/fields/sidebars.php:39
535
+ msgid "Left Sidebar"
536
+ msgstr "Αριστερή Πλευρική Στήλη"
537
+
538
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
539
+ msgid "Choose a sidebar"
540
+ msgstr "Επιλέξτε πλευρική στήλη"
541
+
542
+ #: templates/fields/sidebars.php:54
543
+ msgid "Right Sidebar"
544
+ msgstr "Δεξιά Πλευρική Στήλη"
545
+
546
+ #: templates/fields/upload.php:34
547
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
548
+ msgid "Upload"
549
+ msgstr "Ανέβασμα"
550
+
551
+ #: templates/fields/upload.php:39
552
+ msgid "Reset"
553
+ msgstr "Επαναφορά"
554
+
555
+ #. translators: %s is the plugin version.
556
+ #: templates/panel/welcome-modals/update.php:34
557
+ msgid "is successfully updated to version %s."
558
+ msgstr ""
559
+
560
+ #. translators: %s is the plugin version.
561
+ #: templates/panel/welcome-modals/update.php:44
562
+ msgid "What's new in version %s"
563
+ msgstr ""
564
+
565
+ #: templates/panel/welcome-modals/update.php:49
566
+ msgid "Check the changelog >"
567
+ msgstr ""
568
+
569
+ #: templates/panel/welcome-modals/update.php:64
570
+ #: templates/panel/welcome-modals/welcome.php:60
571
+ msgid "Got it, close this window"
572
+ msgstr ""
573
+
574
+ #: templates/panel/welcome-modals/welcome.php:30
575
+ msgid "Thank you for using our plugin"
576
+ msgstr ""
577
+
578
+ #. translators: %s is the number of steps.
579
+ #: templates/panel/welcome-modals/welcome.php:45
580
+ msgid "Start with these %s steps:"
581
+ msgstr ""
582
+
583
+ #: templates/panel/woocommerce/woocommerce-form.php:29
584
+ #: templates/panel/woocommerce/woocommerce-form.php:33
585
+ msgid "Save Options"
586
+ msgstr ""
587
+
588
+ #: templates/panel/woocommerce/woocommerce-form.php:33
589
+ msgid "Options Saved"
590
+ msgstr ""
591
+
592
+ #: templates/panel/woocommerce/woocommerce-form.php:43
593
+ msgid "Reset Defaults"
594
+ msgstr "Επαναφορά Προεπιλεγμένων"
595
+
596
+ #: templates/sysinfo/system-information-panel.php:12
597
+ msgid "PHPInfo"
598
+ msgstr "PHPInfo"
599
+
600
+ #: templates/sysinfo/system-information-panel.php:13
601
+ #: templates/sysinfo/tabs/error-log.php:25
602
+ msgid "Log Files"
603
+ msgstr "Αρχεία Καταγραφής"
604
+
605
+ #: templates/sysinfo/system-information-panel.php:22
606
+ msgid "YITH System Information"
607
+ msgstr "Σύστημα Πληροφοριών YITH"
608
+
609
+ #: templates/sysinfo/tabs/error-log.php:13
610
+ msgid "WP debug.log file"
611
+ msgstr "Αρχείο WP debug.log"
612
+
613
+ #: templates/sysinfo/tabs/error-log.php:18
614
+ msgid "PHP error_log file"
615
+ msgstr "Αρχείο PHP error_log"
616
+
617
+ #: templates/sysinfo/tabs/error-log.php:60
618
+ msgid "Download"
619
+ msgstr "Κατέβασμα"
620
+
621
+ #: templates/sysinfo/tabs/error-log.php:73
622
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
623
+ msgstr ""
624
+ "Το μέγεθος αρχείου υπερβαίνει τα 8 megabytes οπότε θα πρέπει να το κατεβάσετε"
625
+
626
+ #. translators: %s file name.
627
+ #: templates/sysinfo/tabs/error-log.php:97
628
+ msgid ""
629
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
630
+ "file of your installation"
631
+ msgstr ""
632
+ "Δεν υπάρχει διαθέσιμο αρχείο Καταγραφής. Ενεργοποιήστε την αποσφαλμάτωση "
633
+ "WordPress προσθέτοντάς το στο αρχείο %s της εγκατάστασής σας"
634
+
635
+ #: templates/sysinfo/tabs/error-log.php:106
636
+ msgid "Copied!"
637
+ msgstr "Έγινε αντιγραφή!"
638
+
639
+ #: templates/sysinfo/tabs/error-log.php:106
640
+ msgid "Copy Code"
641
+ msgstr "Αντιγραφή Κώδικα"
642
+
643
+ #: templates/sysinfo/tabs/main.php:17
644
+ msgid "Site Info"
645
+ msgstr "Στοιχεία Ιστότοπου"
646
+
647
+ #: templates/sysinfo/tabs/main.php:22
648
+ msgid "Site URL"
649
+ msgstr "URL Ιστοσελίδας"
650
+
651
+ #: templates/sysinfo/tabs/main.php:31
652
+ msgid "Output IP Address"
653
+ msgstr "Διεύθυνση IP Παραγωγής"
654
+
655
+ #: templates/sysinfo/tabs/main.php:39
656
+ msgid "Defined WP_CACHE"
657
+ msgstr "Καθορισμένο WP_CACHE"
658
+
659
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
660
+ msgid "Yes"
661
+ msgstr "Ναι"
662
+
663
+ #: templates/sysinfo/tabs/main.php:47
664
+ msgid "External object cache"
665
+ msgstr "Cache εξωτερικού αντικειμένου"
666
+
667
+ #: templates/sysinfo/tabs/main.php:55
668
+ msgid "YITH Plugin Framework Version"
669
+ msgstr ""
670
+
671
+ #. translators: %s is the name of the plugin that is loading the framework.
672
+ #: templates/sysinfo/tabs/main.php:64
673
+ msgid "loaded by %s"
674
+ msgstr ""
675
+
676
+ #: templates/sysinfo/tabs/main.php:73
677
+ msgid "Plugins Requirements"
678
+ msgstr "Προϋποθέσεις Πρόσθετων"
679
+
680
+ #: templates/sysinfo/tabs/main.php:108
681
+ msgid "Database Info"
682
+ msgstr ""
683
+
684
+ #: templates/sysinfo/tabs/main.php:113
685
+ msgid "MySQL version"
686
+ msgstr ""
687
+
688
+ #. Translators: %s: Codex link.
689
+ #: templates/sysinfo/tabs/main.php:123
690
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
691
+ msgstr ""
692
+
693
+ #: templates/sysinfo/tabs/main.php:123
694
+ msgid "WordPress requirements"
695
+ msgstr ""
696
+
697
+ #: templates/sysinfo/tabs/main.php:130
698
+ msgid "Total Database Size"
699
+ msgstr ""
700
+
701
+ #: templates/sysinfo/tabs/main.php:138
702
+ msgid "Database Data Size"
703
+ msgstr ""
704
+
705
+ #: templates/sysinfo/tabs/main.php:146
706
+ msgid "Database Index Size"
707
+ msgstr ""
708
+
709
+ #: templates/sysinfo/tabs/main.php:154
710
+ msgid "Database Free Size"
711
+ msgstr ""
712
+
713
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
714
+ #. Engine.
715
+ #: templates/sysinfo/tabs/main.php:168
716
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
717
+ msgstr ""
718
+
719
+ #. translators: %s is the title of the post object.
720
+ #: yit-functions.php:1938
721
+ msgid "Are you sure you want to move \"%s\" to trash?"
722
+ msgstr ""
723
+
724
+ #. translators: %s is the title of the post object.
725
+ #: yit-functions.php:1940 yit-functions.php:2100
726
+ msgid "Are you sure you want to delete \"%s\"?"
727
+ msgstr ""
728
+
729
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
730
+ msgid "Further actions"
731
+ msgstr ""
732
+
733
+ #: yit-plugin.php:233
734
+ msgid "License"
735
+ msgstr "Άδεια χρήσης προϊόντος"
736
+
737
+ #. translators: 1. Plugin(s) name(s).
738
+ #: yit-plugin.php:272
739
+ msgid ""
740
+ "%s was deactivated as you're running an higher tier version of the same "
741
+ "plugin."
742
+ msgid_plural ""
743
+ "%s were deactivated as you're running higher tier versions of the same "
744
+ "plugins."
745
+ msgstr[0] ""
746
+ msgstr[1] ""
747
+
748
+ #. Author of the plugin/theme
749
+ msgid "YITH"
750
+ msgstr "YITH"
751
+
752
+ #. translators: %s it the Elementor Widget title.
753
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
754
+ msgctxt "Elementor Widget - section title"
755
+ msgid "%s - Options"
756
+ msgstr ""
757
+
758
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
759
+ msgctxt "[gutenberg]: Category Name"
760
+ msgid "YITH"
761
+ msgstr "YITH"
762
+
763
+ #: includes/class-yit-assets.php:136
764
+ msgctxt "Button text"
765
+ msgid "Confirm"
766
+ msgstr ""
767
+
768
+ #: includes/class-yit-assets.php:137
769
+ msgctxt "Button text"
770
+ msgid "Cancel"
771
+ msgstr ""
772
+
773
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
774
+ msgctxt "Trash confirmation action"
775
+ msgid "Yes, move to trash"
776
+ msgstr ""
777
+
778
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
779
+ #: yit-functions.php:2154
780
+ msgctxt "Delete confirmation action"
781
+ msgid "Yes, delete"
782
+ msgstr ""
783
+
784
+ #. translators: 1. Plugin name.
785
+ #: includes/class-yit-plugin-panel.php:804
786
+ msgctxt "Help tab default title"
787
+ msgid "Thank you for purchasing %s!"
788
+ msgstr ""
789
+
790
+ #: includes/class-yit-plugin-panel.php:804
791
+ msgctxt "Help tab default title"
792
+ msgid "Thank you for using %s!"
793
+ msgstr ""
794
+
795
+ #: includes/class-yit-plugin-panel.php:812
796
+ msgctxt "Help tab default description"
797
+ msgid ""
798
+ "We want to help you enjoy a wonderful experience with all of our products."
799
+ msgstr ""
800
+
801
+ #: includes/class-yit-plugin-panel.php:863
802
+ msgctxt "Premium tab name"
803
+ msgid "Get premium"
804
+ msgstr ""
805
+
806
+ #: includes/class-yit-plugin-panel.php:875
807
+ msgctxt "Help tab name"
808
+ msgid "Help"
809
+ msgstr ""
810
+
811
+ #: includes/class-yith-dashboard.php:96
812
+ msgctxt "Plugin FW"
813
+ msgid "View Changelog"
814
+ msgstr "Προβολή Αρχείου Καταγραφής"
815
+
816
+ #: includes/class-yith-dashboard.php:97
817
+ msgctxt "Plugin FW"
818
+ msgid "Latest update released on"
819
+ msgstr "Τελευταία αναβάθμιση κυκλοφόρησε στις"
820
+
821
+ #: includes/class-yith-dashboard.php:137
822
+ msgctxt "Button label"
823
+ msgid "Close"
824
+ msgstr "Απενεργοποίηση"
825
+
826
+ #: includes/privacy/class-yith-privacy.php:61
827
+ msgctxt "Privacy Policy Guide Title"
828
+ msgid "YITH Plugins"
829
+ msgstr "Πρόσθετα YITH"
830
+
831
+ #: includes/privacy/class-yith-privacy.php:93
832
+ msgctxt "Privacy Policy Content"
833
+ msgid ""
834
+ "This sample language includes the basics around what personal data your "
835
+ "store may be collecting, storing and sharing, as well as who may have access "
836
+ "to that data. Depending on what settings are enabled and which additional "
837
+ "plugins are used, the specific information shared by your store will vary. "
838
+ "We recommend consulting with a lawyer when deciding what information to "
839
+ "disclose on your privacy policy."
840
+ msgstr ""
841
+ "Αυτό το δείγμα γλώσσας περιλαμβάνει τα βασικά στοιχεία γύρω από το τι "
842
+ "προσωπικά δεδομένα το κατάστημά σας μπορεί να συλλέγει, την αποθήκευση και "
843
+ "την κοινή χρήση, καθώς και ποιοι μπορεί να έχουν πρόσβαση σε αυτά τα "
844
+ "δεδομένα. Ανάλογα με τις ρυθμίσεις που είναι ενεργοποιημένες και ποια "
845
+ "επιπλέον πρόσθετα χρησιμοποιούνται, οι συγκεκριμένες πληροφορίες που "
846
+ "κοινοποιούνται από το κατάστημά σας θα ποικίλλουν. Συνιστούμε τη διαβούλευση "
847
+ "με έναν δικηγόρο, όταν αποφασίζετε ποιες πληροφορίες να αποκαλύπτετε στην "
848
+ "πολιτική απορρήτου σας."
849
+
850
+ #: includes/privacy/class-yith-privacy.php:97
851
+ msgctxt "Privacy Policy Content"
852
+ msgid "What we collect and store"
853
+ msgstr "Τι συλλέγουμε και αποθηκεύουμε"
854
+
855
+ #: includes/privacy/class-yith-privacy.php:100
856
+ msgctxt "Privacy Policy Content"
857
+ msgid "Who on our team has access"
858
+ msgstr "Ποιος στην ομάδα μας έχει πρόσβαση"
859
+
860
+ #: includes/privacy/class-yith-privacy.php:103
861
+ msgctxt "Privacy Policy Content"
862
+ msgid "What we share with others"
863
+ msgstr "Τι μοιραζόμαστε με τους άλλους"
864
+
865
+ #: includes/privacy/class-yith-privacy.php:106
866
+ msgctxt "Privacy Policy Content"
867
+ msgid "Payments"
868
+ msgstr "Πληρωμές"
869
+
870
+ #: templates/fields/copy-to-clipboard.php:41
871
+ msgctxt "Copy-to-clipboard message"
872
+ msgid "Copied!"
873
+ msgstr ""
874
+
875
+ #: templates/fields/copy-to-clipboard.php:45
876
+ msgctxt "Copy-to-clipboard button text"
877
+ msgid "Copy"
878
+ msgstr ""
879
+
880
+ #: templates/fields/dimensions.php:13
881
+ msgctxt "Position in the \"Dimensions\" field"
882
+ msgid "Top"
883
+ msgstr "Κορυφή"
884
+
885
+ #: templates/fields/dimensions.php:14
886
+ msgctxt "Position in the \"Dimensions\" field"
887
+ msgid "Right"
888
+ msgstr "Δεξιά"
889
+
890
+ #: templates/fields/dimensions.php:15
891
+ msgctxt "Position in the \"Dimensions\" field"
892
+ msgid "Bottom"
893
+ msgstr "Κάτω"
894
+
895
+ #: templates/fields/dimensions.php:16
896
+ msgctxt "Position in the \"Dimensions\" field"
897
+ msgid "Left"
898
+ msgstr "Αριστερά"
899
+
900
+ #: templates/fields/dimensions.php:94
901
+ msgctxt "Tooltip in the \"Dimensions\" field"
902
+ msgid "Link values together"
903
+ msgstr "Συνδέστε αξίες"
904
+
905
+ #: templates/fields/image-dimensions.php:18
906
+ msgctxt "Image width field label"
907
+ msgid "Width"
908
+ msgstr ""
909
+
910
+ #: templates/fields/image-dimensions.php:23
911
+ msgctxt "Image height field label"
912
+ msgid "Height"
913
+ msgstr ""
914
+
915
+ #: templates/fields/onoff.php:28
916
+ msgctxt "YES/NO button: use MAX 4 characters!"
917
+ msgid "YES"
918
+ msgstr "ΝΑΙ"
919
+
920
+ #: templates/fields/onoff.php:29
921
+ msgctxt "YES/NO button: use MAX 4 characters!"
922
+ msgid "NO"
923
+ msgstr "ΟΧΙ"
924
+
925
+ #. translators: 1. Url to EN playlist.
926
+ #: templates/panel/help-tab.php:89
927
+ msgctxt "Help tab view all video link"
928
+ msgid ""
929
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
930
+ "learn more >"
931
+ msgstr ""
932
+
933
+ #: templates/panel/help-tab.php:96
934
+ msgctxt "Help tab Watch Videotutorials link"
935
+ msgid "Videos are also available in:"
936
+ msgstr ""
937
+
938
+ #: templates/panel/help-tab.php:126
939
+ msgctxt "Help tab Read Documentation link"
940
+ msgid "Read the documentation"
941
+ msgstr ""
942
+
943
+ #: templates/panel/help-tab.php:129
944
+ msgctxt "Help tab Read Documentation link"
945
+ msgid "to learn how the plugin works from the basics."
946
+ msgstr ""
947
+
948
+ #: templates/panel/help-tab.php:139
949
+ msgctxt "Help tab Watch video tutorials link"
950
+ msgid "Watch our video tutorials"
951
+ msgstr ""
952
+
953
+ #: templates/panel/help-tab.php:142
954
+ msgctxt "Help tab Watch video tutorials link"
955
+ msgid "to see some helpful use cases."
956
+ msgstr ""
957
+
958
+ #: templates/panel/help-tab.php:152
959
+ msgctxt "Help tab view FAQs link"
960
+ msgid "Check the FAQs"
961
+ msgstr ""
962
+
963
+ #: templates/panel/help-tab.php:155
964
+ msgctxt "Help tab view FAQs link"
965
+ msgid "to find answers to your doubts."
966
+ msgstr ""
967
+
968
+ #: templates/panel/help-tab.php:170
969
+ msgctxt "Help tab FAQ title"
970
+ msgid "Last FAQs in our Help Center"
971
+ msgstr ""
972
+
973
+ #: templates/panel/help-tab.php:184
974
+ msgctxt "Help tab FAQ link"
975
+ msgid "View all FAQs >"
976
+ msgstr ""
977
+
978
+ #: templates/panel/help-tab.php:193
979
+ msgctxt "Help tab submit ticket title"
980
+ msgid "Need help?"
981
+ msgstr ""
982
+
983
+ #: templates/panel/help-tab.php:196
984
+ msgctxt "Help tab submit ticket description"
985
+ msgid ""
986
+ "If you are experiencing any technical issues, ask for help from our "
987
+ "developers. Submit a ticket through our support desk and we will help you as "
988
+ "soon as possible."
989
+ msgstr ""
990
+
991
+ #: templates/panel/help-tab.php:204
992
+ msgctxt "Help tab submit ticket button"
993
+ msgid "Submit a ticket"
994
+ msgstr ""
995
+
996
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
997
+ #: templates/panel/help-tab.php:223
998
+ msgctxt "Help tab documentation"
999
+ msgid "Read the plugin documentation"
1000
+ msgstr ""
1001
+
1002
+ #: templates/panel/help-tab.php:220
1003
+ msgctxt "Help tab documentation"
1004
+ msgid "to learn how it works from the basics."
1005
+ msgstr ""
1006
+
1007
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
1008
+ msgctxt "Help tab support"
1009
+ msgid "Need some help?"
1010
+ msgstr ""
1011
+
1012
+ #: templates/panel/help-tab.php:235
1013
+ msgctxt "Help tab support"
1014
+ msgid "From DIY to full-service help"
1015
+ msgstr ""
1016
+
1017
+ #: templates/panel/help-tab.php:238
1018
+ msgctxt "Help tab support"
1019
+ msgid ""
1020
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1021
+ "site."
1022
+ msgstr ""
1023
+
1024
+ #: templates/panel/help-tab.php:241
1025
+ msgctxt "Help tab support"
1026
+ msgid "Yes, I need help"
1027
+ msgstr ""
1028
+
1029
+ #: templates/panel/premium-tab.php:30
1030
+ msgctxt "Premium Tab"
1031
+ msgid "Get the premium version to unlock advanced features"
1032
+ msgstr ""
1033
+
1034
+ #: templates/panel/premium-tab.php:34
1035
+ msgctxt "Premium Tab"
1036
+ msgid "Get premium"
1037
+ msgstr ""
1038
+
1039
+ #: templates/panel/premium-tab.php:39
1040
+ msgctxt "Premium Tab"
1041
+ msgid "Plugin premium features images"
1042
+ msgstr ""
1043
+
1044
+ #. translators: alt attribute of main image tag.
1045
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1046
+ msgctxt "Premium Tab"
1047
+ msgid "And so much more!"
1048
+ msgstr ""
1049
+
1050
+ #: templates/panel/premium-tab.php:53
1051
+ msgctxt "Premium Tab"
1052
+ msgid "Check the premium features >"
1053
+ msgstr ""
1054
+
1055
+ #: templates/panel/premium-tab.php:60
1056
+ msgctxt "Premium Tab"
1057
+ msgid "Check the free vs premium features >"
1058
+ msgstr ""
1059
+
1060
+ #: templates/panel/premium-tab.php:65
1061
+ msgctxt "Premium Tab"
1062
+ msgid "Get the premium version"
1063
+ msgstr ""
1064
+
1065
+ #: yit-functions.php:1952
1066
+ msgctxt "Post action"
1067
+ msgid "Preview"
1068
+ msgstr ""
1069
+
1070
+ #: yit-functions.php:1961
1071
+ msgctxt "Post action"
1072
+ msgid "View"
1073
+ msgstr ""
1074
+
1075
+ #: yit-functions.php:1972
1076
+ msgctxt "Post action"
1077
+ msgid "Edit"
1078
+ msgstr ""
1079
+
1080
+ #: yit-functions.php:1980
1081
+ msgctxt "Post action"
1082
+ msgid "Duplicate"
1083
+ msgstr ""
1084
+
1085
+ #: yit-functions.php:1992
1086
+ msgctxt "Post action"
1087
+ msgid "Restore"
1088
+ msgstr ""
1089
+
1090
+ #: yit-functions.php:2000
1091
+ msgctxt "Post action"
1092
+ msgid "Trash"
1093
+ msgstr ""
1094
+
1095
+ #: yit-functions.php:2017
1096
+ msgctxt "Post action"
1097
+ msgid "Delete Permanently"
1098
+ msgstr ""
1099
+
1100
+ #: yit-functions.php:2114
1101
+ msgctxt "Term action"
1102
+ msgid "View"
1103
+ msgstr ""
1104
+
1105
+ #: yit-functions.php:2124
1106
+ msgctxt "Term action"
1107
+ msgid "Edit"
1108
+ msgstr ""
1109
+
1110
+ #: yit-functions.php:2132
1111
+ msgctxt "Term action"
1112
+ msgid "Duplicate"
1113
+ msgstr ""
1114
+
1115
+ #: yit-functions.php:2145
1116
+ msgctxt "Term action"
1117
+ msgid "Delete"
1118
+ msgstr ""
1119
+
1120
+ #: yit-plugin.php:85
1121
+ msgctxt "Plugin Row Meta"
1122
+ msgid "Live Demo"
1123
+ msgstr "Live Demo"
1124
+
1125
+ #: yit-plugin.php:89
1126
+ msgctxt "Plugin Row Meta"
1127
+ msgid "Documentation"
1128
+ msgstr "Εγχειρίδιο χρήσης"
1129
+
1130
+ #: yit-plugin.php:93
1131
+ msgctxt "Plugin Row Meta"
1132
+ msgid "Support"
1133
+ msgstr "Υποστήριξη"
1134
+
1135
+ #: yit-plugin.php:97
1136
+ msgctxt "Plugin Row Meta"
1137
+ msgid "Premium version"
1138
+ msgstr "Premium έκδοση"
1139
+
1140
+ #: yit-plugin.php:229
1141
+ msgctxt "Action links"
1142
+ msgid "Settings"
1143
+ msgstr "Ρυθμίσεις"
plugin-fw/languages/yith-plugin-fw-es_ES 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-es_ES 2.po ADDED
@@ -0,0 +1,1162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Spanish (Spain)
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2022-09-22 14:14:01+0000\n"
9
+ "Language: es\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
15
+
16
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
17
+ msgid "Confirm trash"
18
+ msgstr "Confirmar el traslado a la papelera"
19
+
20
+ #: includes/class-yit-assets.php:149
21
+ msgid "Are you sure you want to trash the selected items?"
22
+ msgstr ""
23
+ "¿Estás seguro de que quieres mover a la papelera los elementos seleccionados?"
24
+
25
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
26
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
27
+ #: yit-functions.php:2008 yit-functions.php:2026
28
+ msgid "No"
29
+ msgstr "No"
30
+
31
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
32
+ #: yit-functions.php:2152
33
+ msgid "Confirm delete"
34
+ msgstr "Confirmar el borrado"
35
+
36
+ #: includes/class-yit-assets.php:153
37
+ msgid "Are you sure you want to delete the selected items?"
38
+ msgstr "¿Estás seguro de que quieres borrar los elementos seleccionados?"
39
+
40
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
41
+ #: yit-functions.php:2100
42
+ msgid ""
43
+ "This action cannot be undone and you will not be able to recover this data."
44
+ msgstr "Esta acción no se puede revertir y no podrá recuperar estos datos."
45
+
46
+ #: includes/class-yit-assets.php:174
47
+ msgid "Clear"
48
+ msgstr "Borrar"
49
+
50
+ #: includes/class-yit-assets.php:175
51
+ msgid "Clear color"
52
+ msgstr "Borrar color"
53
+
54
+ #: includes/class-yit-assets.php:176
55
+ msgid "Default"
56
+ msgstr "Predeterminado"
57
+
58
+ #: includes/class-yit-assets.php:177
59
+ msgid "Select default color"
60
+ msgstr "Seleccionar color predeterminado"
61
+
62
+ #: includes/class-yit-assets.php:178
63
+ msgid "Select Color"
64
+ msgstr "Seleccionar color"
65
+
66
+ #: includes/class-yit-assets.php:179
67
+ msgid "Color value"
68
+ msgstr "Valor del color"
69
+
70
+ #: includes/class-yit-help-desk.php:152
71
+ msgid "There was an error with your request; please try again later."
72
+ msgstr ""
73
+ "Se ha producido un error en tu solicitud; inténtalo de nuevo más tarde."
74
+
75
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
76
+ msgid "The changes you have made will be lost if you leave this page."
77
+ msgstr "Los cambios que has hecho se perderán si abandonas esta página."
78
+
79
+ #: includes/class-yit-plugin-panel.php:83
80
+ msgid "Plugin Settings"
81
+ msgstr "Ajustes del plugin"
82
+
83
+ #: includes/class-yit-plugin-panel.php:84
84
+ msgid "Settings"
85
+ msgstr "Ajustes"
86
+
87
+ #: includes/class-yit-plugin-panel.php:456
88
+ #: includes/class-yit-plugin-panel.php:459
89
+ msgid "How to install premium version"
90
+ msgstr "Cómo instalar la versión premium"
91
+
92
+ #: includes/class-yit-plugin-panel.php:656
93
+ #: includes/class-yit-plugin-subpanel.php:133
94
+ msgid "Save Changes"
95
+ msgstr "Guardar cambios"
96
+
97
+ #: includes/class-yit-plugin-panel.php:664
98
+ #: includes/class-yit-plugin-subpanel.php:140
99
+ #: templates/panel/woocommerce/woocommerce-form.php:15
100
+ msgid ""
101
+ "If you continue with this action, you will reset all options in this page."
102
+ msgstr ""
103
+ "Si continúas con esta acción, restablecerás todas las opciones en esta "
104
+ "página."
105
+
106
+ #: includes/class-yit-plugin-panel.php:664
107
+ #: includes/class-yit-plugin-subpanel.php:140
108
+ #: templates/panel/woocommerce/woocommerce-form.php:15
109
+ msgid "Are you sure?"
110
+ msgstr "¿Estás seguro?"
111
+
112
+ #: includes/class-yit-plugin-panel.php:668
113
+ #: includes/class-yit-plugin-subpanel.php:143
114
+ msgid "Reset to default"
115
+ msgstr "Restablecer valores predeterminados"
116
+
117
+ #: includes/class-yit-plugin-panel.php:1039
118
+ msgid "Read the <mark>plugin documentation</mark>"
119
+ msgstr "Lee la <mark>documentación del plugin</mark>"
120
+
121
+ #: includes/class-yit-plugin-panel.php:1040
122
+ msgid "Learn what you can really do with this powerful tool"
123
+ msgstr "Aprende lo que realmente puedes hacer con esta potente herramienta"
124
+
125
+ #: includes/class-yit-plugin-panel.php:1050
126
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
127
+ msgstr "Mira nuestro <mark>vídeo de «primeros pasos»</mark>"
128
+
129
+ #: includes/class-yit-plugin-panel.php:1051
130
+ msgid "See how it works before you start using it"
131
+ msgstr "Ve cómo funciona antes de empezar a usarlo"
132
+
133
+ #: includes/class-yit-plugin-panel.php:1307
134
+ msgid ""
135
+ "The element you have entered already exists. Please, enter another name."
136
+ msgstr ""
137
+ "El elemento que has introducido ya existe. Por favor, introduce otro nombre."
138
+
139
+ #: includes/class-yit-plugin-panel.php:1308
140
+ msgid "Settings saved"
141
+ msgstr "Ajustes guardados"
142
+
143
+ #: includes/class-yit-plugin-panel.php:1309
144
+ msgid "Settings reset"
145
+ msgstr "Restablecer ajustes"
146
+
147
+ #: includes/class-yit-plugin-panel.php:1310
148
+ msgid "Element deleted correctly."
149
+ msgstr "Elemento eliminado correctamente."
150
+
151
+ #: includes/class-yit-plugin-panel.php:1311
152
+ #: includes/class-yit-plugin-panel.php:1312
153
+ msgid "Element updated correctly."
154
+ msgstr "Elemento actualizado correctamente."
155
+
156
+ #: includes/class-yit-plugin-panel.php:1313
157
+ msgid "Database imported correctly."
158
+ msgstr "Base de datos importada correctamente."
159
+
160
+ #: includes/class-yit-plugin-panel.php:1314
161
+ msgid "An error has occurred during import. Please try again."
162
+ msgstr ""
163
+ "Ha ocurrido un error durante la importación. Por favor, inténtalo de nuevo."
164
+
165
+ #: includes/class-yit-plugin-panel.php:1315
166
+ msgid "The added file is not valid."
167
+ msgstr "El archivo añadido no es válido."
168
+
169
+ #: includes/class-yit-plugin-panel.php:1316
170
+ msgid "Sorry, import is disabled."
171
+ msgstr "Lo siento, la importación está desactivada."
172
+
173
+ #: includes/class-yit-plugin-panel.php:1317
174
+ msgid "Sorting successful."
175
+ msgstr "Clasificación realizada con éxito"
176
+
177
+ #: includes/class-yit-plugin-panel.php:1806
178
+ msgid "We need your support"
179
+ msgstr "Necesitamos tu apoyo"
180
+
181
+ #: includes/class-yit-plugin-panel.php:1807
182
+ msgid "to keep updating and improving the plugin. Please,"
183
+ msgstr "para que podamos seguir actualizando y mejorando el plugin. Por favor,"
184
+
185
+ #: includes/class-yit-plugin-panel.php:1809
186
+ msgid "help us by leaving a good review"
187
+ msgstr "ayúdanos dejando una buena valoración"
188
+
189
+ #: includes/class-yit-plugin-panel.php:1810
190
+ msgid ":) Thanks!"
191
+ msgstr ":) ¡Gracias!"
192
+
193
+ #: includes/class-yit-pointers.php:80
194
+ msgid "Plugins Activated"
195
+ msgstr "Plugins activados"
196
+
197
+ #: includes/class-yit-pointers.php:81
198
+ msgid ""
199
+ "From now on, you can find all plugin options in YITH menu. Plugin "
200
+ "customization settings will be available as a new entry in YITH menu."
201
+ msgstr ""
202
+ "Desde ahora, puedes encontrar todas las opciones de los plugins en el menú "
203
+ "YITH plugins. La personalización de los ajustes del plugins estará "
204
+ "disponible como una nueva entrada en el menú YITH plugins."
205
+
206
+ #. translators: 1. YITH site link; 2. WordPress site link.
207
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
208
+ msgid "Discover all our plugins available on: %1$s and %2$s"
209
+ msgstr "Descubre todos nuestros plugins disponibles en: %1$s y %2$s"
210
+
211
+ #: includes/class-yit-pointers.php:96
212
+ msgid "Plugins Upgraded"
213
+ msgstr "Plugins mejorados"
214
+
215
+ #: includes/class-yit-pointers.php:97
216
+ msgid ""
217
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
218
+ "Every time one of our plugins is added, a new entry will be added to this "
219
+ "menu. For example, after the update, plugin options (such as for YITH "
220
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
221
+ "previous location to YITH menu."
222
+ msgstr ""
223
+ "Desde ahora puedes encontrar la opción en el panel de Plugins de YITH en el "
224
+ "menú YITH plugins. Cada vez que uno de nuestros plugins es añadido, una "
225
+ "nueva entrada será añadida a este menú. Por ejemplo, tras la actualización, "
226
+ "las opciones de los plugins (tales como YITH WooCommerce Wishlist, YITH "
227
+ "WooCommerce Ajax Search, etc.) serán movidos de la ubicación previa a la "
228
+ "pestaña de YITH plugins."
229
+
230
+ #: includes/class-yith-bh-onboarding.php:85
231
+ msgid "It is not possible save the options"
232
+ msgstr "No es posible guardar las opciones"
233
+
234
+ #: includes/class-yith-dashboard.php:35
235
+ msgid "YITH Latest Updates"
236
+ msgstr "Últimas actualizaciones de YITH"
237
+
238
+ #: includes/class-yith-dashboard.php:36
239
+ msgid "Latest news from YITH Blog"
240
+ msgstr "Últimas novedades del Blog de YITH"
241
+
242
+ #: includes/class-yith-dashboard.php:56
243
+ msgid "RSS Error:"
244
+ msgstr "Error RSS:"
245
+
246
+ #: includes/class-yith-dashboard.php:63
247
+ msgid ""
248
+ "An error has occurred, which probably means the feed is down. Try again "
249
+ "later."
250
+ msgstr ""
251
+ "Ha ocurrido un error, lo que puede que signifique que el feed ha caído. "
252
+ "Inténtalo de nuevo más tarde."
253
+
254
+ #. translators: %s is the name of the post type (example Back to "Membership
255
+ #. Plans").
256
+ #: includes/class-yith-post-type-admin.php:286
257
+ msgid "Back to \"%s\""
258
+ msgstr "Volver a \"%s\""
259
+
260
+ #: includes/class-yith-post-type-admin.php:286
261
+ msgid "Back to the list"
262
+ msgstr "Volver a la lista"
263
+
264
+ #: includes/class-yith-system-status.php:110
265
+ msgid "WordPress Version"
266
+ msgstr "Versión de WordPress"
267
+
268
+ #: includes/class-yith-system-status.php:111
269
+ msgid "WooCommerce Version"
270
+ msgstr "Versión de WooCommerce"
271
+
272
+ #: includes/class-yith-system-status.php:112
273
+ msgid "Available Memory"
274
+ msgstr "Memoria disponible"
275
+
276
+ #: includes/class-yith-system-status.php:113
277
+ msgid "PHP Version"
278
+ msgstr "Versión PHP"
279
+
280
+ #: includes/class-yith-system-status.php:114
281
+ msgid "TLS Version"
282
+ msgstr "Versión TLS"
283
+
284
+ #: includes/class-yith-system-status.php:115
285
+ msgid "WordPress Cron"
286
+ msgstr "Cron de WordPress"
287
+
288
+ #: includes/class-yith-system-status.php:116
289
+ msgid "SimpleXML"
290
+ msgstr "SimpleXML"
291
+
292
+ #: includes/class-yith-system-status.php:117
293
+ msgid "MultiByte String"
294
+ msgstr "Cadena MultiByte"
295
+
296
+ #: includes/class-yith-system-status.php:118
297
+ msgid "ImageMagick Version"
298
+ msgstr "Versión ImageMagick"
299
+
300
+ #: includes/class-yith-system-status.php:119
301
+ msgid "GD Library"
302
+ msgstr "Biblioteca GD"
303
+
304
+ #: includes/class-yith-system-status.php:120
305
+ msgid "Iconv Module"
306
+ msgstr "Módulo Iconv"
307
+
308
+ #: includes/class-yith-system-status.php:121
309
+ msgid "OPCache Save Comments"
310
+ msgstr "Guardar comentarios OPCache"
311
+
312
+ #: includes/class-yith-system-status.php:122
313
+ msgid "URL FOpen"
314
+ msgstr "URL FOpen"
315
+
316
+ #: includes/class-yith-system-status.php:140
317
+ #: includes/class-yith-system-status.php:141
318
+ #: templates/sysinfo/system-information-panel.php:11
319
+ msgid "System Status"
320
+ msgstr "Estado del sistema"
321
+
322
+ #: includes/class-yith-system-status.php:183
323
+ msgid "YITH Plugins"
324
+ msgstr "YITH Plugins"
325
+
326
+ #: includes/class-yith-system-status.php:191
327
+ msgid "WooCommerce"
328
+ msgstr "WooCommerce"
329
+
330
+ #: includes/class-yith-system-status.php:342
331
+ msgid "Warning!"
332
+ msgstr "¡Atención!"
333
+
334
+ #. translators: %1$s open link tag, %2$s open link tag
335
+ #: includes/class-yith-system-status.php:346
336
+ msgid ""
337
+ "The system check has detected some compatibility issues on your installation."
338
+ "%1$sClick here%2$s to know more"
339
+ msgstr ""
340
+ "La comprobación del sistema ha detectado algunos problemas de compatibilidad "
341
+ "en tu instalación.%1$sHaz clic quí%2$s para saber más"
342
+
343
+ #: includes/class-yith-system-status.php:496
344
+ msgid "Enabled"
345
+ msgstr "Activado"
346
+
347
+ #: includes/class-yith-system-status.php:496
348
+ msgid "Disabled"
349
+ msgstr "Desactivado"
350
+
351
+ #: includes/class-yith-system-status.php:501
352
+ msgid "N/A"
353
+ msgstr "N/D"
354
+
355
+ #. translators: %1$s plugin name, %2$s requirement name
356
+ #: includes/class-yith-system-status.php:528
357
+ msgid "%1$s needs %2$s enabled"
358
+ msgstr "%1$s necesita %2$s activado"
359
+
360
+ #. translators: %1$s plugin name, %2$s required memory amount
361
+ #: includes/class-yith-system-status.php:531
362
+ msgid "%1$s needs at least %2$s of available memory"
363
+ msgstr "%1$s necesita al menos %2$s de memoria disponible"
364
+
365
+ #. translators: %1$s plugin name, %2$s version number
366
+ #: includes/class-yith-system-status.php:534
367
+ msgid "%1$s needs at least %2$s version"
368
+ msgstr "%1$s necesita al menos la versión %2$s"
369
+
370
+ #: includes/class-yith-system-status.php:558
371
+ msgid ""
372
+ "Update it to the latest version in order to benefit of all new features and "
373
+ "security updates."
374
+ msgstr ""
375
+ "Actualízalo a la última versión para beneficiarte de todas las "
376
+ "características y actualizaciones de seguridad."
377
+
378
+ #: includes/class-yith-system-status.php:562
379
+ #: includes/class-yith-system-status.php:568
380
+ msgid "Contact your hosting company in order to update it."
381
+ msgstr "Ponte en contacto con tu empresa de hosting para actualizarlo."
382
+
383
+ #: includes/class-yith-system-status.php:566
384
+ msgid "Contact your hosting company in order to install it."
385
+ msgstr "Ponte en contacto con tu empresa de hosting para instalarlo."
386
+
387
+ #. translators: %1$s code, %2$s file name
388
+ #: includes/class-yith-system-status.php:573
389
+ msgid "Remove %1$s from %2$s file"
390
+ msgstr "Eliminar %1$s desde el archivo %2$s "
391
+
392
+ #: includes/class-yith-system-status.php:581
393
+ msgid "Contact your hosting company in order to enable it."
394
+ msgstr "Contacta con tu empresa de hosting para activarlo."
395
+
396
+ #. translators: %1$s opening link tag, %2$s closing link tag
397
+ #: includes/class-yith-system-status.php:585
398
+ #: includes/class-yith-system-status.php:608
399
+ msgid ""
400
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
401
+ "it."
402
+ msgstr ""
403
+ "Lee más %1$saquí%2$s o contacta a tu empresa de hosting para incrementarlo."
404
+
405
+ #. translators: %s recommended memory amount
406
+ #: includes/class-yith-system-status.php:605
407
+ msgid ""
408
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
409
+ "available memory"
410
+ msgstr ""
411
+ "Para el óptimo funcionamiento de nuestros plugins, sugerimos al menos %s de "
412
+ "memoria disponible"
413
+
414
+ #. translators: %1$s TLS label, %2$s cURL label
415
+ #: includes/class-yith-system-status.php:613
416
+ msgid ""
417
+ "The system check cannot determine which %1$s version is installed because "
418
+ "%2$s module is disabled. Ask your hosting company to enable it."
419
+ msgstr ""
420
+ "La comprobación del sistema no ha podido determinar qué versión de %1$s está "
421
+ "instalada porque el módulo %2$s está desactivado. Solicita a tu compañia de "
422
+ "hosting que lo active."
423
+
424
+ #. translators: %1$s TLS label
425
+ #: includes/class-yith-system-status.php:616
426
+ msgid ""
427
+ "The system check cannot determine which %1$s version is installed due to a "
428
+ "connection issue between your site and our server."
429
+ msgstr ""
430
+ "La comprobación del sistema no ha podido determinar qué versión de %1$s está "
431
+ "instalada debido a un error entre tu sitio y nuestro servidor."
432
+
433
+ #: templates/bh-onboarding/onboarding-tabs.php:63
434
+ msgid "Save"
435
+ msgstr "Guardar"
436
+
437
+ #: templates/fields/ajax-customers.php:41
438
+ msgid "Search for a customer..."
439
+ msgstr "Buscar un cliente..."
440
+
441
+ #. translators: 1. user display name; 2. user ID; 3. user email.
442
+ #: templates/fields/ajax-customers.php:68
443
+ #: templates/fields/ajax-customers.php:79
444
+ msgid "%1$s (#%2$s &ndash; %3$s)"
445
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
446
+
447
+ #: templates/fields/ajax-posts.php:41
448
+ msgid "Search for a post..."
449
+ msgstr "Buscar una entrada..."
450
+
451
+ #: templates/fields/ajax-products.php:16
452
+ msgid "Search for a product..."
453
+ msgstr "Buscar un producto..."
454
+
455
+ #: templates/fields/ajax-terms.php:41
456
+ msgid "Search for a category..."
457
+ msgstr "Buscar una categoría..."
458
+
459
+ #: templates/fields/customtabs.php:17
460
+ msgid "Close all"
461
+ msgstr "Cerrar todo"
462
+
463
+ #: templates/fields/customtabs.php:17
464
+ msgid "Expand all"
465
+ msgstr "Expandir todo"
466
+
467
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
468
+ msgid "Remove"
469
+ msgstr "Eliminar"
470
+
471
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
472
+ msgid "Name"
473
+ msgstr "Nombre"
474
+
475
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
476
+ msgid "Value"
477
+ msgstr "Valor"
478
+
479
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
480
+ msgid "Content of the tab. (HTML is supported)"
481
+ msgstr "Contenido de la pestaña. (Compatible con HTML)"
482
+
483
+ #: templates/fields/customtabs.php:52
484
+ msgid "Add custom product tab"
485
+ msgstr "Añadir pestaña de producto personalizada"
486
+
487
+ #: templates/fields/customtabs.php:93
488
+ msgid "Do you want to remove the custom tab?"
489
+ msgstr "¿Quieres eliminar la pestaña personalizada?"
490
+
491
+ #: templates/fields/date-format.php:65
492
+ msgid "Custom:"
493
+ msgstr "Personalizado:"
494
+
495
+ #: templates/fields/date-format.php:70
496
+ msgid "Preview:"
497
+ msgstr "Vista previa:"
498
+
499
+ #: templates/fields/icons.php:78
500
+ msgid "Set Default"
501
+ msgstr "Establecer predeterminado"
502
+
503
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
504
+ msgid "Delete image"
505
+ msgstr "Eliminar imagen"
506
+
507
+ #: templates/fields/image-gallery.php:37
508
+ msgid "Add Images to Gallery"
509
+ msgstr "Añadir imágenes a la Galería"
510
+
511
+ #: templates/fields/image-gallery.php:38
512
+ msgid "Add to gallery"
513
+ msgstr "Añadir a la galería"
514
+
515
+ #: templates/fields/image-gallery.php:39
516
+ msgid "Add images"
517
+ msgstr "Añadir imágenes"
518
+
519
+ #: templates/fields/image-gallery.php:41
520
+ msgid "Delete"
521
+ msgstr "Eliminar"
522
+
523
+ #: templates/fields/select-buttons.php:19
524
+ msgid "Add All"
525
+ msgstr "Añadir todo"
526
+
527
+ #: templates/fields/select-buttons.php:20
528
+ msgid "Remove All"
529
+ msgstr "Eliminar todo"
530
+
531
+ #: templates/fields/sidebars.php:20
532
+ msgid "Left sidebar"
533
+ msgstr "Barra lateral izquierda"
534
+
535
+ #: templates/fields/sidebars.php:23
536
+ msgid "Right sidebar"
537
+ msgstr "Barra lateral derecha"
538
+
539
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
540
+ msgid "No sidebar"
541
+ msgstr "Sin barra lateral"
542
+
543
+ #: templates/fields/sidebars.php:39
544
+ msgid "Left Sidebar"
545
+ msgstr "Barra lateral izquierda"
546
+
547
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
548
+ msgid "Choose a sidebar"
549
+ msgstr "Elige una barra lateral"
550
+
551
+ #: templates/fields/sidebars.php:54
552
+ msgid "Right Sidebar"
553
+ msgstr "Barra lateral derecha"
554
+
555
+ #: templates/fields/upload.php:34
556
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
557
+ msgid "Upload"
558
+ msgstr "Subir"
559
+
560
+ #: templates/fields/upload.php:39
561
+ msgid "Reset"
562
+ msgstr "Restablecer"
563
+
564
+ #. translators: %s is the plugin version.
565
+ #: templates/panel/welcome-modals/update.php:34
566
+ msgid "is successfully updated to version %s."
567
+ msgstr "ha sido actualizado correctamente a la versión %s."
568
+
569
+ #. translators: %s is the plugin version.
570
+ #: templates/panel/welcome-modals/update.php:44
571
+ msgid "What's new in version %s"
572
+ msgstr "Novedades de la versión %s"
573
+
574
+ #: templates/panel/welcome-modals/update.php:49
575
+ msgid "Check the changelog >"
576
+ msgstr "Comprueba el registro de cambios >"
577
+
578
+ #: templates/panel/welcome-modals/update.php:64
579
+ #: templates/panel/welcome-modals/welcome.php:60
580
+ msgid "Got it, close this window"
581
+ msgstr "Entendido, cerrar esta ventana"
582
+
583
+ #: templates/panel/welcome-modals/welcome.php:30
584
+ msgid "Thank you for using our plugin"
585
+ msgstr "Gracias por usar nuestro plugin"
586
+
587
+ #. translators: %s is the number of steps.
588
+ #: templates/panel/welcome-modals/welcome.php:45
589
+ msgid "Start with these %s steps:"
590
+ msgstr "Comienza con estos %s pasos:"
591
+
592
+ #: templates/panel/woocommerce/woocommerce-form.php:29
593
+ #: templates/panel/woocommerce/woocommerce-form.php:33
594
+ msgid "Save Options"
595
+ msgstr "Guardar Opciones"
596
+
597
+ #: templates/panel/woocommerce/woocommerce-form.php:33
598
+ msgid "Options Saved"
599
+ msgstr "Opciones guardadas"
600
+
601
+ #: templates/panel/woocommerce/woocommerce-form.php:43
602
+ msgid "Reset Defaults"
603
+ msgstr "Restablecer valores predeterminados"
604
+
605
+ #: templates/sysinfo/system-information-panel.php:12
606
+ msgid "PHPInfo"
607
+ msgstr "Información PHP"
608
+
609
+ #: templates/sysinfo/system-information-panel.php:13
610
+ #: templates/sysinfo/tabs/error-log.php:25
611
+ msgid "Log Files"
612
+ msgstr "Archivos de registro"
613
+
614
+ #: templates/sysinfo/system-information-panel.php:22
615
+ msgid "YITH System Information"
616
+ msgstr "Información de Sistema de YITH"
617
+
618
+ #: templates/sysinfo/tabs/error-log.php:13
619
+ msgid "WP debug.log file"
620
+ msgstr "Archivo WP debug.log"
621
+
622
+ #: templates/sysinfo/tabs/error-log.php:18
623
+ msgid "PHP error_log file"
624
+ msgstr "Archivo PHP error_log"
625
+
626
+ #: templates/sysinfo/tabs/error-log.php:60
627
+ msgid "Download"
628
+ msgstr "Descargar"
629
+
630
+ #: templates/sysinfo/tabs/error-log.php:73
631
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
632
+ msgstr "El archivo excede los 8 megabytes por lo que debe ser descargado"
633
+
634
+ #. translators: %s file name.
635
+ #: templates/sysinfo/tabs/error-log.php:97
636
+ msgid ""
637
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
638
+ "file of your installation"
639
+ msgstr ""
640
+ "No hay archivo de registro disponible. Activa la depuración de WordPress "
641
+ "añadiendo este código en el archivo %s de tu instalación"
642
+
643
+ #: templates/sysinfo/tabs/error-log.php:106
644
+ msgid "Copied!"
645
+ msgstr "¡Copiado!"
646
+
647
+ #: templates/sysinfo/tabs/error-log.php:106
648
+ msgid "Copy Code"
649
+ msgstr "Copiar código"
650
+
651
+ #: templates/sysinfo/tabs/main.php:17
652
+ msgid "Site Info"
653
+ msgstr "Información del sitio"
654
+
655
+ #: templates/sysinfo/tabs/main.php:22
656
+ msgid "Site URL"
657
+ msgstr "URL del sitio"
658
+
659
+ #: templates/sysinfo/tabs/main.php:31
660
+ msgid "Output IP Address"
661
+ msgstr "Dirección IP de salida"
662
+
663
+ #: templates/sysinfo/tabs/main.php:39
664
+ msgid "Defined WP_CACHE"
665
+ msgstr "WP_CACHE definido"
666
+
667
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
668
+ msgid "Yes"
669
+ msgstr "Sí"
670
+
671
+ #: templates/sysinfo/tabs/main.php:47
672
+ msgid "External object cache"
673
+ msgstr "Caché objeto externo"
674
+
675
+ #: templates/sysinfo/tabs/main.php:55
676
+ msgid "YITH Plugin Framework Version"
677
+ msgstr "Versión del YITH Plugin Framework "
678
+
679
+ #. translators: %s is the name of the plugin that is loading the framework.
680
+ #: templates/sysinfo/tabs/main.php:64
681
+ msgid "loaded by %s"
682
+ msgstr "cargado por %s"
683
+
684
+ #: templates/sysinfo/tabs/main.php:73
685
+ msgid "Plugins Requirements"
686
+ msgstr "Requerimientos de los plugins"
687
+
688
+ #: templates/sysinfo/tabs/main.php:108
689
+ msgid "Database Info"
690
+ msgstr "Información de la base de datos"
691
+
692
+ #: templates/sysinfo/tabs/main.php:113
693
+ msgid "MySQL version"
694
+ msgstr "Versión de MySQL"
695
+
696
+ #. Translators: %s: Codex link.
697
+ #: templates/sysinfo/tabs/main.php:123
698
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
699
+ msgstr "WordPress recomienda como versión mínima para MySQL la 5.6. Ver: %s"
700
+
701
+ #: templates/sysinfo/tabs/main.php:123
702
+ msgid "WordPress requirements"
703
+ msgstr "Requerimientos de WordPress"
704
+
705
+ #: templates/sysinfo/tabs/main.php:130
706
+ msgid "Total Database Size"
707
+ msgstr "Tamaño total de la base de datos:"
708
+
709
+ #: templates/sysinfo/tabs/main.php:138
710
+ msgid "Database Data Size"
711
+ msgstr "Tamaño de los datos en la base de datos:"
712
+
713
+ #: templates/sysinfo/tabs/main.php:146
714
+ msgid "Database Index Size"
715
+ msgstr "Tamaño del índice en la base de datos:"
716
+
717
+ #: templates/sysinfo/tabs/main.php:154
718
+ msgid "Database Free Size"
719
+ msgstr "Espacio libre en la base de datos:"
720
+
721
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
722
+ #. Engine.
723
+ #: templates/sysinfo/tabs/main.php:168
724
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
725
+ msgstr "Datos: %1$.2fMB | Índice: %2$.2fMB | Libre: %3$.2fMB | Motor: %4$s"
726
+
727
+ #. translators: %s is the title of the post object.
728
+ #: yit-functions.php:1938
729
+ msgid "Are you sure you want to move \"%s\" to trash?"
730
+ msgstr "¿Estás seguro de que quieres mover \"%s\" a la papelera?"
731
+
732
+ #. translators: %s is the title of the post object.
733
+ #: yit-functions.php:1940 yit-functions.php:2100
734
+ msgid "Are you sure you want to delete \"%s\"?"
735
+ msgstr "¿Estás seguro de que quieres borrar \"%s\"?"
736
+
737
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
738
+ msgid "Further actions"
739
+ msgstr "Otras acciones"
740
+
741
+ #: yit-plugin.php:233
742
+ msgid "License"
743
+ msgstr "Licencia"
744
+
745
+ #. translators: 1. Plugin(s) name(s).
746
+ #: yit-plugin.php:272
747
+ msgid ""
748
+ "%s was deactivated as you're running an higher tier version of the same "
749
+ "plugin."
750
+ msgid_plural ""
751
+ "%s were deactivated as you're running higher tier versions of the same "
752
+ "plugins."
753
+ msgstr[0] ""
754
+ "%s fue desactivado ya que estás ejecutando una versión superior del mismo "
755
+ "plugin."
756
+ msgstr[1] ""
757
+ "%s fueron desactivados ya que estás ejecutando una versión superior de los "
758
+ "mismos plugins."
759
+
760
+ #. Author of the plugin/theme
761
+ msgid "YITH"
762
+ msgstr "YITH"
763
+
764
+ #. translators: %s it the Elementor Widget title.
765
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
766
+ msgctxt "Elementor Widget - section title"
767
+ msgid "%s - Options"
768
+ msgstr "%s - Opciones"
769
+
770
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
771
+ msgctxt "[gutenberg]: Category Name"
772
+ msgid "YITH"
773
+ msgstr "YITH"
774
+
775
+ #: includes/class-yit-assets.php:136
776
+ msgctxt "Button text"
777
+ msgid "Confirm"
778
+ msgstr "Confirmar"
779
+
780
+ #: includes/class-yit-assets.php:137
781
+ msgctxt "Button text"
782
+ msgid "Cancel"
783
+ msgstr "Cancelar"
784
+
785
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
786
+ msgctxt "Trash confirmation action"
787
+ msgid "Yes, move to trash"
788
+ msgstr "Sí, mover a la papelera"
789
+
790
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
791
+ #: yit-functions.php:2154
792
+ msgctxt "Delete confirmation action"
793
+ msgid "Yes, delete"
794
+ msgstr "Si, borrar"
795
+
796
+ #. translators: 1. Plugin name.
797
+ #: includes/class-yit-plugin-panel.php:804
798
+ msgctxt "Help tab default title"
799
+ msgid "Thank you for purchasing %s!"
800
+ msgstr "¡Gracias por comprar %s!"
801
+
802
+ #: includes/class-yit-plugin-panel.php:804
803
+ msgctxt "Help tab default title"
804
+ msgid "Thank you for using %s!"
805
+ msgstr "¡Gracias por usar %s!"
806
+
807
+ #: includes/class-yit-plugin-panel.php:812
808
+ msgctxt "Help tab default description"
809
+ msgid ""
810
+ "We want to help you enjoy a wonderful experience with all of our products."
811
+ msgstr ""
812
+ "Queremos ayudarte a disfrutar de una experiencia maravillosa con todos "
813
+ "nuestros productos."
814
+
815
+ #: includes/class-yit-plugin-panel.php:863
816
+ msgctxt "Premium tab name"
817
+ msgid "Get premium"
818
+ msgstr "Obtén premium"
819
+
820
+ #: includes/class-yit-plugin-panel.php:875
821
+ msgctxt "Help tab name"
822
+ msgid "Help"
823
+ msgstr "Ayuda"
824
+
825
+ #: includes/class-yith-dashboard.php:96
826
+ msgctxt "Plugin FW"
827
+ msgid "View Changelog"
828
+ msgstr "Ver Registro de cambios"
829
+
830
+ #: includes/class-yith-dashboard.php:97
831
+ msgctxt "Plugin FW"
832
+ msgid "Latest update released on"
833
+ msgstr "Última actualización publicada el"
834
+
835
+ #: includes/class-yith-dashboard.php:137
836
+ msgctxt "Button label"
837
+ msgid "Close"
838
+ msgstr "Cerrar"
839
+
840
+ #: includes/privacy/class-yith-privacy.php:61
841
+ msgctxt "Privacy Policy Guide Title"
842
+ msgid "YITH Plugins"
843
+ msgstr "Plugins de YITH"
844
+
845
+ #: includes/privacy/class-yith-privacy.php:93
846
+ msgctxt "Privacy Policy Content"
847
+ msgid ""
848
+ "This sample language includes the basics around what personal data your "
849
+ "store may be collecting, storing and sharing, as well as who may have access "
850
+ "to that data. Depending on what settings are enabled and which additional "
851
+ "plugins are used, the specific information shared by your store will vary. "
852
+ "We recommend consulting with a lawyer when deciding what information to "
853
+ "disclose on your privacy policy."
854
+ msgstr ""
855
+ "Este idioma de prueba incluye la información principal sobre qué tipo de "
856
+ "información puede estar recopilando, almacenando y compartiendo tu tienda, "
857
+ "así como quién tiene acceso a esa información. Dependiendo de los ajustes "
858
+ "configurados y qué plugins adicionales sean usados, la información "
859
+ "específica compartida por tu sitio variará. Recomendamos consultar con un "
860
+ "abogado cuando decidas qué información mostrar en tu política de privacidad."
861
+
862
+ #: includes/privacy/class-yith-privacy.php:97
863
+ msgctxt "Privacy Policy Content"
864
+ msgid "What we collect and store"
865
+ msgstr "Qué recopilamos y almacenamos"
866
+
867
+ #: includes/privacy/class-yith-privacy.php:100
868
+ msgctxt "Privacy Policy Content"
869
+ msgid "Who on our team has access"
870
+ msgstr "Quién en nuestro equipo tiene acceso"
871
+
872
+ #: includes/privacy/class-yith-privacy.php:103
873
+ msgctxt "Privacy Policy Content"
874
+ msgid "What we share with others"
875
+ msgstr "Qué compartimos con otros"
876
+
877
+ #: includes/privacy/class-yith-privacy.php:106
878
+ msgctxt "Privacy Policy Content"
879
+ msgid "Payments"
880
+ msgstr "Pagos"
881
+
882
+ #: templates/fields/copy-to-clipboard.php:41
883
+ msgctxt "Copy-to-clipboard message"
884
+ msgid "Copied!"
885
+ msgstr "¡Copiado!"
886
+
887
+ #: templates/fields/copy-to-clipboard.php:45
888
+ msgctxt "Copy-to-clipboard button text"
889
+ msgid "Copy"
890
+ msgstr "Copiar"
891
+
892
+ #: templates/fields/dimensions.php:13
893
+ msgctxt "Position in the \"Dimensions\" field"
894
+ msgid "Top"
895
+ msgstr "Parte superior"
896
+
897
+ #: templates/fields/dimensions.php:14
898
+ msgctxt "Position in the \"Dimensions\" field"
899
+ msgid "Right"
900
+ msgstr "Derecha"
901
+
902
+ #: templates/fields/dimensions.php:15
903
+ msgctxt "Position in the \"Dimensions\" field"
904
+ msgid "Bottom"
905
+ msgstr "Parte inferior"
906
+
907
+ #: templates/fields/dimensions.php:16
908
+ msgctxt "Position in the \"Dimensions\" field"
909
+ msgid "Left"
910
+ msgstr "Izquierda"
911
+
912
+ #: templates/fields/dimensions.php:94
913
+ msgctxt "Tooltip in the \"Dimensions\" field"
914
+ msgid "Link values together"
915
+ msgstr "Enlazar valores juntos"
916
+
917
+ #: templates/fields/image-dimensions.php:18
918
+ msgctxt "Image width field label"
919
+ msgid "Width"
920
+ msgstr "Anchura"
921
+
922
+ #: templates/fields/image-dimensions.php:23
923
+ msgctxt "Image height field label"
924
+ msgid "Height"
925
+ msgstr "Altura"
926
+
927
+ #: templates/fields/onoff.php:28
928
+ msgctxt "YES/NO button: use MAX 4 characters!"
929
+ msgid "YES"
930
+ msgstr "SÍ"
931
+
932
+ #: templates/fields/onoff.php:29
933
+ msgctxt "YES/NO button: use MAX 4 characters!"
934
+ msgid "NO"
935
+ msgstr "NO"
936
+
937
+ #. translators: 1. Url to EN playlist.
938
+ #: templates/panel/help-tab.php:89
939
+ msgctxt "Help tab view all video link"
940
+ msgid ""
941
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
942
+ "learn more >"
943
+ msgstr ""
944
+ "Consulta la <a href=\"%s\" target=\"_blank\">Lista de reproducción en "
945
+ "Youtube</a> para saber más >"
946
+
947
+ #: templates/panel/help-tab.php:96
948
+ msgctxt "Help tab Watch Videotutorials link"
949
+ msgid "Videos are also available in:"
950
+ msgstr "Los vídeos también están disponibles en:"
951
+
952
+ #: templates/panel/help-tab.php:126
953
+ msgctxt "Help tab Read Documentation link"
954
+ msgid "Read the documentation"
955
+ msgstr "Lee la documentación"
956
+
957
+ #: templates/panel/help-tab.php:129
958
+ msgctxt "Help tab Read Documentation link"
959
+ msgid "to learn how the plugin works from the basics."
960
+ msgstr "para aprender cómo funciona el plugin desde lo más básico."
961
+
962
+ #: templates/panel/help-tab.php:139
963
+ msgctxt "Help tab Watch video tutorials link"
964
+ msgid "Watch our video tutorials"
965
+ msgstr "Ve nuestros videotutoriales"
966
+
967
+ #: templates/panel/help-tab.php:142
968
+ msgctxt "Help tab Watch video tutorials link"
969
+ msgid "to see some helpful use cases."
970
+ msgstr "para ver algunos casos de uso útiles."
971
+
972
+ #: templates/panel/help-tab.php:152
973
+ msgctxt "Help tab view FAQs link"
974
+ msgid "Check the FAQs"
975
+ msgstr "Comprueba las FAQ"
976
+
977
+ #: templates/panel/help-tab.php:155
978
+ msgctxt "Help tab view FAQs link"
979
+ msgid "to find answers to your doubts."
980
+ msgstr "para encontrar respuestas a tus dudas."
981
+
982
+ #: templates/panel/help-tab.php:170
983
+ msgctxt "Help tab FAQ title"
984
+ msgid "Last FAQs in our Help Center"
985
+ msgstr "Últimas FAQ en nuestro Centro de ayuda"
986
+
987
+ #: templates/panel/help-tab.php:184
988
+ msgctxt "Help tab FAQ link"
989
+ msgid "View all FAQs >"
990
+ msgstr "Ver todas las FAQs >"
991
+
992
+ #: templates/panel/help-tab.php:193
993
+ msgctxt "Help tab submit ticket title"
994
+ msgid "Need help?"
995
+ msgstr "¿Necesitas ayuda?"
996
+
997
+ #: templates/panel/help-tab.php:196
998
+ msgctxt "Help tab submit ticket description"
999
+ msgid ""
1000
+ "If you are experiencing any technical issues, ask for help from our "
1001
+ "developers. Submit a ticket through our support desk and we will help you as "
1002
+ "soon as possible."
1003
+ msgstr ""
1004
+ "Si tienes algún problema técnico, pide ayuda a nuestros desarrolladores. "
1005
+ "Envía un ticket a través de nuestro servicio de asistencia y te ayudaremos "
1006
+ "lo antes posible."
1007
+
1008
+ #: templates/panel/help-tab.php:204
1009
+ msgctxt "Help tab submit ticket button"
1010
+ msgid "Submit a ticket"
1011
+ msgstr "Enviar ticket"
1012
+
1013
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
1014
+ #: templates/panel/help-tab.php:223
1015
+ msgctxt "Help tab documentation"
1016
+ msgid "Read the plugin documentation"
1017
+ msgstr "Lee la documentación del plugin"
1018
+
1019
+ #: templates/panel/help-tab.php:220
1020
+ msgctxt "Help tab documentation"
1021
+ msgid "to learn how it works from the basics."
1022
+ msgstr "para aprender cómo funciona desde lo más básico."
1023
+
1024
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
1025
+ msgctxt "Help tab support"
1026
+ msgid "Need some help?"
1027
+ msgstr "¿Necesitas ayuda?"
1028
+
1029
+ #: templates/panel/help-tab.php:235
1030
+ msgctxt "Help tab support"
1031
+ msgid "From DIY to full-service help"
1032
+ msgstr "Ayuda desde «hazlo tu mismo» hasta un servicio completo"
1033
+
1034
+ #: templates/panel/help-tab.php:238
1035
+ msgctxt "Help tab support"
1036
+ msgid ""
1037
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1038
+ "site."
1039
+ msgstr ""
1040
+ "Llama o chatee las 24 horas del día con nuestros agentes de soporte, o deja "
1041
+ "que nuestros expertos construyan tu sitio."
1042
+
1043
+ #: templates/panel/help-tab.php:241
1044
+ msgctxt "Help tab support"
1045
+ msgid "Yes, I need help"
1046
+ msgstr "Sí, necesito ayuda"
1047
+
1048
+ #: templates/panel/premium-tab.php:30
1049
+ msgctxt "Premium Tab"
1050
+ msgid "Get the premium version to unlock advanced features"
1051
+ msgstr "Obtén la versión premium para desbloquear características avanzadas"
1052
+
1053
+ #: templates/panel/premium-tab.php:34
1054
+ msgctxt "Premium Tab"
1055
+ msgid "Get premium"
1056
+ msgstr "Obtén la versión Premium"
1057
+
1058
+ #: templates/panel/premium-tab.php:39
1059
+ msgctxt "Premium Tab"
1060
+ msgid "Plugin premium features images"
1061
+ msgstr "Imágenes de la versión premium"
1062
+
1063
+ #. translators: alt attribute of main image tag.
1064
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1065
+ msgctxt "Premium Tab"
1066
+ msgid "And so much more!"
1067
+ msgstr "¡Y mucho más!"
1068
+
1069
+ #: templates/panel/premium-tab.php:53
1070
+ msgctxt "Premium Tab"
1071
+ msgid "Check the premium features >"
1072
+ msgstr "Comprueba las características premium >"
1073
+
1074
+ #: templates/panel/premium-tab.php:60
1075
+ msgctxt "Premium Tab"
1076
+ msgid "Check the free vs premium features >"
1077
+ msgstr "Comprueba las características gratuitas frente a las premium >"
1078
+
1079
+ #: templates/panel/premium-tab.php:65
1080
+ msgctxt "Premium Tab"
1081
+ msgid "Get the premium version"
1082
+ msgstr "Obtén la versión Premium"
1083
+
1084
+ #: yit-functions.php:1952
1085
+ msgctxt "Post action"
1086
+ msgid "Preview"
1087
+ msgstr "Previsualizar"
1088
+
1089
+ #: yit-functions.php:1961
1090
+ msgctxt "Post action"
1091
+ msgid "View"
1092
+ msgstr "Ver"
1093
+
1094
+ #: yit-functions.php:1972
1095
+ msgctxt "Post action"
1096
+ msgid "Edit"
1097
+ msgstr "Editar"
1098
+
1099
+ #: yit-functions.php:1980
1100
+ msgctxt "Post action"
1101
+ msgid "Duplicate"
1102
+ msgstr "Duplicar"
1103
+
1104
+ #: yit-functions.php:1992
1105
+ msgctxt "Post action"
1106
+ msgid "Restore"
1107
+ msgstr "Restaurar"
1108
+
1109
+ #: yit-functions.php:2000
1110
+ msgctxt "Post action"
1111
+ msgid "Trash"
1112
+ msgstr "A la papelera"
1113
+
1114
+ #: yit-functions.php:2017
1115
+ msgctxt "Post action"
1116
+ msgid "Delete Permanently"
1117
+ msgstr "Borrar permanentemente"
1118
+
1119
+ #: yit-functions.php:2114
1120
+ msgctxt "Term action"
1121
+ msgid "View"
1122
+ msgstr "Ver"
1123
+
1124
+ #: yit-functions.php:2124
1125
+ msgctxt "Term action"
1126
+ msgid "Edit"
1127
+ msgstr "Editar"
1128
+
1129
+ #: yit-functions.php:2132
1130
+ msgctxt "Term action"
1131
+ msgid "Duplicate"
1132
+ msgstr "Duplicar"
1133
+
1134
+ #: yit-functions.php:2145
1135
+ msgctxt "Term action"
1136
+ msgid "Delete"
1137
+ msgstr "Borrar"
1138
+
1139
+ #: yit-plugin.php:85
1140
+ msgctxt "Plugin Row Meta"
1141
+ msgid "Live Demo"
1142
+ msgstr "Demostración en vivo"
1143
+
1144
+ #: yit-plugin.php:89
1145
+ msgctxt "Plugin Row Meta"
1146
+ msgid "Documentation"
1147
+ msgstr "Documentación"
1148
+
1149
+ #: yit-plugin.php:93
1150
+ msgctxt "Plugin Row Meta"
1151
+ msgid "Support"
1152
+ msgstr "Soporte"
1153
+
1154
+ #: yit-plugin.php:97
1155
+ msgctxt "Plugin Row Meta"
1156
+ msgid "Premium version"
1157
+ msgstr "Versión premium"
1158
+
1159
+ #: yit-plugin.php:229
1160
+ msgctxt "Action links"
1161
+ msgid "Settings"
1162
+ msgstr "Ajustes"
plugin-fw/languages/yith-plugin-fw-it_IT 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-it_IT 2.po ADDED
@@ -0,0 +1,1163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Italian
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2022-08-12 07:42:56+0000\n"
9
+ "Language: it\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
15
+
16
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
17
+ msgid "Confirm trash"
18
+ msgstr "Conferma eliminazione"
19
+
20
+ #: includes/class-yit-assets.php:149
21
+ msgid "Are you sure you want to trash the selected items?"
22
+ msgstr "Se sicuro di voler spostare nel cestino gli elementi selezionati?"
23
+
24
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
25
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
26
+ #: yit-functions.php:2008 yit-functions.php:2026
27
+ msgid "No"
28
+ msgstr "No"
29
+
30
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
31
+ #: yit-functions.php:2152
32
+ msgid "Confirm delete"
33
+ msgstr "Conferma eliminazione"
34
+
35
+ #: includes/class-yit-assets.php:153
36
+ msgid "Are you sure you want to delete the selected items?"
37
+ msgstr "Se sicuro di voler eliminare gli elementi selezionati?"
38
+
39
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
40
+ #: yit-functions.php:2100
41
+ msgid ""
42
+ "This action cannot be undone and you will not be able to recover this data."
43
+ msgstr ""
44
+ "Quest'azione non può essere annullata e non sarà possibile recuperare questi "
45
+ "dati."
46
+
47
+ #: includes/class-yit-assets.php:174
48
+ msgid "Clear"
49
+ msgstr "Rimuovi"
50
+
51
+ #: includes/class-yit-assets.php:175
52
+ msgid "Clear color"
53
+ msgstr "Rimuovi colore"
54
+
55
+ #: includes/class-yit-assets.php:176
56
+ msgid "Default"
57
+ msgstr "Predefinito"
58
+
59
+ #: includes/class-yit-assets.php:177
60
+ msgid "Select default color"
61
+ msgstr "Seleziona il colore predefinito"
62
+
63
+ #: includes/class-yit-assets.php:178
64
+ msgid "Select Color"
65
+ msgstr "Seleziona il colore"
66
+
67
+ #: includes/class-yit-assets.php:179
68
+ msgid "Color value"
69
+ msgstr "Valore del colore"
70
+
71
+ #: includes/class-yit-help-desk.php:152
72
+ msgid "There was an error with your request; please try again later."
73
+ msgstr "Si è verificato un errore con la tua richiesta. Riprova più tardi."
74
+
75
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
76
+ msgid "The changes you have made will be lost if you leave this page."
77
+ msgstr "Perderai tutti i cambiamenti effettuati se lasci questa pagina."
78
+
79
+ #: includes/class-yit-plugin-panel.php:83
80
+ msgid "Plugin Settings"
81
+ msgstr "Impostazioni plugin"
82
+
83
+ #: includes/class-yit-plugin-panel.php:84
84
+ msgid "Settings"
85
+ msgstr "Impostazioni"
86
+
87
+ #: includes/class-yit-plugin-panel.php:456
88
+ #: includes/class-yit-plugin-panel.php:459
89
+ msgid "How to install premium version"
90
+ msgstr "Come installare la versione premium"
91
+
92
+ #: includes/class-yit-plugin-panel.php:656
93
+ #: includes/class-yit-plugin-subpanel.php:133
94
+ msgid "Save Changes"
95
+ msgstr "Salva modifiche"
96
+
97
+ #: includes/class-yit-plugin-panel.php:664
98
+ #: includes/class-yit-plugin-subpanel.php:140
99
+ #: templates/panel/woocommerce/woocommerce-form.php:15
100
+ msgid ""
101
+ "If you continue with this action, you will reset all options in this page."
102
+ msgstr ""
103
+ "Se prosegui con questa azione, tutte le opzioni di questa pagina saranno "
104
+ "reimpostate."
105
+
106
+ #: includes/class-yit-plugin-panel.php:664
107
+ #: includes/class-yit-plugin-subpanel.php:140
108
+ #: templates/panel/woocommerce/woocommerce-form.php:15
109
+ msgid "Are you sure?"
110
+ msgstr "Sei sicuro?"
111
+
112
+ #: includes/class-yit-plugin-panel.php:668
113
+ #: includes/class-yit-plugin-subpanel.php:143
114
+ msgid "Reset to default"
115
+ msgstr "Ripristina configurazione predefinita"
116
+
117
+ #: includes/class-yit-plugin-panel.php:1039
118
+ msgid "Read the <mark>plugin documentation</mark>"
119
+ msgstr "Consulta la <mark>documentazione del plugin</mark>"
120
+
121
+ #: includes/class-yit-plugin-panel.php:1040
122
+ msgid "Learn what you can really do with this powerful tool"
123
+ msgstr "Scopri cosa puoi fare con questo potente strumento"
124
+
125
+ #: includes/class-yit-plugin-panel.php:1050
126
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
127
+ msgstr "Guarda il nostro <mark>video \"Primi Step\"</mark>"
128
+
129
+ #: includes/class-yit-plugin-panel.php:1051
130
+ msgid "See how it works before you start using it"
131
+ msgstr "Guarda come funziona prima di iniziare ad usarlo"
132
+
133
+ #: includes/class-yit-plugin-panel.php:1307
134
+ msgid ""
135
+ "The element you have entered already exists. Please, enter another name."
136
+ msgstr "L'elemento inserito esiste già. Per favore, inserisci un altro nome."
137
+
138
+ #: includes/class-yit-plugin-panel.php:1308
139
+ msgid "Settings saved"
140
+ msgstr "Impostazioni salvate"
141
+
142
+ #: includes/class-yit-plugin-panel.php:1309
143
+ msgid "Settings reset"
144
+ msgstr "Impostazioni azzerate"
145
+
146
+ #: includes/class-yit-plugin-panel.php:1310
147
+ msgid "Element deleted correctly."
148
+ msgstr "Elemento rimosso correttamente."
149
+
150
+ #: includes/class-yit-plugin-panel.php:1311
151
+ #: includes/class-yit-plugin-panel.php:1312
152
+ msgid "Element updated correctly."
153
+ msgstr "Elemento aggiornato correttamente."
154
+
155
+ #: includes/class-yit-plugin-panel.php:1313
156
+ msgid "Database imported correctly."
157
+ msgstr "Database importato correttamente."
158
+
159
+ #: includes/class-yit-plugin-panel.php:1314
160
+ msgid "An error has occurred during import. Please try again."
161
+ msgstr "Si è verificato un errore durante l'importazione. Prova di nuovo."
162
+
163
+ #: includes/class-yit-plugin-panel.php:1315
164
+ msgid "The added file is not valid."
165
+ msgstr "Il file aggiunto non è valido."
166
+
167
+ #: includes/class-yit-plugin-panel.php:1316
168
+ msgid "Sorry, import is disabled."
169
+ msgstr "Ci dispiace, l'importazione è disabilitata."
170
+
171
+ #: includes/class-yit-plugin-panel.php:1317
172
+ msgid "Sorting successful."
173
+ msgstr "Ordinamento effettuato con successo."
174
+
175
+ #: includes/class-yit-plugin-panel.php:1806
176
+ msgid "We need your support"
177
+ msgstr "Abbiamo bisogno del tuo sostegno"
178
+
179
+ #: includes/class-yit-plugin-panel.php:1807
180
+ msgid "to keep updating and improving the plugin. Please,"
181
+ msgstr "per poter continuare ad aggiornare e migliorare il plugin."
182
+
183
+ #: includes/class-yit-plugin-panel.php:1809
184
+ msgid "help us by leaving a good review"
185
+ msgstr "Puoi darci una mano lasciando una recensione positiva"
186
+
187
+ #: includes/class-yit-plugin-panel.php:1810
188
+ msgid ":) Thanks!"
189
+ msgstr ":) Grazie!"
190
+
191
+ #: includes/class-yit-pointers.php:80
192
+ msgid "Plugins Activated"
193
+ msgstr "Plugin attivati"
194
+
195
+ #: includes/class-yit-pointers.php:81
196
+ msgid ""
197
+ "From now on, you can find all plugin options in YITH menu. Plugin "
198
+ "customization settings will be available as a new entry in YITH menu."
199
+ msgstr ""
200
+ "D'ora in poi puoi trovare tutte le opzioni dei plugin nel menù YITH. Le "
201
+ "impostazioni di personalizzazione saranno disponibili come una nuova voce in "
202
+ "YITH."
203
+
204
+ #. translators: 1. YITH site link; 2. WordPress site link.
205
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
206
+ msgid "Discover all our plugins available on: %1$s and %2$s"
207
+ msgstr "Scopri tutti i nostri plugin disponibili su: %1$s and %2$s"
208
+
209
+ #: includes/class-yit-pointers.php:96
210
+ msgid "Plugins Upgraded"
211
+ msgstr "Plugin aggiornati"
212
+
213
+ #: includes/class-yit-pointers.php:97
214
+ msgid ""
215
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
216
+ "Every time one of our plugins is added, a new entry will be added to this "
217
+ "menu. For example, after the update, plugin options (such as for YITH "
218
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
219
+ "previous location to YITH menu."
220
+ msgstr ""
221
+ "D'ora in poi puoi trovare il pannello opzioni dei plugin YITH nel menù YITH. "
222
+ "Ogni volta che viene aggiunto uno dei nostri plugin comparirà una nuova voce "
223
+ "in questo menù. Ad esempio, dopo l'aggiornamento, le opzioni del plugin "
224
+ "(come per YITH WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) "
225
+ "saranno spostate dalla posizione precedente al menù YITH."
226
+
227
+ #: includes/class-yith-bh-onboarding.php:85
228
+ msgid "It is not possible save the options"
229
+ msgstr "Non è possibile salvare le opzioni"
230
+
231
+ #: includes/class-yith-dashboard.php:35
232
+ msgid "YITH Latest Updates"
233
+ msgstr "Ultimi aggiornamenti da YITH"
234
+
235
+ #: includes/class-yith-dashboard.php:36
236
+ msgid "Latest news from YITH Blog"
237
+ msgstr "Ultime novità dal blog YITH"
238
+
239
+ #: includes/class-yith-dashboard.php:56
240
+ msgid "RSS Error:"
241
+ msgstr "Errore RSS:"
242
+
243
+ #: includes/class-yith-dashboard.php:63
244
+ msgid ""
245
+ "An error has occurred, which probably means the feed is down. Try again "
246
+ "later."
247
+ msgstr ""
248
+ "Si è verificato un errore probabilmente causato dal feed non disponibile. "
249
+ "Riprova più tardi."
250
+
251
+ #. translators: %s is the name of the post type (example Back to "Membership
252
+ #. Plans").
253
+ #: includes/class-yith-post-type-admin.php:286
254
+ msgid "Back to \"%s\""
255
+ msgstr "Torna a \"%s\""
256
+
257
+ #: includes/class-yith-post-type-admin.php:286
258
+ msgid "Back to the list"
259
+ msgstr "Torna all'elenco"
260
+
261
+ #: includes/class-yith-system-status.php:110
262
+ msgid "WordPress Version"
263
+ msgstr "Versione di WordPress"
264
+
265
+ #: includes/class-yith-system-status.php:111
266
+ msgid "WooCommerce Version"
267
+ msgstr "Versione di WooCommerce"
268
+
269
+ #: includes/class-yith-system-status.php:112
270
+ msgid "Available Memory"
271
+ msgstr "Memoria disponibile"
272
+
273
+ #: includes/class-yith-system-status.php:113
274
+ msgid "PHP Version"
275
+ msgstr "Versione PHP"
276
+
277
+ #: includes/class-yith-system-status.php:114
278
+ msgid "TLS Version"
279
+ msgstr "Versione TLS"
280
+
281
+ #: includes/class-yith-system-status.php:115
282
+ msgid "WordPress Cron"
283
+ msgstr "Cron WordPress"
284
+
285
+ #: includes/class-yith-system-status.php:116
286
+ msgid "SimpleXML"
287
+ msgstr "SimpleXML"
288
+
289
+ #: includes/class-yith-system-status.php:117
290
+ msgid "MultiByte String"
291
+ msgstr "MultiByte String"
292
+
293
+ #: includes/class-yith-system-status.php:118
294
+ msgid "ImageMagick Version"
295
+ msgstr "Versione di ImageMagick"
296
+
297
+ #: includes/class-yith-system-status.php:119
298
+ msgid "GD Library"
299
+ msgstr "GD Library"
300
+
301
+ #: includes/class-yith-system-status.php:120
302
+ msgid "Iconv Module"
303
+ msgstr "Iconv Module"
304
+
305
+ #: includes/class-yith-system-status.php:121
306
+ msgid "OPCache Save Comments"
307
+ msgstr "OPCache Save Comments"
308
+
309
+ #: includes/class-yith-system-status.php:122
310
+ msgid "URL FOpen"
311
+ msgstr "URL FOpen"
312
+
313
+ #: includes/class-yith-system-status.php:140
314
+ #: includes/class-yith-system-status.php:141
315
+ #: templates/sysinfo/system-information-panel.php:11
316
+ msgid "System Status"
317
+ msgstr "Stato del sistema"
318
+
319
+ #: includes/class-yith-system-status.php:183
320
+ msgid "YITH Plugins"
321
+ msgstr "Plugin YITH"
322
+
323
+ #: includes/class-yith-system-status.php:191
324
+ msgid "WooCommerce"
325
+ msgstr "WooCommerce"
326
+
327
+ #: includes/class-yith-system-status.php:342
328
+ msgid "Warning!"
329
+ msgstr "Attenzione!"
330
+
331
+ #. translators: %1$s open link tag, %2$s open link tag
332
+ #: includes/class-yith-system-status.php:346
333
+ msgid ""
334
+ "The system check has detected some compatibility issues on your installation."
335
+ "%1$sClick here%2$s to know more"
336
+ msgstr ""
337
+ "Il controllo di sistema ha individuato delle incompatibilità con la tua "
338
+ "installazione. %1$sVedi qui%2$s per maggiori dettagli"
339
+
340
+ #: includes/class-yith-system-status.php:496
341
+ msgid "Enabled"
342
+ msgstr "Abilitato"
343
+
344
+ #: includes/class-yith-system-status.php:496
345
+ msgid "Disabled"
346
+ msgstr "Disabilitato"
347
+
348
+ #: includes/class-yith-system-status.php:501
349
+ msgid "N/A"
350
+ msgstr "N.D."
351
+
352
+ #. translators: %1$s plugin name, %2$s requirement name
353
+ #: includes/class-yith-system-status.php:528
354
+ msgid "%1$s needs %2$s enabled"
355
+ msgstr "%1$s necessita dell'attivazione di %2$s"
356
+
357
+ #. translators: %1$s plugin name, %2$s required memory amount
358
+ #: includes/class-yith-system-status.php:531
359
+ msgid "%1$s needs at least %2$s of available memory"
360
+ msgstr "%1$s necessita di almeno %2$s di memoria disponibile"
361
+
362
+ #. translators: %1$s plugin name, %2$s version number
363
+ #: includes/class-yith-system-status.php:534
364
+ msgid "%1$s needs at least %2$s version"
365
+ msgstr "%1$s necessita almeno della versione %2$s"
366
+
367
+ #: includes/class-yith-system-status.php:558
368
+ msgid ""
369
+ "Update it to the latest version in order to benefit of all new features and "
370
+ "security updates."
371
+ msgstr ""
372
+ "Aggiorna all'ultima versione per beneficiare di tutte le nuove funzionalità "
373
+ "e degli aggiornamenti di sicurezza."
374
+
375
+ #: includes/class-yith-system-status.php:562
376
+ #: includes/class-yith-system-status.php:568
377
+ msgid "Contact your hosting company in order to update it."
378
+ msgstr "Contatta il tuo servizio hosting per aggiornarlo."
379
+
380
+ #: includes/class-yith-system-status.php:566
381
+ msgid "Contact your hosting company in order to install it."
382
+ msgstr "Per installarlo contatta il tuo servizio di hosting."
383
+
384
+ #. translators: %1$s code, %2$s file name
385
+ #: includes/class-yith-system-status.php:573
386
+ msgid "Remove %1$s from %2$s file"
387
+ msgstr "Rimuovi %1$s dal file %2$s"
388
+
389
+ #: includes/class-yith-system-status.php:581
390
+ msgid "Contact your hosting company in order to enable it."
391
+ msgstr "Per attivarlo contatta il tuo servizio di hosting."
392
+
393
+ #. translators: %1$s opening link tag, %2$s closing link tag
394
+ #: includes/class-yith-system-status.php:585
395
+ #: includes/class-yith-system-status.php:608
396
+ msgid ""
397
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
398
+ "it."
399
+ msgstr ""
400
+ "Per maggiori informazioni %1$sleggi questo%2$s oppure contatta il tuo host "
401
+ "per un upgrade."
402
+
403
+ #. translators: %s recommended memory amount
404
+ #: includes/class-yith-system-status.php:605
405
+ msgid ""
406
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
407
+ "available memory"
408
+ msgstr ""
409
+ "Per il funzionamento ottimale dei nostri plugin consigliamo di impostare "
410
+ "almeno %s della memoria disponibile"
411
+
412
+ #. translators: %1$s TLS label, %2$s cURL label
413
+ #: includes/class-yith-system-status.php:613
414
+ msgid ""
415
+ "The system check cannot determine which %1$s version is installed because "
416
+ "%2$s module is disabled. Ask your hosting company to enable it."
417
+ msgstr ""
418
+ "Non ci è stato possibile determinare quale versione di %1$s è installata in "
419
+ "quanto il modulo %2$s è disattivato. Chiedi al tuo servizio hosting di "
420
+ "attivarlo."
421
+
422
+ #. translators: %1$s TLS label
423
+ #: includes/class-yith-system-status.php:616
424
+ msgid ""
425
+ "The system check cannot determine which %1$s version is installed due to a "
426
+ "connection issue between your site and our server."
427
+ msgstr ""
428
+ "Non ci è stato possibile determinare quale versione di %1$s è installata a "
429
+ "causa di un problema di connessione fra il tuo sito e il nostro server."
430
+
431
+ #: templates/bh-onboarding/onboarding-tabs.php:63
432
+ msgid "Save"
433
+ msgstr "Salva"
434
+
435
+ #: templates/fields/ajax-customers.php:41
436
+ msgid "Search for a customer..."
437
+ msgstr "Cerca un cliente..."
438
+
439
+ #. translators: 1. user display name; 2. user ID; 3. user email.
440
+ #: templates/fields/ajax-customers.php:68
441
+ #: templates/fields/ajax-customers.php:79
442
+ msgid "%1$s (#%2$s &ndash; %3$s)"
443
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
444
+
445
+ #: templates/fields/ajax-posts.php:41
446
+ msgid "Search for a post..."
447
+ msgstr "Cerca un post..."
448
+
449
+ #: templates/fields/ajax-products.php:16
450
+ msgid "Search for a product..."
451
+ msgstr "Cerca un prodotto..."
452
+
453
+ #: templates/fields/ajax-terms.php:41
454
+ msgid "Search for a category..."
455
+ msgstr "Cerca una categoria..."
456
+
457
+ #: templates/fields/customtabs.php:17
458
+ msgid "Close all"
459
+ msgstr "Chiudi tutti"
460
+
461
+ #: templates/fields/customtabs.php:17
462
+ msgid "Expand all"
463
+ msgstr "Espandi tutti"
464
+
465
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
466
+ msgid "Remove"
467
+ msgstr "Rimuovi"
468
+
469
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
470
+ msgid "Name"
471
+ msgstr "Nome"
472
+
473
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
474
+ msgid "Value"
475
+ msgstr "Valore"
476
+
477
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
478
+ msgid "Content of the tab. (HTML is supported)"
479
+ msgstr "Contenuto della scheda (codice HTML supportato)."
480
+
481
+ #: templates/fields/customtabs.php:52
482
+ msgid "Add custom product tab"
483
+ msgstr "Aggiungi scheda prodotto personalizzata"
484
+
485
+ #: templates/fields/customtabs.php:93
486
+ msgid "Do you want to remove the custom tab?"
487
+ msgstr "Vuoi rimuovere la scheda personalizzata?"
488
+
489
+ #: templates/fields/date-format.php:65
490
+ msgid "Custom:"
491
+ msgstr "Personalizzato:"
492
+
493
+ #: templates/fields/date-format.php:70
494
+ msgid "Preview:"
495
+ msgstr "Anteprima:"
496
+
497
+ #: templates/fields/icons.php:78
498
+ msgid "Set Default"
499
+ msgstr "Ripristina impostazioni iniziali"
500
+
501
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
502
+ msgid "Delete image"
503
+ msgstr "Rimuovi immagine"
504
+
505
+ #: templates/fields/image-gallery.php:37
506
+ msgid "Add Images to Gallery"
507
+ msgstr "Aggiungi immagini alla galleria"
508
+
509
+ #: templates/fields/image-gallery.php:38
510
+ msgid "Add to gallery"
511
+ msgstr "Aggiungi alla galleria"
512
+
513
+ #: templates/fields/image-gallery.php:39
514
+ msgid "Add images"
515
+ msgstr "Aggiungi immagini"
516
+
517
+ #: templates/fields/image-gallery.php:41
518
+ msgid "Delete"
519
+ msgstr "Rimuovi"
520
+
521
+ #: templates/fields/select-buttons.php:19
522
+ msgid "Add All"
523
+ msgstr "Aggiungi tutti"
524
+
525
+ #: templates/fields/select-buttons.php:20
526
+ msgid "Remove All"
527
+ msgstr "Rimuovi tutti"
528
+
529
+ #: templates/fields/sidebars.php:20
530
+ msgid "Left sidebar"
531
+ msgstr "Barra laterale sinistra"
532
+
533
+ #: templates/fields/sidebars.php:23
534
+ msgid "Right sidebar"
535
+ msgstr "Barra laterale destra"
536
+
537
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
538
+ msgid "No sidebar"
539
+ msgstr "Nessuna barra laterale"
540
+
541
+ #: templates/fields/sidebars.php:39
542
+ msgid "Left Sidebar"
543
+ msgstr "Barra laterale sinistra"
544
+
545
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
546
+ msgid "Choose a sidebar"
547
+ msgstr "Scegli una barra laterale"
548
+
549
+ #: templates/fields/sidebars.php:54
550
+ msgid "Right Sidebar"
551
+ msgstr "Barra laterale destra"
552
+
553
+ #: templates/fields/upload.php:34
554
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
555
+ msgid "Upload"
556
+ msgstr "Carica"
557
+
558
+ #: templates/fields/upload.php:39
559
+ msgid "Reset"
560
+ msgstr "Ripristina"
561
+
562
+ #. translators: %s is the plugin version.
563
+ #: templates/panel/welcome-modals/update.php:34
564
+ msgid "is successfully updated to version %s."
565
+ msgstr "è stato aggiornato alla versione %s."
566
+
567
+ #. translators: %s is the plugin version.
568
+ #: templates/panel/welcome-modals/update.php:44
569
+ msgid "What's new in version %s"
570
+ msgstr "Novità nella versione %s"
571
+
572
+ #: templates/panel/welcome-modals/update.php:49
573
+ msgid "Check the changelog >"
574
+ msgstr "Vedi tutte le modifiche >"
575
+
576
+ #: templates/panel/welcome-modals/update.php:64
577
+ #: templates/panel/welcome-modals/welcome.php:60
578
+ msgid "Got it, close this window"
579
+ msgstr "Ho capito, chiudi questa finestra"
580
+
581
+ #: templates/panel/welcome-modals/welcome.php:30
582
+ msgid "Thank you for using our plugin"
583
+ msgstr "Grazie per aver scelto di usare il nostro plugin"
584
+
585
+ #. translators: %s is the number of steps.
586
+ #: templates/panel/welcome-modals/welcome.php:45
587
+ msgid "Start with these %s steps:"
588
+ msgstr "Inizia da questi %s step:"
589
+
590
+ #: templates/panel/woocommerce/woocommerce-form.php:29
591
+ #: templates/panel/woocommerce/woocommerce-form.php:33
592
+ msgid "Save Options"
593
+ msgstr "Salva le opzioni"
594
+
595
+ #: templates/panel/woocommerce/woocommerce-form.php:33
596
+ msgid "Options Saved"
597
+ msgstr "Opzioni salvate"
598
+
599
+ #: templates/panel/woocommerce/woocommerce-form.php:43
600
+ msgid "Reset Defaults"
601
+ msgstr "Ripristina impostazioni iniziali"
602
+
603
+ #: templates/sysinfo/system-information-panel.php:12
604
+ msgid "PHPInfo"
605
+ msgstr "PHPInfo"
606
+
607
+ #: templates/sysinfo/system-information-panel.php:13
608
+ #: templates/sysinfo/tabs/error-log.php:25
609
+ msgid "Log Files"
610
+ msgstr "File log"
611
+
612
+ #: templates/sysinfo/system-information-panel.php:22
613
+ msgid "YITH System Information"
614
+ msgstr "YITH System Information"
615
+
616
+ #: templates/sysinfo/tabs/error-log.php:13
617
+ msgid "WP debug.log file"
618
+ msgstr "WP debug.log file"
619
+
620
+ #: templates/sysinfo/tabs/error-log.php:18
621
+ msgid "PHP error_log file"
622
+ msgstr "PHP error_log file"
623
+
624
+ #: templates/sysinfo/tabs/error-log.php:60
625
+ msgid "Download"
626
+ msgstr "Scarica"
627
+
628
+ #: templates/sysinfo/tabs/error-log.php:73
629
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
630
+ msgstr ""
631
+ "La dimensione del file supera gli 8 megabyte ed è quindi necessario "
632
+ "scaricarlo"
633
+
634
+ #. translators: %s file name.
635
+ #: templates/sysinfo/tabs/error-log.php:97
636
+ msgid ""
637
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
638
+ "file of your installation"
639
+ msgstr ""
640
+ "Nessun file log disponibile. Abilita il debug WordPress aggiungendo questo "
641
+ "nel file %s della tua installazione"
642
+
643
+ #: templates/sysinfo/tabs/error-log.php:106
644
+ msgid "Copied!"
645
+ msgstr "Copiato!"
646
+
647
+ #: templates/sysinfo/tabs/error-log.php:106
648
+ msgid "Copy Code"
649
+ msgstr "Copia codice"
650
+
651
+ #: templates/sysinfo/tabs/main.php:17
652
+ msgid "Site Info"
653
+ msgstr "Info sito"
654
+
655
+ #: templates/sysinfo/tabs/main.php:22
656
+ msgid "Site URL"
657
+ msgstr "URL del sito"
658
+
659
+ #: templates/sysinfo/tabs/main.php:31
660
+ msgid "Output IP Address"
661
+ msgstr "Indirizzo IP di output"
662
+
663
+ #: templates/sysinfo/tabs/main.php:39
664
+ msgid "Defined WP_CACHE"
665
+ msgstr "Defined WP_CACHE"
666
+
667
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
668
+ msgid "Yes"
669
+ msgstr "Sì"
670
+
671
+ #: templates/sysinfo/tabs/main.php:47
672
+ msgid "External object cache"
673
+ msgstr "External object cache"
674
+
675
+ #: templates/sysinfo/tabs/main.php:55
676
+ msgid "YITH Plugin Framework Version"
677
+ msgstr "YITH Plugin Framework Version"
678
+
679
+ #. translators: %s is the name of the plugin that is loading the framework.
680
+ #: templates/sysinfo/tabs/main.php:64
681
+ msgid "loaded by %s"
682
+ msgstr "caricato da %s"
683
+
684
+ #: templates/sysinfo/tabs/main.php:73
685
+ msgid "Plugins Requirements"
686
+ msgstr "Requisiti plugin"
687
+
688
+ #: templates/sysinfo/tabs/main.php:108
689
+ msgid "Database Info"
690
+ msgstr "Info database"
691
+
692
+ #: templates/sysinfo/tabs/main.php:113
693
+ msgid "MySQL version"
694
+ msgstr "Versione MySQL"
695
+
696
+ #. Translators: %s: Codex link.
697
+ #: templates/sysinfo/tabs/main.php:123
698
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
699
+ msgstr "WordPress consiglia una versione minima 5.6 di MySQL. Vedi: %s"
700
+
701
+ #: templates/sysinfo/tabs/main.php:123
702
+ msgid "WordPress requirements"
703
+ msgstr "Requisiti WordPress"
704
+
705
+ #: templates/sysinfo/tabs/main.php:130
706
+ msgid "Total Database Size"
707
+ msgstr "Dimensione totale database"
708
+
709
+ #: templates/sysinfo/tabs/main.php:138
710
+ msgid "Database Data Size"
711
+ msgstr "Dimensione dati database"
712
+
713
+ #: templates/sysinfo/tabs/main.php:146
714
+ msgid "Database Index Size"
715
+ msgstr "Dimensione indice database"
716
+
717
+ #: templates/sysinfo/tabs/main.php:154
718
+ msgid "Database Free Size"
719
+ msgstr "Dimensione spazio libero database"
720
+
721
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
722
+ #. Engine.
723
+ #: templates/sysinfo/tabs/main.php:168
724
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
725
+ msgstr "Dati: %1$.2fMB | Indice: %2$.2fMB | Libero: %3$.2fMB | Engine: %4$s"
726
+
727
+ #. translators: %s is the title of the post object.
728
+ #: yit-functions.php:1938
729
+ msgid "Are you sure you want to move \"%s\" to trash?"
730
+ msgstr "Sei sicuro di voler spostare \"%s\" nel cestino?"
731
+
732
+ #. translators: %s is the title of the post object.
733
+ #: yit-functions.php:1940 yit-functions.php:2100
734
+ msgid "Are you sure you want to delete \"%s\"?"
735
+ msgstr "Sei sicuro di voler eliminare \"%s\"?"
736
+
737
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
738
+ msgid "Further actions"
739
+ msgstr "Altre azioni"
740
+
741
+ #: yit-plugin.php:233
742
+ msgid "License"
743
+ msgstr "Chiave di licenza"
744
+
745
+ #. translators: 1. Plugin(s) name(s).
746
+ #: yit-plugin.php:272
747
+ msgid ""
748
+ "%s was deactivated as you're running an higher tier version of the same "
749
+ "plugin."
750
+ msgid_plural ""
751
+ "%s were deactivated as you're running higher tier versions of the same "
752
+ "plugins."
753
+ msgstr[0] ""
754
+ "%s è stato disattivato poiché stai usando una versione superiore dello "
755
+ "stesso plugin. "
756
+ msgstr[1] ""
757
+ "%s sono stati disattivati poiché stai usando una versione superiore degli "
758
+ "stessi plugin. "
759
+
760
+ #. Author of the plugin/theme
761
+ msgid "YITH"
762
+ msgstr "YITH"
763
+
764
+ #. translators: %s it the Elementor Widget title.
765
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
766
+ msgctxt "Elementor Widget - section title"
767
+ msgid "%s - Options"
768
+ msgstr "%s - Opzioni"
769
+
770
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
771
+ msgctxt "[gutenberg]: Category Name"
772
+ msgid "YITH"
773
+ msgstr "YITH"
774
+
775
+ #: includes/class-yit-assets.php:136
776
+ msgctxt "Button text"
777
+ msgid "Confirm"
778
+ msgstr "Conferma"
779
+
780
+ #: includes/class-yit-assets.php:137
781
+ msgctxt "Button text"
782
+ msgid "Cancel"
783
+ msgstr "Annulla"
784
+
785
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
786
+ msgctxt "Trash confirmation action"
787
+ msgid "Yes, move to trash"
788
+ msgstr "Sì, sposta nel cestino"
789
+
790
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
791
+ #: yit-functions.php:2154
792
+ msgctxt "Delete confirmation action"
793
+ msgid "Yes, delete"
794
+ msgstr "Sì, elimina"
795
+
796
+ #. translators: 1. Plugin name.
797
+ #: includes/class-yit-plugin-panel.php:804
798
+ msgctxt "Help tab default title"
799
+ msgid "Thank you for purchasing %s!"
800
+ msgstr "Grazie per aver acquistato %s!"
801
+
802
+ #: includes/class-yit-plugin-panel.php:804
803
+ msgctxt "Help tab default title"
804
+ msgid "Thank you for using %s!"
805
+ msgstr "Grazie per aver scelto %s!"
806
+
807
+ #: includes/class-yit-plugin-panel.php:812
808
+ msgctxt "Help tab default description"
809
+ msgid ""
810
+ "We want to help you enjoy a wonderful experience with all of our products."
811
+ msgstr ""
812
+ "Vogliamo aiutarti ad avere un'esperienza fantastica con tutti i nostri "
813
+ "prodotti."
814
+
815
+ #: includes/class-yit-plugin-panel.php:863
816
+ msgctxt "Premium tab name"
817
+ msgid "Get premium"
818
+ msgstr "Diventa premium"
819
+
820
+ #: includes/class-yit-plugin-panel.php:875
821
+ msgctxt "Help tab name"
822
+ msgid "Help"
823
+ msgstr "Help"
824
+
825
+ #: includes/class-yith-dashboard.php:96
826
+ msgctxt "Plugin FW"
827
+ msgid "View Changelog"
828
+ msgstr "Visualizza il changelog"
829
+
830
+ #: includes/class-yith-dashboard.php:97
831
+ msgctxt "Plugin FW"
832
+ msgid "Latest update released on"
833
+ msgstr "Ultimo aggiornamento rilasciato il"
834
+
835
+ #: includes/class-yith-dashboard.php:137
836
+ msgctxt "Button label"
837
+ msgid "Close"
838
+ msgstr "Chiudi"
839
+
840
+ #: includes/privacy/class-yith-privacy.php:61
841
+ msgctxt "Privacy Policy Guide Title"
842
+ msgid "YITH Plugins"
843
+ msgstr "YITH Plugins"
844
+
845
+ #: includes/privacy/class-yith-privacy.php:93
846
+ msgctxt "Privacy Policy Content"
847
+ msgid ""
848
+ "This sample language includes the basics around what personal data your "
849
+ "store may be collecting, storing and sharing, as well as who may have access "
850
+ "to that data. Depending on what settings are enabled and which additional "
851
+ "plugins are used, the specific information shared by your store will vary. "
852
+ "We recommend consulting with a lawyer when deciding what information to "
853
+ "disclose on your privacy policy."
854
+ msgstr ""
855
+ "Questo esempio include gli elementi di base sulla raccolta dei dati "
856
+ "personali, la memorizzazione e la condivisione, nonché su chi è autorizzato "
857
+ "ad accedere a tali dati. In base alle impostazioni abilitate e ai moduli di "
858
+ "estensione aggiuntivi utilizzati, le informazioni specifiche condivise dal "
859
+ "nostro negozio possono variare. Ti consigliamo di consultare un legale al "
860
+ "momento di decidere quali informazioni divulgare nell'informativa sulla "
861
+ "privacy."
862
+
863
+ #: includes/privacy/class-yith-privacy.php:97
864
+ msgctxt "Privacy Policy Content"
865
+ msgid "What we collect and store"
866
+ msgstr "Cosa raccogliamo e salviamo"
867
+
868
+ #: includes/privacy/class-yith-privacy.php:100
869
+ msgctxt "Privacy Policy Content"
870
+ msgid "Who on our team has access"
871
+ msgstr "Persone del nostro gruppo di lavoro che hanno accesso"
872
+
873
+ #: includes/privacy/class-yith-privacy.php:103
874
+ msgctxt "Privacy Policy Content"
875
+ msgid "What we share with others"
876
+ msgstr "Cosa condividiamo con gli altri"
877
+
878
+ #: includes/privacy/class-yith-privacy.php:106
879
+ msgctxt "Privacy Policy Content"
880
+ msgid "Payments"
881
+ msgstr "Pagamenti"
882
+
883
+ #: templates/fields/copy-to-clipboard.php:41
884
+ msgctxt "Copy-to-clipboard message"
885
+ msgid "Copied!"
886
+ msgstr "Copiato!"
887
+
888
+ #: templates/fields/copy-to-clipboard.php:45
889
+ msgctxt "Copy-to-clipboard button text"
890
+ msgid "Copy"
891
+ msgstr "Copia"
892
+
893
+ #: templates/fields/dimensions.php:13
894
+ msgctxt "Position in the \"Dimensions\" field"
895
+ msgid "Top"
896
+ msgstr "In alto"
897
+
898
+ #: templates/fields/dimensions.php:14
899
+ msgctxt "Position in the \"Dimensions\" field"
900
+ msgid "Right"
901
+ msgstr "A destra"
902
+
903
+ #: templates/fields/dimensions.php:15
904
+ msgctxt "Position in the \"Dimensions\" field"
905
+ msgid "Bottom"
906
+ msgstr "In basso"
907
+
908
+ #: templates/fields/dimensions.php:16
909
+ msgctxt "Position in the \"Dimensions\" field"
910
+ msgid "Left"
911
+ msgstr "A sinistra"
912
+
913
+ #: templates/fields/dimensions.php:94
914
+ msgctxt "Tooltip in the \"Dimensions\" field"
915
+ msgid "Link values together"
916
+ msgstr "Collega i valori"
917
+
918
+ #: templates/fields/image-dimensions.php:18
919
+ msgctxt "Image width field label"
920
+ msgid "Width"
921
+ msgstr "Larghezza"
922
+
923
+ #: templates/fields/image-dimensions.php:23
924
+ msgctxt "Image height field label"
925
+ msgid "Height"
926
+ msgstr "Altezza"
927
+
928
+ #: templates/fields/onoff.php:28
929
+ msgctxt "YES/NO button: use MAX 4 characters!"
930
+ msgid "YES"
931
+ msgstr "SÌ"
932
+
933
+ #: templates/fields/onoff.php:29
934
+ msgctxt "YES/NO button: use MAX 4 characters!"
935
+ msgid "NO"
936
+ msgstr "NO"
937
+
938
+ #. translators: 1. Url to EN playlist.
939
+ #: templates/panel/help-tab.php:89
940
+ msgctxt "Help tab view all video link"
941
+ msgid ""
942
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
943
+ "learn more >"
944
+ msgstr ""
945
+ "Per saperne di più, vedi la <a href=\"%s\" target=\"_blank\">Playlist "
946
+ "completa su Youtube</a>>"
947
+
948
+ #: templates/panel/help-tab.php:96
949
+ msgctxt "Help tab Watch Videotutorials link"
950
+ msgid "Videos are also available in:"
951
+ msgstr "I video sono disponibili anche in:"
952
+
953
+ #: templates/panel/help-tab.php:126
954
+ msgctxt "Help tab Read Documentation link"
955
+ msgid "Read the documentation"
956
+ msgstr "Consulta la documentazione"
957
+
958
+ #: templates/panel/help-tab.php:129
959
+ msgctxt "Help tab Read Documentation link"
960
+ msgid "to learn how the plugin works from the basics."
961
+ msgstr "per scoprire dalle basi come funziona il plugin."
962
+
963
+ #: templates/panel/help-tab.php:139
964
+ msgctxt "Help tab Watch video tutorials link"
965
+ msgid "Watch our video tutorials"
966
+ msgstr "Guarda i nostri video tutorial"
967
+
968
+ #: templates/panel/help-tab.php:142
969
+ msgctxt "Help tab Watch video tutorials link"
970
+ msgid "to see some helpful use cases."
971
+ msgstr "per vedere dei casi d'utilizzo utili."
972
+
973
+ #: templates/panel/help-tab.php:152
974
+ msgctxt "Help tab view FAQs link"
975
+ msgid "Check the FAQs"
976
+ msgstr "Controlla le FAQ"
977
+
978
+ #: templates/panel/help-tab.php:155
979
+ msgctxt "Help tab view FAQs link"
980
+ msgid "to find answers to your doubts."
981
+ msgstr "per trovare le risposte ai tuoi dubbi."
982
+
983
+ #: templates/panel/help-tab.php:170
984
+ msgctxt "Help tab FAQ title"
985
+ msgid "Last FAQs in our Help Center"
986
+ msgstr "Ultime FAQ nel nostro Centro Assistenza"
987
+
988
+ #: templates/panel/help-tab.php:184
989
+ msgctxt "Help tab FAQ link"
990
+ msgid "View all FAQs >"
991
+ msgstr "Vedi tutte le FAQ"
992
+
993
+ #: templates/panel/help-tab.php:193
994
+ msgctxt "Help tab submit ticket title"
995
+ msgid "Need help?"
996
+ msgstr "Ti serve aiuto?"
997
+
998
+ #: templates/panel/help-tab.php:196
999
+ msgctxt "Help tab submit ticket description"
1000
+ msgid ""
1001
+ "If you are experiencing any technical issues, ask for help from our "
1002
+ "developers. Submit a ticket through our support desk and we will help you as "
1003
+ "soon as possible."
1004
+ msgstr ""
1005
+ "Se stai riscontrando problemi tecnici chiedi aiuto ai nostri sviluppatori. "
1006
+ "Invia un ticket dalla nostra piattaforma di supporto e ti daremo assistenza "
1007
+ "il più presto possibile."
1008
+
1009
+ #: templates/panel/help-tab.php:204
1010
+ msgctxt "Help tab submit ticket button"
1011
+ msgid "Submit a ticket"
1012
+ msgstr "Invia un ticket"
1013
+
1014
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
1015
+ #: templates/panel/help-tab.php:223
1016
+ msgctxt "Help tab documentation"
1017
+ msgid "Read the plugin documentation"
1018
+ msgstr "Leggi la documentazione del plugin"
1019
+
1020
+ #: templates/panel/help-tab.php:220
1021
+ msgctxt "Help tab documentation"
1022
+ msgid "to learn how it works from the basics."
1023
+ msgstr "per vedere come funziona nel dettaglio."
1024
+
1025
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
1026
+ msgctxt "Help tab support"
1027
+ msgid "Need some help?"
1028
+ msgstr "Ti serve aiuto?"
1029
+
1030
+ #: templates/panel/help-tab.php:235
1031
+ msgctxt "Help tab support"
1032
+ msgid "From DIY to full-service help"
1033
+ msgstr "Dal fai-da-te a un servizio completo"
1034
+
1035
+ #: templates/panel/help-tab.php:238
1036
+ msgctxt "Help tab support"
1037
+ msgid ""
1038
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1039
+ "site."
1040
+ msgstr ""
1041
+ "Chiamaci o avvia una chat con i nostri agenti disponibili 24/7 oppure "
1042
+ "lasciati aiutare dai nostri esperti a configurare il tuo sito."
1043
+
1044
+ #: templates/panel/help-tab.php:241
1045
+ msgctxt "Help tab support"
1046
+ msgid "Yes, I need help"
1047
+ msgstr "Sì, mi serve aiuto"
1048
+
1049
+ #: templates/panel/premium-tab.php:30
1050
+ msgctxt "Premium Tab"
1051
+ msgid "Get the premium version to unlock advanced features"
1052
+ msgstr "Ottieni la versione premium per sbloccare le funzionalità avanzate"
1053
+
1054
+ #: templates/panel/premium-tab.php:34
1055
+ msgctxt "Premium Tab"
1056
+ msgid "Get premium"
1057
+ msgstr "Diventa premium"
1058
+
1059
+ #: templates/panel/premium-tab.php:39
1060
+ msgctxt "Premium Tab"
1061
+ msgid "Plugin premium features images"
1062
+ msgstr "Immagini funzionalità premium"
1063
+
1064
+ #. translators: alt attribute of main image tag.
1065
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1066
+ msgctxt "Premium Tab"
1067
+ msgid "And so much more!"
1068
+ msgstr "E molto altro!"
1069
+
1070
+ #: templates/panel/premium-tab.php:53
1071
+ msgctxt "Premium Tab"
1072
+ msgid "Check the premium features >"
1073
+ msgstr "Scopri le funzionalità premium >"
1074
+
1075
+ #: templates/panel/premium-tab.php:60
1076
+ msgctxt "Premium Tab"
1077
+ msgid "Check the free vs premium features >"
1078
+ msgstr "Confronta le funzionalità gratuite e premium >"
1079
+
1080
+ #: templates/panel/premium-tab.php:65
1081
+ msgctxt "Premium Tab"
1082
+ msgid "Get the premium version"
1083
+ msgstr "Ottieni la versione premium"
1084
+
1085
+ #: yit-functions.php:1952
1086
+ msgctxt "Post action"
1087
+ msgid "Preview"
1088
+ msgstr "Anteprima"
1089
+
1090
+ #: yit-functions.php:1961
1091
+ msgctxt "Post action"
1092
+ msgid "View"
1093
+ msgstr "Visualizza"
1094
+
1095
+ #: yit-functions.php:1972
1096
+ msgctxt "Post action"
1097
+ msgid "Edit"
1098
+ msgstr "Modifica"
1099
+
1100
+ #: yit-functions.php:1980
1101
+ msgctxt "Post action"
1102
+ msgid "Duplicate"
1103
+ msgstr "Duplica"
1104
+
1105
+ #: yit-functions.php:1992
1106
+ msgctxt "Post action"
1107
+ msgid "Restore"
1108
+ msgstr "Ripristina"
1109
+
1110
+ #: yit-functions.php:2000
1111
+ msgctxt "Post action"
1112
+ msgid "Trash"
1113
+ msgstr "Cestina"
1114
+
1115
+ #: yit-functions.php:2017
1116
+ msgctxt "Post action"
1117
+ msgid "Delete Permanently"
1118
+ msgstr "Cancella definitivamente"
1119
+
1120
+ #: yit-functions.php:2114
1121
+ msgctxt "Term action"
1122
+ msgid "View"
1123
+ msgstr "Visualizza"
1124
+
1125
+ #: yit-functions.php:2124
1126
+ msgctxt "Term action"
1127
+ msgid "Edit"
1128
+ msgstr "Modifica"
1129
+
1130
+ #: yit-functions.php:2132
1131
+ msgctxt "Term action"
1132
+ msgid "Duplicate"
1133
+ msgstr "Duplica"
1134
+
1135
+ #: yit-functions.php:2145
1136
+ msgctxt "Term action"
1137
+ msgid "Delete"
1138
+ msgstr "Elimina"
1139
+
1140
+ #: yit-plugin.php:85
1141
+ msgctxt "Plugin Row Meta"
1142
+ msgid "Live Demo"
1143
+ msgstr "Live Demo"
1144
+
1145
+ #: yit-plugin.php:89
1146
+ msgctxt "Plugin Row Meta"
1147
+ msgid "Documentation"
1148
+ msgstr "Documentazione"
1149
+
1150
+ #: yit-plugin.php:93
1151
+ msgctxt "Plugin Row Meta"
1152
+ msgid "Support"
1153
+ msgstr "Assistenza"
1154
+
1155
+ #: yit-plugin.php:97
1156
+ msgctxt "Plugin Row Meta"
1157
+ msgid "Premium version"
1158
+ msgstr "Versione premium"
1159
+
1160
+ #: yit-plugin.php:229
1161
+ msgctxt "Action links"
1162
+ msgid "Settings"
1163
+ msgstr "Impostazioni"
plugin-fw/languages/yith-plugin-fw-nl_NL 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-nl_NL 2.po ADDED
@@ -0,0 +1,1151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Dutch
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2021-12-13 12:45:02+0000\n"
9
+ "Language: nl\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
15
+
16
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
17
+ msgid "Confirm trash"
18
+ msgstr "Verplaatsen naar prullenbak bevestigen"
19
+
20
+ #: includes/class-yit-assets.php:149
21
+ msgid "Are you sure you want to trash the selected items?"
22
+ msgstr ""
23
+ "Weet je zeker dat je het geselecteerde item naar de prullenbak wilt "
24
+ "verplaatsen?"
25
+
26
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
27
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
28
+ #: yit-functions.php:2008 yit-functions.php:2026
29
+ msgid "No"
30
+ msgstr "Nee"
31
+
32
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
33
+ #: yit-functions.php:2152
34
+ msgid "Confirm delete"
35
+ msgstr "Verwijderen bevestigen"
36
+
37
+ #: includes/class-yit-assets.php:153
38
+ msgid "Are you sure you want to delete the selected items?"
39
+ msgstr "Weet je zeker dat je de geselecteerde items wilt verwijderen?"
40
+
41
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
42
+ #: yit-functions.php:2100
43
+ msgid ""
44
+ "This action cannot be undone and you will not be able to recover this data."
45
+ msgstr ""
46
+ "Deze actie kan niet ongedaan gemaakt worden en je zult deze gegevens niet "
47
+ "kunnen herstellen."
48
+
49
+ #: includes/class-yit-assets.php:174
50
+ msgid "Clear"
51
+ msgstr "Wissen"
52
+
53
+ #: includes/class-yit-assets.php:175
54
+ msgid "Clear color"
55
+ msgstr "Kleur wissen"
56
+
57
+ #: includes/class-yit-assets.php:176
58
+ msgid "Default"
59
+ msgstr "Standaard"
60
+
61
+ #: includes/class-yit-assets.php:177
62
+ msgid "Select default color"
63
+ msgstr "Standaardkleur selecteren"
64
+
65
+ #: includes/class-yit-assets.php:178
66
+ msgid "Select Color"
67
+ msgstr "Kleur selecteren"
68
+
69
+ #: includes/class-yit-assets.php:179
70
+ msgid "Color value"
71
+ msgstr "Kleurwaarde"
72
+
73
+ #: includes/class-yit-help-desk.php:152
74
+ msgid "There was an error with your request; please try again later."
75
+ msgstr ""
76
+ "Er is een fout opgetreden met je verzoek, probeer het later opnieuw a.u.b."
77
+
78
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
79
+ msgid "The changes you have made will be lost if you leave this page."
80
+ msgstr "Als je deze pagina verlaat zullen alle wijzigingen verloren gaan."
81
+
82
+ #: includes/class-yit-plugin-panel.php:83
83
+ msgid "Plugin Settings"
84
+ msgstr "Plugin instellingen"
85
+
86
+ #: includes/class-yit-plugin-panel.php:84
87
+ msgid "Settings"
88
+ msgstr "Instellingen"
89
+
90
+ #: includes/class-yit-plugin-panel.php:456
91
+ #: includes/class-yit-plugin-panel.php:459
92
+ msgid "How to install premium version"
93
+ msgstr "Hoe installeer ik de premium versie"
94
+
95
+ #: includes/class-yit-plugin-panel.php:656
96
+ #: includes/class-yit-plugin-subpanel.php:133
97
+ msgid "Save Changes"
98
+ msgstr "Wijzigingen opslaan"
99
+
100
+ #: includes/class-yit-plugin-panel.php:664
101
+ #: includes/class-yit-plugin-subpanel.php:140
102
+ #: templates/panel/woocommerce/woocommerce-form.php:15
103
+ msgid ""
104
+ "If you continue with this action, you will reset all options in this page."
105
+ msgstr ""
106
+ "Als je doorgaat met deze actie, zal je alle opties op deze pagina resetten."
107
+
108
+ #: includes/class-yit-plugin-panel.php:664
109
+ #: includes/class-yit-plugin-subpanel.php:140
110
+ #: templates/panel/woocommerce/woocommerce-form.php:15
111
+ msgid "Are you sure?"
112
+ msgstr "Weet je het zeker?"
113
+
114
+ #: includes/class-yit-plugin-panel.php:668
115
+ #: includes/class-yit-plugin-subpanel.php:143
116
+ msgid "Reset to default"
117
+ msgstr "Resetten naar standaard"
118
+
119
+ #: includes/class-yit-plugin-panel.php:1039
120
+ msgid "Read the <mark>plugin documentation</mark>"
121
+ msgstr ""
122
+
123
+ #: includes/class-yit-plugin-panel.php:1040
124
+ msgid "Learn what you can really do with this powerful tool"
125
+ msgstr ""
126
+
127
+ #: includes/class-yit-plugin-panel.php:1050
128
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
129
+ msgstr ""
130
+
131
+ #: includes/class-yit-plugin-panel.php:1051
132
+ msgid "See how it works before you start using it"
133
+ msgstr ""
134
+
135
+ #: includes/class-yit-plugin-panel.php:1307
136
+ msgid ""
137
+ "The element you have entered already exists. Please, enter another name."
138
+ msgstr "Het element dat je hebt ingevoerd bestaat al. Voer een andere naam in."
139
+
140
+ #: includes/class-yit-plugin-panel.php:1308
141
+ msgid "Settings saved"
142
+ msgstr "Instellingen opgeslagen"
143
+
144
+ #: includes/class-yit-plugin-panel.php:1309
145
+ msgid "Settings reset"
146
+ msgstr "Instellingen resetten"
147
+
148
+ #: includes/class-yit-plugin-panel.php:1310
149
+ msgid "Element deleted correctly."
150
+ msgstr "Element juist verwijderd."
151
+
152
+ #: includes/class-yit-plugin-panel.php:1311
153
+ #: includes/class-yit-plugin-panel.php:1312
154
+ msgid "Element updated correctly."
155
+ msgstr "Element juist geüpdatet."
156
+
157
+ #: includes/class-yit-plugin-panel.php:1313
158
+ msgid "Database imported correctly."
159
+ msgstr "Database juist geïmporteerd."
160
+
161
+ #: includes/class-yit-plugin-panel.php:1314
162
+ msgid "An error has occurred during import. Please try again."
163
+ msgstr "Er is een fout opgetreden tijdens importeren. Probeer opnieuw."
164
+
165
+ #: includes/class-yit-plugin-panel.php:1315
166
+ msgid "The added file is not valid."
167
+ msgstr "Het toegevoegde bestand is niet geldig."
168
+
169
+ #: includes/class-yit-plugin-panel.php:1316
170
+ msgid "Sorry, import is disabled."
171
+ msgstr "Sorry, importeren is uitgeschakeld."
172
+
173
+ #: includes/class-yit-plugin-panel.php:1317
174
+ msgid "Sorting successful."
175
+ msgstr "Succesvol gesorteerd."
176
+
177
+ #: includes/class-yit-plugin-panel.php:1806
178
+ msgid "We need your support"
179
+ msgstr "We hebben je hulp nodig"
180
+
181
+ #: includes/class-yit-plugin-panel.php:1807
182
+ msgid "to keep updating and improving the plugin. Please,"
183
+ msgstr "om de plugin te blijven bijwerken en verbeteren. A.u.b.,"
184
+
185
+ #: includes/class-yit-plugin-panel.php:1809
186
+ msgid "help us by leaving a good review"
187
+ msgstr "help ons door een goede beoordeling achter te laten"
188
+
189
+ #: includes/class-yit-plugin-panel.php:1810
190
+ msgid ":) Thanks!"
191
+ msgstr ":) Bedankt!"
192
+
193
+ #: includes/class-yit-pointers.php:80
194
+ msgid "Plugins Activated"
195
+ msgstr "Plugins geactiveerd"
196
+
197
+ #: includes/class-yit-pointers.php:81
198
+ msgid ""
199
+ "From now on, you can find all plugin options in YITH menu. Plugin "
200
+ "customization settings will be available as a new entry in YITH menu."
201
+ msgstr ""
202
+ "Vanaf nu kun je alle plugin opties vinden in het YITH Plugins menu. Plugin "
203
+ "aanpassingen instellingen zullen beschikbaar zijn als nieuwe toegang in het "
204
+ "YITH menu."
205
+
206
+ #. translators: 1. YITH site link; 2. WordPress site link.
207
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
208
+ msgid "Discover all our plugins available on: %1$s and %2$s"
209
+ msgstr "Ontdek al onze beschikbare plugins op: %1$s and %2$s"
210
+
211
+ #: includes/class-yit-pointers.php:96
212
+ msgid "Plugins Upgraded"
213
+ msgstr "Plugins Upgraded"
214
+
215
+ #: includes/class-yit-pointers.php:97
216
+ msgid ""
217
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
218
+ "Every time one of our plugins is added, a new entry will be added to this "
219
+ "menu. For example, after the update, plugin options (such as for YITH "
220
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
221
+ "previous location to YITH menu."
222
+ msgstr ""
223
+ "Vanaf nu kun je het optiepaneel van YITH plugins vinden in het YITH menu. "
224
+ "Elke keer dat een van onze plugins wordt toegevoegd, wordt er een nieuw item "
225
+ "aan dit menu toegevoegd. Bijvoorbeeld na de update worden plugin opties "
226
+ "(zoals voor YITH WooCommerce Wishlist, YITH WooCommerce Ajax Search, enz.) "
227
+ "verplaatst van de vorige locatie naar het YITH menu."
228
+
229
+ #: includes/class-yith-bh-onboarding.php:85
230
+ msgid "It is not possible save the options"
231
+ msgstr ""
232
+
233
+ #: includes/class-yith-dashboard.php:35
234
+ msgid "YITH Latest Updates"
235
+ msgstr "YITH laatste updates"
236
+
237
+ #: includes/class-yith-dashboard.php:36
238
+ msgid "Latest news from YITH Blog"
239
+ msgstr "Laatste nieuws van YITH Blog"
240
+
241
+ #: includes/class-yith-dashboard.php:56
242
+ msgid "RSS Error:"
243
+ msgstr "RSS-fout:"
244
+
245
+ #: includes/class-yith-dashboard.php:63
246
+ msgid ""
247
+ "An error has occurred, which probably means the feed is down. Try again "
248
+ "later."
249
+ msgstr ""
250
+ "Er is een fout opgetreden, wat waarschijnlijk betekent dat de feed niet "
251
+ "werkt. Probeer het later opnieuw."
252
+
253
+ #. translators: %s is the name of the post type (example Back to "Membership
254
+ #. Plans").
255
+ #: includes/class-yith-post-type-admin.php:286
256
+ msgid "Back to \"%s\""
257
+ msgstr "Terug naar \"%s\""
258
+
259
+ #: includes/class-yith-post-type-admin.php:286
260
+ msgid "Back to the list"
261
+ msgstr "Terug naar de lijst"
262
+
263
+ #: includes/class-yith-system-status.php:110
264
+ msgid "WordPress Version"
265
+ msgstr "WordPress Versie"
266
+
267
+ #: includes/class-yith-system-status.php:111
268
+ msgid "WooCommerce Version"
269
+ msgstr "WooCommerce Versie"
270
+
271
+ #: includes/class-yith-system-status.php:112
272
+ msgid "Available Memory"
273
+ msgstr "Beschikbaar geheugen"
274
+
275
+ #: includes/class-yith-system-status.php:113
276
+ msgid "PHP Version"
277
+ msgstr "PHP Versie"
278
+
279
+ #: includes/class-yith-system-status.php:114
280
+ msgid "TLS Version"
281
+ msgstr "TLS Versie"
282
+
283
+ #: includes/class-yith-system-status.php:115
284
+ msgid "WordPress Cron"
285
+ msgstr "WordPress Cron"
286
+
287
+ #: includes/class-yith-system-status.php:116
288
+ msgid "SimpleXML"
289
+ msgstr "SimpleXML"
290
+
291
+ #: includes/class-yith-system-status.php:117
292
+ msgid "MultiByte String"
293
+ msgstr "MultiByte String"
294
+
295
+ #: includes/class-yith-system-status.php:118
296
+ msgid "ImageMagick Version"
297
+ msgstr "ImageMagick Versie"
298
+
299
+ #: includes/class-yith-system-status.php:119
300
+ msgid "GD Library"
301
+ msgstr "GD Library"
302
+
303
+ #: includes/class-yith-system-status.php:120
304
+ msgid "Iconv Module"
305
+ msgstr "Verzendmodule inschakelen"
306
+
307
+ #: includes/class-yith-system-status.php:121
308
+ msgid "OPCache Save Comments"
309
+ msgstr "OPCache Opmerkingen opslaan"
310
+
311
+ #: includes/class-yith-system-status.php:122
312
+ msgid "URL FOpen"
313
+ msgstr "URL FOpen"
314
+
315
+ #: includes/class-yith-system-status.php:140
316
+ #: includes/class-yith-system-status.php:141
317
+ #: templates/sysinfo/system-information-panel.php:11
318
+ msgid "System Status"
319
+ msgstr "Systeem Status"
320
+
321
+ #: includes/class-yith-system-status.php:183
322
+ msgid "YITH Plugins"
323
+ msgstr "YITH Plugins"
324
+
325
+ #: includes/class-yith-system-status.php:191
326
+ msgid "WooCommerce"
327
+ msgstr "WooCommerce"
328
+
329
+ #: includes/class-yith-system-status.php:342
330
+ msgid "Warning!"
331
+ msgstr "Waarschuwing!"
332
+
333
+ #. translators: %1$s open link tag, %2$s open link tag
334
+ #: includes/class-yith-system-status.php:346
335
+ msgid ""
336
+ "The system check has detected some compatibility issues on your installation."
337
+ "%1$sClick here%2$s to know more"
338
+ msgstr ""
339
+ "Het systeem heeft enkele compatibiliteitsproblemen gevonden op uw "
340
+ "installatie.%1$sklik hier%2$s om meer te weten te komen"
341
+
342
+ #: includes/class-yith-system-status.php:496
343
+ msgid "Enabled"
344
+ msgstr "Ingeschakeld"
345
+
346
+ #: includes/class-yith-system-status.php:496
347
+ msgid "Disabled"
348
+ msgstr "Uitgeschakeld"
349
+
350
+ #: includes/class-yith-system-status.php:501
351
+ msgid "N/A"
352
+ msgstr "N.v.t"
353
+
354
+ #. translators: %1$s plugin name, %2$s requirement name
355
+ #: includes/class-yith-system-status.php:528
356
+ msgid "%1$s needs %2$s enabled"
357
+ msgstr "%1$s heeft nodig %2$s ingeschakeld"
358
+
359
+ #. translators: %1$s plugin name, %2$s required memory amount
360
+ #: includes/class-yith-system-status.php:531
361
+ msgid "%1$s needs at least %2$s of available memory"
362
+ msgstr "%1$ss heeft ten minste %2$s beschikbaar geheugen nodig"
363
+
364
+ #. translators: %1$s plugin name, %2$s version number
365
+ #: includes/class-yith-system-status.php:534
366
+ msgid "%1$s needs at least %2$s version"
367
+ msgstr "%1$s heeft minstens %2$s versie nodig"
368
+
369
+ #: includes/class-yith-system-status.php:558
370
+ msgid ""
371
+ "Update it to the latest version in order to benefit of all new features and "
372
+ "security updates."
373
+ msgstr ""
374
+ "Bijwerken naar de laatste versie, om te profiteren van alle nieuwe opties en "
375
+ "veiligheidsupdates."
376
+
377
+ #: includes/class-yith-system-status.php:562
378
+ #: includes/class-yith-system-status.php:568
379
+ msgid "Contact your hosting company in order to update it."
380
+ msgstr "Neem contact op met uw hosting provider om het bij te werken."
381
+
382
+ #: includes/class-yith-system-status.php:566
383
+ msgid "Contact your hosting company in order to install it."
384
+ msgstr "Neem contact op met je hostingbedrijf om het te installeren."
385
+
386
+ #. translators: %1$s code, %2$s file name
387
+ #: includes/class-yith-system-status.php:573
388
+ msgid "Remove %1$s from %2$s file"
389
+ msgstr "Verwijder %1$s uit %2$s bestand"
390
+
391
+ #: includes/class-yith-system-status.php:581
392
+ msgid "Contact your hosting company in order to enable it."
393
+ msgstr "Neem contact op met uw hosting provider om het in te schakelen."
394
+
395
+ #. translators: %1$s opening link tag, %2$s closing link tag
396
+ #: includes/class-yith-system-status.php:585
397
+ #: includes/class-yith-system-status.php:608
398
+ msgid ""
399
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
400
+ "it."
401
+ msgstr ""
402
+ "Lees %1$s hier%2$s meer, of neem contact op met uw hostingmaatschappij om "
403
+ "het te verhogen."
404
+
405
+ #. translators: %s recommended memory amount
406
+ #: includes/class-yith-system-status.php:605
407
+ msgid ""
408
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
409
+ "available memory"
410
+ msgstr ""
411
+ "Om de plugins optimaal te laten functioneren, adviseren wij minstens %s "
412
+ "beschikbaar geheugen"
413
+
414
+ #. translators: %1$s TLS label, %2$s cURL label
415
+ #: includes/class-yith-system-status.php:613
416
+ msgid ""
417
+ "The system check cannot determine which %1$s version is installed because "
418
+ "%2$s module is disabled. Ask your hosting company to enable it."
419
+ msgstr ""
420
+ "We kunnen niet bepalen welke %1$s versie is geïnstalleerd omdat %2$s de "
421
+ "module is uitgeschakeld. Vraag je hostingmaatschappij om het in te schakelen."
422
+
423
+ #. translators: %1$s TLS label
424
+ #: includes/class-yith-system-status.php:616
425
+ msgid ""
426
+ "The system check cannot determine which %1$s version is installed due to a "
427
+ "connection issue between your site and our server."
428
+ msgstr ""
429
+ "De systeemcontrole kan niet bepalen welke versie van %1$s is geïnstalleerd "
430
+ "vanwege een verbindingsprobleem tussen je site en onze server."
431
+
432
+ #: templates/bh-onboarding/onboarding-tabs.php:63
433
+ msgid "Save"
434
+ msgstr ""
435
+
436
+ #: templates/fields/ajax-customers.php:41
437
+ msgid "Search for a customer..."
438
+ msgstr ""
439
+
440
+ #. translators: 1. user display name; 2. user ID; 3. user email.
441
+ #: templates/fields/ajax-customers.php:68
442
+ #: templates/fields/ajax-customers.php:79
443
+ msgid "%1$s (#%2$s &ndash; %3$s)"
444
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
445
+
446
+ #: templates/fields/ajax-posts.php:41
447
+ msgid "Search for a post..."
448
+ msgstr ""
449
+
450
+ #: templates/fields/ajax-products.php:16
451
+ msgid "Search for a product..."
452
+ msgstr ""
453
+
454
+ #: templates/fields/ajax-terms.php:41
455
+ msgid "Search for a category..."
456
+ msgstr ""
457
+
458
+ #: templates/fields/customtabs.php:17
459
+ msgid "Close all"
460
+ msgstr "Sluit allen"
461
+
462
+ #: templates/fields/customtabs.php:17
463
+ msgid "Expand all"
464
+ msgstr "Open allen"
465
+
466
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
467
+ msgid "Remove"
468
+ msgstr "Verwijderen"
469
+
470
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
471
+ msgid "Name"
472
+ msgstr "Name"
473
+
474
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
475
+ msgid "Value"
476
+ msgstr "Waarde"
477
+
478
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
479
+ msgid "Content of the tab. (HTML is supported)"
480
+ msgstr "Inhoud van het tabblad. (HTML wordt ondersteund)"
481
+
482
+ #: templates/fields/customtabs.php:52
483
+ msgid "Add custom product tab"
484
+ msgstr "Aangepaste product tabblad toevoegen"
485
+
486
+ #: templates/fields/customtabs.php:93
487
+ msgid "Do you want to remove the custom tab?"
488
+ msgstr "Wil je dit aangepaste tabblad verwijderen?"
489
+
490
+ #: templates/fields/date-format.php:65
491
+ msgid "Custom:"
492
+ msgstr "Aangepast:"
493
+
494
+ #: templates/fields/date-format.php:70
495
+ msgid "Preview:"
496
+ msgstr "Voorbeeld:"
497
+
498
+ #: templates/fields/icons.php:78
499
+ msgid "Set Default"
500
+ msgstr "Op standaard instellen"
501
+
502
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
503
+ msgid "Delete image"
504
+ msgstr "Afbeelding verwijderen"
505
+
506
+ #: templates/fields/image-gallery.php:37
507
+ msgid "Add Images to Gallery"
508
+ msgstr "Afbeeldingen toevoegen aan galerij"
509
+
510
+ #: templates/fields/image-gallery.php:38
511
+ msgid "Add to gallery"
512
+ msgstr "Aan galerij toevoegen"
513
+
514
+ #: templates/fields/image-gallery.php:39
515
+ msgid "Add images"
516
+ msgstr "Voeg images toe"
517
+
518
+ #: templates/fields/image-gallery.php:41
519
+ msgid "Delete"
520
+ msgstr "Verwijderen"
521
+
522
+ #: templates/fields/select-buttons.php:19
523
+ msgid "Add All"
524
+ msgstr "Allen toevoegen"
525
+
526
+ #: templates/fields/select-buttons.php:20
527
+ msgid "Remove All"
528
+ msgstr "Allen verwijderen"
529
+
530
+ #: templates/fields/sidebars.php:20
531
+ msgid "Left sidebar"
532
+ msgstr "Linker sidebar"
533
+
534
+ #: templates/fields/sidebars.php:23
535
+ msgid "Right sidebar"
536
+ msgstr "Rechter sidebar"
537
+
538
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
539
+ msgid "No sidebar"
540
+ msgstr "Geen sidebar"
541
+
542
+ #: templates/fields/sidebars.php:39
543
+ msgid "Left Sidebar"
544
+ msgstr "Linker sidebar"
545
+
546
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
547
+ msgid "Choose a sidebar"
548
+ msgstr "Kies een sidebar"
549
+
550
+ #: templates/fields/sidebars.php:54
551
+ msgid "Right Sidebar"
552
+ msgstr "Rechter sidebar"
553
+
554
+ #: templates/fields/upload.php:34
555
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
556
+ msgid "Upload"
557
+ msgstr "Upload"
558
+
559
+ #: templates/fields/upload.php:39
560
+ msgid "Reset"
561
+ msgstr "Resetten"
562
+
563
+ #. translators: %s is the plugin version.
564
+ #: templates/panel/welcome-modals/update.php:34
565
+ msgid "is successfully updated to version %s."
566
+ msgstr ""
567
+
568
+ #. translators: %s is the plugin version.
569
+ #: templates/panel/welcome-modals/update.php:44
570
+ msgid "What's new in version %s"
571
+ msgstr ""
572
+
573
+ #: templates/panel/welcome-modals/update.php:49
574
+ msgid "Check the changelog >"
575
+ msgstr ""
576
+
577
+ #: templates/panel/welcome-modals/update.php:64
578
+ #: templates/panel/welcome-modals/welcome.php:60
579
+ msgid "Got it, close this window"
580
+ msgstr ""
581
+
582
+ #: templates/panel/welcome-modals/welcome.php:30
583
+ msgid "Thank you for using our plugin"
584
+ msgstr ""
585
+
586
+ #. translators: %s is the number of steps.
587
+ #: templates/panel/welcome-modals/welcome.php:45
588
+ msgid "Start with these %s steps:"
589
+ msgstr ""
590
+
591
+ #: templates/panel/woocommerce/woocommerce-form.php:29
592
+ #: templates/panel/woocommerce/woocommerce-form.php:33
593
+ msgid "Save Options"
594
+ msgstr "Opties opslaan"
595
+
596
+ #: templates/panel/woocommerce/woocommerce-form.php:33
597
+ msgid "Options Saved"
598
+ msgstr "Opties opgeslagen"
599
+
600
+ #: templates/panel/woocommerce/woocommerce-form.php:43
601
+ msgid "Reset Defaults"
602
+ msgstr "Reset Standaard instellingen"
603
+
604
+ #: templates/sysinfo/system-information-panel.php:12
605
+ msgid "PHPInfo"
606
+ msgstr "PHPInfo"
607
+
608
+ #: templates/sysinfo/system-information-panel.php:13
609
+ #: templates/sysinfo/tabs/error-log.php:25
610
+ msgid "Log Files"
611
+ msgstr "Log bestanden"
612
+
613
+ #: templates/sysinfo/system-information-panel.php:22
614
+ msgid "YITH System Information"
615
+ msgstr "YITH Systeem Informatie"
616
+
617
+ #: templates/sysinfo/tabs/error-log.php:13
618
+ msgid "WP debug.log file"
619
+ msgstr "WP debug.log bestand"
620
+
621
+ #: templates/sysinfo/tabs/error-log.php:18
622
+ msgid "PHP error_log file"
623
+ msgstr "PHP error_log bestand"
624
+
625
+ #: templates/sysinfo/tabs/error-log.php:60
626
+ msgid "Download"
627
+ msgstr "Download"
628
+
629
+ #: templates/sysinfo/tabs/error-log.php:73
630
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
631
+ msgstr ""
632
+ "De bestandsgrootte overschrijd 8 megabytes, dus het moet worden gedownload "
633
+
634
+ #. translators: %s file name.
635
+ #: templates/sysinfo/tabs/error-log.php:97
636
+ msgid ""
637
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
638
+ "file of your installation"
639
+ msgstr ""
640
+ "Geen log bestand beschikbaar. WordPress debug inschakelen door dit bestand "
641
+ "toe te voegen aan het %s bestand van je installatie "
642
+
643
+ #: templates/sysinfo/tabs/error-log.php:106
644
+ msgid "Copied!"
645
+ msgstr "Gekopieerd!"
646
+
647
+ #: templates/sysinfo/tabs/error-log.php:106
648
+ msgid "Copy Code"
649
+ msgstr "Code kopiëren"
650
+
651
+ #: templates/sysinfo/tabs/main.php:17
652
+ msgid "Site Info"
653
+ msgstr "Site informatie"
654
+
655
+ #: templates/sysinfo/tabs/main.php:22
656
+ msgid "Site URL"
657
+ msgstr "Site URL"
658
+
659
+ #: templates/sysinfo/tabs/main.php:31
660
+ msgid "Output IP Address"
661
+ msgstr "Output IP Adres"
662
+
663
+ #: templates/sysinfo/tabs/main.php:39
664
+ msgid "Defined WP_CACHE"
665
+ msgstr "Gedefinieerde WP_CACHE"
666
+
667
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
668
+ msgid "Yes"
669
+ msgstr "Ja"
670
+
671
+ #: templates/sysinfo/tabs/main.php:47
672
+ msgid "External object cache"
673
+ msgstr "Externe object cache"
674
+
675
+ #: templates/sysinfo/tabs/main.php:55
676
+ msgid "YITH Plugin Framework Version"
677
+ msgstr "YITH Plugin Framework Versie"
678
+
679
+ #. translators: %s is the name of the plugin that is loading the framework.
680
+ #: templates/sysinfo/tabs/main.php:64
681
+ msgid "loaded by %s"
682
+ msgstr "geladen door %s"
683
+
684
+ #: templates/sysinfo/tabs/main.php:73
685
+ msgid "Plugins Requirements"
686
+ msgstr "Plugin benodigdheden"
687
+
688
+ #: templates/sysinfo/tabs/main.php:108
689
+ msgid "Database Info"
690
+ msgstr "Database Info"
691
+
692
+ #: templates/sysinfo/tabs/main.php:113
693
+ msgid "MySQL version"
694
+ msgstr "MySQL versie"
695
+
696
+ #. Translators: %s: Codex link.
697
+ #: templates/sysinfo/tabs/main.php:123
698
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
699
+ msgstr "WordPress raadt een minimale MySQL versie aan van 5.6. Bekijk: %s"
700
+
701
+ #: templates/sysinfo/tabs/main.php:123
702
+ msgid "WordPress requirements"
703
+ msgstr "WordPress vereisten"
704
+
705
+ #: templates/sysinfo/tabs/main.php:130
706
+ msgid "Total Database Size"
707
+ msgstr "Totale Database grootte"
708
+
709
+ #: templates/sysinfo/tabs/main.php:138
710
+ msgid "Database Data Size"
711
+ msgstr "Database Data grootte"
712
+
713
+ #: templates/sysinfo/tabs/main.php:146
714
+ msgid "Database Index Size"
715
+ msgstr "Database Index grootte"
716
+
717
+ #: templates/sysinfo/tabs/main.php:154
718
+ msgid "Database Free Size"
719
+ msgstr "Database gratis grootte"
720
+
721
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
722
+ #. Engine.
723
+ #: templates/sysinfo/tabs/main.php:168
724
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
725
+ msgstr "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
726
+
727
+ #. translators: %s is the title of the post object.
728
+ #: yit-functions.php:1938
729
+ msgid "Are you sure you want to move \"%s\" to trash?"
730
+ msgstr "Weet je zeker dat je \"%s\" naar de prullenbak wilt verplaatsen?"
731
+
732
+ #. translators: %s is the title of the post object.
733
+ #: yit-functions.php:1940 yit-functions.php:2100
734
+ msgid "Are you sure you want to delete \"%s\"?"
735
+ msgstr "Weet je zeker dat je \"%s\" wilt verwijderen?"
736
+
737
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
738
+ msgid "Further actions"
739
+ msgstr "Verdere acties"
740
+
741
+ #: yit-plugin.php:233
742
+ msgid "License"
743
+ msgstr "Licentie"
744
+
745
+ #. translators: 1. Plugin(s) name(s).
746
+ #: yit-plugin.php:272
747
+ msgid ""
748
+ "%s was deactivated as you're running an higher tier version of the same "
749
+ "plugin."
750
+ msgid_plural ""
751
+ "%s were deactivated as you're running higher tier versions of the same "
752
+ "plugins."
753
+ msgstr[0] ""
754
+ msgstr[1] ""
755
+
756
+ #. Author of the plugin/theme
757
+ msgid "YITH"
758
+ msgstr "YITH"
759
+
760
+ #. translators: %s it the Elementor Widget title.
761
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
762
+ msgctxt "Elementor Widget - section title"
763
+ msgid "%s - Options"
764
+ msgstr "%s - Opties"
765
+
766
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
767
+ msgctxt "[gutenberg]: Category Name"
768
+ msgid "YITH"
769
+ msgstr "YITH"
770
+
771
+ #: includes/class-yit-assets.php:136
772
+ msgctxt "Button text"
773
+ msgid "Confirm"
774
+ msgstr "Bevestigen"
775
+
776
+ #: includes/class-yit-assets.php:137
777
+ msgctxt "Button text"
778
+ msgid "Cancel"
779
+ msgstr "Annuleren"
780
+
781
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
782
+ msgctxt "Trash confirmation action"
783
+ msgid "Yes, move to trash"
784
+ msgstr "Ja, verplaatsen naar prullenbak"
785
+
786
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
787
+ #: yit-functions.php:2154
788
+ msgctxt "Delete confirmation action"
789
+ msgid "Yes, delete"
790
+ msgstr "Ja, verwijderen"
791
+
792
+ #. translators: 1. Plugin name.
793
+ #: includes/class-yit-plugin-panel.php:804
794
+ msgctxt "Help tab default title"
795
+ msgid "Thank you for purchasing %s!"
796
+ msgstr "Bedankt voor het kopen van %s!"
797
+
798
+ #: includes/class-yit-plugin-panel.php:804
799
+ msgctxt "Help tab default title"
800
+ msgid "Thank you for using %s!"
801
+ msgstr ""
802
+
803
+ #: includes/class-yit-plugin-panel.php:812
804
+ msgctxt "Help tab default description"
805
+ msgid ""
806
+ "We want to help you enjoy a wonderful experience with all of our products."
807
+ msgstr ""
808
+
809
+ #: includes/class-yit-plugin-panel.php:863
810
+ msgctxt "Premium tab name"
811
+ msgid "Get premium"
812
+ msgstr "Neem premium"
813
+
814
+ #: includes/class-yit-plugin-panel.php:875
815
+ msgctxt "Help tab name"
816
+ msgid "Help"
817
+ msgstr "Help"
818
+
819
+ #: includes/class-yith-dashboard.php:96
820
+ msgctxt "Plugin FW"
821
+ msgid "View Changelog"
822
+ msgstr "Bekijk wijzigingenlogboek"
823
+
824
+ #: includes/class-yith-dashboard.php:97
825
+ msgctxt "Plugin FW"
826
+ msgid "Latest update released on"
827
+ msgstr "Laatste update uitgebracht op"
828
+
829
+ #: includes/class-yith-dashboard.php:137
830
+ msgctxt "Button label"
831
+ msgid "Close"
832
+ msgstr "Sluiten"
833
+
834
+ #: includes/privacy/class-yith-privacy.php:61
835
+ msgctxt "Privacy Policy Guide Title"
836
+ msgid "YITH Plugins"
837
+ msgstr "YITH Plugins"
838
+
839
+ #: includes/privacy/class-yith-privacy.php:93
840
+ msgctxt "Privacy Policy Content"
841
+ msgid ""
842
+ "This sample language includes the basics around what personal data your "
843
+ "store may be collecting, storing and sharing, as well as who may have access "
844
+ "to that data. Depending on what settings are enabled and which additional "
845
+ "plugins are used, the specific information shared by your store will vary. "
846
+ "We recommend consulting with a lawyer when deciding what information to "
847
+ "disclose on your privacy policy."
848
+ msgstr ""
849
+ "Dit geschreven voorbeeld bevat de basis rondom welke persoonlijke gegevens "
850
+ "je winkel mag verzamelen, bewaren en delen, en wie toegang heeft tot deze "
851
+ "gegevens. Afhankelijk van welke instellingen zijn ingeschakeld en welke "
852
+ "aanvullende plugins worden gebruikt, zal de informatie die wordt gedeeld "
853
+ "door je winkel variëren. We raden aan om een advocaat te raadplegen wanneer "
854
+ "je besluit je privacy beleid op te stellen."
855
+
856
+ #: includes/privacy/class-yith-privacy.php:97
857
+ msgctxt "Privacy Policy Content"
858
+ msgid "What we collect and store"
859
+ msgstr "Wat we verzamelen en bewaren"
860
+
861
+ #: includes/privacy/class-yith-privacy.php:100
862
+ msgctxt "Privacy Policy Content"
863
+ msgid "Who on our team has access"
864
+ msgstr "Wie van ons team heeft toegang"
865
+
866
+ #: includes/privacy/class-yith-privacy.php:103
867
+ msgctxt "Privacy Policy Content"
868
+ msgid "What we share with others"
869
+ msgstr "Wat wij delen met anderen"
870
+
871
+ #: includes/privacy/class-yith-privacy.php:106
872
+ msgctxt "Privacy Policy Content"
873
+ msgid "Payments"
874
+ msgstr "Betalingen"
875
+
876
+ #: templates/fields/copy-to-clipboard.php:41
877
+ msgctxt "Copy-to-clipboard message"
878
+ msgid "Copied!"
879
+ msgstr "Gekopieerd!"
880
+
881
+ #: templates/fields/copy-to-clipboard.php:45
882
+ msgctxt "Copy-to-clipboard button text"
883
+ msgid "Copy"
884
+ msgstr "Kopieer"
885
+
886
+ #: templates/fields/dimensions.php:13
887
+ msgctxt "Position in the \"Dimensions\" field"
888
+ msgid "Top"
889
+ msgstr "Boven"
890
+
891
+ #: templates/fields/dimensions.php:14
892
+ msgctxt "Position in the \"Dimensions\" field"
893
+ msgid "Right"
894
+ msgstr "Rechts"
895
+
896
+ #: templates/fields/dimensions.php:15
897
+ msgctxt "Position in the \"Dimensions\" field"
898
+ msgid "Bottom"
899
+ msgstr "Onder"
900
+
901
+ #: templates/fields/dimensions.php:16
902
+ msgctxt "Position in the \"Dimensions\" field"
903
+ msgid "Left"
904
+ msgstr "Links"
905
+
906
+ #: templates/fields/dimensions.php:94
907
+ msgctxt "Tooltip in the \"Dimensions\" field"
908
+ msgid "Link values together"
909
+ msgstr "Waarden aan elkaar koppelen"
910
+
911
+ #: templates/fields/image-dimensions.php:18
912
+ msgctxt "Image width field label"
913
+ msgid "Width"
914
+ msgstr "Breedte"
915
+
916
+ #: templates/fields/image-dimensions.php:23
917
+ msgctxt "Image height field label"
918
+ msgid "Height"
919
+ msgstr "Hoogte"
920
+
921
+ #: templates/fields/onoff.php:28
922
+ msgctxt "YES/NO button: use MAX 4 characters!"
923
+ msgid "YES"
924
+ msgstr "JA"
925
+
926
+ #: templates/fields/onoff.php:29
927
+ msgctxt "YES/NO button: use MAX 4 characters!"
928
+ msgid "NO"
929
+ msgstr "NEE"
930
+
931
+ #. translators: 1. Url to EN playlist.
932
+ #: templates/panel/help-tab.php:89
933
+ msgctxt "Help tab view all video link"
934
+ msgid ""
935
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
936
+ "learn more >"
937
+ msgstr ""
938
+ "Bekijk de volledige <a href=\"%s\" target=\"_blank\">Playlist op Youtube</a> "
939
+ "om meer te weten te komen >"
940
+
941
+ #: templates/panel/help-tab.php:96
942
+ msgctxt "Help tab Watch Videotutorials link"
943
+ msgid "Videos are also available in:"
944
+ msgstr "Videos zijn ook beschikbaar in:"
945
+
946
+ #: templates/panel/help-tab.php:126
947
+ msgctxt "Help tab Read Documentation link"
948
+ msgid "Read the documentation"
949
+ msgstr "Lees de documentatie"
950
+
951
+ #: templates/panel/help-tab.php:129
952
+ msgctxt "Help tab Read Documentation link"
953
+ msgid "to learn how the plugin works from the basics."
954
+ msgstr ""
955
+
956
+ #: templates/panel/help-tab.php:139
957
+ msgctxt "Help tab Watch video tutorials link"
958
+ msgid "Watch our video tutorials"
959
+ msgstr ""
960
+
961
+ #: templates/panel/help-tab.php:142
962
+ msgctxt "Help tab Watch video tutorials link"
963
+ msgid "to see some helpful use cases."
964
+ msgstr ""
965
+
966
+ #: templates/panel/help-tab.php:152
967
+ msgctxt "Help tab view FAQs link"
968
+ msgid "Check the FAQs"
969
+ msgstr "Check de FAQs"
970
+
971
+ #: templates/panel/help-tab.php:155
972
+ msgctxt "Help tab view FAQs link"
973
+ msgid "to find answers to your doubts."
974
+ msgstr ""
975
+
976
+ #: templates/panel/help-tab.php:170
977
+ msgctxt "Help tab FAQ title"
978
+ msgid "Last FAQs in our Help Center"
979
+ msgstr "Laatste FAQs in ons Help Center"
980
+
981
+ #: templates/panel/help-tab.php:184
982
+ msgctxt "Help tab FAQ link"
983
+ msgid "View all FAQs >"
984
+ msgstr "Bekijk alle FAQs >"
985
+
986
+ #: templates/panel/help-tab.php:193
987
+ msgctxt "Help tab submit ticket title"
988
+ msgid "Need help?"
989
+ msgstr "Hulp nodig?"
990
+
991
+ #: templates/panel/help-tab.php:196
992
+ msgctxt "Help tab submit ticket description"
993
+ msgid ""
994
+ "If you are experiencing any technical issues, ask for help from our "
995
+ "developers. Submit a ticket through our support desk and we will help you as "
996
+ "soon as possible."
997
+ msgstr ""
998
+
999
+ #: templates/panel/help-tab.php:204
1000
+ msgctxt "Help tab submit ticket button"
1001
+ msgid "Submit a ticket"
1002
+ msgstr "Verstuur een ticket"
1003
+
1004
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
1005
+ #: templates/panel/help-tab.php:223
1006
+ msgctxt "Help tab documentation"
1007
+ msgid "Read the plugin documentation"
1008
+ msgstr ""
1009
+
1010
+ #: templates/panel/help-tab.php:220
1011
+ msgctxt "Help tab documentation"
1012
+ msgid "to learn how it works from the basics."
1013
+ msgstr ""
1014
+
1015
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
1016
+ msgctxt "Help tab support"
1017
+ msgid "Need some help?"
1018
+ msgstr ""
1019
+
1020
+ #: templates/panel/help-tab.php:235
1021
+ msgctxt "Help tab support"
1022
+ msgid "From DIY to full-service help"
1023
+ msgstr ""
1024
+
1025
+ #: templates/panel/help-tab.php:238
1026
+ msgctxt "Help tab support"
1027
+ msgid ""
1028
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1029
+ "site."
1030
+ msgstr ""
1031
+
1032
+ #: templates/panel/help-tab.php:241
1033
+ msgctxt "Help tab support"
1034
+ msgid "Yes, I need help"
1035
+ msgstr ""
1036
+
1037
+ #: templates/panel/premium-tab.php:30
1038
+ msgctxt "Premium Tab"
1039
+ msgid "Get the premium version to unlock advanced features"
1040
+ msgstr "Neem de premium versie om geavanceerde opties te deblokkeren"
1041
+
1042
+ #: templates/panel/premium-tab.php:34
1043
+ msgctxt "Premium Tab"
1044
+ msgid "Get premium"
1045
+ msgstr "Neem premium"
1046
+
1047
+ #: templates/panel/premium-tab.php:39
1048
+ msgctxt "Premium Tab"
1049
+ msgid "Plugin premium features images"
1050
+ msgstr "Plugin premium opties afbeeldingen"
1051
+
1052
+ #. translators: alt attribute of main image tag.
1053
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1054
+ msgctxt "Premium Tab"
1055
+ msgid "And so much more!"
1056
+ msgstr "En zo veel meer!"
1057
+
1058
+ #: templates/panel/premium-tab.php:53
1059
+ msgctxt "Premium Tab"
1060
+ msgid "Check the premium features >"
1061
+ msgstr ""
1062
+
1063
+ #: templates/panel/premium-tab.php:60
1064
+ msgctxt "Premium Tab"
1065
+ msgid "Check the free vs premium features >"
1066
+ msgstr "Bekijk de gratis vs premium opties >"
1067
+
1068
+ #: templates/panel/premium-tab.php:65
1069
+ msgctxt "Premium Tab"
1070
+ msgid "Get the premium version"
1071
+ msgstr "Krijg de premium versie"
1072
+
1073
+ #: yit-functions.php:1952
1074
+ msgctxt "Post action"
1075
+ msgid "Preview"
1076
+ msgstr "Voorbeeld"
1077
+
1078
+ #: yit-functions.php:1961
1079
+ msgctxt "Post action"
1080
+ msgid "View"
1081
+ msgstr "Bekijken"
1082
+
1083
+ #: yit-functions.php:1972
1084
+ msgctxt "Post action"
1085
+ msgid "Edit"
1086
+ msgstr "Bewerken"
1087
+
1088
+ #: yit-functions.php:1980
1089
+ msgctxt "Post action"
1090
+ msgid "Duplicate"
1091
+ msgstr "Dupliceren"
1092
+
1093
+ #: yit-functions.php:1992
1094
+ msgctxt "Post action"
1095
+ msgid "Restore"
1096
+ msgstr "Herstellen"
1097
+
1098
+ #: yit-functions.php:2000
1099
+ msgctxt "Post action"
1100
+ msgid "Trash"
1101
+ msgstr "Prullenbak"
1102
+
1103
+ #: yit-functions.php:2017
1104
+ msgctxt "Post action"
1105
+ msgid "Delete Permanently"
1106
+ msgstr "Permanent verijwderen"
1107
+
1108
+ #: yit-functions.php:2114
1109
+ msgctxt "Term action"
1110
+ msgid "View"
1111
+ msgstr "Bekijken"
1112
+
1113
+ #: yit-functions.php:2124
1114
+ msgctxt "Term action"
1115
+ msgid "Edit"
1116
+ msgstr "Bewerken"
1117
+
1118
+ #: yit-functions.php:2132
1119
+ msgctxt "Term action"
1120
+ msgid "Duplicate"
1121
+ msgstr "Dupliceren"
1122
+
1123
+ #: yit-functions.php:2145
1124
+ msgctxt "Term action"
1125
+ msgid "Delete"
1126
+ msgstr "Verwijderen"
1127
+
1128
+ #: yit-plugin.php:85
1129
+ msgctxt "Plugin Row Meta"
1130
+ msgid "Live Demo"
1131
+ msgstr "Live Demo"
1132
+
1133
+ #: yit-plugin.php:89
1134
+ msgctxt "Plugin Row Meta"
1135
+ msgid "Documentation"
1136
+ msgstr "Documentatie"
1137
+
1138
+ #: yit-plugin.php:93
1139
+ msgctxt "Plugin Row Meta"
1140
+ msgid "Support"
1141
+ msgstr "Ondersteuning"
1142
+
1143
+ #: yit-plugin.php:97
1144
+ msgctxt "Plugin Row Meta"
1145
+ msgid "Premium version"
1146
+ msgstr "Premium versie"
1147
+
1148
+ #: yit-plugin.php:229
1149
+ msgctxt "Action links"
1150
+ msgid "Settings"
1151
+ msgstr "Instellingen"
plugin-fw/languages/yith-plugin-fw-ru_RU 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-ru_RU 2.po ADDED
@@ -0,0 +1,1157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Russian
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2022-04-05 17:22:32+0000\n"
9
+ "Language: ru\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % "
14
+ "10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2);\n"
15
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
16
+
17
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
18
+ msgid "Confirm trash"
19
+ msgstr "Подтвердить корзину"
20
+
21
+ #: includes/class-yit-assets.php:149
22
+ msgid "Are you sure you want to trash the selected items?"
23
+ msgstr "Вы уверены, что хотите переместить в корзину выбранные элементы?"
24
+
25
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
26
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
27
+ #: yit-functions.php:2008 yit-functions.php:2026
28
+ msgid "No"
29
+ msgstr "Нет"
30
+
31
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
32
+ #: yit-functions.php:2152
33
+ msgid "Confirm delete"
34
+ msgstr "Подтвердите удаление"
35
+
36
+ #: includes/class-yit-assets.php:153
37
+ msgid "Are you sure you want to delete the selected items?"
38
+ msgstr "Вы уверены, что хотите удалить выбранные элементы?"
39
+
40
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
41
+ #: yit-functions.php:2100
42
+ msgid ""
43
+ "This action cannot be undone and you will not be able to recover this data."
44
+ msgstr "Это действие нельзя отменить, и вы не сможете восстановить эти данные."
45
+
46
+ #: includes/class-yit-assets.php:174
47
+ msgid "Clear"
48
+ msgstr "Очистить"
49
+
50
+ #: includes/class-yit-assets.php:175
51
+ msgid "Clear color"
52
+ msgstr "Очистить цвет"
53
+
54
+ #: includes/class-yit-assets.php:176
55
+ msgid "Default"
56
+ msgstr "По умолчанию"
57
+
58
+ #: includes/class-yit-assets.php:177
59
+ msgid "Select default color"
60
+ msgstr "Выберите цвет по умолчанию"
61
+
62
+ #: includes/class-yit-assets.php:178
63
+ msgid "Select Color"
64
+ msgstr "Выберите цвет"
65
+
66
+ #: includes/class-yit-assets.php:179
67
+ msgid "Color value"
68
+ msgstr "Цвет значения"
69
+
70
+ #: includes/class-yit-help-desk.php:152
71
+ msgid "There was an error with your request; please try again later."
72
+ msgstr ""
73
+ "При выполнении вашего запроса произошла ошибка; пожалуйста, повторите "
74
+ "попытку позже."
75
+
76
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
77
+ msgid "The changes you have made will be lost if you leave this page."
78
+ msgstr ""
79
+ "Внесенные вами изменения будут потеряны, если вы покинете эту страницу."
80
+
81
+ #: includes/class-yit-plugin-panel.php:83
82
+ msgid "Plugin Settings"
83
+ msgstr "Настройки Плагина"
84
+
85
+ #: includes/class-yit-plugin-panel.php:84
86
+ msgid "Settings"
87
+ msgstr "Настройки"
88
+
89
+ #: includes/class-yit-plugin-panel.php:456
90
+ #: includes/class-yit-plugin-panel.php:459
91
+ msgid "How to install premium version"
92
+ msgstr "Как установить премиум версию"
93
+
94
+ #: includes/class-yit-plugin-panel.php:656
95
+ #: includes/class-yit-plugin-subpanel.php:133
96
+ msgid "Save Changes"
97
+ msgstr "Сохранить Изменения"
98
+
99
+ #: includes/class-yit-plugin-panel.php:664
100
+ #: includes/class-yit-plugin-subpanel.php:140
101
+ #: templates/panel/woocommerce/woocommerce-form.php:15
102
+ msgid ""
103
+ "If you continue with this action, you will reset all options in this page."
104
+ msgstr ""
105
+ "Если вы продолжите это действие, вы сбросите все параметры на этой странице."
106
+
107
+ #: includes/class-yit-plugin-panel.php:664
108
+ #: includes/class-yit-plugin-subpanel.php:140
109
+ #: templates/panel/woocommerce/woocommerce-form.php:15
110
+ msgid "Are you sure?"
111
+ msgstr "Вы уверены?"
112
+
113
+ #: includes/class-yit-plugin-panel.php:668
114
+ #: includes/class-yit-plugin-subpanel.php:143
115
+ msgid "Reset to default"
116
+ msgstr "Сброс до заводских настроек"
117
+
118
+ #: includes/class-yit-plugin-panel.php:1039
119
+ msgid "Read the <mark>plugin documentation</mark>"
120
+ msgstr ""
121
+
122
+ #: includes/class-yit-plugin-panel.php:1040
123
+ msgid "Learn what you can really do with this powerful tool"
124
+ msgstr ""
125
+
126
+ #: includes/class-yit-plugin-panel.php:1050
127
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
128
+ msgstr ""
129
+
130
+ #: includes/class-yit-plugin-panel.php:1051
131
+ msgid "See how it works before you start using it"
132
+ msgstr ""
133
+
134
+ #: includes/class-yit-plugin-panel.php:1307
135
+ msgid ""
136
+ "The element you have entered already exists. Please, enter another name."
137
+ msgstr "Введенный вами элемент уже существует. Пожалуйста, введите другое имя."
138
+
139
+ #: includes/class-yit-plugin-panel.php:1308
140
+ msgid "Settings saved"
141
+ msgstr "Настройки сохранены"
142
+
143
+ #: includes/class-yit-plugin-panel.php:1309
144
+ msgid "Settings reset"
145
+ msgstr "Сбросить настройки"
146
+
147
+ #: includes/class-yit-plugin-panel.php:1310
148
+ msgid "Element deleted correctly."
149
+ msgstr "Элемент удален правильно."
150
+
151
+ #: includes/class-yit-plugin-panel.php:1311
152
+ #: includes/class-yit-plugin-panel.php:1312
153
+ msgid "Element updated correctly."
154
+ msgstr "Элемент обновлен правильно."
155
+
156
+ #: includes/class-yit-plugin-panel.php:1313
157
+ msgid "Database imported correctly."
158
+ msgstr "База данных импортирована правильно."
159
+
160
+ #: includes/class-yit-plugin-panel.php:1314
161
+ msgid "An error has occurred during import. Please try again."
162
+ msgstr "Во время импорта произошла ошибка. Пожалуйста, попробуйте еще раз."
163
+
164
+ #: includes/class-yit-plugin-panel.php:1315
165
+ msgid "The added file is not valid."
166
+ msgstr "Добавленный файл недействителен."
167
+
168
+ #: includes/class-yit-plugin-panel.php:1316
169
+ msgid "Sorry, import is disabled."
170
+ msgstr "Извините, импорт отключен."
171
+
172
+ #: includes/class-yit-plugin-panel.php:1317
173
+ msgid "Sorting successful."
174
+ msgstr "Сортировка выполнена успешно."
175
+
176
+ #: includes/class-yit-plugin-panel.php:1806
177
+ msgid "We need your support"
178
+ msgstr "Нам нужна ваша поддержка"
179
+
180
+ #: includes/class-yit-plugin-panel.php:1807
181
+ msgid "to keep updating and improving the plugin. Please,"
182
+ msgstr "чтобы продолжать обновлять и улучшать плагин. Пожалуйста,"
183
+
184
+ #: includes/class-yit-plugin-panel.php:1809
185
+ msgid "help us by leaving a good review"
186
+ msgstr "помогите нам, оставив хороший отзыв"
187
+
188
+ #: includes/class-yit-plugin-panel.php:1810
189
+ msgid ":) Thanks!"
190
+ msgstr ":) Благодарим!"
191
+
192
+ #: includes/class-yit-pointers.php:80
193
+ msgid "Plugins Activated"
194
+ msgstr "Плагины Активированы"
195
+
196
+ #: includes/class-yit-pointers.php:81
197
+ msgid ""
198
+ "From now on, you can find all plugin options in YITH menu. Plugin "
199
+ "customization settings will be available as a new entry in YITH menu."
200
+ msgstr ""
201
+ "Отныне все опции плагина можно найти в меню YITH. Настройки кастомизации "
202
+ "плагина будут доступны как новый пункт в меню YITH."
203
+
204
+ #. translators: 1. YITH site link; 2. WordPress site link.
205
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
206
+ msgid "Discover all our plugins available on: %1$s and %2$s"
207
+ msgstr "Откройте для себя все наши плагины, доступные на: %1$s и %2$s"
208
+
209
+ #: includes/class-yit-pointers.php:96
210
+ msgid "Plugins Upgraded"
211
+ msgstr "Плагины Обновлены"
212
+
213
+ #: includes/class-yit-pointers.php:97
214
+ msgid ""
215
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
216
+ "Every time one of our plugins is added, a new entry will be added to this "
217
+ "menu. For example, after the update, plugin options (such as for YITH "
218
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
219
+ "previous location to YITH menu."
220
+ msgstr ""
221
+ "С этого момента вы можете найти панель опций плагинов YITH в меню YITH. "
222
+ "Каждый раз, когда добавляется один из наших плагинов, в это меню будет "
223
+ "добавляться новый пункт. Например, после обновления, опции плагинов (такие "
224
+ "как для YITH WooCommerce Wishlist, YITH WooCommerce Ajax Search и т.д.) "
225
+ "будут перемещены из предыдущего места в меню YITH."
226
+
227
+ #: includes/class-yith-bh-onboarding.php:85
228
+ msgid "It is not possible save the options"
229
+ msgstr ""
230
+
231
+ #: includes/class-yith-dashboard.php:35
232
+ msgid "YITH Latest Updates"
233
+ msgstr "Последние обновления YITH"
234
+
235
+ #: includes/class-yith-dashboard.php:36
236
+ msgid "Latest news from YITH Blog"
237
+ msgstr "Последние новости из блога YITH"
238
+
239
+ #: includes/class-yith-dashboard.php:56
240
+ msgid "RSS Error:"
241
+ msgstr "Ошибка RSS:"
242
+
243
+ #: includes/class-yith-dashboard.php:63
244
+ msgid ""
245
+ "An error has occurred, which probably means the feed is down. Try again "
246
+ "later."
247
+ msgstr ""
248
+ "Произошла ошибка, которая, вероятно, означает, что канал не работает. "
249
+ "Повторите попытку позже."
250
+
251
+ #. translators: %s is the name of the post type (example Back to "Membership
252
+ #. Plans").
253
+ #: includes/class-yith-post-type-admin.php:286
254
+ msgid "Back to \"%s\""
255
+ msgstr "Вернуться к \"%s\""
256
+
257
+ #: includes/class-yith-post-type-admin.php:286
258
+ msgid "Back to the list"
259
+ msgstr "Вернуться к списку"
260
+
261
+ #: includes/class-yith-system-status.php:110
262
+ msgid "WordPress Version"
263
+ msgstr "Версия WordPress"
264
+
265
+ #: includes/class-yith-system-status.php:111
266
+ msgid "WooCommerce Version"
267
+ msgstr "Версия WooCommerce"
268
+
269
+ #: includes/class-yith-system-status.php:112
270
+ msgid "Available Memory"
271
+ msgstr "Доступная Памяти"
272
+
273
+ #: includes/class-yith-system-status.php:113
274
+ msgid "PHP Version"
275
+ msgstr "Версия PHP"
276
+
277
+ #: includes/class-yith-system-status.php:114
278
+ msgid "TLS Version"
279
+ msgstr "Версия TLS"
280
+
281
+ #: includes/class-yith-system-status.php:115
282
+ msgid "WordPress Cron"
283
+ msgstr "Ядро WordPress"
284
+
285
+ #: includes/class-yith-system-status.php:116
286
+ msgid "SimpleXML"
287
+ msgstr "SimpleXML"
288
+
289
+ #: includes/class-yith-system-status.php:117
290
+ msgid "MultiByte String"
291
+ msgstr "MultiByte String"
292
+
293
+ #: includes/class-yith-system-status.php:118
294
+ msgid "ImageMagick Version"
295
+ msgstr "Версия ImageMagick"
296
+
297
+ #: includes/class-yith-system-status.php:119
298
+ msgid "GD Library"
299
+ msgstr "Библиотека GD"
300
+
301
+ #: includes/class-yith-system-status.php:120
302
+ msgid "Iconv Module"
303
+ msgstr "Модуль Iconv"
304
+
305
+ #: includes/class-yith-system-status.php:121
306
+ msgid "OPCache Save Comments"
307
+ msgstr "OPCache Сохранить комментарии"
308
+
309
+ #: includes/class-yith-system-status.php:122
310
+ msgid "URL FOpen"
311
+ msgstr "URL FOpen"
312
+
313
+ #: includes/class-yith-system-status.php:140
314
+ #: includes/class-yith-system-status.php:141
315
+ #: templates/sysinfo/system-information-panel.php:11
316
+ msgid "System Status"
317
+ msgstr "Состояние Системы"
318
+
319
+ #: includes/class-yith-system-status.php:183
320
+ msgid "YITH Plugins"
321
+ msgstr "Плагины YITH"
322
+
323
+ #: includes/class-yith-system-status.php:191
324
+ msgid "WooCommerce"
325
+ msgstr "WooCommerce"
326
+
327
+ #: includes/class-yith-system-status.php:342
328
+ msgid "Warning!"
329
+ msgstr "Внимание!"
330
+
331
+ #. translators: %1$s open link tag, %2$s open link tag
332
+ #: includes/class-yith-system-status.php:346
333
+ msgid ""
334
+ "The system check has detected some compatibility issues on your installation."
335
+ "%1$sClick here%2$s to know more"
336
+ msgstr ""
337
+ "Проверка системы обнаружила некоторые проблемы совместимости в вашей "
338
+ "установке.%1$sНажмите сюда%2$s чтобы узнать больше"
339
+
340
+ #: includes/class-yith-system-status.php:496
341
+ msgid "Enabled"
342
+ msgstr "Включено"
343
+
344
+ #: includes/class-yith-system-status.php:496
345
+ msgid "Disabled"
346
+ msgstr "Отключено"
347
+
348
+ #: includes/class-yith-system-status.php:501
349
+ msgid "N/A"
350
+ msgstr "Б/н"
351
+
352
+ #. translators: %1$s plugin name, %2$s requirement name
353
+ #: includes/class-yith-system-status.php:528
354
+ msgid "%1$s needs %2$s enabled"
355
+ msgstr "%1$s требует включения %2$s"
356
+
357
+ #. translators: %1$s plugin name, %2$s required memory amount
358
+ #: includes/class-yith-system-status.php:531
359
+ msgid "%1$s needs at least %2$s of available memory"
360
+ msgstr "%1$s требуется не менее %2$s доступной памяти"
361
+
362
+ #. translators: %1$s plugin name, %2$s version number
363
+ #: includes/class-yith-system-status.php:534
364
+ msgid "%1$s needs at least %2$s version"
365
+ msgstr "%1$s требует как минимум %2$s версии"
366
+
367
+ #: includes/class-yith-system-status.php:558
368
+ msgid ""
369
+ "Update it to the latest version in order to benefit of all new features and "
370
+ "security updates."
371
+ msgstr ""
372
+ "Обновите его до последней версии, чтобы воспользоваться всеми новыми "
373
+ "функциями и обновлениями безопасности."
374
+
375
+ #: includes/class-yith-system-status.php:562
376
+ #: includes/class-yith-system-status.php:568
377
+ msgid "Contact your hosting company in order to update it."
378
+ msgstr "Свяжитесь с вашей хостинговой компанией, чтобы обновить его."
379
+
380
+ #: includes/class-yith-system-status.php:566
381
+ msgid "Contact your hosting company in order to install it."
382
+ msgstr "Для его установки обратитесь в свою хостинговую компанию."
383
+
384
+ #. translators: %1$s code, %2$s file name
385
+ #: includes/class-yith-system-status.php:573
386
+ msgid "Remove %1$s from %2$s file"
387
+ msgstr "Удалить %1$s из файла %2$s"
388
+
389
+ #: includes/class-yith-system-status.php:581
390
+ msgid "Contact your hosting company in order to enable it."
391
+ msgstr "Свяжитесь с вашей хостинговой компанией, чтобы включить его."
392
+
393
+ #. translators: %1$s opening link tag, %2$s closing link tag
394
+ #: includes/class-yith-system-status.php:585
395
+ #: includes/class-yith-system-status.php:608
396
+ msgid ""
397
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
398
+ "it."
399
+ msgstr ""
400
+ "Узнайте больше %1$sздесь%2$s или свяжитесь с вашей хостинговой компанией, "
401
+ "чтобы увеличить его."
402
+
403
+ #. translators: %s recommended memory amount
404
+ #: includes/class-yith-system-status.php:605
405
+ msgid ""
406
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
407
+ "available memory"
408
+ msgstr ""
409
+ "Для оптимального функционирования наших плагинов мы рекомендуем установить "
410
+ "не менее %s доступной памяти"
411
+
412
+ #. translators: %1$s TLS label, %2$s cURL label
413
+ #: includes/class-yith-system-status.php:613
414
+ msgid ""
415
+ "The system check cannot determine which %1$s version is installed because "
416
+ "%2$s module is disabled. Ask your hosting company to enable it."
417
+ msgstr ""
418
+ "Системная проверка не может определить, какая версия %1$s установлена, "
419
+ "потому что модуль %2$s отключен. Попросите вашу хостинг-компанию включить "
420
+ "его."
421
+
422
+ #. translators: %1$s TLS label
423
+ #: includes/class-yith-system-status.php:616
424
+ msgid ""
425
+ "The system check cannot determine which %1$s version is installed due to a "
426
+ "connection issue between your site and our server."
427
+ msgstr ""
428
+ "Системная проверка не может определить, какая версия %1$s установлена, из-за "
429
+ "проблемы с соединением между вашим сайтом и нашим сервером."
430
+
431
+ #: templates/bh-onboarding/onboarding-tabs.php:63
432
+ msgid "Save"
433
+ msgstr ""
434
+
435
+ #: templates/fields/ajax-customers.php:41
436
+ msgid "Search for a customer..."
437
+ msgstr ""
438
+
439
+ #. translators: 1. user display name; 2. user ID; 3. user email.
440
+ #: templates/fields/ajax-customers.php:68
441
+ #: templates/fields/ajax-customers.php:79
442
+ msgid "%1$s (#%2$s &ndash; %3$s)"
443
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
444
+
445
+ #: templates/fields/ajax-posts.php:41
446
+ msgid "Search for a post..."
447
+ msgstr ""
448
+
449
+ #: templates/fields/ajax-products.php:16
450
+ msgid "Search for a product..."
451
+ msgstr ""
452
+
453
+ #: templates/fields/ajax-terms.php:41
454
+ msgid "Search for a category..."
455
+ msgstr ""
456
+
457
+ #: templates/fields/customtabs.php:17
458
+ msgid "Close all"
459
+ msgstr "Закрыть все"
460
+
461
+ #: templates/fields/customtabs.php:17
462
+ msgid "Expand all"
463
+ msgstr "Развернуть все"
464
+
465
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
466
+ msgid "Remove"
467
+ msgstr "Стереть"
468
+
469
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
470
+ msgid "Name"
471
+ msgstr "Имя"
472
+
473
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
474
+ msgid "Value"
475
+ msgstr "Значение"
476
+
477
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
478
+ msgid "Content of the tab. (HTML is supported)"
479
+ msgstr "Содержание вкладки. (Поддерживается HTML)"
480
+
481
+ #: templates/fields/customtabs.php:52
482
+ msgid "Add custom product tab"
483
+ msgstr "Добавить пользовательскую вкладку товара"
484
+
485
+ #: templates/fields/customtabs.php:93
486
+ msgid "Do you want to remove the custom tab?"
487
+ msgstr "Вы хотите удалить пользовательскую вкладку?"
488
+
489
+ #: templates/fields/date-format.php:65
490
+ msgid "Custom:"
491
+ msgstr "Обычай:"
492
+
493
+ #: templates/fields/date-format.php:70
494
+ msgid "Preview:"
495
+ msgstr "Предпросмотр:"
496
+
497
+ #: templates/fields/icons.php:78
498
+ msgid "Set Default"
499
+ msgstr "Установить по умолчанию"
500
+
501
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
502
+ msgid "Delete image"
503
+ msgstr "Удалить Излображение"
504
+
505
+ #: templates/fields/image-gallery.php:37
506
+ msgid "Add Images to Gallery"
507
+ msgstr "Добавить Изображения в Галерею"
508
+
509
+ #: templates/fields/image-gallery.php:38
510
+ msgid "Add to gallery"
511
+ msgstr "Добавить галерею"
512
+
513
+ #: templates/fields/image-gallery.php:39
514
+ msgid "Add images"
515
+ msgstr "Добавить Изображения"
516
+
517
+ #: templates/fields/image-gallery.php:41
518
+ msgid "Delete"
519
+ msgstr "Удалить"
520
+
521
+ #: templates/fields/select-buttons.php:19
522
+ msgid "Add All"
523
+ msgstr "Добавить Все"
524
+
525
+ #: templates/fields/select-buttons.php:20
526
+ msgid "Remove All"
527
+ msgstr "Стереть Все"
528
+
529
+ #: templates/fields/sidebars.php:20
530
+ msgid "Left sidebar"
531
+ msgstr "Левая боковая панель"
532
+
533
+ #: templates/fields/sidebars.php:23
534
+ msgid "Right sidebar"
535
+ msgstr "Правая боковая панель"
536
+
537
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
538
+ msgid "No sidebar"
539
+ msgstr "Без боковой панели"
540
+
541
+ #: templates/fields/sidebars.php:39
542
+ msgid "Left Sidebar"
543
+ msgstr "Левая Боковая панель"
544
+
545
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
546
+ msgid "Choose a sidebar"
547
+ msgstr "Выберите боковую панель"
548
+
549
+ #: templates/fields/sidebars.php:54
550
+ msgid "Right Sidebar"
551
+ msgstr "Правая Боковая панель"
552
+
553
+ #: templates/fields/upload.php:34
554
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
555
+ msgid "Upload"
556
+ msgstr "Загрузить"
557
+
558
+ #: templates/fields/upload.php:39
559
+ msgid "Reset"
560
+ msgstr "Сброс"
561
+
562
+ #. translators: %s is the plugin version.
563
+ #: templates/panel/welcome-modals/update.php:34
564
+ msgid "is successfully updated to version %s."
565
+ msgstr ""
566
+
567
+ #. translators: %s is the plugin version.
568
+ #: templates/panel/welcome-modals/update.php:44
569
+ msgid "What's new in version %s"
570
+ msgstr ""
571
+
572
+ #: templates/panel/welcome-modals/update.php:49
573
+ msgid "Check the changelog >"
574
+ msgstr ""
575
+
576
+ #: templates/panel/welcome-modals/update.php:64
577
+ #: templates/panel/welcome-modals/welcome.php:60
578
+ msgid "Got it, close this window"
579
+ msgstr ""
580
+
581
+ #: templates/panel/welcome-modals/welcome.php:30
582
+ msgid "Thank you for using our plugin"
583
+ msgstr ""
584
+
585
+ #. translators: %s is the number of steps.
586
+ #: templates/panel/welcome-modals/welcome.php:45
587
+ msgid "Start with these %s steps:"
588
+ msgstr ""
589
+
590
+ #: templates/panel/woocommerce/woocommerce-form.php:29
591
+ #: templates/panel/woocommerce/woocommerce-form.php:33
592
+ msgid "Save Options"
593
+ msgstr "Сохранить Настройки"
594
+
595
+ #: templates/panel/woocommerce/woocommerce-form.php:33
596
+ msgid "Options Saved"
597
+ msgstr "Настройки Сохранены"
598
+
599
+ #: templates/panel/woocommerce/woocommerce-form.php:43
600
+ msgid "Reset Defaults"
601
+ msgstr "Сброс до настроек по умолчанию"
602
+
603
+ #: templates/sysinfo/system-information-panel.php:12
604
+ msgid "PHPInfo"
605
+ msgstr "PHPInfo"
606
+
607
+ #: templates/sysinfo/system-information-panel.php:13
608
+ #: templates/sysinfo/tabs/error-log.php:25
609
+ msgid "Log Files"
610
+ msgstr "Файлы журнала"
611
+
612
+ #: templates/sysinfo/system-information-panel.php:22
613
+ msgid "YITH System Information"
614
+ msgstr "Системная информация YITH"
615
+
616
+ #: templates/sysinfo/tabs/error-log.php:13
617
+ msgid "WP debug.log file"
618
+ msgstr "WP debug.log file"
619
+
620
+ #: templates/sysinfo/tabs/error-log.php:18
621
+ msgid "PHP error_log file"
622
+ msgstr "PHP error_log file"
623
+
624
+ #: templates/sysinfo/tabs/error-log.php:60
625
+ msgid "Download"
626
+ msgstr "Загрузка"
627
+
628
+ #: templates/sysinfo/tabs/error-log.php:73
629
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
630
+ msgstr "Размер файла превышает 8 мегабайт, поэтому его необходимо загрузить"
631
+
632
+ #. translators: %s file name.
633
+ #: templates/sysinfo/tabs/error-log.php:97
634
+ msgid ""
635
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
636
+ "file of your installation"
637
+ msgstr ""
638
+ "Файл журнала недоступен. Включите отладку WordPress, добавив следующее в "
639
+ "файл %s вашей установки"
640
+
641
+ #: templates/sysinfo/tabs/error-log.php:106
642
+ msgid "Copied!"
643
+ msgstr "Скопирован!"
644
+
645
+ #: templates/sysinfo/tabs/error-log.php:106
646
+ msgid "Copy Code"
647
+ msgstr "Копировать Код"
648
+
649
+ #: templates/sysinfo/tabs/main.php:17
650
+ msgid "Site Info"
651
+ msgstr "Информация о сайте"
652
+
653
+ #: templates/sysinfo/tabs/main.php:22
654
+ msgid "Site URL"
655
+ msgstr "Адрес сайта"
656
+
657
+ #: templates/sysinfo/tabs/main.php:31
658
+ msgid "Output IP Address"
659
+ msgstr "Выходной IP-адрес"
660
+
661
+ #: templates/sysinfo/tabs/main.php:39
662
+ msgid "Defined WP_CACHE"
663
+ msgstr "Определён WP_CACHE"
664
+
665
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
666
+ msgid "Yes"
667
+ msgstr "Да"
668
+
669
+ #: templates/sysinfo/tabs/main.php:47
670
+ msgid "External object cache"
671
+ msgstr "Кэш внешних объектов"
672
+
673
+ #: templates/sysinfo/tabs/main.php:55
674
+ msgid "YITH Plugin Framework Version"
675
+ msgstr "Версия YITH Plugin Framework"
676
+
677
+ #. translators: %s is the name of the plugin that is loading the framework.
678
+ #: templates/sysinfo/tabs/main.php:64
679
+ msgid "loaded by %s"
680
+ msgstr "загружен %s"
681
+
682
+ #: templates/sysinfo/tabs/main.php:73
683
+ msgid "Plugins Requirements"
684
+ msgstr "Требования к Плагинам"
685
+
686
+ #: templates/sysinfo/tabs/main.php:108
687
+ msgid "Database Info"
688
+ msgstr "Информация о БД"
689
+
690
+ #: templates/sysinfo/tabs/main.php:113
691
+ msgid "MySQL version"
692
+ msgstr "Версия MySQL"
693
+
694
+ #. Translators: %s: Codex link.
695
+ #: templates/sysinfo/tabs/main.php:123
696
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
697
+ msgstr "WordPress рекомендует минимальную версию MySQL 5.6. См: %s"
698
+
699
+ #: templates/sysinfo/tabs/main.php:123
700
+ msgid "WordPress requirements"
701
+ msgstr "Требования WordPress"
702
+
703
+ #: templates/sysinfo/tabs/main.php:130
704
+ msgid "Total Database Size"
705
+ msgstr "Общий размер базы данных"
706
+
707
+ #: templates/sysinfo/tabs/main.php:138
708
+ msgid "Database Data Size"
709
+ msgstr "Размер данных базы данных"
710
+
711
+ #: templates/sysinfo/tabs/main.php:146
712
+ msgid "Database Index Size"
713
+ msgstr "Размер индекса базы данных "
714
+
715
+ #: templates/sysinfo/tabs/main.php:154
716
+ msgid "Database Free Size"
717
+ msgstr "Свободный размер базы данных"
718
+
719
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
720
+ #. Engine.
721
+ #: templates/sysinfo/tabs/main.php:168
722
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
723
+ msgstr ""
724
+ "Данные: %1$.2fMB | Индекс: %2$.2fMB | Свободно: %3$.2fMB | Движок: %4$s"
725
+
726
+ #. translators: %s is the title of the post object.
727
+ #: yit-functions.php:1938
728
+ msgid "Are you sure you want to move \"%s\" to trash?"
729
+ msgstr "Вы уверены, что хотите переместить в корзину \"%s\"?"
730
+
731
+ #. translators: %s is the title of the post object.
732
+ #: yit-functions.php:1940 yit-functions.php:2100
733
+ msgid "Are you sure you want to delete \"%s\"?"
734
+ msgstr "Вы уверены, что хотите удалить \"%s\"?"
735
+
736
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
737
+ msgid "Further actions"
738
+ msgstr "Дальнейшие действия"
739
+
740
+ #: yit-plugin.php:233
741
+ msgid "License"
742
+ msgstr "Лицензия"
743
+
744
+ #. translators: 1. Plugin(s) name(s).
745
+ #: yit-plugin.php:272
746
+ msgid ""
747
+ "%s was deactivated as you're running an higher tier version of the same "
748
+ "plugin."
749
+ msgid_plural ""
750
+ "%s were deactivated as you're running higher tier versions of the same "
751
+ "plugins."
752
+ msgstr[0] ""
753
+ msgstr[1] ""
754
+ msgstr[2] ""
755
+
756
+ #. Author of the plugin/theme
757
+ msgid "YITH"
758
+ msgstr "YITH"
759
+
760
+ #. translators: %s it the Elementor Widget title.
761
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
762
+ msgctxt "Elementor Widget - section title"
763
+ msgid "%s - Options"
764
+ msgstr "%s - Параметры"
765
+
766
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
767
+ msgctxt "[gutenberg]: Category Name"
768
+ msgid "YITH"
769
+ msgstr "YITH"
770
+
771
+ #: includes/class-yit-assets.php:136
772
+ msgctxt "Button text"
773
+ msgid "Confirm"
774
+ msgstr "Подтвердить"
775
+
776
+ #: includes/class-yit-assets.php:137
777
+ msgctxt "Button text"
778
+ msgid "Cancel"
779
+ msgstr "Отмена"
780
+
781
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
782
+ msgctxt "Trash confirmation action"
783
+ msgid "Yes, move to trash"
784
+ msgstr "Да, удалить в корзину"
785
+
786
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
787
+ #: yit-functions.php:2154
788
+ msgctxt "Delete confirmation action"
789
+ msgid "Yes, delete"
790
+ msgstr "Да, удалить"
791
+
792
+ #. translators: 1. Plugin name.
793
+ #: includes/class-yit-plugin-panel.php:804
794
+ msgctxt "Help tab default title"
795
+ msgid "Thank you for purchasing %s!"
796
+ msgstr "Благодарим вас за покупку %s!"
797
+
798
+ #: includes/class-yit-plugin-panel.php:804
799
+ msgctxt "Help tab default title"
800
+ msgid "Thank you for using %s!"
801
+ msgstr ""
802
+
803
+ #: includes/class-yit-plugin-panel.php:812
804
+ msgctxt "Help tab default description"
805
+ msgid ""
806
+ "We want to help you enjoy a wonderful experience with all of our products."
807
+ msgstr ""
808
+ "Мы хотим помочь вам получить удовольствие от использования всех наших "
809
+ "продуктов."
810
+
811
+ #: includes/class-yit-plugin-panel.php:863
812
+ msgctxt "Premium tab name"
813
+ msgid "Get premium"
814
+ msgstr "Получите премиум"
815
+
816
+ #: includes/class-yit-plugin-panel.php:875
817
+ msgctxt "Help tab name"
818
+ msgid "Help"
819
+ msgstr "Помощь"
820
+
821
+ #: includes/class-yith-dashboard.php:96
822
+ msgctxt "Plugin FW"
823
+ msgid "View Changelog"
824
+ msgstr "Посмотреть журнал изменений"
825
+
826
+ #: includes/class-yith-dashboard.php:97
827
+ msgctxt "Plugin FW"
828
+ msgid "Latest update released on"
829
+ msgstr "Последнее обновление выпущено на"
830
+
831
+ #: includes/class-yith-dashboard.php:137
832
+ msgctxt "Button label"
833
+ msgid "Close"
834
+ msgstr "Закрыть"
835
+
836
+ #: includes/privacy/class-yith-privacy.php:61
837
+ msgctxt "Privacy Policy Guide Title"
838
+ msgid "YITH Plugins"
839
+ msgstr "Плагины YITH"
840
+
841
+ #: includes/privacy/class-yith-privacy.php:93
842
+ msgctxt "Privacy Policy Content"
843
+ msgid ""
844
+ "This sample language includes the basics around what personal data your "
845
+ "store may be collecting, storing and sharing, as well as who may have access "
846
+ "to that data. Depending on what settings are enabled and which additional "
847
+ "plugins are used, the specific information shared by your store will vary. "
848
+ "We recommend consulting with a lawyer when deciding what information to "
849
+ "disclose on your privacy policy."
850
+ msgstr ""
851
+ "Этот образец формулировки включает в себя основные положения о том, какие "
852
+ "личные данные может собирать, хранить и передавать ваш магазин, а также кто "
853
+ "может иметь доступ к этим данным. В зависимости от того, какие настройки "
854
+ "включены и какие дополнительные плагины используются, конкретная информация, "
855
+ "передаваемая вашим магазином, будет отличаться. Мы рекомендуем "
856
+ "проконсультироваться с юристом при принятии решения о том, какую информацию "
857
+ "раскрывать в политике конфиденциальности."
858
+
859
+ #: includes/privacy/class-yith-privacy.php:97
860
+ msgctxt "Privacy Policy Content"
861
+ msgid "What we collect and store"
862
+ msgstr "Что мы собираем и храним"
863
+
864
+ #: includes/privacy/class-yith-privacy.php:100
865
+ msgctxt "Privacy Policy Content"
866
+ msgid "Who on our team has access"
867
+ msgstr "Кто в нашей команде имеет доступ"
868
+
869
+ #: includes/privacy/class-yith-privacy.php:103
870
+ msgctxt "Privacy Policy Content"
871
+ msgid "What we share with others"
872
+ msgstr "Чем мы делимся с другими"
873
+
874
+ #: includes/privacy/class-yith-privacy.php:106
875
+ msgctxt "Privacy Policy Content"
876
+ msgid "Payments"
877
+ msgstr "Оплата"
878
+
879
+ #: templates/fields/copy-to-clipboard.php:41
880
+ msgctxt "Copy-to-clipboard message"
881
+ msgid "Copied!"
882
+ msgstr "Скопировано!"
883
+
884
+ #: templates/fields/copy-to-clipboard.php:45
885
+ msgctxt "Copy-to-clipboard button text"
886
+ msgid "Copy"
887
+ msgstr "Копировать"
888
+
889
+ #: templates/fields/dimensions.php:13
890
+ msgctxt "Position in the \"Dimensions\" field"
891
+ msgid "Top"
892
+ msgstr "Сверху"
893
+
894
+ #: templates/fields/dimensions.php:14
895
+ msgctxt "Position in the \"Dimensions\" field"
896
+ msgid "Right"
897
+ msgstr "Справа"
898
+
899
+ #: templates/fields/dimensions.php:15
900
+ msgctxt "Position in the \"Dimensions\" field"
901
+ msgid "Bottom"
902
+ msgstr "Снизу"
903
+
904
+ #: templates/fields/dimensions.php:16
905
+ msgctxt "Position in the \"Dimensions\" field"
906
+ msgid "Left"
907
+ msgstr "Слева"
908
+
909
+ #: templates/fields/dimensions.php:94
910
+ msgctxt "Tooltip in the \"Dimensions\" field"
911
+ msgid "Link values together"
912
+ msgstr "Свяжите ценности вместе"
913
+
914
+ #: templates/fields/image-dimensions.php:18
915
+ msgctxt "Image width field label"
916
+ msgid "Width"
917
+ msgstr "Ширина"
918
+
919
+ #: templates/fields/image-dimensions.php:23
920
+ msgctxt "Image height field label"
921
+ msgid "Height"
922
+ msgstr "Высота"
923
+
924
+ #: templates/fields/onoff.php:28
925
+ msgctxt "YES/NO button: use MAX 4 characters!"
926
+ msgid "YES"
927
+ msgstr "ДА"
928
+
929
+ #: templates/fields/onoff.php:29
930
+ msgctxt "YES/NO button: use MAX 4 characters!"
931
+ msgid "NO"
932
+ msgstr "НЕТ"
933
+
934
+ #. translators: 1. Url to EN playlist.
935
+ #: templates/panel/help-tab.php:89
936
+ msgctxt "Help tab view all video link"
937
+ msgid ""
938
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
939
+ "learn more >"
940
+ msgstr ""
941
+ "Посмотрите полный <a href=\"%s\" target=\"_blank\">плейлист на Youtube</a>, "
942
+ "чтобы узнать больше >"
943
+
944
+ #: templates/panel/help-tab.php:96
945
+ msgctxt "Help tab Watch Videotutorials link"
946
+ msgid "Videos are also available in:"
947
+ msgstr "Видеоматериалы также доступны в:"
948
+
949
+ #: templates/panel/help-tab.php:126
950
+ msgctxt "Help tab Read Documentation link"
951
+ msgid "Read the documentation"
952
+ msgstr "Прочтите документацию"
953
+
954
+ #: templates/panel/help-tab.php:129
955
+ msgctxt "Help tab Read Documentation link"
956
+ msgid "to learn how the plugin works from the basics."
957
+ msgstr ""
958
+
959
+ #: templates/panel/help-tab.php:139
960
+ msgctxt "Help tab Watch video tutorials link"
961
+ msgid "Watch our video tutorials"
962
+ msgstr "Посмотрите наши видеоуроки"
963
+
964
+ #: templates/panel/help-tab.php:142
965
+ msgctxt "Help tab Watch video tutorials link"
966
+ msgid "to see some helpful use cases."
967
+ msgstr ""
968
+
969
+ #: templates/panel/help-tab.php:152
970
+ msgctxt "Help tab view FAQs link"
971
+ msgid "Check the FAQs"
972
+ msgstr "Проверьте ответы на часто задаваемые вопросы"
973
+
974
+ #: templates/panel/help-tab.php:155
975
+ msgctxt "Help tab view FAQs link"
976
+ msgid "to find answers to your doubts."
977
+ msgstr "найти ответы на свои сомнения."
978
+
979
+ #: templates/panel/help-tab.php:170
980
+ msgctxt "Help tab FAQ title"
981
+ msgid "Last FAQs in our Help Center"
982
+ msgstr "Последние часто задаваемые вопросы в нашем Справочном Центре"
983
+
984
+ #: templates/panel/help-tab.php:184
985
+ msgctxt "Help tab FAQ link"
986
+ msgid "View all FAQs >"
987
+ msgstr "Просмотреть все часто задаваемые вопросы >"
988
+
989
+ #: templates/panel/help-tab.php:193
990
+ msgctxt "Help tab submit ticket title"
991
+ msgid "Need help?"
992
+ msgstr "Нужна помощь?"
993
+
994
+ #: templates/panel/help-tab.php:196
995
+ msgctxt "Help tab submit ticket description"
996
+ msgid ""
997
+ "If you are experiencing any technical issues, ask for help from our "
998
+ "developers. Submit a ticket through our support desk and we will help you as "
999
+ "soon as possible."
1000
+ msgstr ""
1001
+ "Если у вас возникли технические проблемы, обратитесь за помощью к нашим "
1002
+ "разработчикам. Отправьте заявку через нашу службу поддержки, и мы поможем "
1003
+ "вам как можно скорее."
1004
+
1005
+ #: templates/panel/help-tab.php:204
1006
+ msgctxt "Help tab submit ticket button"
1007
+ msgid "Submit a ticket"
1008
+ msgstr "Отправить обращение"
1009
+
1010
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
1011
+ #: templates/panel/help-tab.php:223
1012
+ msgctxt "Help tab documentation"
1013
+ msgid "Read the plugin documentation"
1014
+ msgstr ""
1015
+
1016
+ #: templates/panel/help-tab.php:220
1017
+ msgctxt "Help tab documentation"
1018
+ msgid "to learn how it works from the basics."
1019
+ msgstr ""
1020
+
1021
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
1022
+ msgctxt "Help tab support"
1023
+ msgid "Need some help?"
1024
+ msgstr ""
1025
+
1026
+ #: templates/panel/help-tab.php:235
1027
+ msgctxt "Help tab support"
1028
+ msgid "From DIY to full-service help"
1029
+ msgstr ""
1030
+
1031
+ #: templates/panel/help-tab.php:238
1032
+ msgctxt "Help tab support"
1033
+ msgid ""
1034
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1035
+ "site."
1036
+ msgstr ""
1037
+
1038
+ #: templates/panel/help-tab.php:241
1039
+ msgctxt "Help tab support"
1040
+ msgid "Yes, I need help"
1041
+ msgstr ""
1042
+
1043
+ #: templates/panel/premium-tab.php:30
1044
+ msgctxt "Premium Tab"
1045
+ msgid "Get the premium version to unlock advanced features"
1046
+ msgstr "Получите премиум-версию, чтобы разблокировать расширенные возможности"
1047
+
1048
+ #: templates/panel/premium-tab.php:34
1049
+ msgctxt "Premium Tab"
1050
+ msgid "Get premium"
1051
+ msgstr "Получите премиум"
1052
+
1053
+ #: templates/panel/premium-tab.php:39
1054
+ msgctxt "Premium Tab"
1055
+ msgid "Plugin premium features images"
1056
+ msgstr "Изображения премиум-функций плагина"
1057
+
1058
+ #. translators: alt attribute of main image tag.
1059
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1060
+ msgctxt "Premium Tab"
1061
+ msgid "And so much more!"
1062
+ msgstr "И многое другое!"
1063
+
1064
+ #: templates/panel/premium-tab.php:53
1065
+ msgctxt "Premium Tab"
1066
+ msgid "Check the premium features >"
1067
+ msgstr ""
1068
+
1069
+ #: templates/panel/premium-tab.php:60
1070
+ msgctxt "Premium Tab"
1071
+ msgid "Check the free vs premium features >"
1072
+ msgstr "Проверьте бесплатные и премиум функции >"
1073
+
1074
+ #: templates/panel/premium-tab.php:65
1075
+ msgctxt "Premium Tab"
1076
+ msgid "Get the premium version"
1077
+ msgstr "Получите премиум-версию"
1078
+
1079
+ #: yit-functions.php:1952
1080
+ msgctxt "Post action"
1081
+ msgid "Preview"
1082
+ msgstr "Предварительный просмотр"
1083
+
1084
+ #: yit-functions.php:1961
1085
+ msgctxt "Post action"
1086
+ msgid "View"
1087
+ msgstr "Просмотреть"
1088
+
1089
+ #: yit-functions.php:1972
1090
+ msgctxt "Post action"
1091
+ msgid "Edit"
1092
+ msgstr "Изменить"
1093
+
1094
+ #: yit-functions.php:1980
1095
+ msgctxt "Post action"
1096
+ msgid "Duplicate"
1097
+ msgstr "Дублировать"
1098
+
1099
+ #: yit-functions.php:1992
1100
+ msgctxt "Post action"
1101
+ msgid "Restore"
1102
+ msgstr "Восстановить"
1103
+
1104
+ #: yit-functions.php:2000
1105
+ msgctxt "Post action"
1106
+ msgid "Trash"
1107
+ msgstr "Корзина"
1108
+
1109
+ #: yit-functions.php:2017
1110
+ msgctxt "Post action"
1111
+ msgid "Delete Permanently"
1112
+ msgstr "Удалить навсегда"
1113
+
1114
+ #: yit-functions.php:2114
1115
+ msgctxt "Term action"
1116
+ msgid "View"
1117
+ msgstr "Просмотреть"
1118
+
1119
+ #: yit-functions.php:2124
1120
+ msgctxt "Term action"
1121
+ msgid "Edit"
1122
+ msgstr "Изменить"
1123
+
1124
+ #: yit-functions.php:2132
1125
+ msgctxt "Term action"
1126
+ msgid "Duplicate"
1127
+ msgstr "Дублировать"
1128
+
1129
+ #: yit-functions.php:2145
1130
+ msgctxt "Term action"
1131
+ msgid "Delete"
1132
+ msgstr "Удалить"
1133
+
1134
+ #: yit-plugin.php:85
1135
+ msgctxt "Plugin Row Meta"
1136
+ msgid "Live Demo"
1137
+ msgstr "Живая Демонстрация"
1138
+
1139
+ #: yit-plugin.php:89
1140
+ msgctxt "Plugin Row Meta"
1141
+ msgid "Documentation"
1142
+ msgstr "Документация"
1143
+
1144
+ #: yit-plugin.php:93
1145
+ msgctxt "Plugin Row Meta"
1146
+ msgid "Support"
1147
+ msgstr "Поддержка"
1148
+
1149
+ #: yit-plugin.php:97
1150
+ msgctxt "Plugin Row Meta"
1151
+ msgid "Premium version"
1152
+ msgstr "Премиум версия"
1153
+
1154
+ #: yit-plugin.php:229
1155
+ msgctxt "Action links"
1156
+ msgid "Settings"
1157
+ msgstr "Настройки"
plugin-fw/languages/yith-plugin-fw-zh_CN 2.mo ADDED
Binary file
plugin-fw/languages/yith-plugin-fw-zh_CN 2.po ADDED
@@ -0,0 +1,1129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of YITH Framework in Chinese
2
+ # This file is distributed under the same license as the YITH Framework package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: YITH Framework\n"
6
+ "Report-Msgid-Bugs-To: YITH <plugins@yithemes.com>\n"
7
+ "POT-Creation-Date: 2022-11-11 07:31:10+00:00\n"
8
+ "PO-Revision-Date: 2022-06-29 13:12:18+0000\n"
9
+ "Language: zh\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=1; plural=0;\n"
14
+ "X-Generator: GlotPress/3.0.0-alpha.2\n"
15
+
16
+ #: includes/class-yit-assets.php:148 yit-functions.php:2006
17
+ msgid "Confirm trash"
18
+ msgstr "確認丟棄"
19
+
20
+ #: includes/class-yit-assets.php:149
21
+ msgid "Are you sure you want to trash the selected items?"
22
+ msgstr "你確定要將所選的項目移至垃圾桶嗎?"
23
+
24
+ #: includes/class-yit-assets.php:151 includes/class-yit-assets.php:155
25
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
26
+ #: yit-functions.php:2008 yit-functions.php:2026
27
+ msgid "No"
28
+ msgstr "不"
29
+
30
+ #: includes/class-yit-assets.php:152 yit-functions.php:2024
31
+ #: yit-functions.php:2152
32
+ msgid "Confirm delete"
33
+ msgstr "確認刪除"
34
+
35
+ #: includes/class-yit-assets.php:153
36
+ msgid "Are you sure you want to delete the selected items?"
37
+ msgstr "你確定要刪除所選的項目嗎?"
38
+
39
+ #: includes/class-yit-assets.php:153 yit-functions.php:1940
40
+ #: yit-functions.php:2100
41
+ msgid ""
42
+ "This action cannot be undone and you will not be able to recover this data."
43
+ msgstr "此操作無法撤消,您將無法恢復此數據。"
44
+
45
+ #: includes/class-yit-assets.php:174
46
+ msgid "Clear"
47
+ msgstr "清除"
48
+
49
+ #: includes/class-yit-assets.php:175
50
+ msgid "Clear color"
51
+ msgstr "清除顏色"
52
+
53
+ #: includes/class-yit-assets.php:176
54
+ msgid "Default"
55
+ msgstr "預設"
56
+
57
+ #: includes/class-yit-assets.php:177
58
+ msgid "Select default color"
59
+ msgstr "選擇預設顏色"
60
+
61
+ #: includes/class-yit-assets.php:178
62
+ msgid "Select Color"
63
+ msgstr "選擇顏色"
64
+
65
+ #: includes/class-yit-assets.php:179
66
+ msgid "Color value"
67
+ msgstr "顏色數值"
68
+
69
+ #: includes/class-yit-help-desk.php:152
70
+ msgid "There was an error with your request; please try again later."
71
+ msgstr "您的請求有誤; 請稍後再試。"
72
+
73
+ #: includes/class-yit-plugin-panel-woocommerce.php:437
74
+ msgid "The changes you have made will be lost if you leave this page."
75
+ msgstr "如果你離開這個頁面,這些改變將會遺失"
76
+
77
+ #: includes/class-yit-plugin-panel.php:83
78
+ msgid "Plugin Settings"
79
+ msgstr "外掛設定"
80
+
81
+ #: includes/class-yit-plugin-panel.php:84
82
+ msgid "Settings"
83
+ msgstr "設定"
84
+
85
+ #: includes/class-yit-plugin-panel.php:456
86
+ #: includes/class-yit-plugin-panel.php:459
87
+ msgid "How to install premium version"
88
+ msgstr "如何安裝高級版"
89
+
90
+ #: includes/class-yit-plugin-panel.php:656
91
+ #: includes/class-yit-plugin-subpanel.php:133
92
+ msgid "Save Changes"
93
+ msgstr "儲存變更"
94
+
95
+ #: includes/class-yit-plugin-panel.php:664
96
+ #: includes/class-yit-plugin-subpanel.php:140
97
+ #: templates/panel/woocommerce/woocommerce-form.php:15
98
+ msgid ""
99
+ "If you continue with this action, you will reset all options in this page."
100
+ msgstr "如果你繼續這個動作,你將會重設這個頁面所有的選項"
101
+
102
+ #: includes/class-yit-plugin-panel.php:664
103
+ #: includes/class-yit-plugin-subpanel.php:140
104
+ #: templates/panel/woocommerce/woocommerce-form.php:15
105
+ msgid "Are you sure?"
106
+ msgstr "你確定嗎?"
107
+
108
+ #: includes/class-yit-plugin-panel.php:668
109
+ #: includes/class-yit-plugin-subpanel.php:143
110
+ msgid "Reset to default"
111
+ msgstr "重置為預設值"
112
+
113
+ #: includes/class-yit-plugin-panel.php:1039
114
+ msgid "Read the <mark>plugin documentation</mark>"
115
+ msgstr ""
116
+
117
+ #: includes/class-yit-plugin-panel.php:1040
118
+ msgid "Learn what you can really do with this powerful tool"
119
+ msgstr ""
120
+
121
+ #: includes/class-yit-plugin-panel.php:1050
122
+ msgid "Watch our <mark>\"First Steps\" video</mark>"
123
+ msgstr ""
124
+
125
+ #: includes/class-yit-plugin-panel.php:1051
126
+ msgid "See how it works before you start using it"
127
+ msgstr ""
128
+
129
+ #: includes/class-yit-plugin-panel.php:1307
130
+ msgid ""
131
+ "The element you have entered already exists. Please, enter another name."
132
+ msgstr "你輸入的這個元素已經存在,請輸入另一個名稱"
133
+
134
+ #: includes/class-yit-plugin-panel.php:1308
135
+ msgid "Settings saved"
136
+ msgstr "設定已經儲存"
137
+
138
+ #: includes/class-yit-plugin-panel.php:1309
139
+ msgid "Settings reset"
140
+ msgstr "重置設定"
141
+
142
+ #: includes/class-yit-plugin-panel.php:1310
143
+ msgid "Element deleted correctly."
144
+ msgstr "元素已被確實刪除"
145
+
146
+ #: includes/class-yit-plugin-panel.php:1311
147
+ #: includes/class-yit-plugin-panel.php:1312
148
+ msgid "Element updated correctly."
149
+ msgstr "元素已正確更新。"
150
+
151
+ #: includes/class-yit-plugin-panel.php:1313
152
+ msgid "Database imported correctly."
153
+ msgstr "資料庫已被正確匯入"
154
+
155
+ #: includes/class-yit-plugin-panel.php:1314
156
+ msgid "An error has occurred during import. Please try again."
157
+ msgstr "匯入過程中發生一個錯誤,請再試一次"
158
+
159
+ #: includes/class-yit-plugin-panel.php:1315
160
+ msgid "The added file is not valid."
161
+ msgstr "添加的檔案無效"
162
+
163
+ #: includes/class-yit-plugin-panel.php:1316
164
+ msgid "Sorry, import is disabled."
165
+ msgstr "抱歉,匯入功能被關閉"
166
+
167
+ #: includes/class-yit-plugin-panel.php:1317
168
+ msgid "Sorting successful."
169
+ msgstr "已順利排序"
170
+
171
+ #: includes/class-yit-plugin-panel.php:1806
172
+ msgid "We need your support"
173
+ msgstr "我們需要你的支援"
174
+
175
+ #: includes/class-yit-plugin-panel.php:1807
176
+ msgid "to keep updating and improving the plugin. Please,"
177
+ msgstr "請不斷保持更新與改進外掛"
178
+
179
+ #: includes/class-yit-plugin-panel.php:1809
180
+ msgid "help us by leaving a good review"
181
+ msgstr "留下好的評論幫助我們更進步"
182
+
183
+ #: includes/class-yit-plugin-panel.php:1810
184
+ msgid ":) Thanks!"
185
+ msgstr ":) 謝謝!"
186
+
187
+ #: includes/class-yit-pointers.php:80
188
+ msgid "Plugins Activated"
189
+ msgstr "外掛已啟動"
190
+
191
+ #: includes/class-yit-pointers.php:81
192
+ msgid ""
193
+ "From now on, you can find all plugin options in YITH menu. Plugin "
194
+ "customization settings will be available as a new entry in YITH menu."
195
+ msgstr ""
196
+ "從現在開始,您可以在 YITH 選單中找到所有外掛選項。 外掛預設在 YITH 選單下的新"
197
+ "項目。"
198
+
199
+ #. translators: 1. YITH site link; 2. WordPress site link.
200
+ #: includes/class-yit-pointers.php:84 includes/class-yit-pointers.php:100
201
+ msgid "Discover all our plugins available on: %1$s and %2$s"
202
+ msgstr "探索我們所有可用的外掛:%1$s 和 %2$s"
203
+
204
+ #: includes/class-yit-pointers.php:96
205
+ msgid "Plugins Upgraded"
206
+ msgstr "外掛已升級"
207
+
208
+ #: includes/class-yit-pointers.php:97
209
+ msgid ""
210
+ "From now on, you can find the option panel of YITH plugins in YITH menu. "
211
+ "Every time one of our plugins is added, a new entry will be added to this "
212
+ "menu. For example, after the update, plugin options (such as for YITH "
213
+ "WooCommerce Wishlist, YITH WooCommerce Ajax Search, etc.) will be moved from "
214
+ "previous location to YITH menu."
215
+ msgstr ""
216
+ "從現在開始,您可以在 YITH 選單中找到 YITH 外掛的選項面板。 每次添加我們的外掛"
217
+ "時,都會在此選單中添加一個新條目。 例如,更新後,外掛選項(例如 YITH "
218
+ "WooCommerce Wishlist、YITH WooCommerce Ajax 搜尋等)將從之前的位置移動到 "
219
+ "YITH 選單。"
220
+
221
+ #: includes/class-yith-bh-onboarding.php:85
222
+ msgid "It is not possible save the options"
223
+ msgstr ""
224
+
225
+ #: includes/class-yith-dashboard.php:35
226
+ msgid "YITH Latest Updates"
227
+ msgstr "YITH 最新更新"
228
+
229
+ #: includes/class-yith-dashboard.php:36
230
+ msgid "Latest news from YITH Blog"
231
+ msgstr "來自 YITH 部落格的最新消息"
232
+
233
+ #: includes/class-yith-dashboard.php:56
234
+ msgid "RSS Error:"
235
+ msgstr "RSS 錯誤:"
236
+
237
+ #: includes/class-yith-dashboard.php:63
238
+ msgid ""
239
+ "An error has occurred, which probably means the feed is down. Try again "
240
+ "later."
241
+ msgstr "發生錯誤,這可能意味著 Feed 已關閉。 稍後再試。"
242
+
243
+ #. translators: %s is the name of the post type (example Back to "Membership
244
+ #. Plans").
245
+ #: includes/class-yith-post-type-admin.php:286
246
+ msgid "Back to \"%s\""
247
+ msgstr "返回至 \"%s\""
248
+
249
+ #: includes/class-yith-post-type-admin.php:286
250
+ msgid "Back to the list"
251
+ msgstr "返回至列表"
252
+
253
+ #: includes/class-yith-system-status.php:110
254
+ msgid "WordPress Version"
255
+ msgstr "WordPress 版本"
256
+
257
+ #: includes/class-yith-system-status.php:111
258
+ msgid "WooCommerce Version"
259
+ msgstr "WooCommerce 版本"
260
+
261
+ #: includes/class-yith-system-status.php:112
262
+ msgid "Available Memory"
263
+ msgstr "可用記憶體"
264
+
265
+ #: includes/class-yith-system-status.php:113
266
+ msgid "PHP Version"
267
+ msgstr "PHP 版本"
268
+
269
+ #: includes/class-yith-system-status.php:114
270
+ msgid "TLS Version"
271
+ msgstr "TLS 版本"
272
+
273
+ #: includes/class-yith-system-status.php:115
274
+ msgid "WordPress Cron"
275
+ msgstr "WordPress Cron 工作排程"
276
+
277
+ #: includes/class-yith-system-status.php:116
278
+ msgid "SimpleXML"
279
+ msgstr "SimpleXML"
280
+
281
+ #: includes/class-yith-system-status.php:117
282
+ msgid "MultiByte String"
283
+ msgstr "MultiByte 字串"
284
+
285
+ #: includes/class-yith-system-status.php:118
286
+ msgid "ImageMagick Version"
287
+ msgstr "ImageMagick 版本"
288
+
289
+ #: includes/class-yith-system-status.php:119
290
+ msgid "GD Library"
291
+ msgstr "GD 圖形庫"
292
+
293
+ #: includes/class-yith-system-status.php:120
294
+ msgid "Iconv Module"
295
+ msgstr "Iconv 模組"
296
+
297
+ #: includes/class-yith-system-status.php:121
298
+ msgid "OPCache Save Comments"
299
+ msgstr "OPCache 儲存評論"
300
+
301
+ #: includes/class-yith-system-status.php:122
302
+ msgid "URL FOpen"
303
+ msgstr "URL FOpen"
304
+
305
+ #: includes/class-yith-system-status.php:140
306
+ #: includes/class-yith-system-status.php:141
307
+ #: templates/sysinfo/system-information-panel.php:11
308
+ msgid "System Status"
309
+ msgstr "系統狀態"
310
+
311
+ #: includes/class-yith-system-status.php:183
312
+ msgid "YITH Plugins"
313
+ msgstr "YITH 外掛"
314
+
315
+ #: includes/class-yith-system-status.php:191
316
+ msgid "WooCommerce"
317
+ msgstr "WooCommerce"
318
+
319
+ #: includes/class-yith-system-status.php:342
320
+ msgid "Warning!"
321
+ msgstr "警告!"
322
+
323
+ #. translators: %1$s open link tag, %2$s open link tag
324
+ #: includes/class-yith-system-status.php:346
325
+ msgid ""
326
+ "The system check has detected some compatibility issues on your installation."
327
+ "%1$sClick here%2$s to know more"
328
+ msgstr ""
329
+ "系統檢查檢測到您的安裝存在一些相容性問題。%1$s 點擊此處 %2$s 了解更多訊息"
330
+
331
+ #: includes/class-yith-system-status.php:496
332
+ msgid "Enabled"
333
+ msgstr "啟用"
334
+
335
+ #: includes/class-yith-system-status.php:496
336
+ msgid "Disabled"
337
+ msgstr "關閉"
338
+
339
+ #: includes/class-yith-system-status.php:501
340
+ msgid "N/A"
341
+ msgstr "不詳"
342
+
343
+ #. translators: %1$s plugin name, %2$s requirement name
344
+ #: includes/class-yith-system-status.php:528
345
+ msgid "%1$s needs %2$s enabled"
346
+ msgstr "%1$s 需要 %2$s 啟動"
347
+
348
+ #. translators: %1$s plugin name, %2$s required memory amount
349
+ #: includes/class-yith-system-status.php:531
350
+ msgid "%1$s needs at least %2$s of available memory"
351
+ msgstr "%1$s 需要最少 %2$s 的可用記憶體"
352
+
353
+ #. translators: %1$s plugin name, %2$s version number
354
+ #: includes/class-yith-system-status.php:534
355
+ msgid "%1$s needs at least %2$s version"
356
+ msgstr "%1$s 需要最低 %2$s 的版本"
357
+
358
+ #: includes/class-yith-system-status.php:558
359
+ msgid ""
360
+ "Update it to the latest version in order to benefit of all new features and "
361
+ "security updates."
362
+ msgstr "將其更新到最新版本,以便從所有新功能和安全更新中受益。"
363
+
364
+ #: includes/class-yith-system-status.php:562
365
+ #: includes/class-yith-system-status.php:568
366
+ msgid "Contact your hosting company in order to update it."
367
+ msgstr "聯絡您的網站主機托管公司進行更新"
368
+
369
+ #: includes/class-yith-system-status.php:566
370
+ msgid "Contact your hosting company in order to install it."
371
+ msgstr "聯絡您的網站主機托管公司進行安裝"
372
+
373
+ #. translators: %1$s code, %2$s file name
374
+ #: includes/class-yith-system-status.php:573
375
+ msgid "Remove %1$s from %2$s file"
376
+ msgstr "從 %1$s 到 %2$s 移除這些檔案"
377
+
378
+ #: includes/class-yith-system-status.php:581
379
+ msgid "Contact your hosting company in order to enable it."
380
+ msgstr "聯絡你的主機托管公司去啟動"
381
+
382
+ #. translators: %1$s opening link tag, %2$s closing link tag
383
+ #: includes/class-yith-system-status.php:585
384
+ #: includes/class-yith-system-status.php:608
385
+ msgid ""
386
+ "Read more %1$shere%2$s or contact your hosting company in order to increase "
387
+ "it."
388
+ msgstr "閱讀更多 %1$shere%2$s 或聯繫您的託管公司以增加它。"
389
+
390
+ #. translators: %s recommended memory amount
391
+ #: includes/class-yith-system-status.php:605
392
+ msgid ""
393
+ "For optimal functioning of our plugins, we suggest setting at least %s of "
394
+ "available memory"
395
+ msgstr "為了使我們的外掛發揮最佳功能,我們建議至少設置 %s 的可用記憶體"
396
+
397
+ #. translators: %1$s TLS label, %2$s cURL label
398
+ #: includes/class-yith-system-status.php:613
399
+ msgid ""
400
+ "The system check cannot determine which %1$s version is installed because "
401
+ "%2$s module is disabled. Ask your hosting company to enable it."
402
+ msgstr ""
403
+ "系統檢查無法確定安裝了哪個 %1$s 版本,因為 %2$s 模組已禁用。 要求您的主機託管"
404
+ "公司啟用它。"
405
+
406
+ #. translators: %1$s TLS label
407
+ #: includes/class-yith-system-status.php:616
408
+ msgid ""
409
+ "The system check cannot determine which %1$s version is installed due to a "
410
+ "connection issue between your site and our server."
411
+ msgstr ""
412
+ "由於您的網站和我們的伺服器之間的連接問題,系統檢查無法確定安裝了哪個 %1$s 版"
413
+ "本。"
414
+
415
+ #: templates/bh-onboarding/onboarding-tabs.php:63
416
+ msgid "Save"
417
+ msgstr ""
418
+
419
+ #: templates/fields/ajax-customers.php:41
420
+ msgid "Search for a customer..."
421
+ msgstr "搜尋顧客..."
422
+
423
+ #. translators: 1. user display name; 2. user ID; 3. user email.
424
+ #: templates/fields/ajax-customers.php:68
425
+ #: templates/fields/ajax-customers.php:79
426
+ msgid "%1$s (#%2$s &ndash; %3$s)"
427
+ msgstr "%1$s (#%2$s &ndash; %3$s)"
428
+
429
+ #: templates/fields/ajax-posts.php:41
430
+ msgid "Search for a post..."
431
+ msgstr "搜尋文章..."
432
+
433
+ #: templates/fields/ajax-products.php:16
434
+ msgid "Search for a product..."
435
+ msgstr "搜尋商品..."
436
+
437
+ #: templates/fields/ajax-terms.php:41
438
+ msgid "Search for a category..."
439
+ msgstr "搜尋分類..."
440
+
441
+ #: templates/fields/customtabs.php:17
442
+ msgid "Close all"
443
+ msgstr "全部關閉"
444
+
445
+ #: templates/fields/customtabs.php:17
446
+ msgid "Expand all"
447
+ msgstr "全部展開"
448
+
449
+ #: templates/fields/customtabs.php:25 templates/fields/customtabs.php:68
450
+ msgid "Remove"
451
+ msgstr "移除"
452
+
453
+ #: templates/fields/customtabs.php:34 templates/fields/customtabs.php:76
454
+ msgid "Name"
455
+ msgstr "名字"
456
+
457
+ #: templates/fields/customtabs.php:40 templates/fields/customtabs.php:81
458
+ msgid "Value"
459
+ msgstr "數值"
460
+
461
+ #: templates/fields/customtabs.php:41 templates/fields/customtabs.php:82
462
+ msgid "Content of the tab. (HTML is supported)"
463
+ msgstr "頁籤內容(支援 HTML)"
464
+
465
+ #: templates/fields/customtabs.php:52
466
+ msgid "Add custom product tab"
467
+ msgstr "增加自訂商品頁籤"
468
+
469
+ #: templates/fields/customtabs.php:93
470
+ msgid "Do you want to remove the custom tab?"
471
+ msgstr "請問你想要移除這個自訂的頁籤嗎?"
472
+
473
+ #: templates/fields/date-format.php:65
474
+ msgid "Custom:"
475
+ msgstr "自訂:"
476
+
477
+ #: templates/fields/date-format.php:70
478
+ msgid "Preview:"
479
+ msgstr "預覽:"
480
+
481
+ #: templates/fields/icons.php:78
482
+ msgid "Set Default"
483
+ msgstr "設成預設"
484
+
485
+ #: templates/fields/image-gallery.php:29 templates/fields/image-gallery.php:40
486
+ msgid "Delete image"
487
+ msgstr "刪除圖片"
488
+
489
+ #: templates/fields/image-gallery.php:37
490
+ msgid "Add Images to Gallery"
491
+ msgstr "增加圖片至藝廊"
492
+
493
+ #: templates/fields/image-gallery.php:38
494
+ msgid "Add to gallery"
495
+ msgstr "增加至藝廊"
496
+
497
+ #: templates/fields/image-gallery.php:39
498
+ msgid "Add images"
499
+ msgstr "增加圖片"
500
+
501
+ #: templates/fields/image-gallery.php:41
502
+ msgid "Delete"
503
+ msgstr "刪除"
504
+
505
+ #: templates/fields/select-buttons.php:19
506
+ msgid "Add All"
507
+ msgstr "增加全部"
508
+
509
+ #: templates/fields/select-buttons.php:20
510
+ msgid "Remove All"
511
+ msgstr "移除全部"
512
+
513
+ #: templates/fields/sidebars.php:20
514
+ msgid "Left sidebar"
515
+ msgstr "左側小工具"
516
+
517
+ #: templates/fields/sidebars.php:23
518
+ msgid "Right sidebar"
519
+ msgstr "右側小工具"
520
+
521
+ #: templates/fields/sidebars.php:26 templates/fields/sidebars.php:29
522
+ msgid "No sidebar"
523
+ msgstr "沒有小工具"
524
+
525
+ #: templates/fields/sidebars.php:39
526
+ msgid "Left Sidebar"
527
+ msgstr "左側小工具"
528
+
529
+ #: templates/fields/sidebars.php:41 templates/fields/sidebars.php:56
530
+ msgid "Choose a sidebar"
531
+ msgstr "選擇一個小工具"
532
+
533
+ #: templates/fields/sidebars.php:54
534
+ msgid "Right Sidebar"
535
+ msgstr "右側小工具"
536
+
537
+ #: templates/fields/upload.php:34
538
+ #: templates/panel/woocommerce/woocommerce-upload.php:37
539
+ msgid "Upload"
540
+ msgstr "上傳"
541
+
542
+ #: templates/fields/upload.php:39
543
+ msgid "Reset"
544
+ msgstr "重置"
545
+
546
+ #. translators: %s is the plugin version.
547
+ #: templates/panel/welcome-modals/update.php:34
548
+ msgid "is successfully updated to version %s."
549
+ msgstr ""
550
+
551
+ #. translators: %s is the plugin version.
552
+ #: templates/panel/welcome-modals/update.php:44
553
+ msgid "What's new in version %s"
554
+ msgstr ""
555
+
556
+ #: templates/panel/welcome-modals/update.php:49
557
+ msgid "Check the changelog >"
558
+ msgstr ""
559
+
560
+ #: templates/panel/welcome-modals/update.php:64
561
+ #: templates/panel/welcome-modals/welcome.php:60
562
+ msgid "Got it, close this window"
563
+ msgstr ""
564
+
565
+ #: templates/panel/welcome-modals/welcome.php:30
566
+ msgid "Thank you for using our plugin"
567
+ msgstr ""
568
+
569
+ #. translators: %s is the number of steps.
570
+ #: templates/panel/welcome-modals/welcome.php:45
571
+ msgid "Start with these %s steps:"
572
+ msgstr ""
573
+
574
+ #: templates/panel/woocommerce/woocommerce-form.php:29
575
+ #: templates/panel/woocommerce/woocommerce-form.php:33
576
+ msgid "Save Options"
577
+ msgstr "儲存選項"
578
+
579
+ #: templates/panel/woocommerce/woocommerce-form.php:33
580
+ msgid "Options Saved"
581
+ msgstr "選項已儲存"
582
+
583
+ #: templates/panel/woocommerce/woocommerce-form.php:43
584
+ msgid "Reset Defaults"
585
+ msgstr "重置為預設值"
586
+
587
+ #: templates/sysinfo/system-information-panel.php:12
588
+ msgid "PHPInfo"
589
+ msgstr "PHP 信息"
590
+
591
+ #: templates/sysinfo/system-information-panel.php:13
592
+ #: templates/sysinfo/tabs/error-log.php:25
593
+ msgid "Log Files"
594
+ msgstr "紀錄檔"
595
+
596
+ #: templates/sysinfo/system-information-panel.php:22
597
+ msgid "YITH System Information"
598
+ msgstr "YITH 系統信息"
599
+
600
+ #: templates/sysinfo/tabs/error-log.php:13
601
+ msgid "WP debug.log file"
602
+ msgstr "WP 除錯日誌檔"
603
+
604
+ #: templates/sysinfo/tabs/error-log.php:18
605
+ msgid "PHP error_log file"
606
+ msgstr "PHP 錯誤日誌檔"
607
+
608
+ #: templates/sysinfo/tabs/error-log.php:60
609
+ msgid "Download"
610
+ msgstr "下載"
611
+
612
+ #: templates/sysinfo/tabs/error-log.php:73
613
+ msgid "The file size exceeds 8 megabytes so it must be downloaded"
614
+ msgstr "檔案大小超過 8 兆位元,因此必須下載"
615
+
616
+ #. translators: %s file name.
617
+ #: templates/sysinfo/tabs/error-log.php:97
618
+ msgid ""
619
+ "No Log file available. Enable the WordPress debug by adding this in the %s "
620
+ "file of your installation"
621
+ msgstr ""
622
+ "沒有可用的日誌文件。 通過將其添加到安裝的 %s 文件中來啟用 WordPress 除錯"
623
+
624
+ #: templates/sysinfo/tabs/error-log.php:106
625
+ msgid "Copied!"
626
+ msgstr "已複製!"
627
+
628
+ #: templates/sysinfo/tabs/error-log.php:106
629
+ msgid "Copy Code"
630
+ msgstr "複製程式碼"
631
+
632
+ #: templates/sysinfo/tabs/main.php:17
633
+ msgid "Site Info"
634
+ msgstr "網站信息"
635
+
636
+ #: templates/sysinfo/tabs/main.php:22
637
+ msgid "Site URL"
638
+ msgstr "網站網址"
639
+
640
+ #: templates/sysinfo/tabs/main.php:31
641
+ msgid "Output IP Address"
642
+ msgstr "輸出 IP 位置"
643
+
644
+ #: templates/sysinfo/tabs/main.php:39
645
+ msgid "Defined WP_CACHE"
646
+ msgstr "已定義 WP_CACHE"
647
+
648
+ #: templates/sysinfo/tabs/main.php:42 templates/sysinfo/tabs/main.php:50
649
+ msgid "Yes"
650
+ msgstr "是"
651
+
652
+ #: templates/sysinfo/tabs/main.php:47
653
+ msgid "External object cache"
654
+ msgstr "外部物件快取"
655
+
656
+ #: templates/sysinfo/tabs/main.php:55
657
+ msgid "YITH Plugin Framework Version"
658
+ msgstr "YITH 外掛 Framework 版本"
659
+
660
+ #. translators: %s is the name of the plugin that is loading the framework.
661
+ #: templates/sysinfo/tabs/main.php:64
662
+ msgid "loaded by %s"
663
+ msgstr "讀取了 %s"
664
+
665
+ #: templates/sysinfo/tabs/main.php:73
666
+ msgid "Plugins Requirements"
667
+ msgstr "外掛需求"
668
+
669
+ #: templates/sysinfo/tabs/main.php:108
670
+ msgid "Database Info"
671
+ msgstr "資料庫信息"
672
+
673
+ #: templates/sysinfo/tabs/main.php:113
674
+ msgid "MySQL version"
675
+ msgstr "MySQL 版本"
676
+
677
+ #. Translators: %s: Codex link.
678
+ #: templates/sysinfo/tabs/main.php:123
679
+ msgid "WordPress recommends a minimum MySQL version of 5.6. See: %s"
680
+ msgstr "WordPress 建議至少要有 MySQL 5.6. 以上版本,請查看: %s"
681
+
682
+ #: templates/sysinfo/tabs/main.php:123
683
+ msgid "WordPress requirements"
684
+ msgstr "WordPress 要求"
685
+
686
+ #: templates/sysinfo/tabs/main.php:130
687
+ msgid "Total Database Size"
688
+ msgstr "總資料庫大小"
689
+
690
+ #: templates/sysinfo/tabs/main.php:138
691
+ msgid "Database Data Size"
692
+ msgstr "資料庫數據大小"
693
+
694
+ #: templates/sysinfo/tabs/main.php:146
695
+ msgid "Database Index Size"
696
+ msgstr "資料庫索引大小"
697
+
698
+ #: templates/sysinfo/tabs/main.php:154
699
+ msgid "Database Free Size"
700
+ msgstr "資料庫可用大小"
701
+
702
+ #. Translators: %1$f: Table size, %2$f: Index size, %3$f: Free size, %4$s
703
+ #. Engine.
704
+ #: templates/sysinfo/tabs/main.php:168
705
+ msgid "Data: %1$.2fMB | Index: %2$.2fMB | Free: %3$.2fMB | Engine: %4$s"
706
+ msgstr "資料數據: %1$.2fMB | 索引: %2$.2fMB | 可用: %3$.2fMB | 引擎: %4$s"
707
+
708
+ #. translators: %s is the title of the post object.
709
+ #: yit-functions.php:1938
710
+ msgid "Are you sure you want to move \"%s\" to trash?"
711
+ msgstr "您確定要將 \"%s\" 丟進垃圾桶嗎?"
712
+
713
+ #. translators: %s is the title of the post object.
714
+ #: yit-functions.php:1940 yit-functions.php:2100
715
+ msgid "Are you sure you want to delete \"%s\"?"
716
+ msgstr "您確定要刪除 \"%s\" 嗎?"
717
+
718
+ #: yit-functions.php:2038 yit-functions.php:2046 yit-functions.php:2163
719
+ msgid "Further actions"
720
+ msgstr "進一步動作"
721
+
722
+ #: yit-plugin.php:233
723
+ msgid "License"
724
+ msgstr "授權"
725
+
726
+ #. translators: 1. Plugin(s) name(s).
727
+ #: yit-plugin.php:272
728
+ msgid ""
729
+ "%s was deactivated as you're running an higher tier version of the same "
730
+ "plugin."
731
+ msgid_plural ""
732
+ "%s were deactivated as you're running higher tier versions of the same "
733
+ "plugins."
734
+ msgstr[0] ""
735
+
736
+ #. Author of the plugin/theme
737
+ msgid "YITH"
738
+ msgstr "YITH"
739
+
740
+ #. translators: %s it the Elementor Widget title.
741
+ #: includes/builders/elementor/class-yith-elementor-widget.php:252
742
+ msgctxt "Elementor Widget - section title"
743
+ msgid "%s - Options"
744
+ msgstr "%s - 選項"
745
+
746
+ #: includes/builders/gutenberg/class-yith-gutenberg.php:152
747
+ msgctxt "[gutenberg]: Category Name"
748
+ msgid "YITH"
749
+ msgstr "YITH"
750
+
751
+ #: includes/class-yit-assets.php:136
752
+ msgctxt "Button text"
753
+ msgid "Confirm"
754
+ msgstr "確認"
755
+
756
+ #: includes/class-yit-assets.php:137
757
+ msgctxt "Button text"
758
+ msgid "Cancel"
759
+ msgstr "取消"
760
+
761
+ #: includes/class-yit-assets.php:150 yit-functions.php:2009
762
+ msgctxt "Trash confirmation action"
763
+ msgid "Yes, move to trash"
764
+ msgstr "是的,將它移至垃圾桶"
765
+
766
+ #: includes/class-yit-assets.php:154 yit-functions.php:2027
767
+ #: yit-functions.php:2154
768
+ msgctxt "Delete confirmation action"
769
+ msgid "Yes, delete"
770
+ msgstr "是的,刪除"
771
+
772
+ #. translators: 1. Plugin name.
773
+ #: includes/class-yit-plugin-panel.php:804
774
+ msgctxt "Help tab default title"
775
+ msgid "Thank you for purchasing %s!"
776
+ msgstr "感謝您購買 %s !"
777
+
778
+ #: includes/class-yit-plugin-panel.php:804
779
+ msgctxt "Help tab default title"
780
+ msgid "Thank you for using %s!"
781
+ msgstr ""
782
+
783
+ #: includes/class-yit-plugin-panel.php:812
784
+ msgctxt "Help tab default description"
785
+ msgid ""
786
+ "We want to help you enjoy a wonderful experience with all of our products."
787
+ msgstr "我們希望幫助您享受我們所有產品的美妙體驗。"
788
+
789
+ #: includes/class-yit-plugin-panel.php:863
790
+ msgctxt "Premium tab name"
791
+ msgid "Get premium"
792
+ msgstr "取得高級版"
793
+
794
+ #: includes/class-yit-plugin-panel.php:875
795
+ msgctxt "Help tab name"
796
+ msgid "Help"
797
+ msgstr "幫助"
798
+
799
+ #: includes/class-yith-dashboard.php:96
800
+ msgctxt "Plugin FW"
801
+ msgid "View Changelog"
802
+ msgstr "查看修改紀錄"
803
+
804
+ #: includes/class-yith-dashboard.php:97
805
+ msgctxt "Plugin FW"
806
+ msgid "Latest update released on"
807
+ msgstr "最近一次更新於"
808
+
809
+ #: includes/class-yith-dashboard.php:137
810
+ msgctxt "Button label"
811
+ msgid "Close"
812
+ msgstr "關閉"
813
+
814
+ #: includes/privacy/class-yith-privacy.php:61
815
+ msgctxt "Privacy Policy Guide Title"
816
+ msgid "YITH Plugins"
817
+ msgstr "YITH 外掛"
818
+
819
+ #: includes/privacy/class-yith-privacy.php:93
820
+ msgctxt "Privacy Policy Content"
821
+ msgid ""
822
+ "This sample language includes the basics around what personal data your "
823
+ "store may be collecting, storing and sharing, as well as who may have access "
824
+ "to that data. Depending on what settings are enabled and which additional "
825
+ "plugins are used, the specific information shared by your store will vary. "
826
+ "We recommend consulting with a lawyer when deciding what information to "
827
+ "disclose on your privacy policy."
828
+ msgstr ""
829
+ "此示例語言包括有關您的商店可能收集、保存和共享哪些個人數據以及誰可以訪問該數"
830
+ "據的基礎知識。 根據啟用的設置和使用的附加外掛,您的商店共享的具體信息會有所不"
831
+ "同。 在決定在您的隱私政策中披露哪些信息時,我們建議您諮詢律師。"
832
+
833
+ #: includes/privacy/class-yith-privacy.php:97
834
+ msgctxt "Privacy Policy Content"
835
+ msgid "What we collect and store"
836
+ msgstr "我們收集和保存的內容"
837
+
838
+ #: includes/privacy/class-yith-privacy.php:100
839
+ msgctxt "Privacy Policy Content"
840
+ msgid "Who on our team has access"
841
+ msgstr "我們團隊中的哪些人有權訪問"
842
+
843
+ #: includes/privacy/class-yith-privacy.php:103
844
+ msgctxt "Privacy Policy Content"
845
+ msgid "What we share with others"
846
+ msgstr "我們與他人分享的內容"
847
+
848
+ #: includes/privacy/class-yith-privacy.php:106
849
+ msgctxt "Privacy Policy Content"
850
+ msgid "Payments"
851
+ msgstr "付款"
852
+
853
+ #: templates/fields/copy-to-clipboard.php:41
854
+ msgctxt "Copy-to-clipboard message"
855
+ msgid "Copied!"
856
+ msgstr "已複製!"
857
+
858
+ #: templates/fields/copy-to-clipboard.php:45
859
+ msgctxt "Copy-to-clipboard button text"
860
+ msgid "Copy"
861
+ msgstr "複製"
862
+
863
+ #: templates/fields/dimensions.php:13
864
+ msgctxt "Position in the \"Dimensions\" field"
865
+ msgid "Top"
866
+ msgstr "上"
867
+
868
+ #: templates/fields/dimensions.php:14
869
+ msgctxt "Position in the \"Dimensions\" field"
870
+ msgid "Right"
871
+ msgstr "右"
872
+
873
+ #: templates/fields/dimensions.php:15
874
+ msgctxt "Position in the \"Dimensions\" field"
875
+ msgid "Bottom"
876
+ msgstr "下"
877
+
878
+ #: templates/fields/dimensions.php:16
879
+ msgctxt "Position in the \"Dimensions\" field"
880
+ msgid "Left"
881
+ msgstr "左"
882
+
883
+ #: templates/fields/dimensions.php:94
884
+ msgctxt "Tooltip in the \"Dimensions\" field"
885
+ msgid "Link values together"
886
+ msgstr "一起連接的數值"
887
+
888
+ #: templates/fields/image-dimensions.php:18
889
+ msgctxt "Image width field label"
890
+ msgid "Width"
891
+ msgstr "寬"
892
+
893
+ #: templates/fields/image-dimensions.php:23
894
+ msgctxt "Image height field label"
895
+ msgid "Height"
896
+ msgstr "高"
897
+
898
+ #: templates/fields/onoff.php:28
899
+ msgctxt "YES/NO button: use MAX 4 characters!"
900
+ msgid "YES"
901
+ msgstr "是"
902
+
903
+ #: templates/fields/onoff.php:29
904
+ msgctxt "YES/NO button: use MAX 4 characters!"
905
+ msgid "NO"
906
+ msgstr "不"
907
+
908
+ #. translators: 1. Url to EN playlist.
909
+ #: templates/panel/help-tab.php:89
910
+ msgctxt "Help tab view all video link"
911
+ msgid ""
912
+ "Check the full <a href=\"%s\" target=\"_blank\">Playlist on Youtube</a> to "
913
+ "learn more >"
914
+ msgstr ""
915
+ "查看全部的 <a href=\"%s\" target=\"_blank\">Youtube</a> 播放清單去學習更多 >"
916
+
917
+ #: templates/panel/help-tab.php:96
918
+ msgctxt "Help tab Watch Videotutorials link"
919
+ msgid "Videos are also available in:"
920
+ msgstr "影片也可用於:"
921
+
922
+ #: templates/panel/help-tab.php:126
923
+ msgctxt "Help tab Read Documentation link"
924
+ msgid "Read the documentation"
925
+ msgstr "閱讀說明文件"
926
+
927
+ #: templates/panel/help-tab.php:129
928
+ msgctxt "Help tab Read Documentation link"
929
+ msgid "to learn how the plugin works from the basics."
930
+ msgstr "了解外掛的基礎工作原理"
931
+
932
+ #: templates/panel/help-tab.php:139
933
+ msgctxt "Help tab Watch video tutorials link"
934
+ msgid "Watch our video tutorials"
935
+ msgstr "查看我們的教學影片"
936
+
937
+ #: templates/panel/help-tab.php:142
938
+ msgctxt "Help tab Watch video tutorials link"
939
+ msgid "to see some helpful use cases."
940
+ msgstr "查看一些有用的案例"
941
+
942
+ #: templates/panel/help-tab.php:152
943
+ msgctxt "Help tab view FAQs link"
944
+ msgid "Check the FAQs"
945
+ msgstr "檢查問與答"
946
+
947
+ #: templates/panel/help-tab.php:155
948
+ msgctxt "Help tab view FAQs link"
949
+ msgid "to find answers to your doubts."
950
+ msgstr "找到你的問題答案"
951
+
952
+ #: templates/panel/help-tab.php:170
953
+ msgctxt "Help tab FAQ title"
954
+ msgid "Last FAQs in our Help Center"
955
+ msgstr "在我們的幫助中心的最新問答"
956
+
957
+ #: templates/panel/help-tab.php:184
958
+ msgctxt "Help tab FAQ link"
959
+ msgid "View all FAQs >"
960
+ msgstr "查看所有的問與答 >"
961
+
962
+ #: templates/panel/help-tab.php:193
963
+ msgctxt "Help tab submit ticket title"
964
+ msgid "Need help?"
965
+ msgstr "需要幫忙?"
966
+
967
+ #: templates/panel/help-tab.php:196
968
+ msgctxt "Help tab submit ticket description"
969
+ msgid ""
970
+ "If you are experiencing any technical issues, ask for help from our "
971
+ "developers. Submit a ticket through our support desk and we will help you as "
972
+ "soon as possible."
973
+ msgstr ""
974
+ "如果您遇到任何技術問題,請向我們的開發人員尋求幫助。 通過我們的支援後台提交工"
975
+ "作單,我們將盡快為您提供幫助。"
976
+
977
+ #: templates/panel/help-tab.php:204
978
+ msgctxt "Help tab submit ticket button"
979
+ msgid "Submit a ticket"
980
+ msgstr "提交一張工作單"
981
+
982
+ #: templates/panel/help-tab.php:216 templates/panel/help-tab.php:218
983
+ #: templates/panel/help-tab.php:223
984
+ msgctxt "Help tab documentation"
985
+ msgid "Read the plugin documentation"
986
+ msgstr ""
987
+
988
+ #: templates/panel/help-tab.php:220
989
+ msgctxt "Help tab documentation"
990
+ msgid "to learn how it works from the basics."
991
+ msgstr ""
992
+
993
+ #: templates/panel/help-tab.php:231 templates/panel/help-tab.php:233
994
+ msgctxt "Help tab support"
995
+ msgid "Need some help?"
996
+ msgstr ""
997
+
998
+ #: templates/panel/help-tab.php:235
999
+ msgctxt "Help tab support"
1000
+ msgid "From DIY to full-service help"
1001
+ msgstr ""
1002
+
1003
+ #: templates/panel/help-tab.php:238
1004
+ msgctxt "Help tab support"
1005
+ msgid ""
1006
+ "Call or chat 24/7 with our support agents, or let our experts build your "
1007
+ "site."
1008
+ msgstr ""
1009
+
1010
+ #: templates/panel/help-tab.php:241
1011
+ msgctxt "Help tab support"
1012
+ msgid "Yes, I need help"
1013
+ msgstr ""
1014
+
1015
+ #: templates/panel/premium-tab.php:30
1016
+ msgctxt "Premium Tab"
1017
+ msgid "Get the premium version to unlock advanced features"
1018
+ msgstr "取得高級版來解鎖進階的功能特色"
1019
+
1020
+ #: templates/panel/premium-tab.php:34
1021
+ msgctxt "Premium Tab"
1022
+ msgid "Get premium"
1023
+ msgstr "取得高級版"
1024
+
1025
+ #: templates/panel/premium-tab.php:39
1026
+ msgctxt "Premium Tab"
1027
+ msgid "Plugin premium features images"
1028
+ msgstr "高級版外掛特色圖片"
1029
+
1030
+ #. translators: alt attribute of main image tag.
1031
+ #: templates/panel/premium-tab.php:51 templates/panel/premium-tab.php:58
1032
+ msgctxt "Premium Tab"
1033
+ msgid "And so much more!"
1034
+ msgstr "還有更多!"
1035
+
1036
+ #: templates/panel/premium-tab.php:53
1037
+ msgctxt "Premium Tab"
1038
+ msgid "Check the premium features >"
1039
+ msgstr ""
1040
+
1041
+ #: templates/panel/premium-tab.php:60
1042
+ msgctxt "Premium Tab"
1043
+ msgid "Check the free vs premium features >"
1044
+ msgstr "查看免費板與高級版的特色比較"
1045
+
1046
+ #: templates/panel/premium-tab.php:65
1047
+ msgctxt "Premium Tab"
1048
+ msgid "Get the premium version"
1049
+ msgstr "取得高級版本"
1050
+
1051
+ #: yit-functions.php:1952
1052
+ msgctxt "Post action"
1053
+ msgid "Preview"
1054
+ msgstr "預覽"
1055
+
1056
+ #: yit-functions.php:1961
1057
+ msgctxt "Post action"
1058
+ msgid "View"
1059
+ msgstr "查看"
1060
+
1061
+ #: yit-functions.php:1972
1062
+ msgctxt "Post action"
1063
+ msgid "Edit"
1064
+ msgstr "編輯"
1065
+
1066
+ #: yit-functions.php:1980
1067
+ msgctxt "Post action"
1068
+ msgid "Duplicate"
1069
+ msgstr "複製"
1070
+
1071
+ #: yit-functions.php:1992
1072
+ msgctxt "Post action"
1073
+ msgid "Restore"
1074
+ msgstr "還原"
1075
+
1076
+ #: yit-functions.php:2000
1077
+ msgctxt "Post action"
1078
+ msgid "Trash"
1079
+ msgstr "垃圾桶"
1080
+
1081
+ #: yit-functions.php:2017
1082
+ msgctxt "Post action"
1083
+ msgid "Delete Permanently"
1084
+ msgstr "永久刪除"
1085
+
1086
+ #: yit-functions.php:2114
1087
+ msgctxt "Term action"
1088
+ msgid "View"
1089
+ msgstr "查看"
1090
+
1091
+ #: yit-functions.php:2124
1092
+ msgctxt "Term action"
1093
+ msgid "Edit"
1094
+ msgstr "編輯"
1095
+
1096
+ #: yit-functions.php:2132
1097
+ msgctxt "Term action"
1098
+ msgid "Duplicate"
1099
+ msgstr "複製"
1100
+
1101
+ #: yit-functions.php:2145
1102
+ msgctxt "Term action"
1103
+ msgid "Delete"
1104
+ msgstr "刪除"
1105
+
1106
+ #: yit-plugin.php:85
1107
+ msgctxt "Plugin Row Meta"
1108
+ msgid "Live Demo"
1109
+ msgstr "即時演示"
1110
+
1111
+ #: yit-plugin.php:89
1112
+ msgctxt "Plugin Row Meta"
1113
+ msgid "Documentation"
1114
+ msgstr "說明文件"
1115
+
1116
+ #: yit-plugin.php:93
1117
+ msgctxt "Plugin Row Meta"
1118
+ msgid "Support"
1119
+ msgstr "支援"
1120
+
1121
+ #: yit-plugin.php:97
1122
+ msgctxt "Plugin Row Meta"
1123
+ msgid "Premium version"
1124
+ msgstr "高級版本"
1125
+
1126
+ #: yit-plugin.php:229
1127
+ msgctxt "Action links"
1128
+ msgid "Settings"
1129
+ msgstr "設定"
plugin-fw/lib/privacy/yit-privacy 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../../includes/privacy/class-yith-privacy.php';
plugin-fw/lib/privacy/yit-privacy-plugin-abstract 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../../includes/privacy/class-yith-privacy-plugin-abstract.php';
plugin-fw/lib/yit-ajax 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-ajax.php';
plugin-fw/lib/yit-assets 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-assets.php';
plugin-fw/lib/yit-cpt-unlimited 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-cpt-unlimited.php';
plugin-fw/lib/yit-debug 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yith-debug.php';
plugin-fw/lib/yit-icons 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-icons.php';
plugin-fw/lib/yit-metabox 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-metabox.php';
plugin-fw/lib/yit-plugin-common 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-plugin-common.php';
plugin-fw/lib/yit-plugin-gradients 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-gradients.php';
plugin-fw/lib/yit-plugin-licence 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-plugin-licence.php';
plugin-fw/lib/yit-plugin-panel 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-plugin-panel.php';
plugin-fw/lib/yit-plugin-panel-wc 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-plugin-panel-woocommerce.php';
plugin-fw/lib/yit-plugin-subpanel 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-plugin-subpanel.php';
plugin-fw/lib/yit-pointers 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-pointers.php';
plugin-fw/lib/yit-theme-licence 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-theme-licence.php';
plugin-fw/lib/yit-upgrade 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-upgrade.php';
plugin-fw/lib/yit-video 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yit-video.php';
plugin-fw/lib/yith-dashboard 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yith-dashboard.php';
plugin-fw/lib/yith-gutenberg 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/builders/gutenberg/class-yith-gutenberg.php';
plugin-fw/lib/yith-system-status 2.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Deprecated file. Use the correct one in includes folder instead
4
+ *
5
+ * @package YITH\PluginFramework\Classes
6
+ */
7
+
8
+ /**
9
+ * Require the correct file
10
+ */
11
+ require_once __DIR__ . '/../includes/class-yith-system-status.php';
plugin-fw/license 2.txt ADDED
@@ -0,0 +1,740 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ YITH Plugin Framework
2
+
3
+ Copyright 2015-2021 Your Inspiration Solutions (email : plugins@yithemes.com)
4
+
5
+ This program is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
+
19
+ YITH Plugin Framework is released under the GPL
20
+
21
+ This program incorporates work covered by the following copyright and
22
+ permission notices:
23
+
24
+ node-md5 is Copyright (c) 2011-2015, Paul Vorbach - (c) 2009, Jeff Mott.
25
+ https://github.com/pvorb/node-md5
26
+ This package is licensed under the BSD 3-Clause "New" or "Revised" License (the complete text of this license is shown below):
27
+ https://github.com/pvorb/node-md5/blob/master/LICENSE
28
+
29
+ Wherever third party code has been used, credit has been given in the code's
30
+ comments.
31
+
32
+ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
33
+
34
+ GNU GENERAL PUBLIC LICENSE
35
+ Version 3, 29 June 2007
36
+
37
+ Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
38
+ Everyone is permitted to copy and distribute verbatim copies
39
+ of this license document, but changing it is not allowed.
40
+
41
+ Preamble
42
+
43
+ The GNU General Public License is a free, copyleft license for
44
+ software and other kinds of works.
45
+
46
+ The licenses for most software and other practical works are designed
47
+ to take away your freedom to share and change the works. By contrast,
48
+ the GNU General Public License is intended to guarantee your freedom to
49
+ share and change all versions of a program--to make sure it remains free
50
+ software for all its users. We, the Free Software Foundation, use the
51
+ GNU General Public License for most of our software; it applies also to
52
+ any other work released this way by its authors. You can apply it to
53
+ your programs, too.
54
+
55
+ When we speak of free software, we are referring to freedom, not
56
+ price. Our General Public Licenses are designed to make sure that you
57
+ have the freedom to distribute copies of free software (and charge for
58
+ them if you wish), that you receive source code or can get it if you
59
+ want it, that you can change the software or use pieces of it in new
60
+ free programs, and that you know you can do these things.
61
+
62
+ To protect your rights, we need to prevent others from denying you
63
+ these rights or asking you to surrender the rights. Therefore, you have
64
+ certain responsibilities if you distribute copies of the software, or if
65
+ you modify it: responsibilities to respect the freedom of others.
66
+
67
+ For example, if you distribute copies of such a program, whether
68
+ gratis or for a fee, you must pass on to the recipients the same
69
+ freedoms that you received. You must make sure that they, too, receive
70
+ or can get the source code. And you must show them these terms so they
71
+ know their rights.
72
+
73
+ Developers that use the GNU GPL protect your rights with two steps:
74
+ (1) assert copyright on the software, and (2) offer you this License
75
+ giving you legal permission to copy, distribute and/or modify it.
76
+
77
+ For the developers' and authors' protection, the GPL clearly explains
78
+ that there is no warranty for this free software. For both users' and
79
+ authors' sake, the GPL requires that modified versions be marked as
80
+ changed, so that their problems will not be attributed erroneously to
81
+ authors of previous versions.
82
+
83
+ Some devices are designed to deny users access to install or run
84
+ modified versions of the software inside them, although the manufacturer
85
+ can do so. This is fundamentally incompatible with the aim of
86
+ protecting users' freedom to change the software. The systematic
87
+ pattern of such abuse occurs in the area of products for individuals to
88
+ use, which is precisely where it is most unacceptable. Therefore, we
89
+ have designed this version of the GPL to prohibit the practice for those
90
+ products. If such problems arise substantially in other domains, we
91
+ stand ready to extend this provision to those domains in future versions
92
+ of the GPL, as needed to protect the freedom of users.
93
+
94
+ Finally, every program is threatened constantly by software patents.
95
+ States should not allow patents to restrict development and use of
96
+ software on general-purpose computers, but in those that do, we wish to
97
+ avoid the special danger that patents applied to a free program could
98
+ make it effectively proprietary. To prevent this, the GPL assures that
99
+ patents cannot be used to render the program non-free.
100
+
101
+ The precise terms and conditions for copying, distribution and
102
+ modification follow.
103
+
104
+ TERMS AND CONDITIONS
105
+
106
+ 0. Definitions.
107
+
108
+ "This License" refers to version 3 of the GNU General Public License.
109
+
110
+ "Copyright" also means copyright-like laws that apply to other kinds of
111
+ works, such as semiconductor masks.
112
+
113
+ "The Program" refers to any copyrightable work licensed under this
114
+ License. Each licensee is addressed as "you". "Licensees" and
115
+ "recipients" may be individuals or organizations.
116
+
117
+ To "modify" a work means to copy from or adapt all or part of the work
118
+ in a fashion requiring copyright permission, other than the making of an
119
+ exact copy. The resulting work is called a "modified version" of the
120
+ earlier work or a work "based on" the earlier work.
121
+
122
+ A "covered work" means either the unmodified Program or a work based
123
+ on the Program.
124
+
125
+ To "propagate" a work means to do anything with it that, without
126
+ permission, would make you directly or secondarily liable for
127
+ infringement under applicable copyright law, except executing it on a
128
+ computer or modifying a private copy. Propagation includes copying,
129
+ distribution (with or without modification), making available to the
130
+ public, and in some countries other activities as well.
131
+
132
+ To "convey" a work means any kind of propagation that enables other
133
+ parties to make or receive copies. Mere interaction with a user through
134
+ a computer network, with no transfer of a copy, is not conveying.
135
+
136
+ An interactive user interface displays "Appropriate Legal Notices"
137
+ to the extent that it includes a convenient and prominently visible
138
+ feature that (1) displays an appropriate copyright notice, and (2)
139
+ tells the user that there is no warranty for the work (except to the
140
+ extent that warranties are provided), that licensees may convey the
141
+ work under this License, and how to view a copy of this License. If
142
+ the interface presents a list of user commands or options, such as a
143
+ menu, a prominent item in the list meets this criterion.
144
+
145
+ 1. Source Code.
146
+
147
+ The "source code" for a work means the preferred form of the work
148
+ for making modifications to it. "Object code" means any non-source
149
+ form of a work.
150
+
151
+ A "Standard Interface" means an interface that either is an official
152
+ standard defined by a recognized standards body, or, in the case of
153
+ interfaces specified for a particular programming language, one that
154
+ is widely used among developers working in that language.
155
+
156
+ The "System Libraries" of an executable work include anything, other
157
+ than the work as a whole, that (a) is included in the normal form of
158
+ packaging a Major Component, but which is not part of that Major
159
+ Component, and (b) serves only to enable use of the work with that
160
+ Major Component, or to implement a Standard Interface for which an
161
+ implementation is available to the public in source code form. A
162
+ "Major Component", in this context, means a major essential component
163
+ (kernel, window system, and so on) of the specific operating system
164
+ (if any) on which the executable work runs, or a compiler used to
165
+ produce the work, or an object code interpreter used to run it.
166
+
167
+ The "Corresponding Source" for a work in object code form means all
168
+ the source code needed to generate, install, and (for an executable
169
+ work) run the object code and to modify the work, including scripts to
170
+ control those activities. However, it does not include the work's
171
+ System Libraries, or general-purpose tools or generally available free
172
+ programs which are used unmodified in performing those activities but
173
+ which are not part of the work. For example, Corresponding Source
174
+ includes interface definition files associated with source files for
175
+ the work, and the source code for shared libraries and dynamically
176
+ linked subprograms that the work is specifically designed to require,
177
+ such as by intimate data communication or control flow between those
178
+ subprograms and other parts of the work.
179
+
180
+ The Corresponding Source need not include anything that users
181
+ can regenerate automatically from other parts of the Corresponding
182
+ Source.
183
+
184
+ The Corresponding Source for a work in source code form is that
185
+ same work.
186
+
187
+ 2. Basic Permissions.
188
+
189
+ All rights granted under this License are granted for the term of
190
+ copyright on the Program, and are irrevocable provided the stated
191
+ conditions are met. This License explicitly affirms your unlimited
192
+ permission to run the unmodified Program. The output from running a
193
+ covered work is covered by this License only if the output, given its
194
+ content, constitutes a covered work. This License acknowledges your
195
+ rights of fair use or other equivalent, as provided by copyright law.
196
+
197
+ You may make, run and propagate covered works that you do not
198
+ convey, without conditions so long as your license otherwise remains
199
+ in force. You may convey covered works to others for the sole purpose
200
+ of having them make modifications exclusively for you, or provide you
201
+ with facilities for running those works, provided that you comply with
202
+ the terms of this License in conveying all material for which you do
203
+ not control copyright. Those thus making or running the covered works
204
+ for you must do so exclusively on your behalf, under your direction
205
+ and control, on terms that prohibit them from making any copies of
206
+ your copyrighted material outside their relationship with you.
207
+
208
+ Conveying under any other circumstances is permitted solely under
209
+ the conditions stated below. Sublicensing is not allowed; section 10
210
+ makes it unnecessary.
211
+
212
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
213
+
214
+ No covered work shall be deemed part of an effective technological
215
+ measure under any applicable law fulfilling obligations under article
216
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
217
+ similar laws prohibiting or restricting circumvention of such
218
+ measures.
219
+
220
+ When you convey a covered work, you waive any legal power to forbid
221
+ circumvention of technological measures to the extent such circumvention
222
+ is effected by exercising rights under this License with respect to
223
+ the covered work, and you disclaim any intention to limit operation or
224
+ modification of the work as a means of enforcing, against the work's
225
+ users, your or third parties' legal rights to forbid circumvention of
226
+ technological measures.
227
+
228
+ 4. Conveying Verbatim Copies.
229
+
230
+ You may convey verbatim copies of the Program's source code as you
231
+ receive it, in any medium, provided that you conspicuously and
232
+ appropriately publish on each copy an appropriate copyright notice;
233
+ keep intact all notices stating that this License and any
234
+ non-permissive terms added in accord with section 7 apply to the code;
235
+ keep intact all notices of the absence of any warranty; and give all
236
+ recipients a copy of this License along with the Program.
237
+
238
+ You may charge any price or no price for each copy that you convey,
239
+ and you may offer support or warranty protection for a fee.
240
+
241
+ 5. Conveying Modified Source Versions.
242
+
243
+ You may convey a work based on the Program, or the modifications to
244
+ produce it from the Program, in the form of source code under the
245
+ terms of section 4, provided that you also meet all of these conditions:
246
+
247
+ a) The work must carry prominent notices stating that you modified
248
+ it, and giving a relevant date.
249
+
250
+ b) The work must carry prominent notices stating that it is
251
+ released under this License and any conditions added under section
252
+ 7. This requirement modifies the requirement in section 4 to
253
+ "keep intact all notices".
254
+
255
+ c) You must license the entire work, as a whole, under this
256
+ License to anyone who comes into possession of a copy. This
257
+ License will therefore apply, along with any applicable section 7
258
+ additional terms, to the whole of the work, and all its parts,
259
+ regardless of how they are packaged. This License gives no
260
+ permission to license the work in any other way, but it does not
261
+ invalidate such permission if you have separately received it.
262
+
263
+ d) If the work has interactive user interfaces, each must display
264
+ Appropriate Legal Notices; however, if the Program has interactive
265
+ interfaces that do not display Appropriate Legal Notices, your
266
+ work need not make them do so.
267
+
268
+ A compilation of a covered work with other separate and independent
269
+ works, which are not by their nature extensions of the covered work,
270
+ and which are not combined with it such as to form a larger program,
271
+ in or on a volume of a storage or distribution medium, is called an
272
+ "aggregate" if the compilation and its resulting copyright are not
273
+ used to limit the access or legal rights of the compilation's users
274
+ beyond what the individual works permit. Inclusion of a covered work
275
+ in an aggregate does not cause this License to apply to the other
276
+ parts of the aggregate.
277
+
278
+ 6. Conveying Non-Source Forms.
279
+
280
+ You ma