Simple Google Analytics - Version 3.2.2

Version Description

(20.10.2021) = * Added: Compatibility with Wordpress 5.8 * Fixed: Minor bugs

Download this release

Release Info

Developer alexkovalevv
Plugin Icon 128x128 Simple Google Analytics
Version 3.2.2
Comparing to
See all releases

Code changes from version 3.1.1 to 3.2.2

Files changed (82) hide show
  1. admin/activation.php +46 -46
  2. admin/boot.php +273 -273
  3. admin/options.php +174 -139
  4. admin/pages/class-pages-general-settings.php +97 -97
  5. admin/pages/class-pages-more-features.php +21 -21
  6. cache/local-ga.js +0 -74
  7. clearfy.php +56 -51
  8. includes/3rd-party/class-clearfy-plugin.php +99 -89
  9. includes/class-plugin.php +130 -121
  10. includes/classes/class-abstract-cache.php +562 -0
  11. includes/classes/class-configurate-ga.php +207 -161
  12. includes/classes/class-facebook-cache.php +1061 -0
  13. includes/classes/class-facebook-sdk.php +555 -0
  14. includes/classes/class-google-analytics-cache.php +162 -0
  15. includes/classes/class-google-tag-manager-cache.php +156 -0
  16. includes/classes/class-scheduler.php +210 -0
  17. includes/classes/class-yandex-metrika-cache.php +162 -0
  18. includes/update-local-ga.php +92 -77
  19. languages/simple-google-analytics-es_ES.po +233 -233
  20. languages/simple-google-analytics-nl_BE.po +242 -242
  21. languages/simple-google-analytics-pt_BR.po +246 -246
  22. languages/simple-google-analytics-ru_RU.po +198 -198
  23. libs/factory/adverts/boot.php +50 -50
  24. libs/factory/adverts/includes/class-base.php +319 -319
  25. libs/factory/adverts/includes/class-dashboard-widget.php +125 -125
  26. libs/factory/adverts/includes/class-rest-request.php +217 -197
  27. libs/factory/adverts/includes/index.php +2 -2
  28. libs/factory/adverts/index.php +2 -2
  29. libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_124-ru_RU.mo} +0 -0
  30. libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_124-ru_RU.po} +83 -83
  31. libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +11 -11
  32. libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +11 -11
  33. libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +11 -11
  34. libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +25 -25
  35. libs/factory/bootstrap/assets/css-min/bootstrap.datepicker.min.css +16 -16
  36. libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +11 -11
  37. libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +11 -11
  38. libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +11 -11
  39. libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +11 -11
  40. libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +11 -11
  41. libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +11 -11
  42. libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +11 -11
  43. libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +11 -11
  44. libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +11 -11
  45. libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +11 -11
  46. libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +11 -11
  47. libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +10 -10
  48. libs/factory/bootstrap/assets/js-min/bootstrap.tooltip.min.js +9 -9
  49. libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +10 -10
  50. libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +10 -10
  51. libs/factory/bootstrap/assets/js-min/control.list.min.js +10 -10
  52. libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +10 -10
  53. libs/factory/bootstrap/boot.php +46 -46
  54. libs/factory/bootstrap/includes/functions.php +236 -286
  55. libs/factory/bootstrap/includes/index.php +1 -1
  56. libs/factory/bootstrap/index.php +1 -1
  57. libs/factory/bootstrap/package-lock.json +1810 -0
  58. libs/factory/clearfy/assets/css/clearfy-base.css +0 -181
  59. libs/factory/clearfy/assets/js/globals.js +0 -203
  60. libs/factory/clearfy/boot.php +0 -49
  61. libs/factory/clearfy/includes/ajax-handlers.php +0 -92
  62. libs/factory/clearfy/includes/class-configurate.php +0 -116
  63. libs/factory/clearfy/includes/class-helpers.php +0 -362
  64. libs/factory/clearfy/pages/class-page-license.php +0 -365
  65. libs/factory/clearfy/pages/class-page-more-features.php +0 -170
  66. libs/factory/clearfy/pages/class-pages.php +0 -440
  67. libs/factory/core/README.md +3 -3
  68. libs/factory/core/ajax/install-addons.php +228 -0
  69. libs/factory/core/assets/js/core-components.js +227 -0
  70. libs/factory/core/assets/js/core-general.js +99 -0
  71. libs/factory/core/boot.php +73 -62
  72. libs/factory/core/includes/activation/class-factory-activator.php +43 -43
  73. libs/factory/core/includes/activation/class-factory-update.php +39 -39
  74. libs/factory/core/includes/activation/index.php +1 -1
  75. libs/factory/core/includes/assets-managment/class-factory-assets-list.php +126 -126
  76. libs/factory/core/includes/assets-managment/class-factory-script-list.php +167 -166
  77. libs/factory/core/includes/assets-managment/class-factory-style-list.php +86 -86
  78. libs/factory/core/includes/assets-managment/index.php +1 -1
  79. libs/factory/core/includes/class-check-compatibility.php +121 -121
  80. libs/factory/core/includes/class-factory-migrations.php +541 -541
  81. libs/factory/core/includes/class-factory-notices.php +296 -291
  82. libs/factory/core/includes/class-factory-options.php +372 -432
admin/activation.php CHANGED
@@ -1,46 +1,46 @@
1
- <?php
2
-
3
- /**
4
- * Activator for the GA cache
5
- *
6
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
7
- * @copyright (c) 09.09.2017, Webcraftic
8
- * @see Factory420_Activator
9
- * @version 1.0
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- class WGA_Activation extends Wbcr_Factory420_Activator {
18
-
19
- /**
20
- * Runs activation actions.
21
- *
22
- * @since 1.0.0
23
- */
24
- public function activate() {
25
- $ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
26
-
27
- if ( $ga_cache ) {
28
- wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
29
-
30
- if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
31
- wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
32
- }
33
- }
34
- }
35
-
36
- /**
37
- * Runs activation actions.
38
- *
39
- * @since 1.0.0
40
- */
41
- public function deactivate() {
42
- if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
43
- wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
44
- }
45
- }
46
- }
1
+ <?php
2
+
3
+ /**
4
+ * Activator for the GA cache
5
+ *
6
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
7
+ * @copyright (c) 09.09.2017, Webcraftic
8
+ * @see Factory446_Activator
9
+ * @version 1.0
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+ class WGA_Activation extends Wbcr_Factory446_Activator {
18
+
19
+ /**
20
+ * Runs activation actions.
21
+ *
22
+ * @since 1.0.0
23
+ */
24
+ public function activate() {
25
+ $ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
26
+
27
+ if ( $ga_cache ) {
28
+ wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
29
+
30
+ if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
31
+ wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
32
+ }
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Runs activation actions.
38
+ *
39
+ * @since 1.0.0
40
+ */
41
+ public function deactivate() {
42
+ if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
43
+ wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
44
+ }
45
+ }
46
+ }
admin/boot.php CHANGED
@@ -1,274 +1,274 @@
1
- <?php
2
- /**
3
- * The boot file is needed to connect backend files, as well as register hooks.
4
- * Some hooks are so small that it does not make sense to put them into a file
5
- * or put them into a specific group of code.
6
- *
7
- * I usually register administrator notifications, create handlers before saving
8
- * plugin settings or after, register options in the Clearfy plugin.
9
- *
10
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
- * @copyright Webcraftic
12
- */
13
-
14
- // Exit if accessed directly
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit;
17
- }
18
-
19
- /**
20
- * Notice that the plugin has been seriously updated!
21
- *
22
- * @since 3.0.1
23
- *
24
- * @param string $plugin_name
25
- *
26
- * @param array $notices all registered notices
27
- *
28
- * @return array all notices
29
- */
30
- function wbcr_ga_admin_conflict_notices_error( $notices, $plugin_name ) {
31
- if ( defined( 'LOADING_GA_CACHE_AS_ADDON' ) || $plugin_name != WGA_Plugin::app()->getPluginName() ) {
32
- return $notices;
33
- }
34
-
35
- $text = '<p>' . __( 'The <b>Simple Google Analytics</b> plugin has some major changes!', 'simple-google-analytics' ) . '</p>';
36
- $text .= '<p>' . __( 'Unfortunately, the old version of the plugin (2.2.2) is no longer supported, but you still can download it from the WordPress repository in case if the new release doesn’t work for you.', 'simple-google-analytics' ) . '</p>';
37
- $text .= '<p>' . __( 'We’ve updated the code and fixed the compatibility issue for the latest WordPress and PHP versions. We’ve also added additional feature of the Local Google Analytics – this way your website will load faster. The plugin’s name has been changed to Local Google Analytics, but all features remained the same.', 'simple-google-analytics' ) . '</p>';
38
- $text .= '<p>' . sprintf( __( 'Please, check <a href="%s">plugin settings</a> and its performance on your website. We do care about you and want to avoid any problems with the new version.', 'simple-google-analytics' ) . '</p>', admin_url( 'options-general.php?page=ga_cache-' . WGA_Plugin::app()->getPluginName() ) ) . '</p>';
39
- $text .= '<p>' . sprintf( __( 'We are aimed to pay more attention to the speed and security aspects of your website. That’s why you should definitely try our basic WordPress optimization plugin as well. Clearfy includes functionality of this plugin and has many additional features for the website optimization:
40
- <a href="%s">Donwload Clearfy for free</a>', 'simple-google-analytics' ), 'https://clearfy.pro?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName() ) . '</p>';
41
-
42
- $notices[] = [
43
- 'id' => 'ga_plugin_upgrade_notice1',
44
- 'type' => 'warning',
45
- 'dismissible' => true,
46
- 'dismiss_expires' => 0,
47
- 'text' => $text
48
- ];
49
-
50
- return $notices;
51
- }
52
-
53
- add_filter( 'wbcr/factory/admin_notices', 'wbcr_ga_admin_conflict_notices_error', 10, 2 );
54
-
55
- /**
56
- * Migrate settings from the old plugin to the new one.
57
- *
58
- * @since 3.0.1
59
- * @return void
60
- */
61
- function wbcr_ga_upgrade() {
62
- global $wpdb;
63
-
64
- if ( defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
65
- return;
66
- }
67
-
68
- $is_migrate_up_to_230 = WGA_Plugin::app()->getPopulateOption( 'is_migrate_up_to_230', false );
69
-
70
- if ( ! $is_migrate_up_to_230 ) {
71
- $old_plugin_tracking_id = get_option( 'sga_analytics_id' );
72
- $old_plugin_code_location = get_option( 'sga_code_location' );
73
- $old_plugin_demographic_and_interest = (int) get_option( 'sga_demographic_and_interest' );
74
- $old_plugin_sga_render_when_loggedin = (int) get_option( 'sga_render_when_loggedin' );
75
-
76
- if ( ! empty( $old_plugin_tracking_id ) ) {
77
- WGA_Plugin::app()->updatePopulateOption( 'ga_cache', 1 );
78
- WGA_Plugin::app()->updatePopulateOption( 'ga_tracking_id', $old_plugin_tracking_id );
79
-
80
- $script_position = 'footer';
81
-
82
- if ( $old_plugin_code_location == 'head' ) {
83
- $script_position = 'header';
84
- }
85
-
86
- WGA_Plugin::app()->updatePopulateOption( 'ga_script_position', $script_position );
87
- WGA_Plugin::app()->updatePopulateOption( 'ga_anonymize_ip', $old_plugin_demographic_and_interest );
88
- WGA_Plugin::app()->updatePopulateOption( 'ga_track_admin', $old_plugin_sga_render_when_loggedin );
89
-
90
- $wpdb->query( "DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE 'sga_%';" );
91
- }
92
-
93
- WGA_Plugin::app()->updatePopulateOption( 'is_migrate_up_to_230', 1 );
94
- }
95
- }
96
-
97
- add_action( 'init', 'wbcr_ga_upgrade' );
98
-
99
- /**
100
- * After saving the settings in the plugin, we check whether the
101
- * options for analytic caching are enabled or not. If enabled,
102
- * add cron task.
103
- *
104
- * @since 3.0.1
105
- *
106
- * @param Wbcr_FactoryPages420_ImpressiveThemplate $page
107
- *
108
- * @param Wbcr_Factory420_Plugin $plugin
109
- *
110
- * @return void
111
- */
112
- add_action( 'wbcr_factory_420_imppage_after_form_save', function ( $plugin, $page ) {
113
- if ( WGA_Plugin::app()->getPluginName() != $plugin->getPluginName() ) {
114
- return;
115
- }
116
-
117
- $ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
118
-
119
- if ( $ga_cache ) {
120
- if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
121
- wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
122
- }
123
- } else {
124
- if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
125
- wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
126
- }
127
- }
128
- }, 10, 2 );
129
-
130
- if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
131
- /**
132
- * Add a link to plugin meta. You can find this link in admin panel on
133
- * the page plugins.php. Look under plugin short description.
134
- *
135
- * @param array $links An array of the plugin's metadata, including the version,
136
- * author, author URI, and plugin URI.
137
- * @param string $file path to the plugin file, relative to the plugins directory.
138
- *
139
- * @return array
140
- */
141
-
142
- add_filter( 'plugin_row_meta', function ( $links, $file ) {
143
- if ( $file == WGA_PLUGIN_BASE ) {
144
-
145
- $url = 'https://clearfy.pro';
146
-
147
- if ( get_locale() == 'ru_RU' ) {
148
- $url = 'https://ru.clearfy.pro';
149
- }
150
-
151
- $url .= '?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName();
152
-
153
- $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __( 'Get ultimate plugin free', 'simple-google-analytics' ) . '</a>';
154
- }
155
-
156
- return $links;
157
- }, 10, 2 );
158
-
159
- /**
160
- * Rating widget url
161
- *
162
- * @param string $page_url
163
- * @param string $plugin_name
164
- *
165
- * @return string
166
- */
167
- add_filter( 'wbcr_factory_imppage_rating_widget_url', function ( $page_url, $plugin_name ) {
168
- if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) && ( $plugin_name == WGA_Plugin::app()->getPluginName() ) ) {
169
- return 'https://wordpress.org/support/plugin/simple-google-analytics/reviews/#new-post';
170
- }
171
-
172
- return $page_url;
173
- }, 10, 2 );
174
-
175
- /**
176
- * Удаляем лишние виджеты из правого сайдбара в интерфейсе плагина
177
- *
178
- * - Виджет с премиум рекламой
179
- * - Виджет с рейтингом
180
- * - Виджет с маркерами информации
181
- */
182
- add_filter( 'wbcr/factory/pages/impressive/widgets', function ( $widgets, $position, $plugin ) {
183
- if ( WGA_Plugin::app()->getPluginName() == $plugin->getPluginName() && 'right' == $position ) {
184
- unset( $widgets['business_suggetion'] );
185
- unset( $widgets['rating_widget'] );
186
- unset( $widgets['info_widget'] );
187
- }
188
-
189
- return $widgets;
190
- }, 20, 3 );
191
- } else {
192
- /**
193
- * This action is executed when the component of the Clearfy plugin
194
- * is activate and if this component is name ga_cache
195
- *
196
- * @since 3.0.1
197
- * @return void
198
- */
199
- add_action( 'wbcr/clearfy/activated_component', function ( $component_name ) {
200
- if ( $component_name == 'ga_cache' ) {
201
- require_once WGA_PLUGIN_DIR . '/admin/activation.php';
202
- $plugin = new WGA_Activation( WGA_Plugin::app() );
203
- $plugin->activate();
204
- }
205
- } );
206
-
207
- /**
208
- * This action is executed when the component of the Clearfy plugin
209
- * is deactivated and if this component is name ga_cache
210
- *
211
- * @since 3.0.1
212
- * @return void
213
- */
214
- add_action( 'wbcr_clearfy_pre_deactivate_component', function ( $component_name ) {
215
- if ( $component_name == 'ga_cache' ) {
216
- require_once WGA_PLUGIN_DIR . '/admin/activation.php';
217
- $plugin = new WGA_Activation( WGA_Plugin::app() );
218
- $plugin->deactivate();
219
- }
220
- } );
221
-
222
- /**
223
- * We register options of this plugin in global Clearfy options. Clearfy later can automatically
224
- * set default values for this options or completely delete it from site database.
225
- *
226
- * In more detail you can read about it here: wp-plugin-clearfy\admin\includes\options.php
227
- *
228
- * @param array $options all available component options plugin clearfy
229
- *
230
- * @return array
231
- */
232
- function wbcr_ga_group_options( $options ) {
233
- $options[] = [
234
- 'name' => 'ga_cache',
235
- 'title' => __( 'Google Analytics Cache', 'simple-google-analytics' ),
236
- 'tags' => []
237
- ];
238
-
239
- $options[] = [
240
- 'name' => 'ga_tracking_id',
241
- 'title' => __( 'Google analytic Code', 'clearfy' ),
242
- 'tags' => []
243
- ];
244
- $options[] = [
245
- 'name' => 'ga_adjusted_bounce_rate',
246
- 'title' => __( 'Use adjusted bounce rate?', 'clearfy' ),
247
- 'tags' => []
248
- ];
249
- $options[] = [
250
- 'name' => 'ga_enqueue_order',
251
- 'title' => __( 'Change enqueue order?', 'clearfy' ),
252
- 'tags' => []
253
- ];
254
- $options[] = [
255
- 'name' => 'ga_disable_display_features',
256
- 'title' => __( 'Disable all display features functionality?', 'clearfy' ),
257
- 'tags' => []
258
- ];
259
- $options[] = [
260
- 'name' => 'ga_anonymize_ip',
261
- 'title' => __( 'Use Anonymize IP? (Required by law for some countries)', 'clearfy' ),
262
- 'tags' => []
263
- ];
264
- $options[] = [
265
- 'name' => 'ga_track_admin',
266
- 'title' => __( 'Track logged in Administrators?', 'clearfy' ),
267
- 'tags' => []
268
- ];
269
-
270
- return $options;
271
- }
272
-
273
- add_filter( "wbcr_clearfy_group_options", 'wbcr_ga_group_options' );
274
  }
1
+ <?php
2
+ /**
3
+ * The boot file is needed to connect backend files, as well as register hooks.
4
+ * Some hooks are so small that it does not make sense to put them into a file
5
+ * or put them into a specific group of code.
6
+ *
7
+ * I usually register administrator notifications, create handlers before saving
8
+ * plugin settings or after, register options in the Clearfy plugin.
9
+ *
10
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
+ * @copyright Webcraftic
12
+ */
13
+
14
+ // Exit if accessed directly
15
+ if( !defined('ABSPATH') ) {
16
+ exit;
17
+ }
18
+
19
+ /**
20
+ * After saving the settings in the plugin, we check whether the
21
+ * options for analytic caching are enabled or not. If enabled,
22
+ * add cron task.
23
+ *
24
+ * @param Wbcr_FactoryPages445_ImpressiveThemplate $page
25
+ *
26
+ * @param Wbcr_Factory446_Plugin $plugin
27
+ *
28
+ * @return void
29
+ * @since 3.0.1
30
+ *
31
+ */
32
+ add_action('wbcr/factory/pages/impressive/after_form_save', function ($plugin, $page) {
33
+ if( WGA_Plugin::app()->getPluginName() != $plugin->getPluginName() ) {
34
+ return;
35
+ }
36
+
37
+ $ga_cache = WGA_Plugin::app()->getPopulateOption('ga_cache');
38
+
39
+ if( $ga_cache ) {
40
+ if( !wp_next_scheduled('wbcr/gac/update_analytic_library') ) {
41
+ wp_schedule_event(time(), 'daily', 'wbcr/gac/update_analytic_library');
42
+ }
43
+ } else {
44
+ if( wp_next_scheduled('wbcr/gac/update_analytic_library') ) {
45
+ wp_clear_scheduled_hook('wbcr/gac/update_analytic_library');
46
+ }
47
+ }
48
+ }, 10, 2);
49
+
50
+ if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
51
+ /**
52
+ * Notice that the plugin has been seriously updated!
53
+ *
54
+ * @param string $plugin_name
55
+ *
56
+ * @param array $notices all registered notices
57
+ *
58
+ * @return array all notices
59
+ * @since 3.0.1
60
+ *
61
+ */
62
+ function wbcr_ga_admin_conflict_notices_error($notices, $plugin_name)
63
+ {
64
+ if( $plugin_name != WGA_Plugin::app()->getPluginName() ) {
65
+ return $notices;
66
+ }
67
+
68
+ $text = '<p>' . __('The <b>Simple Google Analytics</b> plugin has some major changes!', 'simple-google-analytics') . '</p>';
69
+ $text .= '<p>' . __('Unfortunately, the old version of the plugin (2.2.2) is no longer supported, but you still can download it from the WordPress repository in case if the new release doesn’t work for you.', 'simple-google-analytics') . '</p>';
70
+ $text .= '<p>' . __('We’ve updated the code and fixed the compatibility issue for the latest WordPress and PHP versions. We’ve also added additional feature of the Local Google Analytics – this way your website will load faster. The plugin’s name has been changed to Local Google Analytics, but all features remained the same.', 'simple-google-analytics') . '</p>';
71
+ $text .= '<p>' . sprintf(__('Please, check <a href="%s">plugin settings</a> and its performance on your website. We do care about you and want to avoid any problems with the new version.', 'simple-google-analytics') . '</p>', admin_url('options-general.php?page=ga_cache-' . WGA_Plugin::app()->getPluginName())) . '</p>';
72
+ $text .= '<p>' . sprintf(__('We are aimed to pay more attention to the speed and security aspects of your website. That’s why you should definitely try our basic WordPress optimization plugin as well. Clearfy includes functionality of this plugin and has many additional features for the website optimization:
73
+ <a href="%s">Donwload Clearfy for free</a>', 'simple-google-analytics'), 'https://clearfy.pro?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName()) . '</p>';
74
+
75
+ $notices[] = [
76
+ 'id' => 'ga_plugin_upgrade_notice1',
77
+ 'type' => 'warning',
78
+ 'dismissible' => true,
79
+ 'dismiss_expires' => 0,
80
+ 'text' => $text
81
+ ];
82
+
83
+ return $notices;
84
+ }
85
+
86
+ add_filter('wbcr/factory/admin_notices', 'wbcr_ga_admin_conflict_notices_error', 10, 2);
87
+
88
+ /**
89
+ * Migrate settings from the old plugin to the new one.
90
+ *
91
+ * @return void
92
+ * @since 3.0.1
93
+ */
94
+ add_action('init', function () {
95
+ global $wpdb;
96
+
97
+ if( defined('LOADING_GA_CACHE_AS_ADDON') ) {
98
+ return;
99
+ }
100
+
101
+ $is_migrate_up_to_230 = WGA_Plugin::app()->getPopulateOption('is_migrate_up_to_230', false);
102
+
103
+ if( !$is_migrate_up_to_230 ) {
104
+ $old_plugin_tracking_id = get_option('sga_analytics_id');
105
+ $old_plugin_code_location = get_option('sga_code_location');
106
+ $old_plugin_demographic_and_interest = (int)get_option('sga_demographic_and_interest');
107
+ $old_plugin_sga_render_when_loggedin = (int)get_option('sga_render_when_loggedin');
108
+
109
+ if( !empty($old_plugin_tracking_id) ) {
110
+ WGA_Plugin::app()->updatePopulateOption('ga_cache', 1);
111
+ WGA_Plugin::app()->updatePopulateOption('ga_tracking_id', $old_plugin_tracking_id);
112
+
113
+ $script_position = 'footer';
114
+
115
+ if( $old_plugin_code_location == 'head' ) {
116
+ $script_position = 'header';
117
+ }
118
+
119
+ WGA_Plugin::app()->updatePopulateOption('ga_script_position', $script_position);
120
+ WGA_Plugin::app()->updatePopulateOption('ga_anonymize_ip', $old_plugin_demographic_and_interest);
121
+ WGA_Plugin::app()->updatePopulateOption('ga_track_admin', $old_plugin_sga_render_when_loggedin);
122
+
123
+ $wpdb->query("DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE 'sga_%';");
124
+ }
125
+
126
+ WGA_Plugin::app()->updatePopulateOption('is_migrate_up_to_230', 1);
127
+ }
128
+ });
129
+
130
+ /**
131
+ * Add a link to plugin meta. You can find this link in admin panel on
132
+ * the page plugins.php. Look under plugin short description.
133
+ *
134
+ * @param array $links An array of the plugin's metadata, including the version,
135
+ * author, author URI, and plugin URI.
136
+ * @param string $file path to the plugin file, relative to the plugins directory.
137
+ *
138
+ * @return array
139
+ */
140
+
141
+ add_filter('plugin_row_meta', function ($links, $file) {
142
+ if( $file == WGA_PLUGIN_BASE ) {
143
+
144
+ $url = 'https://clearfy.pro';
145
+
146
+ if( get_locale() == 'ru_RU' ) {
147
+ $url = 'https://ru.clearfy.pro';
148
+ }
149
+
150
+ $url .= '?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName();
151
+
152
+ $links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __('Get ultimate plugin free', 'simple-google-analytics') . '</a>';
153
+ }
154
+
155
+ return $links;
156
+ }, 10, 2);
157
+
158
+ /**
159
+ * Rating widget url
160
+ *
161
+ * @param string $page_url
162
+ * @param string $plugin_name
163
+ *
164
+ * @return string
165
+ */
166
+ add_filter('wbcr_factory_imppage_rating_widget_url', function ($page_url, $plugin_name) {
167
+ if( $plugin_name == WGA_Plugin::app()->getPluginName() ) {
168
+ return 'https://wordpress.org/support/plugin/simple-google-analytics/reviews/#new-post';
169
+ }
170
+
171
+ return $page_url;
172
+ }, 10, 2);
173
+
174
+ /**
175
+ * Удаляем лишние виджеты из правого сайдбара в интерфейсе плагина
176
+ *
177
+ * - Виджет с премиум рекламой
178
+ * - Виджет с рейтингом
179
+ * - Виджет с маркерами информации
180
+ */
181
+ add_filter('wbcr/factory/pages/impressive/widgets', function ($widgets, $position, $plugin) {
182
+ if( WGA_Plugin::app()->getPluginName() == $plugin->getPluginName() && 'right' == $position ) {
183
+ unset($widgets['business_suggetion']);
184
+ unset($widgets['rating_widget']);
185
+ unset($widgets['info_widget']);
186
+ }
187
+
188
+ return $widgets;
189
+ }, 20, 3);
190
+ } else {
191
+ /**
192
+ * This action is executed when the component of the Clearfy plugin
193
+ * is activate and if this component is name ga_cache
194
+ *
195
+ * @return void
196
+ * @since 3.0.1
197
+ */
198
+ add_action('wbcr/clearfy/activated_component', function ($component_name) {
199
+ if( $component_name == 'ga_cache' ) {
200
+ require_once WGA_PLUGIN_DIR . '/admin/activation.php';
201
+ $plugin = new WGA_Activation(WGA_Plugin::app());
202
+ $plugin->activate();
203
+ }
204
+ });
205
+
206
+ /**
207
+ * This action is executed when the component of the Clearfy plugin
208
+ * is deactivated and if this component is name ga_cache
209
+ *
210
+ * @return void
211
+ * @since 3.0.1
212
+ */
213
+ add_action('wbcr_clearfy_pre_deactivate_component', function ($component_name) {
214
+ if( $component_name == 'ga_cache' ) {
215
+ require_once WGA_PLUGIN_DIR . '/admin/activation.php';
216
+ $plugin = new WGA_Activation(WGA_Plugin::app());
217
+ $plugin->deactivate();
218
+ }
219
+ });
220
+
221
+ /**
222
+ * We register options of this plugin in global Clearfy options. Clearfy later can automatically
223
+ * set default values for this options or completely delete it from site database.
224
+ *
225
+ * In more detail you can read about it here: wp-plugin-clearfy\admin\includes\options.php
226
+ *
227
+ * @param array $options all available component options plugin clearfy
228
+ *
229
+ * @return array
230
+ */
231
+ function wbcr_ga_group_options($options)
232
+ {
233
+ $options[] = [
234
+ 'name' => 'ga_cache',
235
+ 'title' => __('Google Analytics Cache', 'simple-google-analytics'),
236
+ 'tags' => []
237
+ ];
238
+
239
+ $options[] = [
240
+ 'name' => 'ga_tracking_id',
241
+ 'title' => __('Google analytic Code', 'clearfy'),
242
+ 'tags' => []
243
+ ];
244
+ $options[] = [
245
+ 'name' => 'ga_adjusted_bounce_rate',
246
+ 'title' => __('Use adjusted bounce rate?', 'clearfy'),
247
+ 'tags' => []
248
+ ];
249
+ $options[] = [
250
+ 'name' => 'ga_enqueue_order',
251
+ 'title' => __('Change enqueue order?', 'clearfy'),
252
+ 'tags' => []
253
+ ];
254
+ $options[] = [
255
+ 'name' => 'ga_disable_display_features',
256
+ 'title' => __('Disable all display features functionality?', 'clearfy'),
257
+ 'tags' => []
258
+ ];
259
+ $options[] = [
260
+ 'name' => 'ga_anonymize_ip',
261
+ 'title' => __('Use Anonymize IP? (Required by law for some countries)', 'clearfy'),
262
+ 'tags' => []
263
+ ];
264
+ $options[] = [
265
+ 'name' => 'ga_track_admin',
266
+ 'title' => __('Track logged in Administrators?', 'clearfy'),
267
+ 'tags' => []
268
+ ];
269
+
270
+ return $options;
271
+ }
272
+
273
+ add_filter("wbcr_clearfy_group_options", 'wbcr_ga_group_options');
274
  }
admin/options.php CHANGED
@@ -1,139 +1,174 @@
1
- <?php
2
- /**
3
- * Options for additionally form
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
- * @copyright (c) 21.01.2018, Webcraftic
7
- * @version 1.0
8
- */
9
-
10
- // Exit if accessed directly
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * @return array
17
- */
18
- function wbcr_ga_get_plugin_options() {
19
- $options = [];
20
-
21
- $options[] = [
22
- 'type' => 'html',
23
- 'html' => '<div class="wbcr-factory-page-group-header">' . __( '<strong>Google Analytics cache</strong>.', 'simple-google-analytics' ) . '<p>' . __( 'To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.', 'simple-google-analytics' ) . '</p></div>'
24
- ];
25
-
26
- $options[] = [
27
- 'type' => 'checkbox',
28
- 'way' => 'buttons',
29
- 'name' => 'ga_cache',
30
- 'title' => __( 'Google Analytics Cache', 'simple-google-analytics' ),
31
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
32
- 'hint' => __( 'If you enable this option, the plugin will begin to save a local copy of Google Analytics to speed up the loading of your website and improve Google Page Speed.', 'simple-google-analytics' ) . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __( 'ATTENTION! Before using this option, remove the previously installed Google Analytics code inside your theme or plugins associated with this feature!', 'simple-google-analytics' ) . '</span>',
33
- 'default' => false,
34
- 'eventsOn' => [
35
- 'show' => '#wbcr-clearfy-performance-ga-block'
36
- ],
37
- 'eventsOff' => [
38
- 'hide' => '#wbcr-clearfy-performance-ga-block'
39
- ]
40
-
41
- ];
42
- $options[] = [
43
- 'type' => 'div',
44
- 'id' => 'wbcr-clearfy-performance-ga-block',
45
- 'items' => [
46
- [
47
- 'type' => 'textbox',
48
- 'way' => 'buttons',
49
- 'name' => 'ga_tracking_id',
50
- 'title' => __( 'Google analytic Code', 'simple-google-analytics' ),
51
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
52
- 'hint' => __( 'Set the Google Analytics tracking code.', 'simple-google-analytics' ),
53
- 'placeholder' => 'UA-XXXXX-Y'
54
- ],
55
- [
56
- 'type' => 'dropdown',
57
- 'way' => 'buttons',
58
- 'name' => 'ga_script_position',
59
- 'data' => [
60
- [ 'header', 'Header' ],
61
- [ 'footer', 'Footer' ],
62
- ],
63
- 'title' => __( 'Save GA in', 'simple-google-analytics' ),
64
- 'hint' => __( 'Select location for the Google Analytics code.', 'simple-google-analytics' ),
65
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
66
- 'default' => 'footer'
67
- ],
68
- [
69
- 'type' => 'integer',
70
- 'name' => 'ga_adjusted_bounce_rate',
71
- 'title' => __( 'Use adjusted bounce rate?', 'simple-google-analytics' ),
72
- 'default' => 0,
73
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
74
- 'hint' => __( 'Essentially, you set up an event which is triggered after a user spends a certain amount of time on the landing page, telling Google Analytics not to count these users as bounces. A user may come to your website, find all of the information they need (a phone number, for example) and then leave the site without visiting another page. Without adjusted bounce rate, such a user would be considered a bounce, even though they had a successful experience. By defining a time limit after which you can consider a user to be "engaged," that user would no longer count as a bounce, and you\'d get a more accurate idea of whether they found what they were looking for.', 'simple-google-analytics' )
75
- ],
76
- [
77
- 'type' => 'integer',
78
- 'way' => 'buttons',
79
- 'name' => 'ga_enqueue_order',
80
- 'title' => __( 'Change enqueue order?', 'simple-google-analytics' ),
81
- 'default' => 0,
82
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
83
- 'hint' => __( 'By default, Google Analytics code is loaded before other scripts and javasscript code, but if you set the value to 100, the GA code will be loaded after all other scripts. By changing the priority, you can set code position on the page.', 'simple-google-analytics' )
84
- ],
85
- [
86
- 'type' => 'checkbox',
87
- 'way' => 'buttons',
88
- 'name' => 'ga_disable_display_features',
89
- 'title' => __( 'Disable all display features functionality?', 'simple-google-analytics' ),
90
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
91
- 'hint' => sprintf( __( 'Disable all <a href="%s">display features functionality?</a>', 'simple-google-analytics' ), 'https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features' ),
92
- 'default' => false
93
- ],
94
- [
95
- 'type' => 'checkbox',
96
- 'way' => 'buttons',
97
- 'name' => 'ga_anonymize_ip',
98
- 'title' => __( 'Use Anonymize IP? (Required by law for some countries)', 'simple-google-analytics' ),
99
- //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
100
- 'hint' => sprintf( __( 'Use <a href="%s">Anonymize IP?</a> (Required by law for some countries)', 'simple-google-analytics' ), 'https://support.google.com/analytics/answer/2763052' ),
101
- 'default' => false
102
- ],
103
- [
104
- 'type' => 'checkbox',
105
- 'way' => 'buttons',
106
- 'name' => 'ga_track_admin',
107
- 'title' => __( 'Track logged in Administrators?', 'simple-google-analytics' ),
108
- 'layout' => [ 'hint-type' => 'icon', 'hint-icon-color' => 'grey' ],
109
- 'hint' => __( 'Track logged in Administrators?', 'simple-google-analytics' ),
110
- 'default' => false
111
- ]
112
- ]
113
- ];
114
-
115
- return $options;
116
- }
117
-
118
- /**
119
- * @param $form
120
- * @param $page Wbcr_FactoryPages420_ImpressiveThemplate
121
- *
122
- * @return mixed
123
- */
124
- function wbcr_ga_additionally_form_options( $form, $page ) {
125
- if ( empty( $form ) ) {
126
- return $form;
127
- }
128
-
129
- $options = wbcr_ga_get_plugin_options();
130
-
131
- foreach ( array_reverse( $options ) as $option ) {
132
- array_unshift( $form[0]['items'], $option );
133
- }
134
-
135
- return $form;
136
- }
137
-
138
- add_filter( 'wbcr_clr_google_performance_form_options', 'wbcr_ga_additionally_form_options', 10, 2 );
139
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Options for additionally form
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
+ * @copyright (c) 21.01.2018, Webcraftic
7
+ * @version 1.0
8
+ */
9
+
10
+ // Exit if accessed directly
11
+ if( !defined('ABSPATH') ) {
12
+ exit;
13
+ }
14
+
15
+ /**
16
+ * @return array
17
+ */
18
+ function wbcr_ga_get_plugin_options()
19
+ {
20
+ $options = [];
21
+
22
+ $options[] = [
23
+ 'type' => 'html',
24
+ 'html' => '<div class="wbcr-factory-page-group-header">' . __('<strong>Improve browser caching for 3rd-party services</strong>.', 'simple-google-analytics') . '<p>' . __('To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.', 'simple-google-analytics') . '</p></div>'
25
+ ];
26
+
27
+ $options[] = [
28
+ 'type' => 'checkbox',
29
+ 'way' => 'buttons',
30
+ 'name' => 'facebook_cache',
31
+ 'title' => __('Improve browser caching for Facebook Pixel', 'simple-google-analytics'),
32
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
33
+ 'hint' => __('Clearfy will host these Facebook Pixels locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching.', 'simple-google-analytics') . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, remove the previously installed Google Analytics code inside your theme or plugins associated with this feature!', 'simple-google-analytics') . '</span>',
34
+ 'default' => false
35
+ ];
36
+
37
+ $options[] = [
38
+ 'type' => 'checkbox',
39
+ 'way' => 'buttons',
40
+ 'name' => 'google_analytics_cache',
41
+ 'title' => __('Improve browser caching for Google Analytics', 'simple-google-analytics'),
42
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
43
+ 'hint' => __('Clearfy will host these Google scripts locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching.', 'simple-google-analytics') . (WGA_Plugin::app()->getPopulateOption('ga_cache') ? '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, please disable the option "Add Google Analytics code and Cache"!', 'simple-google-analytics') . '</span>' : ''),
44
+ 'cssClass' => WGA_Plugin::app()->getPopulateOption('ga_cache') ? ['factory-checkbox-disabled'] : [],
45
+ 'default' => false
46
+ ];
47
+
48
+ $options[] = [
49
+ 'type' => 'checkbox',
50
+ 'way' => 'buttons',
51
+ 'name' => 'yandex_metrika_cache',
52
+ 'title' => __('Improve browser caching for Yandex metrika', 'simple-google-analytics'),
53
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
54
+ 'hint' => __('Clearfy will host these Yandex metrika scripts locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching..', 'simple-google-analytics') . (WGA_Plugin::app()->getPopulateOption('ga_cache') ? '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, please disable the option "Add Google Analytics code and Cache"!', 'simple-google-analytics') . '</span>' : ''),
55
+ 'default' => false
56
+ ];
57
+
58
+ $options[] = [
59
+ 'type' => 'checkbox',
60
+ 'way' => 'buttons',
61
+ 'name' => 'ga_cache',
62
+ 'title' => __('Add Google Analytics code and Cache', 'simple-google-analytics'),
63
+ //'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
64
+ 'hint' => __('If you enable this option, the plugin will begin to save a local copy of Google Analytics to speed up the loading of your website and improve Google Page Speed.', 'simple-google-analytics') . '<br>--<br><span class="wbcr-factory-red-color">' . __('ATTENTION! This option is deprecated and cannot be used since plugin version 1.9.0! Use the new option "Improve browser caching for Google Analytics", you will have to insert the google analytics code yourself without the Clearfy plugin.', 'simple-google-analytics') . '</span>',
65
+ 'default' => false,
66
+ 'cssClass' => !WGA_Plugin::app()->getPopulateOption('ga_cache') ? ['factory-checkbox-disabled'] : [],
67
+ 'eventsOn' => [
68
+ 'show' => '#wbcr-clearfy-performance-ga-block'
69
+ ],
70
+ 'eventsOff' => [
71
+ 'hide' => '#wbcr-clearfy-performance-ga-block'
72
+ ]
73
+
74
+ ];
75
+
76
+ $options[] = [
77
+ 'type' => 'div',
78
+ 'id' => 'wbcr-clearfy-performance-ga-block',
79
+ 'items' => [
80
+ [
81
+ 'type' => 'textbox',
82
+ 'way' => 'buttons',
83
+ 'name' => 'ga_tracking_id',
84
+ 'title' => __('Google analytic Code', 'simple-google-analytics'),
85
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
86
+ 'hint' => __('Set the Google Analytics tracking code.', 'simple-google-analytics'),
87
+ 'placeholder' => 'UA-XXXXX-Y'
88
+ ],
89
+ [
90
+ 'type' => 'dropdown',
91
+ 'way' => 'buttons',
92
+ 'name' => 'ga_script_position',
93
+ 'data' => [
94
+ ['header', 'Header'],
95
+ ['footer', 'Footer'],
96
+ ],
97
+ 'title' => __('Save GA in', 'simple-google-analytics'),
98
+ 'hint' => __('Select location for the Google Analytics code.', 'simple-google-analytics'),
99
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
100
+ 'default' => 'footer'
101
+ ],
102
+ [
103
+ 'type' => 'integer',
104
+ 'name' => 'ga_adjusted_bounce_rate',
105
+ 'title' => __('Use adjusted bounce rate?', 'simple-google-analytics'),
106
+ 'default' => 0,
107
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
108
+ 'hint' => __('Essentially, you set up an event which is triggered after a user spends a certain amount of time on the landing page, telling Google Analytics not to count these users as bounces. A user may come to your website, find all of the information they need (a phone number, for example) and then leave the site without visiting another page. Without adjusted bounce rate, such a user would be considered a bounce, even though they had a successful experience. By defining a time limit after which you can consider a user to be "engaged," that user would no longer count as a bounce, and you\'d get a more accurate idea of whether they found what they were looking for.', 'simple-google-analytics')
109
+ ],
110
+ [
111
+ 'type' => 'integer',
112
+ 'way' => 'buttons',
113
+ 'name' => 'ga_enqueue_order',
114
+ 'title' => __('Change enqueue order?', 'simple-google-analytics'),
115
+ 'default' => 0,
116
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
117
+ 'hint' => __('By default, Google Analytics code is loaded before other scripts and javasscript code, but if you set the value to 100, the GA code will be loaded after all other scripts. By changing the priority, you can set code position on the page.', 'simple-google-analytics')
118
+ ],
119
+ [
120
+ 'type' => 'checkbox',
121
+ 'way' => 'buttons',
122
+ 'name' => 'ga_disable_display_features',
123
+ 'title' => __('Disable all display features functionality?', 'simple-google-analytics'),
124
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
125
+ 'hint' => sprintf(__('Disable all <a href="%s">display features functionality?</a>', 'simple-google-analytics'), 'https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features'),
126
+ 'default' => false
127
+ ],
128
+ [
129
+ 'type' => 'checkbox',
130
+ 'way' => 'buttons',
131
+ 'name' => 'ga_anonymize_ip',
132
+ 'title' => __('Use Anonymize IP? (Required by law for some countries)', 'simple-google-analytics'),
133
+ //'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
134
+ 'hint' => sprintf(__('Use <a href="%s">Anonymize IP?</a> (Required by law for some countries)', 'simple-google-analytics'), 'https://support.google.com/analytics/answer/2763052'),
135
+ 'default' => false
136
+ ],
137
+ [
138
+ 'type' => 'checkbox',
139
+ 'way' => 'buttons',
140
+ 'name' => 'ga_track_admin',
141
+ 'title' => __('Track logged in Administrators?', 'simple-google-analytics'),
142
+ 'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
143
+ 'hint' => __('Track logged in Administrators?', 'simple-google-analytics'),
144
+ 'default' => false
145
+ ]
146
+ ]
147
+ ];
148
+
149
+ return $options;
150
+ }
151
+
152
+ /**
153
+ * @param $form
154
+ * @param $page Wbcr_FactoryPages445_ImpressiveThemplate
155
+ *
156
+ * @return mixed
157
+ */
158
+ function wbcr_ga_additionally_form_options($form, $page)
159
+ {
160
+ if( empty($form) ) {
161
+ return $form;
162
+ }
163
+
164
+ $options = wbcr_ga_get_plugin_options();
165
+
166
+ foreach($options as $option) {
167
+ $form[0]['items'][] = $option;
168
+ }
169
+
170
+ return $form;
171
+ }
172
+
173
+ add_filter('wbcr_clr_code_clean_form_options', 'wbcr_ga_additionally_form_options', 10, 2);
174
+
admin/pages/class-pages-general-settings.php CHANGED
@@ -1,97 +1,97 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- /**
8
- * Страница общих настроек для этого плагина.
9
- *
10
- * Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
11
- * дя плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
12
- *
13
- * Поддерживает режим работы с мультисаймами. Вы можете увидеть эту страницу в панели настройки сети.
14
- *
15
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
16
- * @copyright (c) 2018 Webraftic Ltd
17
- * @version 1.0
18
- */
19
- class WGA_CachePage extends Wbcr_FactoryClearfy212_PageBase {
20
-
21
- /**
22
- * {@inheritDoc}
23
- *
24
- * @var string
25
- */
26
- public $id = "ga_cache";
27
-
28
- /**
29
- * {@inheritDoc}
30
- *
31
- * @var string
32
- */
33
- public $page_menu_dashicon = 'dashicons-testimonial';
34
-
35
- /**
36
- * {@inheritDoc}
37
- *
38
- * @var bool
39
- */
40
- public $available_for_multisite = true;
41
-
42
- /**
43
- * {@inheritDoc}
44
- *
45
- * @since 1.1.0
46
- * @var bool
47
- */
48
- public $show_right_sidebar_in_options = true;
49
-
50
- /**
51
- * @param Wbcr_Factory420_Plugin $plugin
52
- */
53
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
54
- $this->menu_title = __( 'Local Google Analytics', 'simple-google-analytics' );
55
-
56
- if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
57
- $this->internal = false;
58
- $this->menu_target = 'options-general.php';
59
- $this->add_link_to_plugin_actions = true;
60
- }
61
-
62
- parent::__construct( $plugin );
63
-
64
- $this->plugin = $plugin;
65
- }
66
-
67
- /**
68
- * {@inheritDoc}
69
- *
70
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
71
- * @since 3.1.0
72
- * @return string|void
73
- */
74
- public function getPageTitle() {
75
- return __( 'General', 'simple-google-analytics' );
76
- }
77
-
78
- /**
79
- * Permalinks options.
80
- *
81
- * @since 1.0.0
82
- * @return mixed[]
83
- */
84
- public function getPageOptions() {
85
- $options = wbcr_ga_get_plugin_options();
86
-
87
- $formOptions = [];
88
-
89
- $formOptions[] = [
90
- 'type' => 'form-group',
91
- 'items' => $options,
92
- //'cssClass' => 'postbox'
93
- ];
94
-
95
- return apply_filters( 'wbcr_ga_notices_form_options', $formOptions, $this );
96
- }
97
- }
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
+ /**
8
+ * Страница общих настроек для этого плагина.
9
+ *
10
+ * Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
11
+ * дя плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
12
+ *
13
+ * Поддерживает режим работы с мультисаймами. Вы можете увидеть эту страницу в панели настройки сети.
14
+ *
15
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
16
+ * @copyright (c) 2018 Webraftic Ltd
17
+ * @version 1.0
18
+ */
19
+ class WGA_CachePage extends WBCR\Factory_Templates_103\Pages\PageBase {
20
+
21
+ /**
22
+ * {@inheritDoc}
23
+ *
24
+ * @var string
25
+ */
26
+ public $id = "ga_cache";
27
+
28
+ /**
29
+ * {@inheritDoc}
30
+ *
31
+ * @var string
32
+ */
33
+ public $page_menu_dashicon = 'dashicons-testimonial';
34
+
35
+ /**
36
+ * {@inheritDoc}
37
+ *
38
+ * @var bool
39
+ */
40
+ public $available_for_multisite = true;
41
+
42
+ /**
43
+ * {@inheritDoc}
44
+ *
45
+ * @since 1.1.0
46
+ * @var bool
47
+ */
48
+ public $show_right_sidebar_in_options = true;
49
+
50
+ /**
51
+ * @param Wbcr_Factory446_Plugin $plugin
52
+ */
53
+ public function __construct( Wbcr_Factory446_Plugin $plugin ) {
54
+ $this->menu_title = __( 'Local Google Analytics', 'simple-google-analytics' );
55
+
56
+ if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
57
+ $this->internal = false;
58
+ $this->menu_target = 'options-general.php';
59
+ $this->add_link_to_plugin_actions = true;
60
+ }
61
+
62
+ parent::__construct( $plugin );
63
+
64
+ $this->plugin = $plugin;
65
+ }
66
+
67
+ /**
68
+ * {@inheritDoc}
69
+ *
70
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
71
+ * @since 3.1.0
72
+ * @return string|void
73
+ */
74
+ public function getPageTitle() {
75
+ return __( 'General', 'simple-google-analytics' );
76
+ }
77
+
78
+ /**
79
+ * Permalinks options.
80
+ *
81
+ * @since 1.0.0
82
+ * @return mixed[]
83
+ */
84
+ public function getPageOptions() {
85
+ $options = wbcr_ga_get_plugin_options();
86
+
87
+ $formOptions = [];
88
+
89
+ $formOptions[] = [
90
+ 'type' => 'form-group',
91
+ 'items' => $options,
92
+ //'cssClass' => 'postbox'
93
+ ];
94
+
95
+ return apply_filters( 'wbcr_ga_notices_form_options', $formOptions, $this );
96
+ }
97
+ }
admin/pages/class-pages-more-features.php CHANGED
@@ -1,21 +1,21 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- /**
8
- * Рекламная страница.
9
- *
10
- * Используется для рекламы плагина Clearfy. Пользователь может изучить все возможности плагина Clearfy
11
- * и перейти на лендинг плагина, чтобы скачать и попробовать его.
12
- *
13
- * Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
14
- * для плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
15
- *
16
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
17
- * @copyright (c) 2018 Webraftic Ltd
18
- */
19
- class WGA_MoreFeaturesPage extends Wbcr_FactoryClearfy212_MoreFeaturesPage {
20
-
21
- }
1
+ <?php
2
+ // Exit if accessed directly
3
+ if ( ! defined( 'ABSPATH' ) ) {
4
+ exit;
5
+ }
6
+
7
+ /**
8
+ * Рекламная страница.
9
+ *
10
+ * Используется для рекламы плагина Clearfy. Пользователь может изучить все возможности плагина Clearfy
11
+ * и перейти на лендинг плагина, чтобы скачать и попробовать его.
12
+ *
13
+ * Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
14
+ * для плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
15
+ *
16
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
17
+ * @copyright (c) 2018 Webraftic Ltd
18
+ */
19
+ class WGA_MoreFeaturesPage extends \WBCR\Factory_Templates_103\Pages\MoreFeatures {
20
+
21
+ }
cache/local-ga.js DELETED
@@ -1,74 +0,0 @@
1
- (function(){var k=this||self,l=function(a,b){a=a.split(".");var c=k;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var n=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},p=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var q=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var r=window,u=document,v=function(a,b){u.addEventListener?u.addEventListener(a,b,!1):u.attachEvent&&u.attachEvent("on"+a,b)};var w={},x=function(){w.TAGGING=w.TAGGING||[];w.TAGGING[1]=!0};var y=/:[0-9]+$/,A=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=z(a.protocol)||z(r.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:r.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||r.location.hostname).replace(y,"").toLowerCase());var c=z(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":b="";a&&a.href&&(b=a.href.indexOf("#"),b=0>b?a.href:a.href.substr(0,
2
- b));a=b;break;case "protocol":a=c;break;case "host":a=a.hostname.replace(y,"").toLowerCase();break;case "port":a=String(Number(a.port)||("http"==c?80:"https"==c?443:""));break;case "path":a.pathname||a.hostname||x();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(b=a[a.length-1],c=[],Array.prototype.indexOf)b=c.indexOf(b),b="number"==typeof b?b:-1;else{for(var d=0;d<c.length;d++)if(c[d]===b){b=d;break a}b=-1}0<=b&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?",
3
- "");break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=a&&a.href}return a},z=function(a){return a?a.replace(":","").toLowerCase():""},B=function(a){var b=u.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||x(),c="/"+c);a=b.hostname.replace(y,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function C(){for(var a=D,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function E(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}
4
- var D,F,G=function(a){D=D||E();F=F||C();for(var b=[],c=0;c<a.length;c+=3){var d=c+1<a.length,e=c+2<a.length,g=a.charCodeAt(c),f=d?a.charCodeAt(c+1):0,h=e?a.charCodeAt(c+2):0,m=g>>2;g=(g&3)<<4|f>>4;f=(f&15)<<2|h>>6;h&=63;e||(h=64,d||(f=64));b.push(D[m],D[g],D[f],D[h])}return b.join("")},H=function(a){function b(m){for(;d<a.length;){var t=a.charAt(d++),L=F[t];if(null!=L)return L;if(!/^[\s\xa0]*$/.test(t))throw Error("Unknown base64 encoding at char: "+t);}return m}D=D||E();F=F||C();for(var c="",d=0;;){var e=
5
- b(-1),g=b(0),f=b(64),h=b(64);if(64===h&&-1===e)return c;c+=String.fromCharCode(e<<2|g>>4);64!=f&&(c+=String.fromCharCode(g<<4&240|f>>2),64!=h&&(c+=String.fromCharCode(f<<6&192|h)))}};var I;function J(a,b){if(!a||b===u.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}
6
- var O=function(){var a=K,b=M,c=N(),d=function(f){a(f.target||f.srcElement||{})},e=function(f){b(f.target||f.srcElement||{})};if(!c.init){v("mousedown",d);v("keyup",d);v("submit",e);var g=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);g.call(this)};c.init=!0}},N=function(){var a={};var b=r.google_tag_data;r.google_tag_data=void 0===b?a:b;a=r.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var P=/(.*?)\*(.*?)\*(.*)/,Q=/([^?#]+)(\?[^#]*)?(#.*)?/,R=/(.*?)(^|&)_gl=([^&]*)&?(.*)/,T=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()&&(b.push(c),b.push(G(String(d))))}a=b.join("*");return["1",S(a),a].join("*")},S=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");
7
- if(!(b=I)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}I=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^I[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ba=function(a){return function(b){var c=B(r.location.href),d=c.search.replace("?","");a:{var e=d.split("&");for(var g=0;g<e.length;g++){var f=e[g].split("=");if("_gl"===decodeURIComponent(f[0]).replace(/\+/g," ")){e=f.slice(1).join("=");break a}}e=void 0}b.query=U(e||"")||{};e=A(c,"fragment");
8
- g=e.match(R);b.fragment=U(g&&g[3]||"")||{};a&&aa(c,d,e)}};function V(a){var b=R.exec(a);if(b){var c=b[2],d=b[4];a=b[1];d&&(a=a+c+d)}return a}
9
- var aa=function(a,b,c){function d(e,g){e=V(e);e.length&&(e=g+e);return e}r.history&&r.history.replaceState&&(R.test(b)||R.test(c))&&(a=A(a,"path"),b=d(b,"?"),c=d(c,"#"),r.history.replaceState({},void 0,""+a+b+c))},U=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=P.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var g=e[2],f=e[3];a:{for(e=0;e<b;++e)if(g===S(f,e)){var h=!0;break a}h=!1}if(h){b={};var m=f?f.split("*"):[];for(f=0;f<m.length;f+=
10
- 2)b[m[f]]=H(m[f+1]);return b}}}}catch(t){}};function W(a,b,c){function d(h){h=V(h);var m=h.charAt(h.length-1);h&&"&"!==m&&(h+="&");return h+f}c=void 0===c?!1:c;var e=Q.exec(b);if(!e)return"";b=e[1];var g=e[2]||"";e=e[3]||"";var f="_gl="+a;c?e="#"+d(e.substring(1)):g="?"+d(g.substring(1));return""+b+g+e}
11
- function X(a,b,c){for(var d={},e={},g=N().decorators,f=0;f<g.length;++f){var h=g[f];(!c||h.forms)&&J(h.domains,b)&&(h.fragment?n(e,h.callback()):n(d,h.callback()))}p(d)&&(b=T(d),c?Y(b,a):Z(b,a,!1));!c&&p(e)&&(c=T(e),Z(c,a,!0))}function Z(a,b,c){b.href&&(a=W(a,b.href,void 0===c?!1:c),q.test(a)&&(b.href=a))}
12
- function Y(a,b){if(b&&b.action){var c=(b.method||"").toLowerCase();if("get"===c){c=b.childNodes||[];for(var d=!1,e=0;e<c.length;e++){var g=c[e];if("_gl"===g.name){g.setAttribute("value",a);d=!0;break}}d||(c=u.createElement("input"),c.setAttribute("type","hidden"),c.setAttribute("name","_gl"),c.setAttribute("value",a),b.appendChild(c))}else"post"===c&&(a=W(a,b.action),q.test(a)&&(b.action=a))}}
13
- var K=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||X(c,c.hostname,!1)}}catch(e){}},M=function(a){try{if(a.action){var b=A(B(a.action),"host");X(a,b,!0)}}catch(c){}};l("google_tag_data.glBridge.auto",function(a,b,c,d){O();a={callback:a,domains:b,fragment:"fragment"===c,forms:!!d};N().decorators.push(a)});l("google_tag_data.glBridge.decorate",function(a,b,c){c=!!c;a=T(a);if(b.tagName){if("a"==b.tagName.toLowerCase())return Z(a,b,c);if("form"==b.tagName.toLowerCase())return Y(a,b)}if("string"==typeof b)return W(a,b,c)});l("google_tag_data.glBridge.generate",T);
14
- l("google_tag_data.glBridge.get",function(a,b){var c=ba(!!b);b=N();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)n(c,b.query),a&&n(c,b.fragment);return c});})(window);
15
- (function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.w.length;b++)this.w[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,wa;if(wa=void 0!=ha)wa=-1<(ha.constructor+"").indexOf("String");var Za;if(Za=wa){var Qa=window.GoogleAnalyticsObject;Za=Qa?Qa.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=Za||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.w.slice(),c=0;c<a.w.length;c++)b[c]=b[c]||a.w[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
16
- 1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+
17
- K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:
18
- c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var F=window,Ea=document,G=function(a){var b=F._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===F["ga-disable-"+a])return!0;try{var c=F.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Ea.cookie||document.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Ea.getElementById("__gaOptOutExtension")?
19
- !0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=Ca(a);
20
- for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),
21
- "$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},
22
- 1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=
23
- e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===
24
- fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==
25
- c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}if(b==c){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,
26
- d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var ca=g.responseText;if(1>ca.length)ge("xhr","ver","0"),c();else if("1"!=ca.charAt(0))ge("xhr","ver",String(ca.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==ca.length)c();else{var l=ca.charAt(1);if("d"==
27
- l)pe("https://stats.g.doubleclick.net/j/collect",d.U,d,c);else if("g"==l){wc("https://www.google.%/ads/ga-audiences".replace("%","com"),d.google,c);var k=ca.substring(2);k&&(/^[a-z.]{1,6}$/.test(k)?wc("https://www.google.%/ads/ga-audiences".replace("%",k),d.google,ua):ge("tld","bcc",k))}else ge("xhr","brc",l),c()}}catch(w){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*
28
- Math.random()||G("?")||(a=["t=error","_e="+a,"_v=j78","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var h=function(a){var b=O.gaData=O.gaData||{};return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
29
- function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
30
- function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d?d+"/3":bd(!1)+"/collect");switch(P(a,ad)){case "d":e=c||(d?d+"/32":bd(!1)+"/j/collect");b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;case "b":e=c||(d?d+"/31":bd(!1)+"/r/collect");default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e=P(a,Na);delete h(e).pending_experiments;
31
- a.set(Ia,ua,!0)}function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
32
- function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};
33
- Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");
34
- var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
35
- var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
36
- S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
37
- var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b});
38
- var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),Yb=T("cookiePath",
39
- void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),je=T("storeGac",void 0,!0),oe=S("_x_19"),
40
- gd=S("transportUrl"),Md=S("_r","_r"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&&
41
- (e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
42
- a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
43
- a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b)}ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W));a=P(a,Na);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(a),c,ca,l,a,d)));le(b)}}else J(75)}},ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);
44
- var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,l,d)&&(hc=!0);else{J(32);for(var k=id(),w=0;w<k.length;w++)if(ca=k[w],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,l,d)){hc=!0;return}a.data.set(W,"auto")}}},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,
45
- b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);
46
- else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));
47
- b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var od=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,pd=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,me=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
48
- function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
49
- var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
50
- var qd=function(a,b,c){var d=pd.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=me.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
51
- a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
52
- Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g=
53
- g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(od);ca&&sd(a,ca[1])&&rd(e,g)}}))};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a);return{_ga:a.get(Q),_gid:a.get(I)||void 0,_gac:b?[b.qa,b.timestamp].join("."):void 0}}
54
- function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){if(ne()!==H(a,e)){J(80);var ca={U:re(a,e,1),google:re(a,e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca)}else ta(re(a,e,0));e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)||
55
- b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4)},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(ca){$a(ca).F&&d.set($a(ca).F,b.get(ca))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(ca,l){g+=K(ca)+"=";g+=K(""+l)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+g);return g},
56
- H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.w);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(ad,"d",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(ad,"b",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.b.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(hb,1);b(ib,"j78");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,
57
- Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));Kc(this.b);Jc(this.b,a[Q]);this.b.set(jb,Lc())},Jc=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1E3}else d=!1;d&&(c=
58
- void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),c=Ca(P(a,la)),(c=Xd(a,c))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));
59
- d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)&&(c=be("_ga",!!a.get(cc)),g=be("_gl",!!a.get(cc)),d=De.get(a.get(cc)),e=d._ga,g&&0<g.indexOf("_ga*")&&!e&&J(30),g=d.gclid,ca=d._gac,c||e||g||ca))if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))){if(e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid))),g?(J(82),a.data.set(ce,g),d.gclsrc&&a.data.set(ie,d.gclsrc)):ca&&(d=ca.split("."))&&2===d.length&&(J(37),a.data.set(ce,d[0]),a.data.set(fe,
60
- d[1])),c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,
61
- c[2]),J(70))}}else J(21);b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||((b=(b=O.gaGlobal&&O.gaGlobal.vid)&&-1!=b.search(jd)?b:void 0)?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a)},Kc=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(!!a.get(ec),!!a.get(Kd)));if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&(J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement;
62
- var g=(e=M.body)&&e.clientWidth&&e.clientHeight,ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,
63
- Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)};
64
- var qc={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";
65
- if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
66
- var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);if(p.test(b)){J(52);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get("&gtm")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId=
67
- String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));c=d.B;g=(new Date).getTime();O[c]=O[c]||[];g={"gtm.start":g};e||(g.event="gtm.js");O[c].push(g);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);if(c){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}c&&0<=c.indexOf("/")||(c=(ca?ca+"/34":bd(!1)+"/plugins/ua/")+c);ca=ae(c);a=ca.protocol;d=M.location.protocol;if(("https:"==
68
- a||a==d||("http:"!=a?0:"http:"==d))&&B(ca)){if(ca=ca.url)a=(a=M.querySelector&&M.querySelector("script[nonce]")||null)?a.nonce||a.getAttribute&&a.getAttribute("nonce")||"":"",e?(e="",a&&Nd.test(a)&&(e=' nonce="'+a+'"'),f.test(ca)&&M.write("<script"+e+' src="'+ca+'">\x3c/script>')):(e=M.createElement("script"),e.type="text/javascript",e.async=!0,e.src=ca,a&&e.setAttribute("nonce",a),ca=M.getElementsByTagName("script")[0],ca.parentNode.insertBefore(e,ca));$d.set(b,!0)}}}},v=function(a,b){var c=A.get(a)||
69
- [];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(l){var k=l.hostname||"",w=
70
- 0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;
71
- d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b};
72
- Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.C,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.C].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var uc=[Na,W,V];N.create=function(a){var b=za(uc,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
73
- N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+
74
- "/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var te=N.N,we=O[gb];we&&we.r?te():z(te);z(function(){Z.D(["provide","render",ua])});})(window);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
clearfy.php CHANGED
@@ -1,51 +1,56 @@
1
- <?php
2
- /**
3
- * Этот файл инициализирует этот плагин, как аддон для плагина Clearfy.
4
- *
5
- * Файл будет подключен только в плагине Clearfy, используя особый вариант загрузки. Это более простое решение
6
- * пришло на смену встроенной системы подключения аддонов в фреймворке.
7
- *
8
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
- * @copyright (c) 2018 Webraftic Ltd
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- if ( ! defined( 'WGA_PLUGIN_ACTIVE' ) ) {
18
- define( 'WGA_PLUGIN_VERSION', '3.1.1' );
19
- define( 'WGA_PLUGIN_ACTIVE', true );
20
-
21
- // Этот плагин загружен, как аддон для плагина Clearfy
22
- define( 'LOADING_GA_CACHE_AS_ADDON', true );
23
-
24
- if ( ! defined( 'WGA_PLUGIN_DIR' ) ) {
25
- define( 'WGA_PLUGIN_DIR', dirname( __FILE__ ) );
26
- }
27
-
28
- if ( ! defined( 'WGA_PLUGIN_BASE' ) ) {
29
- define( 'WGA_PLUGIN_BASE', plugin_basename( __FILE__ ) );
30
- }
31
-
32
- if ( ! defined( 'WGA_PLUGIN_URL' ) ) {
33
- define( 'WGA_PLUGIN_URL', plugins_url( null, __FILE__ ) );
34
- }
35
-
36
- try {
37
- // Global scripts
38
- require_once( WGA_PLUGIN_DIR . '/includes/3rd-party/class-clearfy-plugin.php' );
39
- new WGA_Plugin();
40
- } catch( Exception $e ) {
41
- $wga_plugin_error_func = function () use ( $e ) {
42
- $error = sprintf( "The %s plugin has stopped. <b>Error:</b> %s Code: %s", 'Webcraftic Local Google Analytic', $e->getMessage(), $e->getCode() );
43
- echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
44
- };
45
-
46
- add_action( 'admin_notices', $wga_plugin_error_func );
47
- add_action( 'network_admin_notices', $wga_plugin_error_func );
48
- }
49
- }
50
-
51
-
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Этот файл инициализирует этот плагин, как аддон для плагина Clearfy.
4
+ *
5
+ * Файл будет подключен только в плагине Clearfy, используя особый вариант загрузки. Это более простое решение
6
+ * пришло на смену встроенной системы подключения аддонов в фреймворке.
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2018 Webraftic Ltd
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
+ exit;
15
+ }
16
+
17
+ if( !defined('WGA_PLUGIN_ACTIVE') ) {
18
+ define('WGA_PLUGIN_VERSION', '3.2.2');
19
+ define('WGA_TEXT_DOMAIN', 'simple-google-analytics');
20
+ define('WGA_PLUGIN_ACTIVE', true);
21
+
22
+ // Этот плагин загружен, как аддон для плагина Clearfy
23
+ define('LOADING_GA_CACHE_AS_ADDON', true);
24
+
25
+ if( !defined('WGA_PLUGIN_DIR') ) {
26
+ define('WGA_PLUGIN_DIR', dirname(__FILE__));
27
+ }
28
+
29
+ if( !defined('WGA_PLUGIN_BASE') ) {
30
+ define('WGA_PLUGIN_BASE', plugin_basename(__FILE__));
31
+ }
32
+
33
+ if( !defined('WGA_PLUGIN_URL') ) {
34
+ define('WGA_PLUGIN_URL', plugins_url(null, __FILE__));
35
+ }
36
+
37
+ if( !defined('WGA_PLUGIN_CACHE_FOLDER') ) {
38
+ define('WGA_PLUGIN_CACHE_FOLDER', 'wga-cache');
39
+ }
40
+
41
+ try {
42
+ // Global scripts
43
+ require_once(WGA_PLUGIN_DIR . '/includes/3rd-party/class-clearfy-plugin.php');
44
+ new WGA_Plugin();
45
+ } catch( Exception $e ) {
46
+ $wga_plugin_error_func = function () use ($e) {
47
+ $error = sprintf("The %s plugin has stopped. <b>Error:</b> %s Code: %s", 'Webcraftic Local Google Analytic', $e->getMessage(), $e->getCode());
48
+ echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
49
+ };
50
+
51
+ add_action('admin_notices', $wga_plugin_error_func);
52
+ add_action('network_admin_notices', $wga_plugin_error_func);
53
+ }
54
+ }
55
+
56
+
includes/3rd-party/class-clearfy-plugin.php CHANGED
@@ -1,90 +1,100 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- /**
8
- * Local Google Analytic
9
- *
10
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
- * @copyright (c) 2018 Webraftic Ltd
12
- * @version 1.0
13
- */
14
- class WGA_Plugin {
15
-
16
- /**
17
- * @see self::app()
18
- * @var WCL_Plugin
19
- */
20
- private static $app;
21
-
22
- /**
23
- * Конструктор
24
- *
25
- * Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
26
- * Подробнее о свойстве $app см. self::app()
27
- *
28
- * @param string $plugin_path
29
- * @param array $data
30
- *
31
- * @throws Exception
32
- */
33
- public function __construct() {
34
- if ( ! class_exists( 'WCL_Plugin' ) ) {
35
- throw new Exception( 'Plugin Clearfy is not installed!' );
36
- }
37
-
38
- self::$app = WCL_Plugin::app();
39
-
40
- $this->global_scripts();
41
-
42
- if ( is_admin() ) {
43
- $this->init_activation();
44
- $this->admin_scripts();
45
- }
46
- }
47
-
48
- /**
49
- * Статический метод для быстрого доступа к интерфейсу плагина.
50
- *
51
- * Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
52
- * плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
53
- *
54
- * Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
55
- * классам.
56
- *
57
- * @return WCL_Plugin
58
- */
59
- public static function app() {
60
- return self::$app;
61
- }
62
-
63
- /**
64
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
65
- * @since 3.0.0
66
- */
67
- private function init_activation() {
68
- require_once( WGA_PLUGIN_DIR . '/admin/activation.php' );
69
- self::app()->registerActivation( 'WGA_Activation' );
70
- }
71
-
72
- /**
73
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
74
- * @since 3.0.0
75
- * @throws \Exception
76
- */
77
- private function admin_scripts() {
78
- require( WGA_PLUGIN_DIR . '/admin/options.php' );
79
- require( WGA_PLUGIN_DIR . '/admin/boot.php' );
80
- }
81
-
82
- /**
83
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
84
- * @since 3.0.0
85
- */
86
- private function global_scripts() {
87
- require( WGA_PLUGIN_DIR . '/includes/classes/class.configurate-ga.php' );
88
- new WGA_ConfigGACache( self::$app );
89
- }
 
 
 
 
 
 
 
 
 
 
90
  }
1
+ <?php
2
+ // Exit if accessed directly
3
+ if( !defined('ABSPATH') ) {
4
+ exit;
5
+ }
6
+
7
+ /**
8
+ * Local Google Analytic
9
+ *
10
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
+ * @copyright (c) 2018 Webraftic Ltd
12
+ * @version 1.0
13
+ */
14
+ class WGA_Plugin {
15
+
16
+ /**
17
+ * @see self::app()
18
+ * @var WCL_Plugin
19
+ */
20
+ private static $app;
21
+
22
+ /**
23
+ * Конструктор
24
+ *
25
+ * Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
26
+ * Подробнее о свойстве $app см. self::app()
27
+ *
28
+ * @param string $plugin_path
29
+ * @param array $data
30
+ *
31
+ * @throws Exception
32
+ */
33
+ public function __construct()
34
+ {
35
+ if( !class_exists('WCL_Plugin') ) {
36
+ throw new Exception('Plugin Clearfy is not installed!');
37
+ }
38
+
39
+ self::$app = WCL_Plugin::app();
40
+
41
+ $this->global_scripts();
42
+
43
+ if( is_admin() ) {
44
+ $this->init_activation();
45
+ $this->admin_scripts();
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Статический метод для быстрого доступа к интерфейсу плагина.
51
+ *
52
+ * Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
53
+ * плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
54
+ *
55
+ * Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
56
+ * классам.
57
+ *
58
+ * @return WCL_Plugin
59
+ */
60
+ public static function app()
61
+ {
62
+ return self::$app;
63
+ }
64
+
65
+ /**
66
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
67
+ * @since 3.0.0
68
+ */
69
+ private function init_activation()
70
+ {
71
+ require_once(WGA_PLUGIN_DIR . '/admin/activation.php');
72
+ self::app()->registerActivation('WGA_Activation');
73
+ }
74
+
75
+ /**
76
+ * @throws \Exception
77
+ * @since 3.0.0
78
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
79
+ */
80
+ private function admin_scripts()
81
+ {
82
+ require(WGA_PLUGIN_DIR . '/admin/options.php');
83
+ require(WGA_PLUGIN_DIR . '/admin/boot.php');
84
+ }
85
+
86
+ /**
87
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
88
+ * @since 3.0.0
89
+ */
90
+ private function global_scripts()
91
+ {
92
+ require(WGA_PLUGIN_DIR . '/includes/classes/class-configurate-ga.php');
93
+ new WGA_ConfigGACache(self::$app);
94
+
95
+ add_action('plugins_loaded', function () {
96
+ require(WGA_PLUGIN_DIR . '/includes/classes/class-scheduler.php');
97
+ new \WGA\Busting\Sheduller();
98
+ });
99
+ }
100
  }
includes/class-plugin.php CHANGED
@@ -1,121 +1,130 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- /**
8
- * Plugin class
9
- *
10
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
- * @copyright (c) 19.02.2018, Webcraftic
12
- */
13
- class WGA_Plugin extends Wbcr_Factory420_Plugin {
14
-
15
- /**
16
- * @see self::app()
17
- * @var Wbcr_Factory420_Plugin
18
- */
19
- private static $app;
20
-
21
- /**
22
- * @since 3.1.0
23
- * @var array
24
- */
25
- private $plugin_data;
26
-
27
- /**
28
- * Конструктор
29
- *
30
- * Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
31
- * Подробнее о свойстве $app см. self::app()
32
- *
33
- * @param string $plugin_path
34
- * @param array $data
35
- *
36
- * @throws Exception
37
- */
38
- public function __construct( $plugin_path, $data ) {
39
- parent::__construct( $plugin_path, $data );
40
-
41
- self::$app = $this;
42
- $this->plugin_data = $data;
43
-
44
- $this->global_scripts();
45
-
46
- if ( is_admin() ) {
47
- $this->init_activation();
48
- $this->admin_scripts();
49
- }
50
- }
51
-
52
- /**
53
- * Статический метод для быстрого доступа к интерфейсу плагина.
54
- *
55
- * Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
56
- * плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
57
- *
58
- * Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
59
- * классам.
60
- *
61
- * @return \Wbcr_Factory420_Plugin|\WGA_Plugin
62
- */
63
- public static function app() {
64
- return self::$app;
65
- }
66
-
67
- /**
68
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
69
- * @since 3.0.0
70
- */
71
- private function init_activation() {
72
- require_once( WGA_PLUGIN_DIR . '/admin/activation.php' );
73
- self::app()->registerActivation( 'WGA_Activation' );
74
- }
75
-
76
- /**
77
- * Регистрирует классы страниц в плагине
78
- *
79
- * Мы указываем плагину, где найти файлы страниц и какое имя у их класса. Чтобы плагин
80
- * выполнил подключение классов страниц. После регистрации, страницы будут доступные по url
81
- * и в меню боковой панели администратора. Регистрируемые страницы будут связаны с текущим плагином
82
- * все операции выполняемые внутри классов страниц, имеют отношение только текущему плагину.
83
- *
84
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
85
- * @since 3.0.0
86
- * @throws \Exception
87
- */
88
- private function register_pages() {
89
- if ( $this->as_addon ) {
90
- return;
91
- }
92
-
93
- if ( $this->isNetworkActive() and ! is_network_admin() ) {
94
- return;
95
- }
96
- self::app()->registerPage( 'WGA_CachePage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-general-settings.php' );
97
- self::app()->registerPage( 'WGA_MoreFeaturesPage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-more-features.php' );
98
- }
99
-
100
- /**
101
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
102
- * @since 3.1.0
103
- * @throws \Exception
104
- */
105
- private function admin_scripts() {
106
- require( WGA_PLUGIN_DIR . '/admin/options.php' );
107
- require( WGA_PLUGIN_DIR . '/admin/boot.php' );
108
-
109
- $this->register_pages();
110
- }
111
-
112
- /**
113
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
114
- * @since 3.0.0
115
- */
116
- private function global_scripts() {
117
- require( WGA_PLUGIN_DIR . '/includes/classes/class-configurate-ga.php' );
118
- new WGA_ConfigGACache( self::$app );
119
- }
120
- }
121
-
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Exit if accessed directly
3
+ if( !defined('ABSPATH') ) {
4
+ exit;
5
+ }
6
+
7
+ /**
8
+ * Plugin class
9
+ *
10
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
+ * @copyright (c) 19.02.2018, Webcraftic
12
+ */
13
+ class WGA_Plugin extends Wbcr_Factory446_Plugin {
14
+
15
+ /**
16
+ * @see self::app()
17
+ * @var Wbcr_Factory446_Plugin
18
+ */
19
+ private static $app;
20
+
21
+ /**
22
+ * @since 3.1.0
23
+ * @var array
24
+ */
25
+ private $plugin_data;
26
+
27
+ /**
28
+ * Конструктор
29
+ *
30
+ * Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
31
+ * Подробнее о свойстве $app см. self::app()
32
+ *
33
+ * @param string $plugin_path
34
+ * @param array $data
35
+ *
36
+ * @throws Exception
37
+ */
38
+ public function __construct($plugin_path, $data)
39
+ {
40
+ parent::__construct($plugin_path, $data);
41
+
42
+ self::$app = $this;
43
+ $this->plugin_data = $data;
44
+
45
+ $this->global_scripts();
46
+
47
+ if( is_admin() ) {
48
+ $this->init_activation();
49
+ $this->admin_scripts();
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Статический метод для быстрого доступа к интерфейсу плагина.
55
+ *
56
+ * Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
57
+ * плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
58
+ *
59
+ * Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
60
+ * классам.
61
+ *
62
+ * @return \Wbcr_Factory446_Plugin|\WGA_Plugin
63
+ */
64
+ public static function app()
65
+ {
66
+ return self::$app;
67
+ }
68
+
69
+ /**
70
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
71
+ * @since 3.0.0
72
+ */
73
+ private function init_activation()
74
+ {
75
+ require_once(WGA_PLUGIN_DIR . '/admin/activation.php');
76
+ self::app()->registerActivation('WGA_Activation');
77
+ }
78
+
79
+ /**
80
+ * Регистрирует классы страниц в плагине
81
+ *
82
+ * Мы указываем плагину, где найти файлы страниц и какое имя у их класса. Чтобы плагин
83
+ * выполнил подключение классов страниц. После регистрации, страницы будут доступные по url
84
+ * и в меню боковой панели администратора. Регистрируемые страницы будут связаны с текущим плагином
85
+ * все операции выполняемые внутри классов страниц, имеют отношение только текущему плагину.
86
+ *
87
+ * @throws \Exception
88
+ * @since 3.0.0
89
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
90
+ */
91
+ private function register_pages()
92
+ {
93
+ if( $this->as_addon ) {
94
+ return;
95
+ }
96
+
97
+ if( $this->isNetworkActive() and !is_network_admin() ) {
98
+ return;
99
+ }
100
+ self::app()->registerPage('WGA_CachePage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-general-settings.php');
101
+ self::app()->registerPage('WGA_MoreFeaturesPage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-more-features.php');
102
+ }
103
+
104
+ /**
105
+ * @throws \Exception
106
+ * @since 3.1.0
107
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
108
+ */
109
+ private function admin_scripts()
110
+ {
111
+ require(WGA_PLUGIN_DIR . '/admin/options.php');
112
+ require(WGA_PLUGIN_DIR . '/admin/boot.php');
113
+
114
+ $this->register_pages();
115
+ }
116
+
117
+ /**
118
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
119
+ * @since 3.0.0
120
+ */
121
+ private function global_scripts()
122
+ {
123
+ require(WGA_PLUGIN_DIR . '/includes/classes/class-configurate-ga.php');
124
+ new WGA_ConfigGACache(self::$app);
125
+
126
+ require(WGA_PLUGIN_DIR . '/includes/classes/class-scheduler.php');
127
+ new \WGA\Busting\Sheduller();
128
+ }
129
+ }
130
+
includes/classes/class-abstract-cache.php ADDED
@@ -0,0 +1,562 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ use FilesystemIterator;
6
+ use IteratorIterator;
7
+ use RegexIterator;
8
+
9
+ /**
10
+ * This class configures the google analytics cache
11
+ *
12
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
13
+ * @copyright (c) 2020 CreativeMotion Ltd
14
+ * @version 1.0
15
+ */
16
+
17
+ // Exit if accessed directly
18
+ if( !defined('ABSPATH') ) {
19
+ exit;
20
+ }
21
+
22
+ abstract class Abstract_Cache {
23
+
24
+ /**
25
+ * Cache busting files base path
26
+ *
27
+ * @var string
28
+ */
29
+ protected $busting_path;
30
+
31
+ /**
32
+ * Cache busting base URL
33
+ *
34
+ * @var string
35
+ */
36
+ protected $busting_url;
37
+
38
+ /**
39
+ * Filename for the cache busting file.
40
+ *
41
+ * @var string
42
+ */
43
+ protected $filename;
44
+
45
+ /**
46
+ * Filesystem object.
47
+ *
48
+ * @var object
49
+ * @since 3.2.0
50
+ */
51
+ protected $filesystem = false;
52
+
53
+ /**
54
+ * Constructor.
55
+ *
56
+ * @param string $busting_path Path to the busting directory.
57
+ * @param string $busting_url URL of the busting directory.
58
+ * @since 3.2.0
59
+ */
60
+ public function __construct($busting_path, $busting_url)
61
+ {
62
+ /*
63
+ * Define the timeouts for the connections. Only available after the constructor is called
64
+ * to allow for per-transport overriding of the default.
65
+ */
66
+ if( !defined('FS_CONNECT_TIMEOUT') ) {
67
+ define('FS_CONNECT_TIMEOUT', 30);
68
+ }
69
+ if( !defined('FS_TIMEOUT') ) {
70
+ define('FS_TIMEOUT', 30);
71
+ }
72
+
73
+ // Set the permission constants if not already set.
74
+ if( !defined('FS_CHMOD_DIR') ) {
75
+ define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
76
+ }
77
+ if( !defined('FS_CHMOD_FILE') ) {
78
+ define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
79
+ }
80
+
81
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
82
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
83
+ $this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
84
+ }
85
+
86
+ /**
87
+ * Tell if the cache busting should happen.
88
+ *
89
+ * @return bool
90
+ * @since 3.2.0
91
+ *
92
+ */
93
+ private function is_allowed()
94
+ {
95
+ //if( defined('DONOTROCKETOPTIMIZE') && DONOTROCKETOPTIMIZE ) {
96
+ //return false;
97
+ //}
98
+
99
+ return true;
100
+ }
101
+
102
+ /**
103
+ * Saves the content of the URL to bust to the busting file.
104
+ *
105
+ * @param string $url URL to get the content from.
106
+ * @return bool
107
+ * @since 3.2.0
108
+ */
109
+ public function refresh_save($url)
110
+ {
111
+ // Before doing anything, make sure the busting file can be created.
112
+ if( !$this->is_busting_dir_writable() ) {
113
+ return false;
114
+ }
115
+
116
+ // Get remote content.
117
+ $content = $this->get_remote_contents($url);
118
+
119
+ if( !$content ) {
120
+ // Could not get the remote contents.
121
+ return false;
122
+ }
123
+
124
+ $version = md5($content);
125
+ $path = $this->get_busting_file_path($version);
126
+
127
+ return $this->update_file_contents($path, $content);
128
+ }
129
+
130
+
131
+ /**
132
+ * Performs the replacement process.
133
+ *
134
+ * @param string $html HTML content.
135
+ * @return string
136
+ * @since 3.2.0
137
+ */
138
+ abstract public function replace_url($html);
139
+
140
+ /**
141
+ * Searches for element(s) in the DOM
142
+ *
143
+ * @param string $pattern Pattern to match.
144
+ * @param string $html HTML content.
145
+ * @return string
146
+ * @since 3.2.0
147
+ */
148
+ abstract protected function find($pattern, $html);
149
+
150
+ /**
151
+ * Saves the content of the URL to bust to the busting file if it doesn't exist yet.
152
+ *
153
+ * @param string $url URL to get the content from.
154
+ * @return bool
155
+ * @since 3.2.0
156
+ */
157
+ public function save($url)
158
+ {
159
+ if( $this->get_busting_version() ) {
160
+ // We have a local copy.
161
+ \WGA_Plugin::app()->logger->info('Found local file. Busting path ' . $this->get_busting_path());
162
+
163
+ return true;
164
+ }
165
+
166
+ if( $this->refresh_save($url) ) {
167
+ // We downloaded a fresh copy.
168
+ \WGA_Plugin::app()->logger->info('New copy downloaded. Busting path ' . $this->get_busting_path());
169
+
170
+ return true;
171
+ }
172
+
173
+ return false;
174
+ }
175
+
176
+ /**
177
+ * Deletes the busting file.
178
+ *
179
+ * @return bool True on success. False on failure.
180
+ * @since 3.2.0
181
+ */
182
+ public function delete()
183
+ {
184
+ $files = $this->get_all_files();
185
+
186
+ if( false === $files ) {
187
+ // Error.
188
+ return false;
189
+ }
190
+
191
+ $this->file_version = null;
192
+
193
+ if( !$files ) {
194
+ // No local files yet.
195
+ return true;
196
+ }
197
+
198
+ return $this->delete_files(array_keys($files));
199
+ }
200
+
201
+ /**
202
+ * Get the version of the current busting file.
203
+ *
204
+ * @return string|bool Version of the file. False if the file does not exist.
205
+ *
206
+ *
207
+ * @since 3.2.0
208
+ */
209
+ protected function get_busting_version()
210
+ {
211
+ if( !empty($this->file_version) ) {
212
+ return $this->file_version;
213
+ }
214
+
215
+ $files = $this->get_all_files();
216
+
217
+ if( !$files ) {
218
+ return false;
219
+ }
220
+
221
+ $this->file_version = reset($files);
222
+
223
+ return $this->file_version;
224
+ }
225
+
226
+ /**
227
+ * Get all cached files in the directory.
228
+ * In a perfect world, there should be only one.
229
+ *
230
+ * @return bool|array A list of file names (as array keys) and versions (as array values). False on failure.
231
+ * @since 3.2.0
232
+ * @access private
233
+ *
234
+ */
235
+ private function get_all_files()
236
+ {
237
+ $dir_path = rtrim($this->busting_path, '\\/');
238
+
239
+ if( !$this->filesystem->exists($dir_path) ) {
240
+ return [];
241
+ }
242
+
243
+ if( !$this->filesystem->is_readable($dir_path) ) {
244
+ \WGA_Plugin::app()->logger->error('Directory is not readable. Path ' . $dir_path);
245
+
246
+ return false;
247
+ }
248
+
249
+ $pattern = '/' . sprintf($this->escape_file_name($this->filename_pattern), '([a-f0-9]{32}|local)') . '/';
250
+
251
+ $entries = $this->get_dir_files_by_regex($dir_path, $pattern);
252
+
253
+ $list = [];
254
+ foreach($entries as $entry) {
255
+ $filename = $entry->getFilename();
256
+
257
+ preg_match($pattern, $filename, $file_details_match);
258
+ if( !empty($file_details_match[1]) ) {
259
+ $list[$filename] = $file_details_match[1];
260
+ }
261
+ }
262
+
263
+ return $list;
264
+ }
265
+
266
+ /**
267
+ * Get the final URL for the current cache busting file.
268
+ *
269
+ * @return string|bool URL of the file. False if the file does not exist.
270
+ * @since 3.2.0
271
+ * @access protected
272
+ *
273
+ */
274
+ public function get_busting_url()
275
+ {
276
+ return $this->get_busting_file_url($this->get_busting_version());
277
+ }
278
+
279
+ /**
280
+ * Get the path to the current cache busting file.
281
+ *
282
+ * @return string|bool URL of the file. False if the file does not exist.
283
+ *
284
+ *
285
+ * @since 3.2.0
286
+ * @access protected
287
+ */
288
+ protected function get_busting_path()
289
+ {
290
+ return $this->get_busting_file_path($this->get_busting_version());
291
+ }
292
+
293
+ /**
294
+ * Get the final URL for a cache busting file.
295
+ *
296
+ * @param string $version The file version.
297
+ * @return string|bool URL of the file with this version. False if no versions are provided.
298
+ * @since 3.2.0
299
+ * @access private
300
+ *
301
+ *
302
+ */
303
+ private function get_busting_file_url($version)
304
+ {
305
+ if( !$version ) {
306
+ return false;
307
+ }
308
+
309
+ $filename = $this->get_busting_file_name($version);
310
+
311
+ return $this->busting_url . $filename;
312
+ }
313
+
314
+ /**
315
+ * Get the local file name.
316
+ *
317
+ * @param string $version The file version.
318
+ * @return string|bool The name of the file with this version. False if no versions are provided.
319
+ * @since 3.2.0
320
+ * @access private
321
+ */
322
+ private function get_busting_file_name($version)
323
+ {
324
+ if( !$version ) {
325
+ return false;
326
+ }
327
+
328
+ return sprintf($this->filename_pattern, $version);
329
+ }
330
+
331
+ /**
332
+ * Get the local file path.
333
+ *
334
+ * @param string $version The file version.
335
+ * @return string|bool Path to the file with this version. False if no versions are provided.
336
+ * @since 3.2.0
337
+ * @access private
338
+ */
339
+ private function get_busting_file_path($version)
340
+ {
341
+ if( !$version ) {
342
+ return false;
343
+ }
344
+
345
+ return $this->busting_path . $this->get_busting_file_name($version);
346
+ }
347
+
348
+ /**
349
+ * Escape a file name, to be used in a regex pattern (delimiter is `/`).
350
+ * `%s` conversion specifications are protected.
351
+ *
352
+ * @param string $filename_pattern The file name.
353
+ * @return string
354
+ * @since 3.2.0
355
+ * @access private
356
+ *
357
+ */
358
+ private function escape_file_name($filename_pattern)
359
+ {
360
+ return preg_quote($filename_pattern, '/');
361
+ }
362
+
363
+ /**
364
+ * Delete busting files.
365
+ *
366
+ * @param array $files A list of file names.
367
+ * @return bool True if files have been deleted (or no files have been provided). False on failure.
368
+ * @since 3.2.0
369
+ */
370
+ private function delete_files($files)
371
+ {
372
+ if( !$files ) {
373
+ return true;
374
+ }
375
+
376
+ $has_deleted = false;
377
+ $error_paths = [];
378
+
379
+ foreach($files as $file_name) {
380
+ if( !$this->filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
381
+ $error_paths[] = $this->busting_path . $file_name;
382
+ } else {
383
+ $has_deleted = true;
384
+ }
385
+ }
386
+
387
+ if( $error_paths ) {
388
+ \WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Path ' . $error_paths);
389
+ }
390
+
391
+ return $has_deleted;
392
+ }
393
+
394
+ /**
395
+ * Add new contents to a file. If the file doesn't exist, it is created.
396
+ *
397
+ * @param string $file_path Path to the file to update.
398
+ * @param string $file_contents New contents.
399
+ * @return string|bool The file contents on success. False on failure.
400
+ *
401
+ *
402
+ * @since 3.2.0
403
+ * @access private
404
+ */
405
+ private function update_file_contents($file_path, $file_contents)
406
+ {
407
+ if( !$this->is_busting_dir_writable() ) {
408
+ return false;
409
+ }
410
+
411
+ if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
412
+ \WGA_Plugin::app()->logger->error('Contents could not be written into file. Path ' . $file_path);
413
+
414
+ return false;
415
+ }
416
+
417
+ return $file_contents;
418
+ }
419
+
420
+ /**
421
+ * Tell if the directory containing the busting file is writable.
422
+ *
423
+ * @return bool
424
+ *
425
+ *
426
+ * @since 3.2
427
+ * @access private
428
+ */
429
+ private function is_busting_dir_writable()
430
+ {
431
+ if( !$this->filesystem->exists($this->busting_path) ) {
432
+ wp_mkdir_p($this->busting_path);
433
+ }
434
+
435
+ if( !$this->filesystem->is_writable($this->busting_path) ) {
436
+ \WGA_Plugin::app()->logger->error('Directory is not writable. Paths ' . $this->busting_path);
437
+
438
+ return false;
439
+ }
440
+
441
+ return true;
442
+ }
443
+
444
+ /** ----------------------------------------------------------------------------------------- */
445
+ /** GET LOCAL/REMOTE CONTENTS =============================================================== */
446
+ /** ----------------------------------------------------------------------------------------- */
447
+
448
+ /**
449
+ * Get a file contents. If the file doesn't exist, new contents are fetched remotely.
450
+ *
451
+ * @param string $file_path Path to the file.
452
+ * @param string $file_url URL to the remote file.
453
+ * @return string|bool The contents on success, false on failure.
454
+ *
455
+ * @since 3.2.0
456
+ */
457
+ private function get_file_or_remote_contents($file_path, $file_url)
458
+ {
459
+ $content = $this->get_file_contents($file_path);
460
+
461
+ if( $content ) {
462
+ // We have a local file.
463
+ return $content;
464
+ }
465
+
466
+ return $this->get_remote_contents($file_url);
467
+ }
468
+
469
+ /**
470
+ * Get a file contents.
471
+ *
472
+ * @param string $file_path Path to the file.
473
+ * @return string|bool The contents on success, false on failure.
474
+ * @since 3.2.0
475
+ * @access private
476
+ *
477
+ *
478
+ */
479
+ private function get_file_contents($file_path)
480
+ {
481
+ if( !$this->filesystem->exists($file_path) ) {
482
+ \WGA_Plugin::app()->logger->error('Local file does not exist. Path ' . $file_path);
483
+
484
+ return false;
485
+ }
486
+
487
+ if( !$this->filesystem->is_readable($file_path) ) {
488
+ \WGA_Plugin::app()->logger->error('Local file is not readable. Path' . $file_path);
489
+
490
+ return false;
491
+ }
492
+
493
+ $content = $this->filesystem->get_contents($file_path);
494
+
495
+ if( !$content ) {
496
+ \WGA_Plugin::app()->logger->error('Local file is empty. Path' . $file_path);
497
+
498
+ return false;
499
+ }
500
+
501
+ return $content;
502
+ }
503
+
504
+ /**
505
+ * Get the contents of a URL.
506
+ *
507
+ * @param string $url The URL to request.
508
+ * @return string|bool The contents on success. False on failure.
509
+ * @since 3.2.0
510
+ * @access private
511
+ *
512
+ *
513
+ */
514
+ private function get_remote_contents($url)
515
+ {
516
+ try {
517
+ $response = wp_remote_get($url);
518
+ } catch( \Exception $e ) {
519
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
520
+
521
+ return false;
522
+ }
523
+
524
+ if( is_wp_error($response) ) {
525
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
526
+
527
+ return false;
528
+ }
529
+
530
+ $contents = wp_remote_retrieve_body($response);
531
+
532
+ if( !$contents ) {
533
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
534
+
535
+ return false;
536
+ }
537
+
538
+ return $contents;
539
+ }
540
+
541
+ /**
542
+ * Gets Directory files matches regex.
543
+ *
544
+ * @param string $dir Directory to search for files inside it.
545
+ * @param string $regex Regular expression for files need to be searched for.
546
+ *
547
+ * @return array|RegexIterator List of files matches this regular expression.
548
+ * @since 3.6.3
549
+ * @access private
550
+ *
551
+ */
552
+ function get_dir_files_by_regex($dir, $regex)
553
+ { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound
554
+ try {
555
+ $iterator = new IteratorIterator(new FilesystemIterator($dir));
556
+
557
+ return new RegexIterator($iterator, $regex);
558
+ } catch( \Exception $e ) {
559
+ return [];
560
+ }
561
+ }
562
+ }
includes/classes/class-configurate-ga.php CHANGED
@@ -1,161 +1,207 @@
1
- <?php
2
- /**
3
- * This class configures the google analytics cache
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
- * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
- */
9
-
10
- // Exit if accessed directly
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- class WGA_ConfigGACache extends Wbcr_FactoryClearfy212_Configurate {
16
-
17
-
18
- public function registerActionsAndFilters() {
19
-
20
- if ( $this->getPopulateOption( 'ga_cache' ) ) {
21
- add_filter( 'cron_schedules', [ $this, 'cron_additions' ] );
22
-
23
- // Load update script to schedule in wp_cron.
24
- add_action( 'wbcr/gac/update_analytic_library', [ $this, 'update_local_analytic' ] );
25
-
26
- if ( ! is_admin() ) {
27
- $this->add_google_analitics_script();
28
- }
29
- }
30
- }
31
-
32
- /**
33
- * Extends the recurrence interval of cron tasks. In the core,
34
- * the number of recurrence intervals for cron tasks is limited.
35
- * Therefore, we create 3 additional recurrences weekly,
36
- * twicemonthly, monthly.
37
- *
38
- * @param array $schedules an array of already recorded recurrences
39
- *
40
- * @return mixed
41
- */
42
- public function cron_additions( $schedules ) {
43
- $schedules['weekly'] = [
44
- 'interval' => DAY_IN_SECONDS * 7,
45
- 'display' => __( 'Once Weekly' ),
46
- ];
47
-
48
- $schedules['twicemonthly'] = [
49
- 'interval' => DAY_IN_SECONDS * 14,
50
- 'display' => __( 'Twice Monthly' ),
51
- ];
52
-
53
- $schedules['monthly'] = [
54
- 'interval' => DAY_IN_SECONDS * 30,
55
- 'display' => __( 'Once Monthly' ),
56
- ];
57
-
58
- return $schedules;
59
- }
60
-
61
- /**
62
- * Enables update-local-ga.php, which creates and updates
63
- * the Google analytics library locally on the user's site.
64
- * This method performs via cron and manually if the library
65
- * file has not yet been created.
66
- *
67
- * @since 3.0.1
68
- * @return void
69
- */
70
- public function update_local_analytic() {
71
- include( WGA_PLUGIN_DIR . '/includes/update-local-ga.php' );
72
- }
73
-
74
- /**
75
- * Generates tracking code based on the user options set. Then it just
76
- * prints this code on the page. The code can be printed to the header
77
- * or footer, depending on which action called this method.
78
- *
79
- * @since 3.0.1
80
- * @return void
81
- */
82
- public function print_google_analytics() {
83
-
84
- $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
85
- $track_admin = $this->getPopulateOption( 'ga_track_admin' );
86
-
87
- // If user is admin we don't want to render the tracking code, when option is disabled.
88
- if ( empty( $tracking_id ) || ( current_user_can( 'manage_options' ) && ( ! $track_admin ) ) ) {
89
- return;
90
- }
91
-
92
- $adjusted_bounce_rate = $this->getPopulateOption( 'ga_adjusted_bounce_rate', 0 );
93
- $anonymize_ip = $this->getPopulateOption( 'ga_anonymize_ip', false );
94
- $disable_display_features = $this->getPopulateOption( 'ga_disable_display_features', false );
95
-
96
- echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
97
-
98
- echo "<script>" . PHP_EOL;
99
- echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
100
- (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
101
- m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
102
- })(window,document,'script','" . WGA_PLUGIN_URL . "/cache/local-ga.js','ga');" . PHP_EOL;
103
-
104
- /**
105
- * Allows you to complement the current configuration analytics.
106
- * For example, one of the users wanted to add google adwords ID
107
- * to this code.
108
- *
109
- * When using this action, you must enter only javascript code,
110
- * without opening and closing tags.
111
- *
112
- * @since 3.0.1
113
- */
114
- do_action( 'wbcr/gac/print_analytic_options', [
115
- 'tracking_id' => $tracking_id,
116
- 'track_admin' => $track_admin,
117
- 'adjusted_bounce_rate' => $adjusted_bounce_rate,
118
- 'anonymize_ip' => $anonymize_ip,
119
- 'disable_display_features' => $disable_display_features
120
- ] );
121
-
122
- echo "ga('create', '" . $tracking_id . "', 'auto');" . PHP_EOL;
123
- echo $disable_display_features ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL : '';
124
- echo $anonymize_ip ? "ga('set', 'anonymizeIp', true);" . PHP_EOL : '';
125
- echo "ga('send', 'pageview');";
126
- echo $adjusted_bounce_rate ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $adjusted_bounce_rate . " seconds')" . '"' . ',' . $adjusted_bounce_rate * 1000 . ');' : '';
127
- echo PHP_EOL . '</script>' . PHP_EOL;
128
-
129
- echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
130
- }
131
-
132
- /**
133
- * Inserts tracking code in header and footer. Before insertion,
134
- * it executes the wbcr_ga_update_local_script action to update
135
- * Google local analytics library.
136
- *
137
- * @since 3.0.1
138
- * @return void
139
- */
140
- private function add_google_analitics_script() {
141
- $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
142
-
143
- if ( ! empty( $tracking_id ) ) {
144
- $local_ga_file = WGA_PLUGIN_DIR . '/cache/local-ga.js';
145
- // If file is not created yet, create now!
146
- if ( ! file_exists( $local_ga_file ) ) {
147
- ob_start();
148
- do_action( 'wbcr_ga_update_local_script' );
149
- ob_end_clean();
150
- }
151
-
152
- $enqueue_order = $this->getPopulateOption( 'ga_enqueue_order', 0 );
153
-
154
- if ( $this->getPopulateOption( 'ga_script_position', 'footer' ) == 'header' ) {
155
- add_action( 'wp_head', [ $this, 'print_google_analytics' ], $enqueue_order );
156
- } else {
157
- add_action( 'wp_footer', [ $this, 'print_google_analytics' ], $enqueue_order );
158
- }
159
- }
160
- }
161
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This class configures the google analytics cache
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
+ * @copyright (c) 2017 Webraftic Ltd
7
+ * @version 1.0
8
+ */
9
+
10
+ // Exit if accessed directly
11
+ if ( ! defined( 'ABSPATH' ) ) {
12
+ exit;
13
+ }
14
+
15
+ class WGA_ConfigGACache extends WBCR\Factory_Templates_103\Configurate {
16
+
17
+
18
+ public function registerActionsAndFilters() {
19
+
20
+ if ( $this->getPopulateOption( 'ga_cache' ) ) {
21
+ add_filter( 'cron_schedules', [ $this, 'cron_additions' ] );
22
+
23
+ // Load update script to schedule in wp_cron.
24
+ add_action( 'wbcr/gac/update_analytic_library', [ $this, 'update_local_analytic' ] );
25
+
26
+ if ( ! is_admin() ) {
27
+ $this->add_google_analitics_script();
28
+ }
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Extends the recurrence interval of cron tasks. In the core,
34
+ * the number of recurrence intervals for cron tasks is limited.
35
+ * Therefore, we create 3 additional recurrences weekly,
36
+ * twicemonthly, monthly.
37
+ *
38
+ * @param array $schedules an array of already recorded recurrences
39
+ *
40
+ * @return mixed
41
+ */
42
+ public function cron_additions( $schedules ) {
43
+ $schedules['weekly'] = [
44
+ 'interval' => DAY_IN_SECONDS * 7,
45
+ 'display' => __( 'Once Weekly' ),
46
+ ];
47
+
48
+ $schedules['twicemonthly'] = [
49
+ 'interval' => DAY_IN_SECONDS * 14,
50
+ 'display' => __( 'Twice Monthly' ),
51
+ ];
52
+
53
+ $schedules['monthly'] = [
54
+ 'interval' => DAY_IN_SECONDS * 30,
55
+ 'display' => __( 'Once Monthly' ),
56
+ ];
57
+
58
+ return $schedules;
59
+ }
60
+
61
+ /**
62
+ * Enables update-local-ga.php, which creates and updates
63
+ * the Google analytics library locally on the user's site.
64
+ * This method performs via cron and manually if the library
65
+ * file has not yet been created.
66
+ *
67
+ * @since 3.0.1
68
+ * @return void
69
+ */
70
+ public function update_local_analytic() {
71
+ include( WGA_PLUGIN_DIR . '/includes/update-local-ga.php' );
72
+ }
73
+
74
+ /**
75
+ * Generates tracking code based on the user options set. Then it just
76
+ * prints this code on the page. The code can be printed to the header
77
+ * or footer, depending on which action called this method.
78
+ *
79
+ * @since 3.0.1
80
+ * @return void
81
+ */
82
+ public function print_google_analytics() {
83
+
84
+ $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
85
+ $track_admin = (int) $this->getPopulateOption( 'ga_track_admin' );
86
+
87
+ // If user is admin we don't want to render the tracking code, when option is disabled.
88
+ if ( empty( $tracking_id ) || ( current_user_can( 'manage_options' ) && ( ! $track_admin ) ) ) {
89
+ return;
90
+ }
91
+
92
+ $adjusted_bounce_rate = (int) $this->getPopulateOption( 'ga_adjusted_bounce_rate', 0 );
93
+ $anonymize_ip = (int) $this->getPopulateOption( 'ga_anonymize_ip', 0 );
94
+ $disable_display_features = (int) $this->getPopulateOption( 'ga_disable_display_features', 0 );
95
+
96
+ echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
97
+
98
+ echo "<script>" . PHP_EOL;
99
+ echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
100
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
101
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
102
+ })(window,document,'script','" . esc_url( $this->get_local_analytic_file_url() ) . "','ga');" . PHP_EOL;
103
+
104
+ /**
105
+ * Allows you to complement the current configuration analytics.
106
+ * For example, one of the users wanted to add google adwords ID
107
+ * to this code.
108
+ *
109
+ * When using this action, you must enter only javascript code,
110
+ * without opening and closing tags.
111
+ *
112
+ * @since 3.0.1
113
+ */
114
+ do_action( 'wbcr/gac/print_analytic_options', [
115
+ 'tracking_id' => $tracking_id,
116
+ 'track_admin' => $track_admin,
117
+ 'adjusted_bounce_rate' => $adjusted_bounce_rate,
118
+ 'anonymize_ip' => $anonymize_ip,
119
+ 'disable_display_features' => $disable_display_features
120
+ ] );
121
+
122
+ echo "ga('create', '" . esc_attr( $tracking_id ) . "', 'auto');" . PHP_EOL;
123
+ echo $disable_display_features ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL : '';
124
+ echo $anonymize_ip ? "ga('set', 'anonymizeIp', true);" . PHP_EOL : '';
125
+ echo "ga('send', 'pageview');";
126
+ echo $adjusted_bounce_rate ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $adjusted_bounce_rate . " seconds')" . '"' . ',' . $adjusted_bounce_rate * 1000 . ');' : '';
127
+ echo PHP_EOL . '</script>' . PHP_EOL;
128
+
129
+ echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
130
+ }
131
+
132
+ /**
133
+ * Inserts tracking code in header and footer. Before insertion,
134
+ * it executes the wbcr_ga_update_local_script action to update
135
+ * Google local analytics library.
136
+ *
137
+ * @since 3.0.1
138
+ * @return void
139
+ */
140
+ private function add_google_analitics_script() {
141
+ $tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
142
+
143
+ if ( ! empty( $tracking_id ) ) {
144
+ $local_ga_file = $this->get_local_analytic_file_path();
145
+ // If file is not created yet, create now!
146
+ if ( $local_ga_file && ! file_exists( $local_ga_file ) ) {
147
+ ob_start();
148
+ $this->update_local_analytic();
149
+ ob_end_clean();
150
+ }
151
+
152
+ $enqueue_order = $this->getPopulateOption( 'ga_enqueue_order', 0 );
153
+
154
+ if ( $this->getPopulateOption( 'ga_script_position', 'footer' ) == 'header' ) {
155
+ add_action( 'wp_head', [ $this, 'print_google_analytics' ], $enqueue_order );
156
+ } else {
157
+ add_action( 'wp_footer', [ $this, 'print_google_analytics' ], $enqueue_order );
158
+ }
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Get uploads dir
164
+ *
165
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
166
+ * @since 3.1.1
167
+ */
168
+ private function get_uploads_dir() {
169
+ $upload_dir = wp_upload_dir();
170
+
171
+ if ( true === $upload_dir['error'] ) {
172
+ return null;
173
+ }
174
+
175
+ return (object) $upload_dir;
176
+ }
177
+
178
+ /**
179
+ * Get the path to an encrypted google analytics file
180
+ *
181
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
182
+ * @since 3.1.1
183
+ * @return string|null
184
+ */
185
+ private function get_local_analytic_file_url() {
186
+ if ( $this->get_uploads_dir() ) {
187
+ return untrailingslashit( $this->get_uploads_dir()->baseurl ) . '/wga-cache/local-ga.js';
188
+ }
189
+
190
+ return null;
191
+ }
192
+
193
+ /**
194
+ * Get the url to an encrypted google analytics file
195
+ *
196
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
197
+ * @since 3.1.1
198
+ * @return string|null
199
+ */
200
+ private function get_local_analytic_file_path() {
201
+ if ( $this->get_uploads_dir() ) {
202
+ return untrailingslashit( $this->get_uploads_dir()->basedir ) . '/wga-cache/local-ga.js';
203
+ }
204
+
205
+ return null;
206
+ }
207
+ }
includes/classes/class-facebook-cache.php ADDED
@@ -0,0 +1,1061 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Facebook_Pixel_Cache {
19
+
20
+ /**
21
+ * Regex pattern to capture a locale.
22
+ *
23
+ * @var string
24
+ * @since 3.2
25
+ */
26
+ const LOCALE_CAPTURE = '(?<locale>[a-zA-Z_-]+)';
27
+
28
+ /**
29
+ * Regex pattern to capture a version.
30
+ *
31
+ * @var string
32
+ * @since 3.2
33
+ */
34
+ const VERSION_CAPTURE = '(?<version>[\d\.]+)';
35
+
36
+ /**
37
+ * Regex pattern to capture an app ID.
38
+ *
39
+ * @var string
40
+ * @since 3.2
41
+ */
42
+ const APP_ID_CAPTURE = '(?<app_id>\d+)';
43
+
44
+ /**
45
+ * Cache busting files base path.
46
+ *
47
+ * @var string
48
+ * @since 3.2
49
+ */
50
+ private $busting_path;
51
+
52
+ /**
53
+ * Cache busting base URL.
54
+ *
55
+ * @var string
56
+ * @since 3.2
57
+ */
58
+ private $busting_url;
59
+
60
+ /**
61
+ * Main file URL (remote).
62
+ * %s is a locale like "en_US".
63
+ *
64
+ * @var string
65
+ * @since 3.2
66
+ */
67
+ private $main_file_url = 'https://connect.facebook.net/%s/fbevents.js';
68
+
69
+ /**
70
+ * Main file name (local).
71
+ * %s is like "{{locale}}-{{version}}".
72
+ *
73
+ * @var string
74
+ * @since 3.2
75
+ */
76
+ private $main_file_name = 'fbpix-events-%s.js';
77
+
78
+ /**
79
+ * Config file URL (remote).
80
+ * %d is an app ID (a number), %s is a version like "2.8.30".
81
+ * The "r" argument is the release segment: it is considered "stable".
82
+ *
83
+ * @var string
84
+ * @since 3.2
85
+ */
86
+ private $config_file_url = 'https://connect.facebook.net/signals/config/%s?v=%s&r=stable';
87
+
88
+ /**
89
+ * Config file name (local).
90
+ * %s is like "{{app_id}}-{{version}}".
91
+ *
92
+ * @var string
93
+ * @since 3.2
94
+ */
95
+ private $config_file_name = 'fbpix-config-%s.js';
96
+
97
+ /**
98
+ * Plugins file URL (remote).
99
+ * 1st %s is a plugin name like "identity", 2nd %s is a version like "2.8.30".
100
+ *
101
+ * @var string
102
+ * @since 3.2
103
+ */
104
+ private $plugins_file_url = 'https://connect.facebook.net/signals/plugins/%s?v=%s';
105
+
106
+ /**
107
+ * Plugins file name (local).
108
+ * %s is like "{{plugin_name}}-{{version}}".
109
+ *
110
+ * @var string
111
+ * @since 3.2
112
+ */
113
+ private $plugins_file_name = 'fbpix-plugin-%s.js';
114
+
115
+ /**
116
+ * Flag to track the replacement.
117
+ *
118
+ * @var bool
119
+ * @since 3.2
120
+ */
121
+ private $is_replaced = false;
122
+
123
+ /**
124
+ * Filesystem object.
125
+ *
126
+ * @var object
127
+ * @since 3.2.0
128
+ */
129
+ protected $filesystem = false;
130
+
131
+ /**
132
+ * Constructor.
133
+ *
134
+ * @param string $busting_path Path to the busting directory.
135
+ * @param string $busting_url URL of the busting directory.
136
+ * @since 3.2
137
+ *
138
+ */
139
+ public function __construct($busting_path, $busting_url)
140
+ {
141
+ /** Warning: all file names and script URLs are dynamic, and must be run through sprintf(). */
142
+ $this->busting_path = $busting_path . 'facebook-tracking/';
143
+ $this->busting_url = $busting_url . 'facebook-tracking/';
144
+
145
+ /*
146
+ * Define the timeouts for the connections. Only available after the constructor is called
147
+ * to allow for per-transport overriding of the default.
148
+ */
149
+ if( !defined('FS_CONNECT_TIMEOUT') ) {
150
+ define('FS_CONNECT_TIMEOUT', 30);
151
+ }
152
+ if( !defined('FS_TIMEOUT') ) {
153
+ define('FS_TIMEOUT', 30);
154
+ }
155
+
156
+ // Set the permission constants if not already set.
157
+ if( !defined('FS_CHMOD_DIR') ) {
158
+ define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
159
+ }
160
+ if( !defined('FS_CHMOD_FILE') ) {
161
+ define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
162
+ }
163
+
164
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
165
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
166
+ $this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
167
+ }
168
+
169
+ /**
170
+ * Perform the URL replacement process.
171
+ *
172
+ * @param string $html HTML contents.
173
+ * @return string HTML contents.
174
+ * @since 3.2
175
+ *
176
+ */
177
+ public function replace_url($html)
178
+ {
179
+ $this->is_replaced = false;
180
+
181
+ $tags = $this->find_tags($html);
182
+
183
+ if( !$tags ) {
184
+ return $html;
185
+ }
186
+
187
+ \WGA_Plugin::app()->logger->info('FACEBOOK PIXEL CACHING PROCESS STARTED. Tag ' . $tags['tag_to_search']);
188
+
189
+ $all_files = [];
190
+
191
+ /**
192
+ * Fetch the main file: https://connect.facebook.net/{{locale}}/fbevents.js.
193
+ */
194
+ $version = $this->get_most_recent_local_version();
195
+ $locale = $this->get_locale_from_url($tags['tag_to_search']);
196
+ $main_file_url = $this->get_main_file_url($locale);
197
+
198
+ if( $version ) {
199
+ // At least 1 main file exists locally (but maybe not in the right locale).
200
+ $main_file_path = $this->get_busting_file_path($locale, $version);
201
+ $main_file_contents = $this->get_file_contents($main_file_path, $main_file_url);
202
+ } else {
203
+ // No cached files yet.
204
+ $main_file_contents = $this->get_remote_contents($main_file_url);
205
+ }
206
+
207
+ if( !$main_file_contents ) {
208
+ return $html;
209
+ }
210
+
211
+ /**
212
+ * Grab some data from the main file and the inline tag: app_id and version.
213
+ */
214
+ $variables = $this->get_variables($main_file_contents, $tags['tag_to_search']);
215
+
216
+ if( !$variables ) {
217
+ return $html;
218
+ }
219
+
220
+ if( !$version ) {
221
+ // The local file doesn't exist yet, so we couldn't get its version (and so, can't know its path yet) until we fetch a fresh copy.
222
+ $main_file_path = $this->get_busting_file_path($locale, $variables['version']);
223
+ }
224
+
225
+ $all_files[] = $main_file_path;
226
+ unset($version);
227
+
228
+ /**
229
+ * Fetch the config file: https://connect.facebook.net/signals/config/{{app_id}}?v={{version}}&r={{release_segment​}}.
230
+ */
231
+ $config_file_path = $this->get_config_file_path($variables);
232
+
233
+ if( !$config_file_path ) {
234
+ return $html;
235
+ }
236
+
237
+ $all_files[] = $config_file_path;
238
+
239
+ /**
240
+ * Fetch all plugin files: https://connect.facebook.net/signals/plugins/{{pluginName}}.js?v={{version}}​.
241
+ */
242
+ $plugin_file_paths = $this->get_plugin_file_paths($variables);
243
+
244
+ if( !$plugin_file_paths ) {
245
+ return $html;
246
+ }
247
+
248
+ $all_files = array_merge($all_files, $plugin_file_paths);
249
+
250
+ /**
251
+ * Modify the main file contents.
252
+ */
253
+ $busting_file_url = $this->get_busting_file_url($locale, $variables['version']);
254
+ $busting_dir_url = dirname($busting_file_url) . '/';
255
+ $main_file_contents = $this->replace_main_file_contents($main_file_contents, $busting_dir_url);
256
+
257
+ if( !$main_file_contents ) {
258
+ return $html;
259
+ }
260
+
261
+ /**
262
+ * Save all the changes to the main file.
263
+ */
264
+ $updated = $this->update_file_contents($main_file_path, $main_file_contents);
265
+
266
+ if( !$updated ) {
267
+ return $html;
268
+ }
269
+
270
+ /**
271
+ * Finally, replace the main file URL by the local one in the inline script tag.
272
+ */
273
+ $replace_tag = preg_replace('@(?:https?:)?//connect\.facebook\.net/[a-zA-Z_-]+/fbevents\.js@i', $busting_file_url, $tags['tag_to_replace'], -1, $count);
274
+
275
+ if( !$count || false === strpos($html, $tags['tag_to_replace']) ) {
276
+ \WGA_Plugin::app()->logger->error('Fb pixel: The local file URL could not be replaced in the page contents.');
277
+
278
+ return $html;
279
+ }
280
+
281
+ $html = str_replace($tags['tag_to_replace'], $replace_tag, $html);
282
+
283
+ $this->is_replaced = true;
284
+
285
+ \WGA_Plugin::app()->logger->error('Fb pixel: Facebook pixel caching process succeeded. Files ' . $all_files);
286
+
287
+ return $html;
288
+ }
289
+
290
+ /**
291
+ * Tell if the replacement was sucessful or not.
292
+ *
293
+ * @return bool
294
+ * @since 3.2
295
+ * @access public
296
+ *
297
+ */
298
+ public function is_replaced()
299
+ {
300
+ return $this->is_replaced;
301
+ }
302
+
303
+ /**
304
+ * Search for elements in the DOM.
305
+ *
306
+ * @param string $html HTML contents.
307
+ * @return array|bool {
308
+ * An array on success, described as below. False if nothing is found.
309
+ *
310
+ * @type string $tag_to_replace The script tag that contains the facebook.net URL: this is the tag that will be replaced in the page HTML.
311
+ * @type string $tag_to_search It contains both app ID and facebook.net URL: this is what will be searched in for this data.
312
+ *
313
+ * When the app ID and the URL are in the same tag, $tag_to_replace and $tag_to_search are the same.
314
+ * }
315
+ * @since 3.2
316
+ *
317
+ */
318
+ private function find_tags($html)
319
+ {
320
+ preg_match_all('@<script[^>]*?>(.*)</script>@Umsi', $html, $matches, PREG_SET_ORDER);
321
+
322
+ if( empty($matches) ) {
323
+ return false;
324
+ }
325
+
326
+ $tags = [
327
+ 'app_id' => [],
328
+ 'url' => [],
329
+ 'both' => [],
330
+ ];
331
+
332
+ foreach($matches as $match) {
333
+ list($tag, $script) = $match;
334
+
335
+ if( !trim($script) ) {
336
+ continue;
337
+ }
338
+
339
+ $has_app_id = false;
340
+ $has_url = false;
341
+
342
+ if( preg_match('@fbq\s*\(\s*["\']init["\']\s*,\s*["\']' . self::APP_ID_CAPTURE . '["\']@', $script, $matches_init) ) {
343
+ if( (int)$matches_init['app_id'] > 0 ) {
344
+ $has_app_id = true;
345
+ }
346
+ }
347
+
348
+ $has_url = (bool)$this->get_locale_from_url($script);
349
+
350
+ if( $has_app_id && $has_url ) {
351
+ // OK we have both.
352
+ $tags['both'] = $tag;
353
+ break;
354
+ }
355
+
356
+ if( $has_app_id ) {
357
+ $tags['app_id'] = $tag;
358
+
359
+ if( $tags['url'] ) {
360
+ // OK we have both.
361
+ break;
362
+ }
363
+ } elseif( $has_url ) {
364
+ $tags['url'] = $tag;
365
+
366
+ if( $tags['app_id'] ) {
367
+ // OK we have both.
368
+ break;
369
+ }
370
+ }
371
+ }
372
+
373
+ if( !empty($tags['both']) ) {
374
+ return [
375
+ 'tag_to_replace' => $tags['both'],
376
+ 'tag_to_search' => $tags['both'],
377
+ ];
378
+ }
379
+
380
+ if( !empty($tags['app_id']) && !empty($tags['url']) ) {
381
+ return [
382
+ 'tag_to_replace' => $tags['url'],
383
+ 'tag_to_search' => $tags['url'] . $tags['app_id'],
384
+ ];
385
+ }
386
+
387
+ return false;
388
+ }
389
+
390
+ /**
391
+ * Get some values from the main file and the inline script contents.
392
+ *
393
+ * @param string $main_file_contents Main file contents.
394
+ * @param string $tag_contents Inline script contents.
395
+ * @return array|bool {
396
+ * An array of values. False on failure.
397
+ *
398
+ * @type string $app_id The app ID.
399
+ * @type string $version The file version.
400
+ * }
401
+ * @since 3.2
402
+ *
403
+ */
404
+ private function get_variables($main_file_contents = null, $tag_contents = null)
405
+ {
406
+ $variables = [];
407
+
408
+ if( isset($tag_contents) ) {
409
+ // Retrieve the app ID from the tag contents.
410
+ preg_match('@fbq\s*\(\s*["\']init["\']\s*,\s*["\']' . self::APP_ID_CAPTURE . '["\']@', $tag_contents, $matches);
411
+
412
+ if( empty($matches['app_id']) ) {
413
+ \WGA_Plugin::app()->logger->error('Fb pixel: The app ID could not be retrieved from the inline script contents.');
414
+
415
+ return false;
416
+ }
417
+
418
+ $variables['app_id'] = $matches['app_id'];
419
+ }
420
+
421
+ if( isset($main_file_contents) ) {
422
+ // Retrieve the version from the main file contents.
423
+ preg_match('@fbq\.version\s*=\s*["\']' . self::VERSION_CAPTURE . '["\']\s*;@', $main_file_contents, $matches);
424
+
425
+ if( empty($matches['version']) ) {
426
+ \WGA_Plugin::app()->logger->error('Fb pixel: The version could not be retrieved from the main file contents.');
427
+
428
+ return false;
429
+ }
430
+
431
+ $variables['version'] = $matches['version'];
432
+ }
433
+
434
+ return $variables;
435
+ }
436
+
437
+ /**
438
+ * Perform some replacements in the main file contents. Will be replaced:
439
+ * - the CDN_BASE_URL value,
440
+ * - the config file URL,
441
+ * - the plugins file URL.
442
+ *
443
+ * @param string $main_file_contents The file contents.
444
+ * @param string $busting_dir_url URL of the folder containing the files.
445
+ * @return string|bool The new contents on success. False on failure.
446
+ * @since 3.2
447
+ *
448
+ */
449
+ private function replace_main_file_contents($main_file_contents, $busting_dir_url)
450
+ {
451
+ /**
452
+ * Replace the CDN_BASE_URL value.
453
+ * From: CDN_BASE_URL:"https://connect.facebook.net/"
454
+ * To: CDN_BASE_URL:"https://example.com/wp-content/cache/busting/facebook-tracking/"
455
+ */
456
+ $replacement = 'CDN_BASE_URL:"' . $busting_dir_url . '"';
457
+
458
+ if( !strpos($main_file_contents, $replacement) ) {
459
+ $main_file_contents = preg_replace('@CDN_BASE_URL\s*:\s*["\'][^"\']+["\']@', $replacement, $main_file_contents, -1, $count);
460
+
461
+ if( !$count ) {
462
+ \WGA_Plugin::app()->logger->error('Fb pixel: The CDN_BASE_URL could not be replaced in the main file contents.');
463
+
464
+ return false;
465
+ }
466
+ }
467
+
468
+ /**
469
+ * Replace the config file URL (https://connect.facebook.net/signals/config/{{app_id}}?v={{version}}&r={{release_segment​}}).
470
+ * From: CDN_BASE_URL+"signals/config/"+a+"?v="+b+"&r="+c
471
+ * To: CDN_BASE_URL+"fbpix-config-"+a+"-"+b+".js" (the release segment is not taken into account, we consider it "stable")
472
+ */
473
+ $replacement_pattern = $this->escape_file_name($this->config_file_name);
474
+ $replacement_pattern = sprintf($replacement_pattern, '"\+[a-zA-Z._]+\+"\-"\+[a-zA-Z._]+\+"');
475
+ $replacement_pattern = 'CDN_BASE_URL\+"' . $replacement_pattern . '"';
476
+
477
+ if( !preg_match('/' . $replacement_pattern . '/', $main_file_contents) ) {
478
+ $pattern = '@CDN_BASE_URL\s*\+\s*["\']signals/config/["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']\?v=["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']&r=["\']\s*\+\s*[a-zA-Z._]+@';
479
+ $replacement = 'CDN_BASE_URL+"' . sprintf($this->config_file_name, '"+$1+"-"+$2+"') . '"';
480
+ $main_file_contents = preg_replace($pattern, $replacement, $main_file_contents, -1, $count);
481
+
482
+ if( !$count ) {
483
+ \WGA_Plugin::app()->logger->error('Fb pixel: The config file URL could not be replaced in the main file contents.');
484
+
485
+ return false;
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Replace the plugins file URL (https://connect.facebook.net/signals/plugins/{{plugin_name}}.js?v={{version}}​).
491
+ * From: CDN_BASE_URL+"signals/plugins/"+b+".js?v="+a.version
492
+ * To : CDN_BASE_URL+"fbpix-plugin-"+b+"-"+a.version+".js"
493
+ */
494
+ $replacement_pattern = $this->escape_file_name($this->plugins_file_name);
495
+ $replacement_pattern = sprintf($replacement_pattern, '"\+[a-zA-Z._]+\+"-"\+[a-zA-Z._]+\+"');
496
+ $replacement_pattern = 'CDN_BASE_URL\+"' . $replacement_pattern . '"';
497
+
498
+ if( !preg_match('/' . $replacement_pattern . '/', $main_file_contents) ) {
499
+ $pattern = '@CDN_BASE_URL\s*\+\s*["\']signals/plugins/["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']\.js\?v=["\']\s*\+\s*([a-zA-Z._]+)@';
500
+ $replacement = 'CDN_BASE_URL+"' . sprintf($this->plugins_file_name, '"+$1+"-"+$2+"') . '"';
501
+ $main_file_contents = preg_replace($pattern, $replacement, $main_file_contents, -1, $count);
502
+
503
+ if( !$count ) {
504
+ \WGA_Plugin::app()->logger->error('Fb pixel: The plugins file URL could not be replaced in the main file contents.');
505
+
506
+ return false;
507
+ }
508
+ }
509
+
510
+ return $main_file_contents;
511
+ }
512
+
513
+ /**
514
+ * Save the contents of a URL into a local file if it doesn't exist yet.
515
+ *
516
+ * @param string $url URL to get the contents from.
517
+ * @param string $path Path to the file that will store the URL contents.
518
+ * @return bool True on success. False on failure.
519
+ * @since 3.2
520
+ *
521
+ */
522
+ private function maybe_save($url, $path)
523
+ {
524
+ $filesystem = $this->filesystem;
525
+
526
+ if( $filesystem->exists($path) ) {
527
+ // If a previous version is present, keep it.
528
+ return true;
529
+ }
530
+
531
+ return (bool)$this->save($url, $path);
532
+ }
533
+
534
+ /**
535
+ * Save the contents of a URL into a local file.
536
+ *
537
+ * @param string $url URL to get the contents from.
538
+ * @param string $path Path to the file that will store the URL contents.
539
+ * @return string|bool The file contents on success. False on failure.
540
+ * @since 3.2
541
+ *
542
+ */
543
+ private function save($url, $path)
544
+ {
545
+ $contents = $this->get_remote_contents($url);
546
+
547
+ if( !$contents ) {
548
+ // Error, we couldn't fetch the file contents.
549
+ return false;
550
+ }
551
+
552
+ return $this->update_file_contents($path, $contents);
553
+ }
554
+
555
+ /**
556
+ * Add new contents to a file. If the file doesn't exist, it is created.
557
+ *
558
+ * @param string $file_path Path to the file to update.
559
+ * @param string $file_contents New contents.
560
+ * @return string|bool The file contents on success. False on failure.
561
+ * @since 3.2
562
+ *
563
+ */
564
+ private function update_file_contents($file_path, $file_contents)
565
+ {
566
+ if( !$this->filesystem->exists($this->busting_path) ) {
567
+ wp_mkdir_p($this->busting_path);
568
+ }
569
+
570
+ if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
571
+ \WGA_Plugin::app()->logger->error('Fb pixel: Contents could not be written into file. Paths ' . $file_path);
572
+
573
+ return false;
574
+ }
575
+
576
+ return $file_contents;
577
+ }
578
+
579
+ /**
580
+ * Look for existing local files and update their contents if there's a new version available.
581
+ * Actually, if a more recent version exists on the FB side, it will delete all local files and hit the home page to recreate them.
582
+ *
583
+ * @return bool True on success. False on failure.
584
+ * @since 3.2
585
+ *
586
+ */
587
+ public function refresh_all()
588
+ {
589
+ // Get all local main files.
590
+ $main_files = $this->get_all_main_files();
591
+
592
+ if( !$main_files ) {
593
+ // No files (or there's an error).
594
+ return false !== $main_files;
595
+ }
596
+
597
+ $updated = false;
598
+
599
+ foreach($main_files as $local_main_file) {
600
+ $remote_file_contents = $this->get_remote_contents($this->get_main_file_url($local_main_file['locale']));
601
+
602
+ if( !$remote_file_contents ) {
603
+ continue;
604
+ }
605
+
606
+ $variables = $this->get_variables($remote_file_contents);
607
+
608
+ if( !$variables ) {
609
+ unset($remote_file_contents, $variables);
610
+ continue;
611
+ }
612
+
613
+ if( version_compare($local_main_file['version'], $variables['version']) >= 0 ) {
614
+ unset($remote_file_contents, $variables);
615
+ continue;
616
+ }
617
+
618
+ unset($remote_file_contents);
619
+ $updated = true;
620
+ break;
621
+ }
622
+
623
+ if( !$updated ) {
624
+ return true;
625
+ }
626
+
627
+ // Delete all local files.
628
+ $this->delete_all();
629
+
630
+ return true;
631
+ }
632
+
633
+ /**
634
+ * Delete all Facebook Pixel busting files.
635
+ *
636
+ * @return bool True on success. False on failure.
637
+ * @since 3.2
638
+ * @access public
639
+ *
640
+ */
641
+ public function delete_all()
642
+ {
643
+ $filesystem = $this->filesystem;
644
+ $files = $this->get_all_files();
645
+
646
+ if( !$files ) {
647
+ // No files (or there's an error).
648
+ return false !== $files;
649
+ }
650
+
651
+ $error_paths = [];
652
+
653
+ foreach($files as $file_name) {
654
+ if( !$filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
655
+ $error_paths[] = $this->busting_path . $file_name;
656
+ }
657
+ }
658
+
659
+ if( $error_paths ) {
660
+ \WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Paths ' . $error_paths);
661
+ }
662
+
663
+ return !$error_paths;
664
+ }
665
+
666
+ /**
667
+ * Get all cached files in the directory.
668
+ *
669
+ * @return array|bool A list of file names. False on failure.
670
+ * @since 3.2
671
+ *
672
+ */
673
+ private function get_all_files()
674
+ {
675
+ $filesystem = $this->filesystem;
676
+ $dir_path = rtrim($this->busting_path, '\\/');
677
+
678
+ if( !$filesystem->exists($dir_path) ) {
679
+ return [];
680
+ }
681
+
682
+ if( !$filesystem->is_writable($dir_path) ) {
683
+ \WGA_Plugin::app()->logger->error('Fb pixel: Directory is not writable. Path ' . $dir_path);
684
+
685
+ return false;
686
+ }
687
+
688
+ $dir = $filesystem->dirlist($dir_path);
689
+
690
+ if( false === $dir ) {
691
+ \WGA_Plugin::app()->logger->error('Fb pixel: could not get the directory contents. Path ' . $dir_path);
692
+
693
+ return false;
694
+ }
695
+
696
+ if( !$dir ) {
697
+ return [];
698
+ }
699
+
700
+ $list = [];
701
+
702
+ foreach($dir as $entry) {
703
+ if( 'f' !== $entry['type'] ) {
704
+ continue;
705
+ }
706
+ if( preg_match('@^fbpix-(?:config|events|plugin)-.+\.js$@', $entry['name'], $matches) ) {
707
+ $list[$entry['name']] = $entry['name'];
708
+ }
709
+ }
710
+
711
+ return $list;
712
+ }
713
+
714
+ /**
715
+ * Get all main files in the directory.
716
+ *
717
+ * @return array|bool {
718
+ * An array of file names (array keys) with following data as values. False on failure.
719
+ *
720
+ * @type string $locale The locale, like "en_US".
721
+ * @type string $version The file version.
722
+ * }
723
+ * @since 3.2
724
+ *
725
+ */
726
+ private function get_all_main_files()
727
+ {
728
+ $filesystem = $this->filesystem;
729
+ $dir_path = rtrim($this->busting_path, '\\/');
730
+
731
+ if( !$filesystem->exists($dir_path) ) {
732
+ return [];
733
+ }
734
+
735
+ if( !$filesystem->is_writable($dir_path) ) {
736
+ \WGA_Plugin::app()->logger->error('Fb pixel: Directory is not writable. Path ' . $dir_path);
737
+
738
+ return false;
739
+ }
740
+
741
+ $dir = $filesystem->dirlist($dir_path);
742
+
743
+ if( false === $dir ) {
744
+ \WGA_Plugin::app()->logger->error('Fb pixel: could not get the directory contents. Path ' . $dir_path);
745
+
746
+ return false;
747
+ }
748
+
749
+ if( !$dir ) {
750
+ return [];
751
+ }
752
+
753
+ $list = [];
754
+ $pattern = $this->escape_file_name($this->main_file_name);
755
+ $pattern = sprintf($pattern, self::LOCALE_CAPTURE . '-' . self::VERSION_CAPTURE);
756
+
757
+ foreach($dir as $entry) {
758
+ if( 'f' !== $entry['type'] ) {
759
+ continue;
760
+ }
761
+ if( preg_match('@^' . $pattern . '$@', $entry['name'], $matches) ) {
762
+ unset($matches[0]);
763
+ $list[$entry['name']] = $matches;
764
+ }
765
+ }
766
+
767
+ return $list;
768
+ }
769
+
770
+ /**
771
+ * Get the most recent "version" of the main file cached locally.
772
+ *
773
+ * @return string|bool The version on success. False on failure.
774
+ * @since 3.2
775
+ *
776
+ */
777
+ private function get_most_recent_local_version()
778
+ {
779
+ $main_files = $this->get_all_main_files();
780
+
781
+ if( !$main_files ) {
782
+ return false;
783
+ }
784
+
785
+ $version = false;
786
+
787
+ foreach($main_files as $file_name => $data) {
788
+ if( !$version || version_compare($data['version'], $version) > 0 ) {
789
+ $version = $data['version'];
790
+ }
791
+ }
792
+
793
+ return $version;
794
+ }
795
+
796
+ /**
797
+ * Get the oldest "version" of the main file cached locally.
798
+ *
799
+ * @return string|bool The version on success. False on failure.
800
+ * @since 3.2
801
+ *
802
+ */
803
+ private function get_oldest_local_version()
804
+ {
805
+ $main_files = $this->get_all_main_files();
806
+
807
+ if( !$main_files ) {
808
+ return false;
809
+ }
810
+
811
+ $version = false;
812
+
813
+ foreach($main_files as $file_name => $data) {
814
+ if( !$version || version_compare($data['version'], $version) < 0 ) {
815
+ $version = $data['version'];
816
+ }
817
+ }
818
+
819
+ return $version;
820
+ }
821
+
822
+ /**
823
+ * Get the remote Facebook Pixel URL.
824
+ *
825
+ * @param string $locale A locale string, like 'en_US'.
826
+ * @return string
827
+ * @since 3.2
828
+ *
829
+ */
830
+ public function get_main_file_url($locale)
831
+ {
832
+ return sprintf($this->main_file_url, $locale);
833
+ }
834
+
835
+ /**
836
+ * Extract the locale from a URL to bust.
837
+ *
838
+ * @param string $url Any string containing the URL to bust.
839
+ * @return string|bool The locale on success. False on failure.
840
+ * @since 3.2
841
+ *
842
+ */
843
+ private function get_locale_from_url($url)
844
+ {
845
+ $pattern = '@//connect\.facebook\.net/' . self::LOCALE_CAPTURE . '/fbevents\.js@i';
846
+
847
+ if( !preg_match($pattern, $url, $matches) ) {
848
+ return false;
849
+ }
850
+
851
+ return $matches['locale'];
852
+ }
853
+
854
+ /** ----------------------------------------------------------------------------------------- */
855
+ /** BUSTING FILE (aka: cached copy of the main file) ======================================== */
856
+ /** ----------------------------------------------------------------------------------------- */
857
+
858
+ /**
859
+ * Get the local Facebook Pixel URL (the "main" file).
860
+ *
861
+ * @param string $locale A locale string, like 'en_US'.
862
+ * @param string $version The script version.
863
+ * @return string
864
+ * @since 3.2
865
+ *
866
+ */
867
+ private function get_busting_file_url($locale, $version)
868
+ {
869
+ $filename = $this->get_busting_file_name($locale, $version);
870
+
871
+ // This filter is documented in inc/functions/minify.php.
872
+ return $this->busting_url . $filename;
873
+ }
874
+
875
+ /**
876
+ * Get the local Facebook Pixel file name.
877
+ *
878
+ * @param string $locale A locale string, like 'en_US'.
879
+ * @param string $version The script version.
880
+ * @return string
881
+ * @since 3.2
882
+ *
883
+ */
884
+ private function get_busting_file_name($locale, $version)
885
+ {
886
+ return sprintf($this->main_file_name, $locale . '-' . $version);
887
+ }
888
+
889
+ /**
890
+ * Get the local Facebook Pixel file path.
891
+ *
892
+ * @param string $locale A locale string, like 'en_US'.
893
+ * @param string $version The script version.
894
+ * @return string
895
+ * @since 3.2
896
+ *
897
+ */
898
+ private function get_busting_file_path($locale, $version)
899
+ {
900
+ return $this->busting_path . $this->get_busting_file_name($locale, $version);
901
+ }
902
+
903
+ /** ----------------------------------------------------------------------------------------- */
904
+ /** CONFIG FILE ============================================================================= */
905
+ /** ----------------------------------------------------------------------------------------- */
906
+
907
+ /**
908
+ * Get the path to the local "config" file. If the file doesn't exist, it is created by fetching its contents remotely, then saved locally.
909
+ *
910
+ * @param array $variables {
911
+ * An array of variable values.
912
+ *
913
+ * @type int $app_id The app ID.
914
+ * @type string $version The file version.
915
+ * }
916
+ * @return string|bool The file path on success. False on failure.
917
+ * @since 3.2
918
+ * @access private
919
+ * @see $this->get_variables()
920
+ *
921
+ */
922
+ private function get_config_file_path($variables)
923
+ {
924
+ $config_file_url = sprintf($this->config_file_url, $variables['app_id'], $variables['version']);
925
+ $config_file_name = sprintf($this->config_file_name, $variables['app_id'] . '-' . $variables['version']);
926
+ $config_file_path = $this->busting_path . $config_file_name;
927
+
928
+ if( !$this->maybe_save($config_file_url, $config_file_path) ) {
929
+ return false;
930
+ }
931
+
932
+ return $config_file_path;
933
+ }
934
+
935
+ /**
936
+ * Get the paths to all local "plugin" files. If the files don't exist, they are created by fetching their contents remotely, then saved locally.
937
+ *
938
+ * @param array $variables {
939
+ * An array of variable values.
940
+ *
941
+ * @type string $app_id The app ID.
942
+ * @type string $version The file version.
943
+ * }
944
+ * @return array|bool An array of file paths on success. False on failure.
945
+ * @since 3.2
946
+ * @see $this->get_variables()
947
+ *
948
+ */
949
+ private function get_plugin_file_paths($variables)
950
+ {
951
+ $paths = [];
952
+ $plugin_names = [
953
+ 'identity',
954
+ 'microdata',
955
+ 'inferredEvents',
956
+ 'dwell',
957
+ 'sessions',
958
+ 'timespent',
959
+ 'ga2fbq',
960
+ ];
961
+
962
+ foreach($plugin_names as $plugin_name) {
963
+ $plugin_file_url = sprintf($this->plugins_file_url, $plugin_name, $variables['version']);
964
+ $plugin_file_name = sprintf($this->plugins_file_name, $plugin_name . '-' . $variables['version']);
965
+ $plugin_file_path = $this->busting_path . $plugin_file_name;
966
+
967
+ if( !$this->maybe_save($plugin_file_url, $plugin_file_path) ) {
968
+ return false;
969
+ }
970
+
971
+ $paths[] = $plugin_file_path;
972
+ }
973
+
974
+ return $paths;
975
+ }
976
+
977
+ /**
978
+ * Get a file contents. If the file doesn't exist or is not writtable, new contents are fetched remotely.
979
+ *
980
+ * @param string $file_path Path to the file.
981
+ * @param string $file_url URL to the remote file.
982
+ * @return string|bool The contents on success, false on failure.
983
+ * @since 3.2
984
+ * @access private
985
+ *
986
+ */
987
+ private function get_file_contents($file_path, $file_url = false)
988
+ {
989
+ $filesystem = $this->filesystem;
990
+
991
+ if( $filesystem->is_writable($file_path) ) {
992
+ // If a previous version is present, return its contents.
993
+ $contents = $filesystem->get_contents($file_path);
994
+
995
+ if( $contents ) {
996
+ return $contents;
997
+ }
998
+ // In case the file is empty or we could not get its contents, try to get a fresh copy from remote location.
999
+ }
1000
+
1001
+ if( !$file_url ) {
1002
+ return false;
1003
+ }
1004
+
1005
+ return $this->get_remote_contents($file_url);
1006
+ }
1007
+
1008
+ /**
1009
+ * Get the contents of a URL.
1010
+ *
1011
+ * @param string $url The URL to request.
1012
+ * @return string|bool The contents on success. False on failure.
1013
+ * @since 3.2
1014
+ *
1015
+ */
1016
+ private function get_remote_contents($url)
1017
+ {
1018
+ try {
1019
+ $response = wp_remote_get($url);
1020
+ } catch( \Exception $e ) {
1021
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
1022
+
1023
+ return false;
1024
+ }
1025
+
1026
+ if( is_wp_error($response) ) {
1027
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
1028
+
1029
+ return false;
1030
+ }
1031
+
1032
+ $contents = wp_remote_retrieve_body($response);
1033
+
1034
+ if( !$contents ) {
1035
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
1036
+
1037
+ return false;
1038
+ }
1039
+
1040
+ return $contents;
1041
+ }
1042
+
1043
+ /**
1044
+ * Escape a file name, to be used in a regex pattern (delimiter is `/`).
1045
+ * `%s` conversion specifications are protected.
1046
+ *
1047
+ * @param string $file_name The file name.
1048
+ * @return string
1049
+ * @since 3.2
1050
+ * @access private
1051
+ * @author Grégory Viguier
1052
+ *
1053
+ */
1054
+ private function escape_file_name($file_name)
1055
+ {
1056
+ $file_name = explode('%s', $file_name);
1057
+ $file_name = array_map('preg_quote', $file_name);
1058
+
1059
+ return implode('%s', $file_name);
1060
+ }
1061
+ }
includes/classes/class-facebook-sdk.php ADDED
@@ -0,0 +1,555 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Facebook_SDK {
19
+
20
+ /**
21
+ * Facebook SDK URL.
22
+ * %s is a locale like "en_US".
23
+ *
24
+ * @var string
25
+ * @since 3.2.0
26
+ */
27
+ protected $url = 'https://connect.facebook.net/%s/sdk.js';
28
+
29
+ /**
30
+ * Filename for the cache busting file.
31
+ * %s is a locale like "en_US".
32
+ *
33
+ * @var string
34
+ * @since 3.2.0
35
+ */
36
+ protected $filename = 'fbsdk-%s.js';
37
+
38
+ /**
39
+ * Flag to track the replacement.
40
+ *
41
+ * @var bool
42
+ * @since 3.2.0
43
+ */
44
+ protected $is_replaced = false;
45
+
46
+ /**
47
+ * Filesystem object.
48
+ *
49
+ * @var object
50
+ * @since 3.2.0
51
+ */
52
+ protected $filesystem = false;
53
+
54
+ /**
55
+ * Constructor.
56
+ *
57
+ * @param string $busting_path Path to the busting directory.
58
+ * @param string $busting_url URL of the busting directory.
59
+ * @since 3.2.0
60
+ *
61
+ */
62
+ public function __construct($busting_path, $busting_url)
63
+ {
64
+ /** Warning: the file name and script URL are dynamic, and must be run through sprintf(). */
65
+ $this->busting_path = $busting_path . 'facebook-tracking/';
66
+ $this->busting_url = $busting_url . 'facebook-tracking/';
67
+
68
+ /*
69
+ * Define the timeouts for the connections. Only available after the constructor is called
70
+ * to allow for per-transport overriding of the default.
71
+ */
72
+ if( !defined('FS_CONNECT_TIMEOUT') ) {
73
+ define('FS_CONNECT_TIMEOUT', 30);
74
+ }
75
+ if( !defined('FS_TIMEOUT') ) {
76
+ define('FS_TIMEOUT', 30);
77
+ }
78
+
79
+ // Set the permission constants if not already set.
80
+ if( !defined('FS_CHMOD_DIR') ) {
81
+ define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
82
+ }
83
+ if( !defined('FS_CHMOD_FILE') ) {
84
+ define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
85
+ }
86
+
87
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
88
+ require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
89
+ $this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
90
+ }
91
+
92
+ /**
93
+ * Perform the URL replacement process.
94
+ *
95
+ * @param string $html HTML contents.
96
+ * @return string HTML contents.
97
+ * @since 3.2.0
98
+ *
99
+ */
100
+ public function replace_url($html)
101
+ {
102
+ $this->is_replaced = false;
103
+
104
+ $tag = $this->find('<script[^>]*?>(.*)<\/script>', $html);
105
+
106
+ if( !$tag ) {
107
+ return $html;
108
+ }
109
+
110
+ \WGA_Plugin::app()->logger->info('FACEBOOK SDK CACHING PROCESS STARTED. Tag ' . $tag);
111
+
112
+ $locale = $this->get_locale_from_url($tag);
113
+ $remote_url = $this->get_url($locale);
114
+
115
+ if( !$this->save($remote_url) ) {
116
+ return $html;
117
+ }
118
+
119
+ $file_url = $this->get_busting_file_url($locale);
120
+ $replace_tag = preg_replace('@(?:https?:)?//connect\.facebook\.net/[a-zA-Z_-]+/sdk\.js@i', $file_url, $tag, -1, $count);
121
+
122
+ if( !$count || false === strpos($html, $tag) ) {
123
+ \WGA_Plugin::app()->logger->error('The facebook sdk local file URL could not be replaced in the page contents.');
124
+
125
+ return $html;
126
+ }
127
+
128
+ $html = str_replace($tag, $replace_tag, $html);
129
+ $file_path = $this->get_busting_file_path($locale);
130
+ $xfbml = $this->get_xfbml_from_url($tag); // Default value should be set to false.
131
+ $app_id = $this->get_appId_from_url($tag); // APP_ID is the only required value.
132
+ $url_version = $this->get_version_from_url($tag);
133
+ $version = false === $url_version ? 'v5.0' : $url_version; // If version is not available set it to the latest: v.5.0.
134
+
135
+ if( false !== $app_id ) {
136
+ // Add FB async init.
137
+ $fb_async_script = '<script>window.fbAsyncInit = function fbAsyncInit () {FB.init({appId: \'' . $app_id . '\',xfbml: ' . $xfbml . ',version: \'' . $version . '\'})}</script>';
138
+ $html = str_replace('</body>', $fb_async_script . '</body>', $html);
139
+ }
140
+
141
+ $this->is_replaced = true;
142
+
143
+ \WGA_Plugin::app()->logger->info('Facebook SDK caching process succeeded. File ' . $file_path);
144
+
145
+ return $html;
146
+ }
147
+
148
+ /**
149
+ * Tell if the replacement was sucessful or not.
150
+ *
151
+ * @return bool
152
+ * @since 3.2.0
153
+ *
154
+ */
155
+ public function is_replaced()
156
+ {
157
+ return $this->is_replaced;
158
+ }
159
+
160
+ /**
161
+ * Search for an element in the DOM.
162
+ *
163
+ * @param string $pattern Pattern to match.
164
+ * @param string $html HTML contents.
165
+ * @return string|bool The matched HTML on success. False if nothing is found.
166
+ * @since 3.2.0
167
+ *
168
+ */
169
+ protected function find($pattern, $html)
170
+ {
171
+ preg_match_all('/' . $pattern . '/Umsi', $html, $matches, PREG_SET_ORDER);
172
+
173
+ if( empty($matches) ) {
174
+ return false;
175
+ }
176
+
177
+ foreach($matches as $match) {
178
+ if( trim($match[1]) && preg_match('@//connect\.facebook\.net/[a-zA-Z_-]+/sdk\.js@i', $match[1]) ) {
179
+ return $match[0];
180
+ }
181
+ }
182
+
183
+ return false;
184
+ }
185
+
186
+ /**
187
+ * Save the contents of a URL into a local file if it doesn't exist yet.
188
+ *
189
+ * @param string $url URL to get the contents from.
190
+ * @return bool True on success. False on failure.
191
+ * @since 3.2.0
192
+ *
193
+ */
194
+ public function save($url)
195
+ {
196
+ $locale = $this->get_locale_from_url($url);
197
+ $path = $this->get_busting_file_path($locale);
198
+
199
+ if( $this->filesystem->exists($path) ) {
200
+ // If a previous version is present, keep it.
201
+ return true;
202
+ }
203
+
204
+ return $this->refresh_save($url);
205
+ }
206
+
207
+ /**
208
+ * Save the contents of a URL into a local file.
209
+ *
210
+ * @param string $url URL to get the contents from.
211
+ * @return bool True on success. False on failure.
212
+ * @since 3.2.0
213
+ *
214
+ */
215
+ public function refresh_save($url)
216
+ {
217
+ $content = $this->get_file_content($url);
218
+
219
+ if( !$content ) {
220
+ // Error, we couldn't fetch the file contents.
221
+ return false;
222
+ }
223
+
224
+ $locale = $this->get_locale_from_url($url);
225
+ $path = $this->get_busting_file_path($locale);
226
+
227
+ return (bool)$this->update_file_contents($path, $content);
228
+ }
229
+
230
+ /**
231
+ * Add new contents to a file. If the file doesn't exist, it is created.
232
+ *
233
+ * @param string $file_path Path to the file to update.
234
+ * @param string $file_contents New contents.
235
+ * @return string|bool The file contents on success. False on failure.
236
+ * @since 3.2.0
237
+ *
238
+ */
239
+ private function update_file_contents($file_path, $file_contents)
240
+ {
241
+ if( !$this->filesystem->exists($this->busting_path) ) {
242
+ wp_mkdir_p($this->busting_path);
243
+ }
244
+
245
+ if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
246
+ \WGA_Plugin::app()->logger->error('Contents could not be written into file. File path ' . $file_path);
247
+
248
+ return false;
249
+ }
250
+
251
+ return $file_contents;
252
+ }
253
+
254
+ /**
255
+ * Look for existing local files and update their contents if there's a new version available.
256
+ * Actually, if a more recent version exists on the FB side, it will delete all local files and hit the home page to recreate them.
257
+ *
258
+ * @return bool True on success. False on failure.
259
+ * @since 3.2.0
260
+ *
261
+ */
262
+ public function refresh()
263
+ {
264
+ $files = $this->get_files();
265
+
266
+ if( !$files ) {
267
+ // No files (or there's an error).
268
+ return false !== $files;
269
+ }
270
+
271
+ $error_paths = [];
272
+ $pattern = $this->escape_file_name($this->filename);
273
+ $pattern = sprintf($pattern, '(?<locale>[a-zA-Z_-]+)');
274
+
275
+ foreach($files as $file) {
276
+ preg_match('/^' . $pattern . '$/', $file, $matches);
277
+
278
+ $remote_url = $this->get_url($matches['locale']);
279
+
280
+ if( !$this->refresh_save($remote_url) ) {
281
+ $error_paths[] = $this->get_busting_file_path($matches['locale']);
282
+ }
283
+ }
284
+
285
+ if( $error_paths ) {
286
+ \WGA_Plugin::app()->logger->error('Local file(s) could not be updated. Paths ' . $error_paths);
287
+ }
288
+
289
+ return !$error_paths;
290
+ }
291
+
292
+ /**
293
+ * Delete all Facebook SDK busting files.
294
+ *
295
+ * @return bool True on success. False on failure.
296
+ * @since 3.2.0
297
+ *
298
+ */
299
+ public function delete()
300
+ {
301
+ $filesystem = $this->filesystem;
302
+ $files = $this->get_files();
303
+
304
+ if( !$files ) {
305
+ // No files (or there's an error).
306
+ return false !== $files;
307
+ }
308
+
309
+ $error_paths = [];
310
+
311
+ foreach($files as $file_name) {
312
+ if( !$filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
313
+ $error_paths[] = $this->busting_path . $file_name;
314
+ }
315
+ }
316
+
317
+ if( $error_paths ) {
318
+ \WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Paths ' . $error_paths);
319
+ }
320
+
321
+ return !$error_paths;
322
+ }
323
+
324
+ /**
325
+ * Get all cached files in the directory.
326
+ *
327
+ * @return array|bool A list of file names. False on failure.
328
+ * @since 3.2.0
329
+ *
330
+ */
331
+ private function get_files()
332
+ {
333
+ $filesystem = $this->filesystem;
334
+ $dir_path = rtrim($this->busting_path, '\\/');
335
+
336
+ if( !$filesystem->exists($dir_path) ) {
337
+ return [];
338
+ }
339
+
340
+ if( !$filesystem->is_writable($dir_path) ) {
341
+ \WGA_Plugin::app()->logger->error('Facebook sdk: Directory is not writable. Path ' . $dir_path);
342
+
343
+ return false;
344
+ }
345
+
346
+ $dir = $filesystem->dirlist($dir_path);
347
+
348
+ if( false === $dir ) {
349
+ \WGA_Plugin::app()->logger->error('Facebook sdk: Could not get the directory contents. Path ' . $dir_path);
350
+
351
+ return false;
352
+ }
353
+
354
+ if( !$dir ) {
355
+ return [];
356
+ }
357
+
358
+ $list = [];
359
+ $pattern = $this->escape_file_name($this->filename);
360
+ $pattern = sprintf($pattern, '[a-zA-Z_-]+');
361
+
362
+ foreach($dir as $entry) {
363
+ if( 'f' !== $entry['type'] ) {
364
+ continue;
365
+ }
366
+ if( preg_match('/^' . $pattern . '$/', $entry['name'], $matches) ) {
367
+ $list[$entry['name']] = $entry['name'];
368
+ }
369
+ }
370
+
371
+ return $list;
372
+ }
373
+
374
+ /**
375
+ * Get the remote Facebook SDK URL.
376
+ *
377
+ * @param string $locale A locale string, like 'en_US'.
378
+ * @return string
379
+ * @since 3.2.0
380
+ *
381
+ */
382
+ public function get_url($locale)
383
+ {
384
+ return sprintf($this->url, $locale);
385
+ }
386
+
387
+ /**
388
+ * Extract the locale from a URL to bust.
389
+ *
390
+ * @param string $url Any string containing the URL to bust.
391
+ * @return string|bool The locale on success. False on failure.
392
+ * @since 3.2.0
393
+ *
394
+ */
395
+ private function get_locale_from_url($url)
396
+ {
397
+ $pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js@i';
398
+
399
+ if( !preg_match($pattern, $url, $matches) ) {
400
+ return false;
401
+ }
402
+
403
+ return $matches['locale'];
404
+ }
405
+
406
+ /**
407
+ * Extract XFBML from a URL to bust.
408
+ *
409
+ * @param string $url Any string containing the URL to bust.
410
+ * @return string|bool The XFBML on success. False on failure.
411
+ * @since 3.4.3
412
+ *
413
+ */
414
+ private function get_xfbml_from_url($url)
415
+ {
416
+ $pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?xfbml=(?<xfbml>[0-9]+)@i';
417
+
418
+ if( !preg_match($pattern, $url, $matches) ) {
419
+ return false;
420
+ }
421
+
422
+ return $matches['xfbml'];
423
+ }
424
+
425
+ /**
426
+ * Extract appId from a URL to bust.
427
+ *
428
+ * @param string $url Any string containing the URL to bust.
429
+ * @return string|bool The appId on success. False on failure.
430
+ * @since 3.4.3
431
+ *
432
+ */
433
+ private function get_appId_from_url($url)
434
+ {
435
+ $pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?appId=(?<appId>[0-9]+)@i';
436
+
437
+ if( !preg_match($pattern, $url, $matches) ) {
438
+ return false;
439
+ }
440
+
441
+ return $matches['appId'];
442
+ }
443
+
444
+ /**
445
+ * Extract version from a URL to bust.
446
+ *
447
+ * @param string $url Any string containing the URL to bust.
448
+ * @return string|bool The version on success. False on failure.
449
+ * @since 3.4.3
450
+ *
451
+ */
452
+ private function get_version_from_url($url)
453
+ {
454
+ $pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?version=(?<version>[a-zA-Z0-9.]+)@i';
455
+
456
+ if( !preg_match($pattern, $url, $matches) ) {
457
+ return false;
458
+ }
459
+
460
+ return $matches['version'];
461
+ }
462
+
463
+ /**
464
+ * Get the local Facebook SDK URL.
465
+ *
466
+ * @param string $locale A locale string, like 'en_US'.
467
+ * @return string
468
+ * @since 3.2.0
469
+ *
470
+ */
471
+ private function get_busting_file_url($locale)
472
+ {
473
+ $filename = $this->get_busting_file_name($locale);
474
+
475
+ return $this->busting_url . $filename;
476
+ }
477
+
478
+ /**
479
+ * Get the local Facebook SDK file name.
480
+ *
481
+ * @param string $locale A locale string, like 'en_US'.
482
+ * @return string
483
+ * @since 3.2.0
484
+ *
485
+ */
486
+ private function get_busting_file_name($locale)
487
+ {
488
+ return sprintf($this->filename, $locale);
489
+ }
490
+
491
+ /**
492
+ * Get the local Facebook SDK file path.
493
+ *
494
+ * @param string $locale A locale string, like 'en_US'.
495
+ * @return string
496
+ * @since 3.2.0
497
+ *
498
+ */
499
+ private function get_busting_file_path($locale)
500
+ {
501
+ return $this->busting_path . $this->get_busting_file_name($locale);
502
+ }
503
+
504
+ /**
505
+ * Get the contents of a URL.
506
+ *
507
+ * @param string $url The URL to request.
508
+ * @return string|bool The contents on success. False on failure.
509
+ * @since 3.2.0
510
+ *
511
+ */
512
+ protected function get_file_content($url)
513
+ {
514
+ try {
515
+ $response = wp_remote_get($url);
516
+ } catch( \Exception $e ) {
517
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
518
+
519
+ return false;
520
+ }
521
+
522
+ if( is_wp_error($response) ) {
523
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
524
+
525
+ return false;
526
+ }
527
+
528
+ $contents = wp_remote_retrieve_body($response);
529
+
530
+ if( !$contents ) {
531
+ \WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
532
+
533
+ return false;
534
+ }
535
+
536
+ return $contents;
537
+ }
538
+
539
+ /**
540
+ * Escape a file name, to be used in a regex pattern (delimiter is `/`).
541
+ * `%s` conversion specifications are protected.
542
+ *
543
+ * @param string $file_name The file name.
544
+ * @return string
545
+ * @since 3.2.0
546
+ *
547
+ */
548
+ private function escape_file_name($file_name)
549
+ {
550
+ $file_name = explode('%s', $file_name);
551
+ $file_name = array_map('preg_quote', $file_name);
552
+
553
+ return implode('%s', $file_name);
554
+ }
555
+ }
includes/classes/class-google-analytics-cache.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Google_Analytics_Cache extends Abstract_Cache {
19
+
20
+ /**
21
+ * Google Analytics URL.
22
+ *
23
+ * @var string
24
+ * @since 3.2.0
25
+ */
26
+ protected $url = 'https://www.google-analytics.com/analytics.js';
27
+
28
+ /**
29
+ * File name (local).
30
+ * %s is a "version": a md5 hash of the file contents.
31
+ *
32
+ * @var string
33
+ * @since 3.2.0
34
+ */
35
+ protected $filename_pattern = 'ga-%s.js';
36
+
37
+ /**
38
+ * Current file version (local): a md5 hash of the file contents.
39
+ *
40
+ * @var string
41
+ * @since 3.2.0
42
+ */
43
+ protected $file_version;
44
+
45
+ /**
46
+ * Flag to track the replacement.
47
+ *
48
+ * @var bool
49
+ * @since 3.2.0
50
+ */
51
+ protected $is_replaced = false;
52
+
53
+ /**
54
+ * Constructor.
55
+ *
56
+ * @param string $busting_path Path to the busting directory.
57
+ * @param string $busting_url URL of the busting directory.
58
+ * @since 3.1
59
+ * @access public
60
+ *
61
+ */
62
+ public function __construct($busting_path, $busting_url)
63
+ {
64
+ parent::__construct($busting_path, $busting_url);
65
+
66
+ $this->busting_path = $busting_path . 'google-tracking/';
67
+ $this->busting_url = $busting_url . 'google-tracking/';
68
+ }
69
+
70
+ /**
71
+ * Performs the replacement process.
72
+ *
73
+ * @param string $html HTML content.
74
+ * @return string
75
+ * @since 3.2.0
76
+ *
77
+ */
78
+ public function replace_url($html)
79
+ {
80
+ $this->is_replaced = false;
81
+
82
+ $tag = $this->find('<script\s*(?<attr>[^>]*)?>(?<content>[^<]+)?<\/script>', $html);
83
+
84
+ if( !$tag ) {
85
+ return $html;
86
+ }
87
+
88
+ \WGA_Plugin::app()->logger->info('GOOGLE ANALYTICS CACHING PROCESS STARTED. TAG #' . $tag);
89
+
90
+ if( !$this->save($this->url) ) {
91
+ return $html;
92
+ }
93
+
94
+ $replace_tag = preg_replace('/(?:https?:)?\/\/www\.google-analytics\.com\/analytics\.js/i', $this->get_busting_url(), $tag);
95
+ $html = str_replace($tag, $replace_tag, $html);
96
+
97
+ $this->is_replaced = true;
98
+
99
+ \WGA_Plugin::app()->logger->info('Google Analytics caching process succeeded. Busting path ' . $this->get_busting_path());
100
+
101
+ return $html;
102
+ }
103
+
104
+ /**
105
+ * Tell if the replacement was sucessful or not.
106
+ *
107
+ * @return bool
108
+ *
109
+ * @since 3.2.0
110
+ */
111
+ public function is_replaced()
112
+ {
113
+ return $this->is_replaced;
114
+ }
115
+
116
+ /**
117
+ * Get the Google Analytics URL.
118
+ *
119
+ * @return string
120
+ * @author Remy Perona
121
+ *
122
+ * @since 3.1
123
+ * @access public
124
+ */
125
+ public function get_url()
126
+ {
127
+ return $this->url;
128
+ }
129
+
130
+ /**
131
+ * Searches for element(s) in the DOM.
132
+ *
133
+ * @param string $pattern Pattern to match.
134
+ * @param string $html HTML content.
135
+ * @return string
136
+ * @author Remy Perona
137
+ *
138
+ * @since 3.1
139
+ * @access public
140
+ */
141
+ protected function find($pattern, $html)
142
+ {
143
+ preg_match_all('/' . $pattern . '/is', $html, $all_matches, PREG_SET_ORDER);
144
+
145
+ $matches = array_map(function ($match) {
146
+
147
+ if( empty($match['content']) || (!preg_match('/src\s*=\s*[\'"]\s*(?:https?:)?\/\/www\.google-analytics\.com\/analytics\.js\s*[\'"]/i', $match['attr'] . $match['content']) && false === strpos($match['content'], 'GoogleAnalyticsObject')) ) {
148
+ return;
149
+ }
150
+
151
+ return $match[0];
152
+ }, $all_matches);
153
+
154
+ $matches = array_values(array_filter($matches));
155
+
156
+ if( !$matches ) {
157
+ return false;
158
+ }
159
+
160
+ return $matches[0];
161
+ }
162
+ }
includes/classes/class-google-tag-manager-cache.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Google_Tag_Manager_Cache extends Abstract_Cache {
19
+
20
+ /**
21
+ * Context used for the logger.
22
+ *
23
+ * @var string
24
+ * @since 3.2.4
25
+ */
26
+ const LOGGER_CONTEXT = 'gg tag manager';
27
+
28
+ /**
29
+ * File name (local).
30
+ * %s is a "version": a md5 hash of the file contents.
31
+ *
32
+ * @var string
33
+ * @since 3.2.4
34
+ * @access protected
35
+ */
36
+ protected $filename_pattern = 'gtm-%s.js';
37
+
38
+ /**
39
+ * Current file version (local): a md5 hash of the file contents.
40
+ *
41
+ * @var string
42
+ * @since 3.2.4
43
+ * @access protected
44
+ */
45
+ protected $file_version;
46
+
47
+ /**
48
+ * Filesystem object.
49
+ *
50
+ * @var object
51
+ * @since 3.2.4
52
+ * @access protected
53
+ */
54
+ protected $filesystem = false;
55
+
56
+ /**
57
+ * Google Analytics object.
58
+ *
59
+ * @var object
60
+ * @since 3.2.4
61
+ * @access protected
62
+ */
63
+ protected $ga_busting = false;
64
+
65
+ /**
66
+ * Constructor.
67
+ *
68
+ * @param string $busting_path Path to the busting directory.
69
+ * @param string $busting_url URL of the busting directory.
70
+ * @param Google_Analytics_Cache $ga_busting A GoogleAnalytics instance.
71
+ * @since 3.1
72
+ * @access public
73
+ *
74
+ */
75
+ public function __construct($busting_path, $busting_url, Google_Analytics_Cache $ga_busting)
76
+ {
77
+ parent::__construct($busting_path, $busting_url);
78
+ $blog_id = get_current_blog_id();
79
+ $this->busting_path = $busting_path . $blog_id . '/';
80
+ $this->busting_url = $busting_url . $blog_id . '/';
81
+ $this->ga_busting = $ga_busting;
82
+ }
83
+
84
+ /**
85
+ * Performs the replacement process.
86
+ *
87
+ * @param string $html HTML content.
88
+ * @return string
89
+ * @since 3.1
90
+ * @access public
91
+ *
92
+ */
93
+ public function replace_url($html)
94
+ {
95
+ $script = $this->find('<script(\s+[^>]+)?\s+src\s*=\s*[\'"]\s*?((?:https?:)?\/\/www\.googletagmanager\.com(?:.+)?)\s*?[\'"]([^>]+)?\/?>', $html);
96
+
97
+ if( !$script ) {
98
+ return $html;
99
+ }
100
+
101
+ // replace relative protocol // with full https://.
102
+ $gtm_url = preg_replace('/^\/\//', 'https://', $script[2]);
103
+
104
+ \WGA_Plugin::app()->logger->info('GOOGLE TAG MANAGER CACHING PROCESS STARTED. Script ' . $script);
105
+
106
+ if( !$this->save($gtm_url) ) {
107
+ return $html;
108
+ }
109
+
110
+ $replace_script = str_replace($script[2], $this->get_busting_url(), $script[0]);
111
+ $replace_script = str_replace('<script', '<script data-no-minify="1"', $replace_script);
112
+ $html = str_replace($script[0], $replace_script, $html);
113
+
114
+ \WGA_Plugin::app()->logger->info('Google Tag Manager caching process succeeded. Path ' . $this->get_busting_path());
115
+
116
+ return $html;
117
+ }
118
+
119
+ /**
120
+ * Searches for element(s) in the DOM.
121
+ *
122
+ * @param string $pattern Pattern to match.
123
+ * @param string $html HTML content.
124
+ * @return string
125
+ * @since 3.1
126
+ * @access public
127
+ *
128
+ */
129
+ protected function find($pattern, $html)
130
+ {
131
+ preg_match_all('/' . $pattern . '/Umsi', $html, $matches, PREG_SET_ORDER);
132
+
133
+ if( empty($matches) ) {
134
+ return false;
135
+ }
136
+
137
+ return $matches[0];
138
+ }
139
+
140
+ /**
141
+ * Replaces the Google Analytics URL by the local copy inside the gtm-local.js file content
142
+ *
143
+ * @param string $content JavaScript content.
144
+ * @return string
145
+ * @since 3.1
146
+ *
147
+ */
148
+ protected function replace_ga_url($content)
149
+ {
150
+ if( !$this->ga_busting->save($this->ga_busting->get_url()) ) {
151
+ return $content;
152
+ }
153
+
154
+ return str_replace($this->ga_busting->get_url(), $this->ga_busting->get_busting_url(), $content);
155
+ }
156
+ }
includes/classes/class-scheduler.php ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Sheduller {
19
+
20
+ protected $ga_processor;
21
+ protected $gtm_processor;
22
+ protected $fbpix_processor;
23
+ protected $fbsdk_processor;
24
+
25
+ /**
26
+ * Constructor
27
+ */
28
+ public function __construct()
29
+ {
30
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-abstract-cache.php';
31
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-google-analytics-cache.php';
32
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-yandex-metrika-cache.php';
33
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-google-tag-manager-cache.php';
34
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-facebook-sdk.php';
35
+ require_once WGA_PLUGIN_DIR . '/includes/classes/class-facebook-cache.php';
36
+
37
+ $uploads_dir = wp_get_upload_dir();
38
+
39
+ if( !$uploads_dir ) {
40
+ return false;
41
+ }
42
+
43
+ $busting_path = trailingslashit($uploads_dir['basedir']) . WGA_PLUGIN_CACHE_FOLDER . '/';
44
+ $busting_url = trailingslashit($uploads_dir['baseurl']) . WGA_PLUGIN_CACHE_FOLDER . '/';
45
+
46
+ if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
47
+ $this->ym_processor = new Yandex_Metrika_Cache($busting_path, $busting_url);
48
+ }
49
+
50
+ if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
51
+ $this->ga_processor = new Google_Analytics_Cache($busting_path, $busting_url);
52
+ $this->gtm_processor = new Google_Tag_Manager_Cache($busting_path, $busting_url, $this->ga_processor);
53
+ }
54
+ if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
55
+ $this->fbpix_processor = new Facebook_Pixel_Cache($busting_path, $busting_url);
56
+ $this->fbsdk_processor = new Facebook_SDK($busting_path, $busting_url);
57
+ }
58
+
59
+ add_action('cron_schedules', [$this, 'add_schedule']);
60
+ add_action('wclearfy/google_tracking_cache_update', [$this, 'update_tracking_cache']);
61
+ add_action('init', [$this, 'schedule_tracking_cache_update']);
62
+
63
+ add_action('template_redirect', function () {
64
+ ob_start([$this, 'cache_busting_google_tracking']);
65
+ }, 1);
66
+
67
+ add_action('wclearfy_delete_cache', [$this, 'delete_tracking_cache']);
68
+ }
69
+
70
+ /**
71
+ * Processes the cache busting on the HTML content
72
+ *
73
+ * Google Analytics replacement is performed first, and if no replacement occured, Google Tag Manager replacement is performed.
74
+ *
75
+ * @param string $html HTML content.
76
+ * @return string
77
+ * @since 3.1
78
+ *
79
+ */
80
+ public function cache_busting_google_tracking($html)
81
+ {
82
+ if( !$this->is_busting_active() ) {
83
+ return $html;
84
+ }
85
+
86
+ if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
87
+ $html = $this->ym_processor->replace_url($html);
88
+ }
89
+
90
+ if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
91
+ $html = $this->ga_processor->replace_url($html);
92
+ $html = $this->gtm_processor->replace_url($html);
93
+ }
94
+ if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
95
+ $html = $this->fbpix_processor->replace_url($html);
96
+ $html = $this->fbsdk_processor->replace_url($html);
97
+ }
98
+
99
+ return $html;
100
+ }
101
+
102
+
103
+ /**
104
+ * Adds weekly interval to cron schedules
105
+ *
106
+ * @param $schedules array An array of intervals used by cron jobs.
107
+ * @return []
108
+ * @since 3.2.0
109
+ *
110
+ */
111
+ public function add_schedule($schedules)
112
+ {
113
+ if( !$this->is_busting_active() ) {
114
+ return $schedules;
115
+ }
116
+
117
+ $schedules['weekly'] = [
118
+ 'interval' => 604800,
119
+ 'display' => __('weekly', 'clearfy'),
120
+ ];
121
+
122
+ return $schedules;
123
+ }
124
+
125
+ /**
126
+ * Schedules the auto-update of Google Analytics cache busting file
127
+ *
128
+ * @return void
129
+ * @since 3.2.0
130
+ */
131
+ public function schedule_tracking_cache_update()
132
+ {
133
+ if( !$this->is_busting_active() ) {
134
+ return;
135
+ }
136
+
137
+ if( !wp_next_scheduled('wclearfy/google_tracking_cache_update') ) {
138
+ wp_schedule_event(time(), 'weekly', 'wclearfy/google_tracking_cache_update');
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Updates Google Analytics cache busting file
144
+ *
145
+ * @return bool
146
+ * @since 3.2.0
147
+ */
148
+ public function update_tracking_cache()
149
+ {
150
+ if( !$this->is_busting_active() ) {
151
+ return false;
152
+ }
153
+
154
+ if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
155
+ $this->ym_processor->refresh_save($this->ym_processor->get_url());
156
+ }
157
+
158
+ if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
159
+ $this->ga_processor->refresh_save($this->ga_processor->get_url());
160
+ }
161
+
162
+ if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
163
+ $this->fbsdk_processor->refresh();
164
+ $this->fbpix_processor->refresh_all();
165
+ }
166
+
167
+ return true;
168
+ }
169
+
170
+ /**
171
+ * Deletes the GA busting file.
172
+ *
173
+ * @return bool
174
+ * @since 3.2.0
175
+ */
176
+ public function delete_tracking_cache()
177
+ {
178
+ if( !$this->is_busting_active() ) {
179
+ return false;
180
+ }
181
+
182
+ $result = false;
183
+
184
+ if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
185
+ $result = $this->fbsdk_processor->delete() && $this->fbpix_processor->delete_all();
186
+ }
187
+
188
+ if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
189
+ $result = $result && $this->ga_processor->delete() && $this->gtm_processor->delete();
190
+ }
191
+
192
+ if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
193
+ $result = $result && $this->ym_processor->delete();
194
+ }
195
+
196
+ return $result;
197
+ }
198
+
199
+ /**
200
+ * Tell if the cache busting option is active.
201
+ *
202
+ * @return bool
203
+ * @since 3.2.0
204
+ *
205
+ */
206
+ private function is_busting_active()
207
+ {
208
+ return (\WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') || \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') || \WGA_Plugin::app()->getPopulateOption('facebook_cache'));
209
+ }
210
+ }
includes/classes/class-yandex-metrika-cache.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WGA\Busting;
4
+
5
+ /**
6
+ * This class configures the google analytics cache
7
+ *
8
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
9
+ * @copyright (c) 2017 Webraftic Ltd
10
+ * @version 1.0
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if( !defined('ABSPATH') ) {
15
+ exit;
16
+ }
17
+
18
+ class Yandex_Metrika_Cache extends Abstract_Cache {
19
+
20
+ /**
21
+ * Google Analytics URL.
22
+ *
23
+ * @var string
24
+ * @since 3.2.0
25
+ */
26
+ protected $url = 'https://mc.yandex.ru/metrika/tag.js';
27
+
28
+ /**
29
+ * File name (local).
30
+ * %s is a "version": a md5 hash of the file contents.
31
+ *
32
+ * @var string
33
+ * @since 3.2.0
34
+ */
35
+ protected $filename_pattern = 'ym-tag-%s.js';
36
+
37
+ /**
38
+ * Current file version (local): a md5 hash of the file contents.
39
+ *
40
+ * @var string
41
+ * @since 3.2.0
42
+ */
43
+ protected $file_version;
44
+
45
+ /**
46
+ * Flag to track the replacement.
47
+ *
48
+ * @var bool
49
+ * @since 3.2.0
50
+ */
51
+ protected $is_replaced = false;
52
+
53
+ /**
54
+ * Constructor.
55
+ *
56
+ * @param string $busting_path Path to the busting directory.
57
+ * @param string $busting_url URL of the busting directory.
58
+ * @since 3.1
59
+ * @access public
60
+ *
61
+ */
62
+ public function __construct($busting_path, $busting_url)
63
+ {
64
+ parent::__construct($busting_path, $busting_url);
65
+
66
+ $this->busting_path = $busting_path . 'yandex-tracking/';
67
+ $this->busting_url = $busting_url . 'yandex-tracking/';
68
+ }
69
+
70
+ /**
71
+ * Performs the replacement process.
72
+ *
73
+ * @param string $html HTML content.
74
+ * @return string
75
+ * @since 3.2.0
76
+ *
77
+ */
78
+ public function replace_url($html)
79
+ {
80
+ $this->is_replaced = false;
81
+
82
+ $tag = $this->find('<script\s*(?<attr>[^>]*)?>(?<content>[^<]+)?<\/script>', $html);
83
+
84
+ if( !$tag ) {
85
+ return $html;
86
+ }
87
+
88
+ \WGA_Plugin::app()->logger->info('YANDEX METRIKA CACHING PROCESS STARTED. TAG #' . $tag);
89
+
90
+ if( !$this->save($this->url) ) {
91
+ return $html;
92
+ }
93
+
94
+ $replace_tag = preg_replace('/(?:https?:)?\/\/mc\.yandex\.ru\/metrika\/tag\.js/i', $this->get_busting_url(), $tag);
95
+ $html = str_replace($tag, $replace_tag, $html);
96
+
97
+ $this->is_replaced = true;
98
+
99
+ \WGA_Plugin::app()->logger->info('Yandex metrika caching process succeeded. Busting path ' . $this->get_busting_path());
100
+
101
+ return $html;
102
+ }
103
+
104
+ /**
105
+ * Tell if the replacement was sucessful or not.
106
+ *
107
+ * @return bool
108
+ *
109
+ * @since 3.2.0
110
+ */
111
+ public function is_replaced()
112
+ {
113
+ return $this->is_replaced;
114
+ }
115
+
116
+ /**
117
+ * Get the Google Analytics URL.
118
+ *
119
+ * @return string
120
+ * @author Remy Perona
121
+ *
122
+ * @since 3.1
123
+ * @access public
124
+ */
125
+ public function get_url()
126
+ {
127
+ return $this->url;
128
+ }
129
+
130
+ /**
131
+ * Searches for element(s) in the DOM.
132
+ *
133
+ * @param string $pattern Pattern to match.
134
+ * @param string $html HTML content.
135
+ * @return string
136
+ * @author Remy Perona
137
+ *
138
+ * @since 3.1
139
+ * @access public
140
+ */
141
+ protected function find($pattern, $html)
142
+ {
143
+ preg_match_all('/' . $pattern . '/is', $html, $all_matches, PREG_SET_ORDER);
144
+
145
+ $matches = array_map(function ($match) {
146
+
147
+ if( empty($match['content']) || (!preg_match('/\"script\",\s*[\'"](?:https?:)?\/\/mc\.yandex\.ru\/metrika\/tag\.js[\'"]/i', $match['attr'] . $match['content'])) ) {
148
+ return false;
149
+ }
150
+
151
+ return $match[0];
152
+ }, $all_matches);
153
+
154
+ $matches = array_values(array_filter($matches));
155
+
156
+ if( !$matches ) {
157
+ return false;
158
+ }
159
+
160
+ return $matches[0];
161
+ }
162
+ }
includes/update-local-ga.php CHANGED
@@ -1,77 +1,92 @@
1
- <?php
2
- /**
3
- * Script to update local-ga.js-file
4
- * Credits go to: Matthew Horne | http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/
5
- * I adjusted this script to work with wp-cron. It will still run in crontab, though.
6
- * To run the script in crontab, remove the code on lines 8 and 9.
7
- */
8
- // Exit if accessed directly.
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
-
13
- // Remote file to download.
14
- $remote_file = 'https://www.google-analytics.com/analytics.js';
15
- $local_file = WGA_PLUGIN_DIR . '/cache/local-ga.js';
16
-
17
- // Connection time out.
18
- $conn_timeout = 10;
19
- $url = wp_parse_url( $remote_file );
20
- $host = $url['host'];
21
- $path = isset( $url['path'] ) ? $url['path'] : '/';
22
-
23
- if ( isset( $url['query'] ) ) {
24
- $path .= '?' . $url['query'];
25
- }
26
-
27
- $port = isset( $url['port'] ) ? $url['port'] : '80';
28
- $fp = @fsockopen( $host, '80', $errno, $errstr, $conn_timeout );
29
-
30
- if ( ! $fp ) {
31
- // On connection failure return the cached file (if exists).
32
- if ( file_exists( $local_file ) ) {
33
- readfile( $local_file );
34
- }
35
- } else {
36
- // Send the header information
37
- $header = "GET $path HTTP/1.0\r\n";
38
- $header .= "Host: $host\r\n";
39
- $header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6\r\n";
40
- $header .= "Accept: */*\r\n";
41
- $header .= "Accept-Language: en-us,en;q=0.5\r\n";
42
- $header .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
43
- $header .= "Keep-Alive: 300\r\n";
44
- $header .= "Connection: keep-alive\r\n";
45
- $header .= "Referer: http://$host\r\n\r\n";
46
- fputs( $fp, $header );
47
- $response = '';
48
-
49
- // Get the response from the remote server.
50
- while( $line = fread( $fp, 4096 ) ) {
51
- $response .= $line;
52
- }
53
-
54
- // Close the connection.
55
- fclose( $fp );
56
-
57
- // Remove the headers.
58
- $pos = strpos( $response, "\r\n\r\n" );
59
- $response = substr( $response, $pos + 4 );
60
-
61
- // Return the processed response.
62
- echo $response;
63
-
64
- // Save the response to the local file.
65
- if ( ! file_exists( $local_file ) ) {
66
- // Try to create the file, if doesn't exist.
67
- fopen( $local_file, 'w' );
68
- }
69
-
70
- if ( is_writable( $local_file ) ) {
71
- $fp = fopen( $local_file, 'w' );
72
- if ( $fp ) {
73
- fwrite( $fp, $response );
74
- fclose( $fp );
75
- }
76
- }
77
- }// End if().
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Script to update local-ga.js-file
4
+ * Credits go to: Matthew Horne | http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/
5
+ * I adjusted this script to work with wp-cron. It will still run in crontab, though.
6
+ * To run the script in crontab, remove the code on lines 8 and 9.
7
+ */
8
+ // Exit if accessed directly.
9
+ if ( ! defined( 'ABSPATH' ) ) {
10
+ exit;
11
+ }
12
+
13
+ // Remote file to download.
14
+ $remote_file = 'https://www.google-analytics.com/analytics.js';
15
+
16
+ $upload_dir = wp_upload_dir();
17
+
18
+ if ( true === $upload_dir['error'] ) {
19
+ return;
20
+ }
21
+
22
+ $cache_dir = untrailingslashit( $upload_dir['basedir'] ) . '/wga-cache';
23
+
24
+ if ( ! file_exists( $cache_dir ) ) {
25
+ if ( ! wp_mkdir_p( $cache_dir ) ) {
26
+ return;
27
+ }
28
+ }
29
+
30
+ $local_file = $cache_dir . '/local-ga.js';
31
+
32
+ // Connection time out.
33
+ $conn_timeout = 10;
34
+ $url = wp_parse_url( $remote_file );
35
+ $host = $url['host'];
36
+ $path = isset( $url['path'] ) ? $url['path'] : '/';
37
+
38
+ if ( isset( $url['query'] ) ) {
39
+ $path .= '?' . $url['query'];
40
+ }
41
+
42
+ $port = isset( $url['port'] ) ? $url['port'] : '80';
43
+ $fp = @fsockopen( $host, '80', $errno, $errstr, $conn_timeout );
44
+
45
+ if ( ! $fp ) {
46
+ // On connection failure return the cached file (if exists).
47
+ if ( file_exists( $local_file ) ) {
48
+ readfile( $local_file );
49
+ }
50
+ } else {
51
+ // Send the header information
52
+ $header = "GET $path HTTP/1.0\r\n";
53
+ $header .= "Host: $host\r\n";
54
+ $header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6\r\n";
55
+ $header .= "Accept: */*\r\n";
56
+ $header .= "Accept-Language: en-us,en;q=0.5\r\n";
57
+ $header .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
58
+ $header .= "Keep-Alive: 300\r\n";
59
+ $header .= "Connection: keep-alive\r\n";
60
+ $header .= "Referer: http://$host\r\n\r\n";
61
+ fputs( $fp, $header );
62
+ $response = '';
63
+
64
+ // Get the response from the remote server.
65
+ while( $line = fread( $fp, 4096 ) ) {
66
+ $response .= $line;
67
+ }
68
+
69
+ // Close the connection.
70
+ fclose( $fp );
71
+
72
+ // Remove the headers.
73
+ $pos = strpos( $response, "\r\n\r\n" );
74
+ $response = substr( $response, $pos + 4 );
75
+
76
+ // Return the processed response.
77
+ echo $response;
78
+
79
+ // Save the response to the local file.
80
+ if ( ! file_exists( $local_file ) ) {
81
+ // Try to create the file, if doesn't exist.
82
+ fopen( $local_file, 'w' );
83
+ }
84
+
85
+ if ( is_writable( $local_file ) ) {
86
+ $fp = fopen( $local_file, 'w' );
87
+ if ( $fp ) {
88
+ fwrite( $fp, $response );
89
+ fclose( $fp );
90
+ }
91
+ }
92
+ }// End if().
languages/simple-google-analytics-es_ES.po CHANGED
@@ -1,234 +1,234 @@
1
- # Translation of Plugins - Clearfy in Spanish (Spain)
2
- # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
- msgid ""
4
- msgstr ""
5
- "Project-Id-Version: \n"
6
- "POT-Creation-Date: 2019-04-28 06:27+0300\n"
7
- "PO-Revision-Date: 2019-04-28 06:27+0300\n"
8
- "Last-Translator: \n"
9
- "Language-Team: \n"
10
- "Language: es\n"
11
- "MIME-Version: 1.0\n"
12
- "Content-Type: text/plain; charset=UTF-8\n"
13
- "Content-Transfer-Encoding: 8bit\n"
14
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
- "X-Generator: Poedit 2.1.1\n"
16
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
- "X-Generator: Poedit 2.1.1\n"
18
- "X-Poedit-Basepath: ..\n"
19
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
- "X-Poedit-SourceCharset: UTF-8\n"
22
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
- "X-Poedit-SearchPath-0: .\n"
24
- "X-Poedit-SearchPathExcluded-0: libs\n"
25
- "X-Poedit-SearchPathExcluded-1: components\n"
26
- "X-Poedit-SearchPathExcluded-2: cache\n"
27
-
28
- #: admin/boot.php:34
29
- msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
30
- msgstr "El plugin <b>Simple Google Analytics</b> tiene cambios importantes."
31
-
32
- #: admin/boot.php:35
33
- msgid ""
34
- "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
35
- "but you still can download it from the WordPress repository in case if the "
36
- "new release doesn’t work for you."
37
- msgstr ""
38
- "Desafortunadamente, la versión anterior del complemento (2.2.2) ya no aplica "
39
- "soporte, pero aún puede descargarlo del repositorio de WordPress en caso de "
40
- "que la nueva versión no funcione para usted."
41
-
42
- #: admin/boot.php:36
43
- msgid ""
44
- "We’ve updated the code and fixed the compatibility issue for the latest "
45
- "WordPress and PHP versions. We’ve also added additional feature of the Local "
46
- "Google Analytics – this way your website will load faster. The plugin’s name "
47
- "has been changed to Local Google Analytics, but all features remained the "
48
- "same."
49
- msgstr ""
50
- "Hemos actualizado el código y hemos solucionado el problema de "
51
- "compatibilidad para las últimas versiones de WordPress y PHP. También hemos "
52
- "agregado una función adicional de Local Google Analytics, de esta manera su "
53
- "sitio web cargará más rápido. El nombre del plugin se ha cambiado a Local "
54
- "Google Analytics, pero todas las características siguen siendo las mismas."
55
-
56
- #: admin/boot.php:37
57
- #, php-format
58
- msgid ""
59
- "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
60
- "website. We do care about you and want to avoid any problems with the new "
61
- "version."
62
- msgstr ""
63
- "Verifique <a href=\"%s\">configuraciónes de plugins</a> y el rendimiento de "
64
- "su Website. Nos preocupamos por usted, queremos evitar problemas con la "
65
- "nueva versión."
66
-
67
- #: admin/boot.php:38
68
- #, php-format
69
- msgid ""
70
- "We are aimed to pay more attention to the speed and security aspects of your "
71
- "website. That’s why you should definitely try our basic WordPress "
72
- "optimization plugin as well. Clearfy includes functionality of this plugin "
73
- "and has many additional features for the website optimization:\n"
74
- "<a href=\"%s\">Donwload Clearfy for free</a>"
75
- msgstr ""
76
- "Nuestro meta es prestar más atención a los aspectos de velocidad y seguridad "
77
- "de su sitio web. Por eso prueba nuestro plugin básico de optimización "
78
- "WordPress. Clearfy incluye funcionalidades de este plugin y posee "
79
- "características adicionales para optimización de sitios web:\n"
80
- "<a href=\"%s\">Descargue Clearfy de forma gratuita</a>"
81
-
82
- #: admin/boot.php:170 admin/options.php:29 admin/pages/ga_cache.php:54
83
- msgid "Google Analytics Cache"
84
- msgstr "Cache de Google Analytics"
85
-
86
- #: admin/boot.php:176 admin/options.php:49
87
- msgid "Google analytic Code"
88
- msgstr "Código de Google Analytics"
89
-
90
- #: admin/boot.php:181 admin/options.php:70
91
- msgid "Use adjusted bounce rate?"
92
- msgstr "¿Usar tasa de rebote ajustada?"
93
-
94
- #: admin/boot.php:186 admin/options.php:79
95
- msgid "Change enqueue order?"
96
- msgstr "¿Cambiar orden del turno?"
97
-
98
- #: admin/boot.php:191 admin/options.php:88
99
- msgid "Disable all display features functionality?"
100
- msgstr "¿Desactivar todas las funciones de la pantalla?"
101
-
102
- #: admin/boot.php:196 admin/options.php:97
103
- msgid "Use Anonymize IP? (Required by law for some countries)"
104
- msgstr "¿Usar IP Anónima? (Requerimiento legal en algunos países)"
105
-
106
- #: admin/boot.php:201 admin/options.php:106 admin/options.php:108
107
- msgid "Track logged in Administrators?"
108
- msgstr "¿Registrados en Administradores?"
109
-
110
- #: admin/boot.php:232
111
- msgid "Get ultimate plugin free"
112
- msgstr "Obtener el ultimate plugin gratis"
113
-
114
- #: admin/options.php:22
115
- msgid "<strong>Google Analytics cache</strong>."
116
- msgstr "<strong>Google Analytics cache</strong>."
117
-
118
- #: admin/options.php:22
119
- msgid ""
120
- "To improve Google Page Speed indicators Analytics caching is needed. "
121
- "However, it can also slightly increase your website loading speed, because "
122
- "Analytics js files will load locally. The second case that you might need "
123
- "these settings is the usual Google Analytics connection to your website. You "
124
- "do not need to do this with other plugins or insert the tracking code into "
125
- "your theme."
126
- msgstr ""
127
- "Para mejorar el ranking en Google Page Speed, es necesario el almacenamiento "
128
- "en caché de Analytics. con esto, aumentará ligeramente la velocidad de carga "
129
- "de su sitio web, ya que los archivos de Analytics js se cargarán localmente. "
130
- "El segundo caso en el que puede necesitar estos ajustes, es con la conexión "
131
- "habitual de Google Analytics a su sitio web. No necesita hacer esto con "
132
- "otros plugins ni insertar el código de seguimiento en su tema."
133
-
134
- #: admin/options.php:31
135
- msgid ""
136
- "If you enable this option, the plugin will begin to save a local copy of "
137
- "Google Analytics to speed up the loading of your website and improve Google "
138
- "Page Speed."
139
- msgstr ""
140
- "Si habilita esta opción, el complemento comenzará a guardar una copia local "
141
- "de Google Analytics acelerando la carga de su sitio web y mejorando el "
142
- "ranking en Google Page Speed ."
143
-
144
- #: admin/options.php:31
145
- msgid ""
146
- "ATTENTION! Before using this option, remove the previously installed Google "
147
- "Analytics code inside your theme or plugins associated with this feature!"
148
- msgstr ""
149
- "¡ATENCIÓN! ¡Antes de usar esta opción, elimine el código de Google Analytics "
150
- "instalado previamente dentro de su tema o los complementos asociados con "
151
- "esta función!"
152
-
153
- #: admin/options.php:51
154
- msgid "Set the Google Analytics tracking code."
155
- msgstr "Configure el código de seguimiento de Google Analytics."
156
-
157
- #: admin/options.php:62
158
- msgid "Save GA in"
159
- msgstr "Guardar GA en"
160
-
161
- #: admin/options.php:63
162
- msgid "Select location for the Google Analytics code."
163
- msgstr "Seleccione la ubicación para el código de Google Analytics."
164
-
165
- #: admin/options.php:73
166
- msgid ""
167
- "Essentially, you set up an event which is triggered after a user spends a "
168
- "certain amount of time on the landing page, telling Google Analytics not to "
169
- "count these users as bounces. A user may come to your website, find all of "
170
- "the information they need (a phone number, for example) and then leave the "
171
- "site without visiting another page. Without adjusted bounce rate, such a "
172
- "user would be considered a bounce, even though they had a successful "
173
- "experience. By defining a time limit after which you can consider a user to "
174
- "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
175
- "more accurate idea of whether they found what they were looking for."
176
- msgstr ""
177
- "Básicamente, configura un evento que se activa después de que un usuario "
178
- "pasa una cierta cantidad de tiempo en la página de destino, diciéndole a "
179
- "Google Analytics que no cuente a estos usuarios como rebotes. Un usuario "
180
- "puede ir a su sitio web, buscar toda la información que necesita (un número "
181
- "de teléfono, por ejemplo) y luego abandonar el sitio sin visitar otra "
182
- "página. Sin una tasa de rebote ajustada, dicho usuario se consideraría un "
183
- "rebote aunque tuviera una experiencia exitosa. Al definir un límite de "
184
- "tiempo, un usuario se consideraría \"comprometido\", ese usuario ya no se "
185
- "contaría como un rebote ya que sería obvio que encontró lo que buscó."
186
-
187
- #: admin/options.php:82
188
- msgid ""
189
- "By default, Google Analytics code is loaded before other scripts and "
190
- "javasscript code, but if you set the value to 100, the GA code will be "
191
- "loaded after all other scripts. By changing the priority, you can set code "
192
- "position on the page."
193
- msgstr ""
194
- "Por defecto, el código de Google Analytics se carga antes que otros scripts "
195
- "y el código javasscript, pero si establece el valor a 100, el código GA se "
196
- "cargará después de todos los demás scripts. Al cambiar la prioridad, puede "
197
- "establecer la posición del código en la página."
198
-
199
- #: admin/options.php:90
200
- #, php-format
201
- msgid "Disable all <a href=\"%s\">display features functionality?</a>"
202
- msgstr ""
203
- "Deshabilitar todas las <a href=\"%s\">¿Características de funciones?</a>"
204
-
205
- #: admin/options.php:99
206
- #, php-format
207
- msgid ""
208
- "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
209
- msgstr ""
210
- "Use <a href=\"%s\">¿Anonimizar IP?</a> (Requisito legal para algunos países)"
211
-
212
- #: admin/pages/ga_cache.php:38
213
- msgid "Local Google Analytics"
214
- msgstr "Google Analytics local"
215
-
216
- #: admin/pages/ga_cache.php:55
217
- msgid "General"
218
- msgstr "General"
219
-
220
- #: includes/classes/class.configurate-ga.php:44
221
- msgid "Once Weekly"
222
- msgstr "Una vez a la semana"
223
-
224
- #: includes/classes/class.configurate-ga.php:49
225
- msgid "Twice Monthly"
226
- msgstr "Dos veces al mes"
227
-
228
- #: includes/classes/class.configurate-ga.php:54
229
- msgid "Once Monthly"
230
- msgstr "Una vez al mes"
231
-
232
- #: simple_google_analytics.php:83
233
- msgid "Webcraftic Local Google Analytics"
234
  msgstr "Webcraftic Local Google Analytics"
1
+ # Translation of Plugins - Clearfy in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: \n"
6
+ "POT-Creation-Date: 2019-04-28 06:27+0300\n"
7
+ "PO-Revision-Date: 2019-04-28 06:27+0300\n"
8
+ "Last-Translator: \n"
9
+ "Language-Team: \n"
10
+ "Language: es\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 2.1.1\n"
16
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
17
+ "X-Generator: Poedit 2.1.1\n"
18
+ "X-Poedit-Basepath: ..\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
+ "X-Poedit-SourceCharset: UTF-8\n"
22
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+ "X-Poedit-SearchPathExcluded-0: libs\n"
25
+ "X-Poedit-SearchPathExcluded-1: components\n"
26
+ "X-Poedit-SearchPathExcluded-2: cache\n"
27
+
28
+ #: admin/boot.php:34
29
+ msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
30
+ msgstr "El plugin <b>Simple Google Analytics</b> tiene cambios importantes."
31
+
32
+ #: admin/boot.php:35
33
+ msgid ""
34
+ "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
35
+ "but you still can download it from the WordPress repository in case if the "
36
+ "new release doesn’t work for you."
37
+ msgstr ""
38
+ "Desafortunadamente, la versión anterior del complemento (2.2.2) ya no aplica "
39
+ "soporte, pero aún puede descargarlo del repositorio de WordPress en caso de "
40
+ "que la nueva versión no funcione para usted."
41
+
42
+ #: admin/boot.php:36
43
+ msgid ""
44
+ "We’ve updated the code and fixed the compatibility issue for the latest "
45
+ "WordPress and PHP versions. We’ve also added additional feature of the Local "
46
+ "Google Analytics – this way your website will load faster. The plugin’s name "
47
+ "has been changed to Local Google Analytics, but all features remained the "
48
+ "same."
49
+ msgstr ""
50
+ "Hemos actualizado el código y hemos solucionado el problema de "
51
+ "compatibilidad para las últimas versiones de WordPress y PHP. También hemos "
52
+ "agregado una función adicional de Local Google Analytics, de esta manera su "
53
+ "sitio web cargará más rápido. El nombre del plugin se ha cambiado a Local "
54
+ "Google Analytics, pero todas las características siguen siendo las mismas."
55
+
56
+ #: admin/boot.php:37
57
+ #, php-format
58
+ msgid ""
59
+ "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
60
+ "website. We do care about you and want to avoid any problems with the new "
61
+ "version."
62
+ msgstr ""
63
+ "Verifique <a href=\"%s\">configuraciónes de plugins</a> y el rendimiento de "
64
+ "su Website. Nos preocupamos por usted, queremos evitar problemas con la "
65
+ "nueva versión."
66
+
67
+ #: admin/boot.php:38
68
+ #, php-format
69
+ msgid ""
70
+ "We are aimed to pay more attention to the speed and security aspects of your "
71
+ "website. That’s why you should definitely try our basic WordPress "
72
+ "optimization plugin as well. Clearfy includes functionality of this plugin "
73
+ "and has many additional features for the website optimization:\n"
74
+ "<a href=\"%s\">Donwload Clearfy for free</a>"
75
+ msgstr ""
76
+ "Nuestro meta es prestar más atención a los aspectos de velocidad y seguridad "
77
+ "de su sitio web. Por eso prueba nuestro plugin básico de optimización "
78
+ "WordPress. Clearfy incluye funcionalidades de este plugin y posee "
79
+ "características adicionales para optimización de sitios web:\n"
80
+ "<a href=\"%s\">Descargue Clearfy de forma gratuita</a>"
81
+
82
+ #: admin/boot.php:170 admin/options.php:29 admin/pages/ga_cache.php:54
83
+ msgid "Google Analytics Cache"
84
+ msgstr "Cache de Google Analytics"
85
+
86
+ #: admin/boot.php:176 admin/options.php:49
87
+ msgid "Google analytic Code"
88
+ msgstr "Código de Google Analytics"
89
+
90
+ #: admin/boot.php:181 admin/options.php:70
91
+ msgid "Use adjusted bounce rate?"
92
+ msgstr "¿Usar tasa de rebote ajustada?"
93
+
94
+ #: admin/boot.php:186 admin/options.php:79
95
+ msgid "Change enqueue order?"
96
+ msgstr "¿Cambiar orden del turno?"
97
+
98
+ #: admin/boot.php:191 admin/options.php:88
99
+ msgid "Disable all display features functionality?"
100
+ msgstr "¿Desactivar todas las funciones de la pantalla?"
101
+
102
+ #: admin/boot.php:196 admin/options.php:97
103
+ msgid "Use Anonymize IP? (Required by law for some countries)"
104
+ msgstr "¿Usar IP Anónima? (Requerimiento legal en algunos países)"
105
+
106
+ #: admin/boot.php:201 admin/options.php:106 admin/options.php:108
107
+ msgid "Track logged in Administrators?"
108
+ msgstr "¿Registrados en Administradores?"
109
+
110
+ #: admin/boot.php:232
111
+ msgid "Get ultimate plugin free"
112
+ msgstr "Obtener el ultimate plugin gratis"
113
+
114
+ #: admin/options.php:22
115
+ msgid "<strong>Google Analytics cache</strong>."
116
+ msgstr "<strong>Google Analytics cache</strong>."
117
+
118
+ #: admin/options.php:22
119
+ msgid ""
120
+ "To improve Google Page Speed indicators Analytics caching is needed. "
121
+ "However, it can also slightly increase your website loading speed, because "
122
+ "Analytics js files will load locally. The second case that you might need "
123
+ "these settings is the usual Google Analytics connection to your website. You "
124
+ "do not need to do this with other plugins or insert the tracking code into "
125
+ "your theme."
126
+ msgstr ""
127
+ "Para mejorar el ranking en Google Page Speed, es necesario el almacenamiento "
128
+ "en caché de Analytics. con esto, aumentará ligeramente la velocidad de carga "
129
+ "de su sitio web, ya que los archivos de Analytics js se cargarán localmente. "
130
+ "El segundo caso en el que puede necesitar estos ajustes, es con la conexión "
131
+ "habitual de Google Analytics a su sitio web. No necesita hacer esto con "
132
+ "otros plugins ni insertar el código de seguimiento en su tema."
133
+
134
+ #: admin/options.php:31
135
+ msgid ""
136
+ "If you enable this option, the plugin will begin to save a local copy of "
137
+ "Google Analytics to speed up the loading of your website and improve Google "
138
+ "Page Speed."
139
+ msgstr ""
140
+ "Si habilita esta opción, el complemento comenzará a guardar una copia local "
141
+ "de Google Analytics acelerando la carga de su sitio web y mejorando el "
142
+ "ranking en Google Page Speed ."
143
+
144
+ #: admin/options.php:31
145
+ msgid ""
146
+ "ATTENTION! Before using this option, remove the previously installed Google "
147
+ "Analytics code inside your theme or plugins associated with this feature!"
148
+ msgstr ""
149
+ "¡ATENCIÓN! ¡Antes de usar esta opción, elimine el código de Google Analytics "
150
+ "instalado previamente dentro de su tema o los complementos asociados con "
151
+ "esta función!"
152
+
153
+ #: admin/options.php:51
154
+ msgid "Set the Google Analytics tracking code."
155
+ msgstr "Configure el código de seguimiento de Google Analytics."
156
+
157
+ #: admin/options.php:62
158
+ msgid "Save GA in"
159
+ msgstr "Guardar GA en"
160
+
161
+ #: admin/options.php:63
162
+ msgid "Select location for the Google Analytics code."
163
+ msgstr "Seleccione la ubicación para el código de Google Analytics."
164
+
165
+ #: admin/options.php:73
166
+ msgid ""
167
+ "Essentially, you set up an event which is triggered after a user spends a "
168
+ "certain amount of time on the landing page, telling Google Analytics not to "
169
+ "count these users as bounces. A user may come to your website, find all of "
170
+ "the information they need (a phone number, for example) and then leave the "
171
+ "site without visiting another page. Without adjusted bounce rate, such a "
172
+ "user would be considered a bounce, even though they had a successful "
173
+ "experience. By defining a time limit after which you can consider a user to "
174
+ "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
175
+ "more accurate idea of whether they found what they were looking for."
176
+ msgstr ""
177
+ "Básicamente, configura un evento que se activa después de que un usuario "
178
+ "pasa una cierta cantidad de tiempo en la página de destino, diciéndole a "
179
+ "Google Analytics que no cuente a estos usuarios como rebotes. Un usuario "
180
+ "puede ir a su sitio web, buscar toda la información que necesita (un número "
181
+ "de teléfono, por ejemplo) y luego abandonar el sitio sin visitar otra "
182
+ "página. Sin una tasa de rebote ajustada, dicho usuario se consideraría un "
183
+ "rebote aunque tuviera una experiencia exitosa. Al definir un límite de "
184
+ "tiempo, un usuario se consideraría \"comprometido\", ese usuario ya no se "
185
+ "contaría como un rebote ya que sería obvio que encontró lo que buscó."
186
+
187
+ #: admin/options.php:82
188
+ msgid ""
189
+ "By default, Google Analytics code is loaded before other scripts and "
190
+ "javasscript code, but if you set the value to 100, the GA code will be "
191
+ "loaded after all other scripts. By changing the priority, you can set code "
192
+ "position on the page."
193
+ msgstr ""
194
+ "Por defecto, el código de Google Analytics se carga antes que otros scripts "
195
+ "y el código javasscript, pero si establece el valor a 100, el código GA se "
196
+ "cargará después de todos los demás scripts. Al cambiar la prioridad, puede "
197
+ "establecer la posición del código en la página."
198
+
199
+ #: admin/options.php:90
200
+ #, php-format
201
+ msgid "Disable all <a href=\"%s\">display features functionality?</a>"
202
+ msgstr ""
203
+ "Deshabilitar todas las <a href=\"%s\">¿Características de funciones?</a>"
204
+
205
+ #: admin/options.php:99
206
+ #, php-format
207
+ msgid ""
208
+ "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
209
+ msgstr ""
210
+ "Use <a href=\"%s\">¿Anonimizar IP?</a> (Requisito legal para algunos países)"
211
+
212
+ #: admin/pages/ga_cache.php:38
213
+ msgid "Local Google Analytics"
214
+ msgstr "Google Analytics local"
215
+
216
+ #: admin/pages/ga_cache.php:55
217
+ msgid "General"
218
+ msgstr "General"
219
+
220
+ #: includes/classes/class.configurate-ga.php:44
221
+ msgid "Once Weekly"
222
+ msgstr "Una vez a la semana"
223
+
224
+ #: includes/classes/class.configurate-ga.php:49
225
+ msgid "Twice Monthly"
226
+ msgstr "Dos veces al mes"
227
+
228
+ #: includes/classes/class.configurate-ga.php:54
229
+ msgid "Once Monthly"
230
+ msgstr "Una vez al mes"
231
+
232
+ #: simple_google_analytics.php:83
233
+ msgid "Webcraftic Local Google Analytics"
234
  msgstr "Webcraftic Local Google Analytics"
languages/simple-google-analytics-nl_BE.po CHANGED
@@ -1,243 +1,243 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: Clearfy\n"
4
- "POT-Creation-Date: 2018-09-06 18:33+0300\n"
5
- "PO-Revision-Date: \n"
6
- "Last-Translator: \n"
7
- "Language-Team: \n"
8
- "Language: nl_BE\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
- "X-Generator: Poedit 2.1.1\n"
15
- "X-Poedit-Basepath: ..\n"
16
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
17
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18
- "X-Poedit-SourceCharset: UTF-8\n"
19
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
20
- "X-Poedit-SearchPath-0: .\n"
21
- "X-Poedit-SearchPathExcluded-0: libs\n"
22
- "X-Poedit-SearchPathExcluded-1: components\n"
23
- "X-Poedit-SearchPathExcluded-2: cache\n"
24
-
25
- #: admin/boot.php:27
26
- msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
27
- msgstr ""
28
-
29
- #: admin/boot.php:28
30
- msgid ""
31
- "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
32
- "but you still can download it from the WordPress repository in case if the new "
33
- "release doesn’t work for you."
34
- msgstr ""
35
-
36
- #: admin/boot.php:29
37
- msgid ""
38
- "We’ve updated the code and fixed the compatibility issue for the latest "
39
- "WordPress and PHP versions. We’ve also added additional feature of the Local "
40
- "Google Analytics – this way your website will load faster. The plugin’s name "
41
- "has been changed to Local Google Analytics, but all features remained the same."
42
- msgstr ""
43
-
44
- #: admin/boot.php:30
45
- #, php-format
46
- msgid ""
47
- "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
48
- "website. We do care about you and want to avoid any problems with the new "
49
- "version."
50
- msgstr ""
51
-
52
- #: admin/boot.php:32
53
- #, php-format
54
- msgid ""
55
- "We are aimed to pay more attention to the speed and security aspects of your "
56
- "website. That’s why you should definitely try our basic WordPress optimization "
57
- "plugin as well. Clearfy includes functionality of this plugin and has many "
58
- "additional features for the website optimization:\n"
59
- "<a href=\"%s\">Donwload Clearfy for free</a>"
60
- msgstr ""
61
-
62
- #: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
63
- msgid "Google Analytics Cache"
64
- msgstr ""
65
-
66
- #: admin/boot.php:127 admin/options.php:50
67
- msgid "Google analytic Code"
68
- msgstr "Google analytics Code"
69
-
70
- #: admin/boot.php:132 admin/options.php:71
71
- msgid "Use adjusted bounce rate?"
72
- msgstr "Aangepast bounce percentage gebruiken?"
73
-
74
- #: admin/boot.php:137 admin/options.php:80
75
- msgid "Change enqueue order?"
76
- msgstr "Enqueue volgorde wijzigen?"
77
-
78
- #: admin/boot.php:142 admin/options.php:89
79
- msgid "Disable all display features functionality?"
80
- msgstr "Alle weergave functionaliteit uitschakelen?"
81
-
82
- #: admin/boot.php:147 admin/options.php:98
83
- msgid "Use Anonymize IP? (Required by law for some countries)"
84
- msgstr "Gebruik anonimiseren IP? (Voor sommige landen wettelijk verplicht)"
85
-
86
- #: admin/boot.php:152 admin/options.php:107 admin/options.php:109
87
- msgid "Track logged in Administrators?"
88
- msgstr "Track ingelogde Beheerders?"
89
-
90
- #: admin/boot.php:157 admin/options.php:116
91
- msgid "Remove script from wp-cron?"
92
- msgstr "Verwijder script van wp-cron?"
93
-
94
- #: admin/boot.php:185
95
- msgid "Get ultimate plugin free"
96
- msgstr "Krijg ultieme plugin gratis"
97
-
98
- #: admin/options.php:23
99
- msgid "<strong>Google Analytics cache</strong>."
100
- msgstr "<strong>Google Analytics cache</strong>."
101
-
102
- #: admin/options.php:23
103
- msgid ""
104
- "To improve Google Page Speed indicators Analytics caching is needed. However, "
105
- "it can also slightly increase your website loading speed, because Analytics js "
106
- "files will load locally. The second case that you might need these settings is "
107
- "the usual Google Analytics connection to your website. You do not need to do "
108
- "this with other plugins or insert the tracking code into your theme."
109
- msgstr ""
110
- "Om de pagina snelheid indicatoren van Google te verbeteren, is caching in "
111
- "Analytics nodig. Het kan echter ook de laadsnelheid van uw website enigszins "
112
- "verhogen, omdat de Analytics js bestanden lokaal worden geladen. Het tweede "
113
- "geval waarvoor u deze instellingen nodig heeft, is de gebruikelijke Google "
114
- "Analytics verbinding met uw website. U hoeft dit niet met andere plugins te "
115
- "doen of de tracking code in uw thema in te voegen."
116
-
117
- #: admin/options.php:32
118
- msgid ""
119
- "If you enable this option, the plugin will begin to save a local copy of "
120
- "Google Analytics to speed up the loading of your website and improve Google "
121
- "Page Speed."
122
- msgstr ""
123
- "Als u deze optie inschakelt, zal de plugin beginnen met het opslaan van een "
124
- "lokale kopie van Google Analytics om het laden van uw website te versnellen en "
125
- "de Google Page Speed ​​te verbeteren."
126
-
127
- #: admin/options.php:32
128
- msgid ""
129
- "ATTENTION! Before using this option, remove the previously installed Google "
130
- "Analytics code inside your theme or plugins associated with this feature!"
131
- msgstr ""
132
- "AANDACHT! Voordat u deze optie gebruikt, verwijdert u de eerder geïnstalleerde "
133
- "Google Analytics code in uw thema of plugins die aan deze functie zijn "
134
- "gekoppeld!"
135
-
136
- #: admin/options.php:52
137
- msgid "Set the Google Analytics tracking code."
138
- msgstr "Stel de Google Analytics tracking code in."
139
-
140
- #: admin/options.php:63
141
- msgid "Save GA in"
142
- msgstr "Bewaar GA in"
143
-
144
- #: admin/options.php:64
145
- msgid "Select location for the Google Analytics code."
146
- msgstr "Selecteer een locatie voor de Google Analytics code."
147
-
148
- #: admin/options.php:74
149
- msgid ""
150
- "Essentially, you set up an event which is triggered after a user spends a "
151
- "certain amount of time on the landing page, telling Google Analytics not to "
152
- "count these users as bounces. A user may come to your website, find all of the "
153
- "information they need (a phone number, for example) and then leave the site "
154
- "without visiting another page. Without adjusted bounce rate, such a user would "
155
- "be considered a bounce, even though they had a successful experience. By "
156
- "defining a time limit after which you can consider a user to be \"engaged,\" "
157
- "that user would no longer count as a bounce, and you'd get a more accurate "
158
- "idea of whether they found what they were looking for."
159
- msgstr ""
160
- "In essentie stelt u een gebeurtenis in die wordt geactiveerd nadat een "
161
- "gebruiker een bepaalde hoeveelheid tijd op de bestemmingspagina heeft "
162
- "doorgebracht, waarmee u Google Analytics vertelt om deze gebruikers niet als "
163
- "bounces te tellen. Een gebruiker kan naar uw website komen, alle benodigde "
164
- "informatie vinden (bijvoorbeeld een telefoonnummer) en vervolgens de website "
165
- "verlaten zonder een andere pagina te bezoeken. Zonder aangepast bounce "
166
- "percentage zou een dergelijke gebruiker als een bounce worden beschouwd, ook "
167
- "al hadden ze een succesvolle ervaring. Door een tijdslimiet te definiëren "
168
- "waarna u kunt concluderen dat een gebruiker \"geëngageerd\" is, telt die "
169
- "gebruiker niet mee als een bounce en krijgt u een beter beeld van het feit of "
170
- "ze hebben gevonden waarnaar ze op zoek waren."
171
-
172
- #: admin/options.php:83
173
- msgid ""
174
- "By default, Google Analytics code is loaded before other scripts and "
175
- "javasscript code, but if you set the value to 100, the GA code will be loaded "
176
- "after all other scripts. By changing the priority, you can set code position "
177
- "on the page."
178
- msgstr ""
179
- "Standaard wordt de Google Analytics code geladen voor andere scripts en "
180
- "javasscript code, maar als u de waarde instelt op 100, wordt de GA code "
181
- "geladen na alle andere scripts. Door de prioriteit te wijzigen, kunt u de "
182
- "codepositie op de pagina instellen."
183
-
184
- #: admin/options.php:91
185
- #, php-format
186
- msgid "Disable all <a href=\"%s\">display features functionality?</a>"
187
- msgstr "Alle <a href=\"%s\">van weergave functies uitschakelen?</a>"
188
-
189
- #: admin/options.php:100
190
- #, php-format
191
- msgid "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
192
- msgstr ""
193
- "Gebruik <a href=\"%s\">Anoniem maken van IP?</a> (Wettelijk vereist voor "
194
- "sommige landen)"
195
-
196
- #: admin/options.php:118
197
- msgid ""
198
- "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
199
- "After enabling this option, the plugin will not update Google Analytics cache "
200
- "file. Do not use this option if you do not understand why you need it!"
201
- msgstr ""
202
- "Clearfy maakt een cron-taak om dagelijks de cache scripts van Google Analytics "
203
- "bij te werken. Nadat u deze optie hebt ingeschakeld, werkt de plugin het cache "
204
- "bestand van Google Analytics niet bij. Gebruik deze optie niet als u niet "
205
- "begrijpt waarom u het nodig hebt!"
206
-
207
- #: admin/pages/ga_cache.php:33
208
- msgid "Local Google Analytics"
209
- msgstr ""
210
-
211
- #: admin/pages/ga_cache.php:50
212
- msgid "General"
213
- msgstr "Algemeen"
214
-
215
- #: includes/classes/class.configurate-ga.php:37
216
- msgid "Once Weekly"
217
- msgstr "Eénmaal per week"
218
-
219
- #: includes/classes/class.configurate-ga.php:42
220
- msgid "Twice Monthly"
221
- msgstr "Tweemaal per maand"
222
-
223
- #: includes/classes/class.configurate-ga.php:47
224
- msgid "Once Monthly"
225
- msgstr "Eénmaal per maand"
226
-
227
- #: simple_google_analytics.php:32
228
- msgid ""
229
- "We found that you have the \"Clearfy - disable unused features\" plugin "
230
- "installed, this plugin already has Google Analytics cache functions, so you "
231
- "can deactivate plugin \"Google Analytics Cache\"!"
232
- msgstr ""
233
-
234
- #: simple_google_analytics.php:40
235
- msgid ""
236
- "You use the old version of Wordpress to use the <b>Webcraftic Local Google "
237
- "Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
238
- "your Wordpress to the minimum version 4.2!"
239
- msgstr ""
240
-
241
- #: simple_google_analytics.php:65
242
- msgid "Webcraftic Local Google Analytics"
243
  msgstr ""
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Clearfy\n"
4
+ "POT-Creation-Date: 2018-09-06 18:33+0300\n"
5
+ "PO-Revision-Date: \n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: \n"
8
+ "Language: nl_BE\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: Poedit 2.1.1\n"
15
+ "X-Poedit-Basepath: ..\n"
16
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
17
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18
+ "X-Poedit-SourceCharset: UTF-8\n"
19
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+ "X-Poedit-SearchPathExcluded-0: libs\n"
22
+ "X-Poedit-SearchPathExcluded-1: components\n"
23
+ "X-Poedit-SearchPathExcluded-2: cache\n"
24
+
25
+ #: admin/boot.php:27
26
+ msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
27
+ msgstr ""
28
+
29
+ #: admin/boot.php:28
30
+ msgid ""
31
+ "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
32
+ "but you still can download it from the WordPress repository in case if the new "
33
+ "release doesn’t work for you."
34
+ msgstr ""
35
+
36
+ #: admin/boot.php:29
37
+ msgid ""
38
+ "We’ve updated the code and fixed the compatibility issue for the latest "
39
+ "WordPress and PHP versions. We’ve also added additional feature of the Local "
40
+ "Google Analytics – this way your website will load faster. The plugin’s name "
41
+ "has been changed to Local Google Analytics, but all features remained the same."
42
+ msgstr ""
43
+
44
+ #: admin/boot.php:30
45
+ #, php-format
46
+ msgid ""
47
+ "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
48
+ "website. We do care about you and want to avoid any problems with the new "
49
+ "version."
50
+ msgstr ""
51
+
52
+ #: admin/boot.php:32
53
+ #, php-format
54
+ msgid ""
55
+ "We are aimed to pay more attention to the speed and security aspects of your "
56
+ "website. That’s why you should definitely try our basic WordPress optimization "
57
+ "plugin as well. Clearfy includes functionality of this plugin and has many "
58
+ "additional features for the website optimization:\n"
59
+ "<a href=\"%s\">Donwload Clearfy for free</a>"
60
+ msgstr ""
61
+
62
+ #: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
63
+ msgid "Google Analytics Cache"
64
+ msgstr ""
65
+
66
+ #: admin/boot.php:127 admin/options.php:50
67
+ msgid "Google analytic Code"
68
+ msgstr "Google analytics Code"
69
+
70
+ #: admin/boot.php:132 admin/options.php:71
71
+ msgid "Use adjusted bounce rate?"
72
+ msgstr "Aangepast bounce percentage gebruiken?"
73
+
74
+ #: admin/boot.php:137 admin/options.php:80
75
+ msgid "Change enqueue order?"
76
+ msgstr "Enqueue volgorde wijzigen?"
77
+
78
+ #: admin/boot.php:142 admin/options.php:89
79
+ msgid "Disable all display features functionality?"
80
+ msgstr "Alle weergave functionaliteit uitschakelen?"
81
+
82
+ #: admin/boot.php:147 admin/options.php:98
83
+ msgid "Use Anonymize IP? (Required by law for some countries)"
84
+ msgstr "Gebruik anonimiseren IP? (Voor sommige landen wettelijk verplicht)"
85
+
86
+ #: admin/boot.php:152 admin/options.php:107 admin/options.php:109
87
+ msgid "Track logged in Administrators?"
88
+ msgstr "Track ingelogde Beheerders?"
89
+
90
+ #: admin/boot.php:157 admin/options.php:116
91
+ msgid "Remove script from wp-cron?"
92
+ msgstr "Verwijder script van wp-cron?"
93
+
94
+ #: admin/boot.php:185
95
+ msgid "Get ultimate plugin free"
96
+ msgstr "Krijg ultieme plugin gratis"
97
+
98
+ #: admin/options.php:23
99
+ msgid "<strong>Google Analytics cache</strong>."
100
+ msgstr "<strong>Google Analytics cache</strong>."
101
+
102
+ #: admin/options.php:23
103
+ msgid ""
104
+ "To improve Google Page Speed indicators Analytics caching is needed. However, "
105
+ "it can also slightly increase your website loading speed, because Analytics js "
106
+ "files will load locally. The second case that you might need these settings is "
107
+ "the usual Google Analytics connection to your website. You do not need to do "
108
+ "this with other plugins or insert the tracking code into your theme."
109
+ msgstr ""
110
+ "Om de pagina snelheid indicatoren van Google te verbeteren, is caching in "
111
+ "Analytics nodig. Het kan echter ook de laadsnelheid van uw website enigszins "
112
+ "verhogen, omdat de Analytics js bestanden lokaal worden geladen. Het tweede "
113
+ "geval waarvoor u deze instellingen nodig heeft, is de gebruikelijke Google "
114
+ "Analytics verbinding met uw website. U hoeft dit niet met andere plugins te "
115
+ "doen of de tracking code in uw thema in te voegen."
116
+
117
+ #: admin/options.php:32
118
+ msgid ""
119
+ "If you enable this option, the plugin will begin to save a local copy of "
120
+ "Google Analytics to speed up the loading of your website and improve Google "
121
+ "Page Speed."
122
+ msgstr ""
123
+ "Als u deze optie inschakelt, zal de plugin beginnen met het opslaan van een "
124
+ "lokale kopie van Google Analytics om het laden van uw website te versnellen en "
125
+ "de Google Page Speed ​​te verbeteren."
126
+
127
+ #: admin/options.php:32
128
+ msgid ""
129
+ "ATTENTION! Before using this option, remove the previously installed Google "
130
+ "Analytics code inside your theme or plugins associated with this feature!"
131
+ msgstr ""
132
+ "AANDACHT! Voordat u deze optie gebruikt, verwijdert u de eerder geïnstalleerde "
133
+ "Google Analytics code in uw thema of plugins die aan deze functie zijn "
134
+ "gekoppeld!"
135
+
136
+ #: admin/options.php:52
137
+ msgid "Set the Google Analytics tracking code."
138
+ msgstr "Stel de Google Analytics tracking code in."
139
+
140
+ #: admin/options.php:63
141
+ msgid "Save GA in"
142
+ msgstr "Bewaar GA in"
143
+
144
+ #: admin/options.php:64
145
+ msgid "Select location for the Google Analytics code."
146
+ msgstr "Selecteer een locatie voor de Google Analytics code."
147
+
148
+ #: admin/options.php:74
149
+ msgid ""
150
+ "Essentially, you set up an event which is triggered after a user spends a "
151
+ "certain amount of time on the landing page, telling Google Analytics not to "
152
+ "count these users as bounces. A user may come to your website, find all of the "
153
+ "information they need (a phone number, for example) and then leave the site "
154
+ "without visiting another page. Without adjusted bounce rate, such a user would "
155
+ "be considered a bounce, even though they had a successful experience. By "
156
+ "defining a time limit after which you can consider a user to be \"engaged,\" "
157
+ "that user would no longer count as a bounce, and you'd get a more accurate "
158
+ "idea of whether they found what they were looking for."
159
+ msgstr ""
160
+ "In essentie stelt u een gebeurtenis in die wordt geactiveerd nadat een "
161
+ "gebruiker een bepaalde hoeveelheid tijd op de bestemmingspagina heeft "
162
+ "doorgebracht, waarmee u Google Analytics vertelt om deze gebruikers niet als "
163
+ "bounces te tellen. Een gebruiker kan naar uw website komen, alle benodigde "
164
+ "informatie vinden (bijvoorbeeld een telefoonnummer) en vervolgens de website "
165
+ "verlaten zonder een andere pagina te bezoeken. Zonder aangepast bounce "
166
+ "percentage zou een dergelijke gebruiker als een bounce worden beschouwd, ook "
167
+ "al hadden ze een succesvolle ervaring. Door een tijdslimiet te definiëren "
168
+ "waarna u kunt concluderen dat een gebruiker \"geëngageerd\" is, telt die "
169
+ "gebruiker niet mee als een bounce en krijgt u een beter beeld van het feit of "
170
+ "ze hebben gevonden waarnaar ze op zoek waren."
171
+
172
+ #: admin/options.php:83
173
+ msgid ""
174
+ "By default, Google Analytics code is loaded before other scripts and "
175
+ "javasscript code, but if you set the value to 100, the GA code will be loaded "
176
+ "after all other scripts. By changing the priority, you can set code position "
177
+ "on the page."
178
+ msgstr ""
179
+ "Standaard wordt de Google Analytics code geladen voor andere scripts en "
180
+ "javasscript code, maar als u de waarde instelt op 100, wordt de GA code "
181
+ "geladen na alle andere scripts. Door de prioriteit te wijzigen, kunt u de "
182
+ "codepositie op de pagina instellen."
183
+
184
+ #: admin/options.php:91
185
+ #, php-format
186
+ msgid "Disable all <a href=\"%s\">display features functionality?</a>"
187
+ msgstr "Alle <a href=\"%s\">van weergave functies uitschakelen?</a>"
188
+
189
+ #: admin/options.php:100
190
+ #, php-format
191
+ msgid "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
192
+ msgstr ""
193
+ "Gebruik <a href=\"%s\">Anoniem maken van IP?</a> (Wettelijk vereist voor "
194
+ "sommige landen)"
195
+
196
+ #: admin/options.php:118
197
+ msgid ""
198
+ "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
199
+ "After enabling this option, the plugin will not update Google Analytics cache "
200
+ "file. Do not use this option if you do not understand why you need it!"
201
+ msgstr ""
202
+ "Clearfy maakt een cron-taak om dagelijks de cache scripts van Google Analytics "
203
+ "bij te werken. Nadat u deze optie hebt ingeschakeld, werkt de plugin het cache "
204
+ "bestand van Google Analytics niet bij. Gebruik deze optie niet als u niet "
205
+ "begrijpt waarom u het nodig hebt!"
206
+
207
+ #: admin/pages/ga_cache.php:33
208
+ msgid "Local Google Analytics"
209
+ msgstr ""
210
+
211
+ #: admin/pages/ga_cache.php:50
212
+ msgid "General"
213
+ msgstr "Algemeen"
214
+
215
+ #: includes/classes/class.configurate-ga.php:37
216
+ msgid "Once Weekly"
217
+ msgstr "Eénmaal per week"
218
+
219
+ #: includes/classes/class.configurate-ga.php:42
220
+ msgid "Twice Monthly"
221
+ msgstr "Tweemaal per maand"
222
+
223
+ #: includes/classes/class.configurate-ga.php:47
224
+ msgid "Once Monthly"
225
+ msgstr "Eénmaal per maand"
226
+
227
+ #: simple_google_analytics.php:32
228
+ msgid ""
229
+ "We found that you have the \"Clearfy - disable unused features\" plugin "
230
+ "installed, this plugin already has Google Analytics cache functions, so you "
231
+ "can deactivate plugin \"Google Analytics Cache\"!"
232
+ msgstr ""
233
+
234
+ #: simple_google_analytics.php:40
235
+ msgid ""
236
+ "You use the old version of Wordpress to use the <b>Webcraftic Local Google "
237
+ "Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
238
+ "your Wordpress to the minimum version 4.2!"
239
+ msgstr ""
240
+
241
+ #: simple_google_analytics.php:65
242
+ msgid "Webcraftic Local Google Analytics"
243
  msgstr ""
languages/simple-google-analytics-pt_BR.po CHANGED
@@ -1,247 +1,247 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: clearfy\n"
4
- "POT-Creation-Date: 2018-09-06 18:33+0300\n"
5
- "PO-Revision-Date: 2018-09-06 18:33+0300\n"
6
- "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
- "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
- "Language: pt_BR\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
- "X-Poedit-SearchPathExcluded-0: libs\n"
20
- "X-Poedit-SearchPathExcluded-1: components\n"
21
- "X-Poedit-SearchPathExcluded-2: cache\n"
22
-
23
- #: admin/boot.php:27
24
- msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
25
- msgstr ""
26
-
27
- #: admin/boot.php:28
28
- msgid ""
29
- "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
30
- "but you still can download it from the WordPress repository in case if the "
31
- "new release doesn’t work for you."
32
- msgstr ""
33
-
34
- #: admin/boot.php:29
35
- msgid ""
36
- "We’ve updated the code and fixed the compatibility issue for the latest "
37
- "WordPress and PHP versions. We’ve also added additional feature of the Local "
38
- "Google Analytics – this way your website will load faster. The plugin’s name "
39
- "has been changed to Local Google Analytics, but all features remained the "
40
- "same."
41
- msgstr ""
42
-
43
- #: admin/boot.php:30
44
- #, php-format
45
- msgid ""
46
- "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
47
- "website. We do care about you and want to avoid any problems with the new "
48
- "version."
49
- msgstr ""
50
-
51
- #: admin/boot.php:32
52
- #, php-format
53
- msgid ""
54
- "We are aimed to pay more attention to the speed and security aspects of your "
55
- "website. That’s why you should definitely try our basic WordPress "
56
- "optimization plugin as well. Clearfy includes functionality of this plugin "
57
- "and has many additional features for the website optimization:\n"
58
- "<a href=\"%s\">Donwload Clearfy for free</a>"
59
- msgstr ""
60
-
61
- #: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
62
- msgid "Google Analytics Cache"
63
- msgstr "Cache analítico do Google"
64
-
65
- #: admin/boot.php:127 admin/options.php:50
66
- msgid "Google analytic Code"
67
- msgstr "Código analítico do Google"
68
-
69
- #: admin/boot.php:132 admin/options.php:71
70
- msgid "Use adjusted bounce rate?"
71
- msgstr "Use taxa de rejeição ajustada?"
72
-
73
- #: admin/boot.php:137 admin/options.php:80
74
- msgid "Change enqueue order?"
75
- msgstr "Alterar ordem de enfileiramento?"
76
-
77
- #: admin/boot.php:142 admin/options.php:89
78
- msgid "Disable all display features functionality?"
79
- msgstr "Desativar todas as funcionalidades dos recursos de exibição?"
80
-
81
- #: admin/boot.php:147 admin/options.php:98
82
- msgid "Use Anonymize IP? (Required by law for some countries)"
83
- msgstr "Use Anonymize IP? (Obrigatório por lei para alguns países)"
84
-
85
- #: admin/boot.php:152 admin/options.php:107 admin/options.php:109
86
- msgid "Track logged in Administrators?"
87
- msgstr "Track logado em Administradores?"
88
-
89
- #: admin/boot.php:157 admin/options.php:116
90
- msgid "Remove script from wp-cron?"
91
- msgstr "Remover script do wp-cron?"
92
-
93
- #: admin/boot.php:185
94
- msgid "Get ultimate plugin free"
95
- msgstr "Obtenha o melhor plugin grátis"
96
-
97
- #: admin/options.php:23
98
- msgid "<strong>Google Analytics cache</strong>."
99
- msgstr "<strong>cache do Google Analytics</strong>."
100
-
101
- #: admin/options.php:23
102
- msgid ""
103
- "To improve Google Page Speed indicators Analytics caching is needed. "
104
- "However, it can also slightly increase your website loading speed, because "
105
- "Analytics js files will load locally. The second case that you might need "
106
- "these settings is the usual Google Analytics connection to your website. You "
107
- "do not need to do this with other plugins or insert the tracking code into "
108
- "your theme."
109
- msgstr ""
110
- "Para melhorar os indicadores do Google Page Speed, é necessário o "
111
- "armazenamento em cache do Analytics. No entanto, também pode aumentar "
112
- "ligeiramente a velocidade de carregamento do seu site, porque os arquivos do "
113
- "Google Analytics js serão carregados localmente. O segundo caso em que você "
114
- "pode precisar dessas configurações é a conexão normal do Google Analytics "
115
- "com seu website. Você não precisa fazer isso com outros plug-ins ou inserir "
116
- "o código de acompanhamento em seu tema."
117
-
118
- #: admin/options.php:32
119
- msgid ""
120
- "If you enable this option, the plugin will begin to save a local copy of "
121
- "Google Analytics to speed up the loading of your website and improve Google "
122
- "Page Speed."
123
- msgstr ""
124
- "Se você ativar essa opção, o plug-in começará a salvar uma cópia local do "
125
- "Google Analytics para acelerar o carregamento de seu website e melhorar a "
126
- "velocidade da página do Google."
127
-
128
- #: admin/options.php:32
129
- msgid ""
130
- "ATTENTION! Before using this option, remove the previously installed Google "
131
- "Analytics code inside your theme or plugins associated with this feature!"
132
- msgstr ""
133
- "ATENÇÃO! Antes de usar essa opção, remova o código do Google Analytics "
134
- "instalado anteriormente no seu tema ou plug-ins associados a esse recurso."
135
-
136
- #: admin/options.php:52
137
- msgid "Set the Google Analytics tracking code."
138
- msgstr "Definir o código de acompanhamento do Google Analytics."
139
-
140
- #: admin/options.php:63
141
- msgid "Save GA in"
142
- msgstr "Salvar o GA em"
143
-
144
- #: admin/options.php:64
145
- msgid "Select location for the Google Analytics code."
146
- msgstr "Selecione o local para o código do Google Analytics."
147
-
148
- #: admin/options.php:74
149
- msgid ""
150
- "Essentially, you set up an event which is triggered after a user spends a "
151
- "certain amount of time on the landing page, telling Google Analytics not to "
152
- "count these users as bounces. A user may come to your website, find all of "
153
- "the information they need (a phone number, for example) and then leave the "
154
- "site without visiting another page. Without adjusted bounce rate, such a "
155
- "user would be considered a bounce, even though they had a successful "
156
- "experience. By defining a time limit after which you can consider a user to "
157
- "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
158
- "more accurate idea of whether they found what they were looking for."
159
- msgstr ""
160
- "Essencialmente, você configura um evento que é acionado depois que um "
161
- "usuário passa um determinado período de tempo na página de destino, dizendo "
162
- "ao Google Analytics para não contabilizar esses usuários como rejeições. Um "
163
- "usuário pode acessar seu site, encontrar todas as informações necessárias "
164
- "(um número de telefone, por exemplo) e sair do site sem visitar outra "
165
- "página. Sem a taxa de rejeição ajustada, esse usuário seria considerado uma "
166
- "rejeição, mesmo que tivesse uma experiência bem-sucedida. Ao definir um "
167
- "limite de tempo após o qual você pode considerar um usuário \"engajado\", "
168
- "esse usuário não será mais considerado uma rejeição, e você terá uma ideia "
169
- "mais precisa sobre se encontrou o que estava procurando."
170
-
171
- #: admin/options.php:83
172
- msgid ""
173
- "By default, Google Analytics code is loaded before other scripts and "
174
- "javasscript code, but if you set the value to 100, the GA code will be "
175
- "loaded after all other scripts. By changing the priority, you can set code "
176
- "position on the page."
177
- msgstr ""
178
- "Por padrão, o código do Google Analytics é carregado antes de outros scripts "
179
- "e código javasscript, mas se você definir o valor como 100, o código do GA "
180
- "será carregado depois de todos os outros scripts. Ao alterar a prioridade, "
181
- "você pode definir a posição do código na página."
182
-
183
- #: admin/options.php:91
184
- #, php-format
185
- msgid "Disable all <a href=\"%s\">display features functionality?</a>"
186
- msgstr ""
187
- "Desativar todas as <a href=\"%s\"> funcionalidades dos recursos de exibição? "
188
- "</a>"
189
-
190
- #: admin/options.php:100
191
- #, php-format
192
- msgid ""
193
- "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
194
- msgstr ""
195
- "Usar <a href=\"%s\">Anonimizar IP?</a> (exigido por lei para alguns países)"
196
-
197
- #: admin/options.php:118
198
- msgid ""
199
- "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
200
- "After enabling this option, the plugin will not update Google Analytics "
201
- "cache file. Do not use this option if you do not understand why you need it!"
202
- msgstr ""
203
- "O Clearfy cria uma tarefa cron para atualizar diariamente os scripts de "
204
- "cache do Google Analytics. Depois de ativar essa opção, o plug-in não "
205
- "atualizará o arquivo de cache do Google Analytics. Não use essa opção se "
206
- "você não entender por que precisa!"
207
-
208
- #: admin/pages/ga_cache.php:33
209
- msgid "Local Google Analytics"
210
- msgstr ""
211
-
212
- #: admin/pages/ga_cache.php:50
213
- msgid "General"
214
- msgstr "Geral"
215
-
216
- #: includes/classes/class.configurate-ga.php:37
217
- msgid "Once Weekly"
218
- msgstr "Uma vez por semana"
219
-
220
- #: includes/classes/class.configurate-ga.php:42
221
- msgid "Twice Monthly"
222
- msgstr "Duas vezes por mês"
223
-
224
- #: includes/classes/class.configurate-ga.php:47
225
- msgid "Once Monthly"
226
- msgstr "Uma vez por mês"
227
-
228
- #: simple_google_analytics.php:32
229
- msgid ""
230
- "We found that you have the \"Clearfy - disable unused features\" plugin "
231
- "installed, this plugin already has Google Analytics cache functions, so you "
232
- "can deactivate plugin \"Google Analytics Cache\"!"
233
- msgstr ""
234
- "Descobrimos que você tem o \"Clearfy - desativar os recursos não utilizados "
235
- "\" plugin instalado, este plugin já tem desativar as funções de comentários, "
236
- "assim você pode desativar o plugin \"Hide Login Page \"!"
237
-
238
- #: simple_google_analytics.php:40
239
- msgid ""
240
- "You use the old version of Wordpress to use the <b>Webcraftic Local Google "
241
- "Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
242
- "your Wordpress to the minimum version 4.2!"
243
- msgstr ""
244
-
245
- #: simple_google_analytics.php:65
246
- msgid "Webcraftic Local Google Analytics"
247
  msgstr ""
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: clearfy\n"
4
+ "POT-Creation-Date: 2018-09-06 18:33+0300\n"
5
+ "PO-Revision-Date: 2018-09-06 18:33+0300\n"
6
+ "Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
7
+ "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
+ "Language: pt_BR\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+ "X-Poedit-SearchPathExcluded-0: libs\n"
20
+ "X-Poedit-SearchPathExcluded-1: components\n"
21
+ "X-Poedit-SearchPathExcluded-2: cache\n"
22
+
23
+ #: admin/boot.php:27
24
+ msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
25
+ msgstr ""
26
+
27
+ #: admin/boot.php:28
28
+ msgid ""
29
+ "Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
30
+ "but you still can download it from the WordPress repository in case if the "
31
+ "new release doesn’t work for you."
32
+ msgstr ""
33
+
34
+ #: admin/boot.php:29
35
+ msgid ""
36
+ "We’ve updated the code and fixed the compatibility issue for the latest "
37
+ "WordPress and PHP versions. We’ve also added additional feature of the Local "
38
+ "Google Analytics – this way your website will load faster. The plugin’s name "
39
+ "has been changed to Local Google Analytics, but all features remained the "
40
+ "same."
41
+ msgstr ""
42
+
43
+ #: admin/boot.php:30
44
+ #, php-format
45
+ msgid ""
46
+ "Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
47
+ "website. We do care about you and want to avoid any problems with the new "
48
+ "version."
49
+ msgstr ""
50
+
51
+ #: admin/boot.php:32
52
+ #, php-format
53
+ msgid ""
54
+ "We are aimed to pay more attention to the speed and security aspects of your "
55
+ "website. That’s why you should definitely try our basic WordPress "
56
+ "optimization plugin as well. Clearfy includes functionality of this plugin "
57
+ "and has many additional features for the website optimization:\n"
58
+ "<a href=\"%s\">Donwload Clearfy for free</a>"
59
+ msgstr ""
60
+
61
+ #: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
62
+ msgid "Google Analytics Cache"
63
+ msgstr "Cache analítico do Google"
64
+
65
+ #: admin/boot.php:127 admin/options.php:50
66
+ msgid "Google analytic Code"
67
+ msgstr "Código analítico do Google"
68
+
69
+ #: admin/boot.php:132 admin/options.php:71
70
+ msgid "Use adjusted bounce rate?"
71
+ msgstr "Use taxa de rejeição ajustada?"
72
+
73
+ #: admin/boot.php:137 admin/options.php:80
74
+ msgid "Change enqueue order?"
75
+ msgstr "Alterar ordem de enfileiramento?"
76
+
77
+ #: admin/boot.php:142 admin/options.php:89
78
+ msgid "Disable all display features functionality?"
79
+ msgstr "Desativar todas as funcionalidades dos recursos de exibição?"
80
+
81
+ #: admin/boot.php:147 admin/options.php:98
82
+ msgid "Use Anonymize IP? (Required by law for some countries)"
83
+ msgstr "Use Anonymize IP? (Obrigatório por lei para alguns países)"
84
+
85
+ #: admin/boot.php:152 admin/options.php:107 admin/options.php:109
86
+ msgid "Track logged in Administrators?"
87
+ msgstr "Track logado em Administradores?"
88
+
89
+ #: admin/boot.php:157 admin/options.php:116
90
+ msgid "Remove script from wp-cron?"
91
+ msgstr "Remover script do wp-cron?"
92
+
93
+ #: admin/boot.php:185
94
+ msgid "Get ultimate plugin free"
95
+ msgstr "Obtenha o melhor plugin grátis"
96
+
97
+ #: admin/options.php:23
98
+ msgid "<strong>Google Analytics cache</strong>."
99
+ msgstr "<strong>cache do Google Analytics</strong>."
100
+
101
+ #: admin/options.php:23
102
+ msgid ""
103
+ "To improve Google Page Speed indicators Analytics caching is needed. "
104
+ "However, it can also slightly increase your website loading speed, because "
105
+ "Analytics js files will load locally. The second case that you might need "
106
+ "these settings is the usual Google Analytics connection to your website. You "
107
+ "do not need to do this with other plugins or insert the tracking code into "
108
+ "your theme."
109
+ msgstr ""
110
+ "Para melhorar os indicadores do Google Page Speed, é necessário o "
111
+ "armazenamento em cache do Analytics. No entanto, também pode aumentar "
112
+ "ligeiramente a velocidade de carregamento do seu site, porque os arquivos do "
113
+ "Google Analytics js serão carregados localmente. O segundo caso em que você "
114
+ "pode precisar dessas configurações é a conexão normal do Google Analytics "
115
+ "com seu website. Você não precisa fazer isso com outros plug-ins ou inserir "
116
+ "o código de acompanhamento em seu tema."
117
+
118
+ #: admin/options.php:32
119
+ msgid ""
120
+ "If you enable this option, the plugin will begin to save a local copy of "
121
+ "Google Analytics to speed up the loading of your website and improve Google "
122
+ "Page Speed."
123
+ msgstr ""
124
+ "Se você ativar essa opção, o plug-in começará a salvar uma cópia local do "
125
+ "Google Analytics para acelerar o carregamento de seu website e melhorar a "
126
+ "velocidade da página do Google."
127
+
128
+ #: admin/options.php:32
129
+ msgid ""
130
+ "ATTENTION! Before using this option, remove the previously installed Google "
131
+ "Analytics code inside your theme or plugins associated with this feature!"
132
+ msgstr ""
133
+ "ATENÇÃO! Antes de usar essa opção, remova o código do Google Analytics "
134
+ "instalado anteriormente no seu tema ou plug-ins associados a esse recurso."
135
+
136
+ #: admin/options.php:52
137
+ msgid "Set the Google Analytics tracking code."
138
+ msgstr "Definir o código de acompanhamento do Google Analytics."
139
+
140
+ #: admin/options.php:63
141
+ msgid "Save GA in"
142
+ msgstr "Salvar o GA em"
143
+
144
+ #: admin/options.php:64
145
+ msgid "Select location for the Google Analytics code."
146
+ msgstr "Selecione o local para o código do Google Analytics."
147
+
148
+ #: admin/options.php:74
149
+ msgid ""
150
+ "Essentially, you set up an event which is triggered after a user spends a "
151
+ "certain amount of time on the landing page, telling Google Analytics not to "
152
+ "count these users as bounces. A user may come to your website, find all of "
153
+ "the information they need (a phone number, for example) and then leave the "
154
+ "site without visiting another page. Without adjusted bounce rate, such a "
155
+ "user would be considered a bounce, even though they had a successful "
156
+ "experience. By defining a time limit after which you can consider a user to "
157
+ "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
158
+ "more accurate idea of whether they found what they were looking for."
159
+ msgstr ""
160
+ "Essencialmente, você configura um evento que é acionado depois que um "
161
+ "usuário passa um determinado período de tempo na página de destino, dizendo "
162
+ "ao Google Analytics para não contabilizar esses usuários como rejeições. Um "
163
+ "usuário pode acessar seu site, encontrar todas as informações necessárias "
164
+ "(um número de telefone, por exemplo) e sair do site sem visitar outra "
165
+ "página. Sem a taxa de rejeição ajustada, esse usuário seria considerado uma "
166
+ "rejeição, mesmo que tivesse uma experiência bem-sucedida. Ao definir um "
167
+ "limite de tempo após o qual você pode considerar um usuário \"engajado\", "
168
+ "esse usuário não será mais considerado uma rejeição, e você terá uma ideia "
169
+ "mais precisa sobre se encontrou o que estava procurando."
170
+
171
+ #: admin/options.php:83
172
+ msgid ""
173
+ "By default, Google Analytics code is loaded before other scripts and "
174
+ "javasscript code, but if you set the value to 100, the GA code will be "
175
+ "loaded after all other scripts. By changing the priority, you can set code "
176
+ "position on the page."
177
+ msgstr ""
178
+ "Por padrão, o código do Google Analytics é carregado antes de outros scripts "
179
+ "e código javasscript, mas se você definir o valor como 100, o código do GA "
180
+ "será carregado depois de todos os outros scripts. Ao alterar a prioridade, "
181
+ "você pode definir a posição do código na página."
182
+
183
+ #: admin/options.php:91
184
+ #, php-format
185
+ msgid "Disable all <a href=\"%s\">display features functionality?</a>"
186
+ msgstr ""
187
+ "Desativar todas as <a href=\"%s\"> funcionalidades dos recursos de exibição? "
188
+ "</a>"
189
+
190
+ #: admin/options.php:100
191
+ #, php-format
192
+ msgid ""
193
+ "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
194
+ msgstr ""
195
+ "Usar <a href=\"%s\">Anonimizar IP?</a> (exigido por lei para alguns países)"
196
+
197
+ #: admin/options.php:118
198
+ msgid ""
199
+ "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
200
+ "After enabling this option, the plugin will not update Google Analytics "
201
+ "cache file. Do not use this option if you do not understand why you need it!"
202
+ msgstr ""
203
+ "O Clearfy cria uma tarefa cron para atualizar diariamente os scripts de "
204
+ "cache do Google Analytics. Depois de ativar essa opção, o plug-in não "
205
+ "atualizará o arquivo de cache do Google Analytics. Não use essa opção se "
206
+ "você não entender por que precisa!"
207
+
208
+ #: admin/pages/ga_cache.php:33
209
+ msgid "Local Google Analytics"
210
+ msgstr ""
211
+
212
+ #: admin/pages/ga_cache.php:50
213
+ msgid "General"
214
+ msgstr "Geral"
215
+
216
+ #: includes/classes/class.configurate-ga.php:37
217
+ msgid "Once Weekly"
218
+ msgstr "Uma vez por semana"
219
+
220
+ #: includes/classes/class.configurate-ga.php:42
221
+ msgid "Twice Monthly"
222
+ msgstr "Duas vezes por mês"
223
+
224
+ #: includes/classes/class.configurate-ga.php:47
225
+ msgid "Once Monthly"
226
+ msgstr "Uma vez por mês"
227
+
228
+ #: simple_google_analytics.php:32
229
+ msgid ""
230
+ "We found that you have the \"Clearfy - disable unused features\" plugin "
231
+ "installed, this plugin already has Google Analytics cache functions, so you "
232
+ "can deactivate plugin \"Google Analytics Cache\"!"
233
+ msgstr ""
234
+ "Descobrimos que você tem o \"Clearfy - desativar os recursos não utilizados "
235
+ "\" plugin instalado, este plugin já tem desativar as funções de comentários, "
236
+ "assim você pode desativar o plugin \"Hide Login Page \"!"
237
+
238
+ #: simple_google_analytics.php:40
239
+ msgid ""
240
+ "You use the old version of Wordpress to use the <b>Webcraftic Local Google "
241
+ "Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
242
+ "your Wordpress to the minimum version 4.2!"
243
+ msgstr ""
244
+
245
+ #: simple_google_analytics.php:65
246
+ msgid "Webcraftic Local Google Analytics"
247
  msgstr ""
languages/simple-google-analytics-ru_RU.po CHANGED
@@ -1,198 +1,198 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: \n"
4
- "POT-Creation-Date: 2018-04-17 02:28+0400\n"
5
- "PO-Revision-Date: 2018-04-17 02:35+0400\n"
6
- "Last-Translator: \n"
7
- "Language-Team: \n"
8
- "Language: ru_RU\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.0.6\n"
13
- "X-Poedit-Basepath: ga-cache\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: google-analytics-cache.php\n"
19
- "X-Poedit-SearchPath-1: includes/class-rio-plugin.php\n"
20
- "X-Poedit-SearchPath-2: admin/options.php\n"
21
- "X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
22
- "X-Poedit-SearchPath-4: admin/pages/class-pages-general-settings.php\n"
23
-
24
- #: admin/options.php:23
25
- msgid "<strong>Google Analytics cache</strong>."
26
- msgstr ""
27
-
28
- #: admin/options.php:23
29
- msgid ""
30
- "To improve Google Page Speed indicators Analytics caching is needed. "
31
- "However, it can also slightly increase your website loading speed, because "
32
- "Analytics js files will load locally. The second case that you might need "
33
- "these settings is the usual Google Analytics connection to your website. You "
34
- "do not need to do this with other plugins or insert the tracking code into "
35
- "your theme."
36
- msgstr ""
37
- "Кеширование Analytics нужно для улучшения показателей Google Page Speed, но\n"
38
- "это также может незначительно повысить скорость загрузки вашего сайта, \n"
39
- "потому что js файлы Analytics будут подгружаться локально. Второй случай, \n"
40
- "когда вам могут понадобиться эти настройки — обычное подключение Google \n"
41
- "Analytics к сайту. Вам не нужно делать это с помощью других плагинов или \n"
42
- "просто вставлять код отслеживания в вашу тему."
43
-
44
- #: admin/options.php:31 admin/pages/ga_cache.php:33 admin/pages/ga_cache.php:49
45
- msgid "Google Analytics Cache"
46
- msgstr ""
47
-
48
- #: admin/options.php:33
49
- msgid ""
50
- "If you enable this option, the plugin will begin to save a local copy of "
51
- "Google Analytics to speed up the loading of your website and improve Google "
52
- "Page Speed."
53
- msgstr ""
54
- "Если включить эту опцию, плагин начнет сохранять локальную копию Google \n"
55
- "Analytics, чтобы ускорить загрузку вашего сайта и улучшить показатели "
56
- "Google \n"
57
- "Page speed. ВНИМАНИЕ! Перед использованием этой опции, удалите ранее \n"
58
- "установленный код Google Analytics в вашей теме или плагины, связанные с \n"
59
- "этой функцией!"
60
-
61
- #: admin/options.php:33
62
- msgid ""
63
- "ATTENTION! Before using this option, remove the previously installed Google "
64
- "Analytics code inside your theme or plugins associated with this feature!"
65
- msgstr ""
66
- "ВНИМАНИЕ! Перед использованием этой опции, удалите ранее установленный код \n"
67
- "Google Analytics в вашей теме или плагины, связанные с этой функцией!"
68
-
69
- #: admin/options.php:51
70
- msgid "Google analytic Code"
71
- msgstr "Код Google аналитики"
72
-
73
- #: admin/options.php:53
74
- msgid "Set the Google Analytics tracking code."
75
- msgstr "Установите код отслеживания Google Analytics."
76
-
77
- #: admin/options.php:64
78
- msgid "Save GA in"
79
- msgstr "Использовать код аналитики в"
80
-
81
- #: admin/options.php:65
82
- msgid "Select location for the Google Analytics code."
83
- msgstr "Выберите местоположение для кода Google Analytics."
84
-
85
- #: admin/options.php:72
86
- msgid "Use adjusted bounce rate?"
87
- msgstr "Показатель отказов?"
88
-
89
- #: admin/options.php:75
90
- msgid ""
91
- "Essentially, you set up an event which is triggered after a user spends a "
92
- "certain amount of time on the landing page, telling Google Analytics not to "
93
- "count these users as bounces. A user may come to your website, find all of "
94
- "the information they need (a phone number, for example) and then leave the "
95
- "site without visiting another page. Without adjusted bounce rate, such a "
96
- "user would be considered a bounce, even though they had a successful "
97
- "experience. By defining a time limit after which you can consider a user to "
98
- "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
99
- "more accurate idea of whether they found what they were looking for."
100
- msgstr ""
101
- "По сути, вы настраиваете событие, которое запускается после того, как \n"
102
- "пользователь тратит определенное количество времени на целевую страницу, \n"
103
- "сообщая Google Analytics не считать этих пользователей как отказы. \n"
104
- "Пользователь может зайти на ваш сайт, найти всю необходимую информацию \n"
105
- "(например, номер телефона), а затем покинуть сайт, не посещая другую \n"
106
- "страницу. Без скорректированного коэффициента отказов такой пользователь \n"
107
- "будет считаться отказом, хотя у них был успешный опыт. Определив лимит \n"
108
- "времени, после которого вы можете считать пользователя «включенным», этот \n"
109
- "пользователь больше не будет считаться отказом, и вы получите более точное \n"
110
- "представление о том, нашли ли они то, что искали."
111
-
112
- #: admin/options.php:81
113
- msgid "Change enqueue order?"
114
- msgstr "Сортировка скрипта?"
115
-
116
- #: admin/options.php:84
117
- msgid ""
118
- "By default, Google Analytics code is loaded before other scripts and "
119
- "javasscript code, but if you set the value to 100, the GA code will be "
120
- "loaded after all other scripts. By changing the priority, you can set code "
121
- "position on the page."
122
- msgstr ""
123
- "По умолчанию код Google Analytics загружается раньше остальных скриптов и \n"
124
- "javasscript кода, но если вы установите к примеру значение 100, то код GA \n"
125
- "будет загружен после всех остальных скриптов. Изменяя приоритет, вы можете \n"
126
- "задавать положение кода на странице."
127
-
128
- #: admin/options.php:90
129
- msgid "Disable all display features functionality?"
130
- msgstr "Отключить все функции для контекстно-медийной сети?"
131
-
132
- #: admin/options.php:92
133
- #, php-format
134
- msgid "Disable all <a href=\"%s\">display features functionality?</a>"
135
- msgstr "Отключить <a href=\"%s\">все функции для контекстно-медийной сети?</a>"
136
-
137
- #: admin/options.php:99
138
- msgid "Use Anonymize IP? (Required by law for some countries)"
139
- msgstr ""
140
- "Использовать анонимный IP-адрес? (Требуется по закону для некоторых стран)"
141
-
142
- #: admin/options.php:101
143
- #, php-format
144
- msgid ""
145
- "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
146
- msgstr ""
147
- "Использовать <a href=\"%s\">анонимный IP-адрес?</a> (Требуется по закону "
148
- "для \n"
149
- "некоторых стран)"
150
-
151
- #: admin/options.php:108 admin/options.php:110
152
- msgid "Track logged in Administrators?"
153
- msgstr "Отслеживать, если вы авторизованы под администратором?"
154
-
155
- #: admin/options.php:117
156
- msgid "Remove script from wp-cron?"
157
- msgstr "Удалить кеширования скрипта из крона?"
158
-
159
- #: admin/options.php:119
160
- msgid ""
161
- "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
162
- "After enabling this option, the plugin will not update Google Analytics "
163
- "cache file. Do not use this option if you do not understand why you need it!"
164
- msgstr ""
165
- "Плагин создает cron задание, чтобы ежедневно обновлять кеш скриптов Google \n"
166
- "Analytics. После включения этой опции, плагин не будет обновлять кэш файл \n"
167
- "Google Analytics. Не используйте эту опцию, если вы не понимаете, для чего \n"
168
- "вам это нужно!"
169
-
170
- #: admin/pages/ga_cache.php:50
171
- msgid "General"
172
- msgstr "Основные"
173
-
174
- #: google-analytics-cache.php:22
175
- msgid ""
176
- "We found that you have the \"Clearfy - disable unused features\" plugin "
177
- "installed, this plugin already has Google Analytics cache functions, so you "
178
- "can deactivate plugin \"Google Analytics Cache\"!"
179
- msgstr ""
180
- "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить \n"
181
- "неиспользуемые функции», этот плагин уже имеет функцию кеширования Google "
182
- "Analytics, поэтому вы можете отключить плагин «Google Analytics Cache»!"
183
-
184
- #: google-analytics-cache.php:50
185
- msgid "Webcraftic Google Analytics Cache"
186
- msgstr ""
187
-
188
- #: includes/classes/class.configurate-ga.php:40
189
- msgid "Once Weekly"
190
- msgstr ""
191
-
192
- #: includes/classes/class.configurate-ga.php:45
193
- msgid "Twice Monthly"
194
- msgstr ""
195
-
196
- #: includes/classes/class.configurate-ga.php:50
197
- msgid "Once Monthly"
198
- msgstr ""
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "POT-Creation-Date: 2018-04-17 02:28+0400\n"
5
+ "PO-Revision-Date: 2018-04-17 02:35+0400\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: \n"
8
+ "Language: ru_RU\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.0.6\n"
13
+ "X-Poedit-Basepath: ga-cache\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: google-analytics-cache.php\n"
19
+ "X-Poedit-SearchPath-1: includes/class-rio-plugin.php\n"
20
+ "X-Poedit-SearchPath-2: admin/options.php\n"
21
+ "X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
22
+ "X-Poedit-SearchPath-4: admin/pages/class-pages-general-settings.php\n"
23
+
24
+ #: admin/options.php:23
25
+ msgid "<strong>Google Analytics cache</strong>."
26
+ msgstr ""
27
+
28
+ #: admin/options.php:23
29
+ msgid ""
30
+ "To improve Google Page Speed indicators Analytics caching is needed. "
31
+ "However, it can also slightly increase your website loading speed, because "
32
+ "Analytics js files will load locally. The second case that you might need "
33
+ "these settings is the usual Google Analytics connection to your website. You "
34
+ "do not need to do this with other plugins or insert the tracking code into "
35
+ "your theme."
36
+ msgstr ""
37
+ "Кеширование Analytics нужно для улучшения показателей Google Page Speed, но\n"
38
+ "это также может незначительно повысить скорость загрузки вашего сайта, \n"
39
+ "потому что js файлы Analytics будут подгружаться локально. Второй случай, \n"
40
+ "когда вам могут понадобиться эти настройки — обычное подключение Google \n"
41
+ "Analytics к сайту. Вам не нужно делать это с помощью других плагинов или \n"
42
+ "просто вставлять код отслеживания в вашу тему."
43
+
44
+ #: admin/options.php:31 admin/pages/ga_cache.php:33 admin/pages/ga_cache.php:49
45
+ msgid "Google Analytics Cache"
46
+ msgstr ""
47
+
48
+ #: admin/options.php:33
49
+ msgid ""
50
+ "If you enable this option, the plugin will begin to save a local copy of "
51
+ "Google Analytics to speed up the loading of your website and improve Google "
52
+ "Page Speed."
53
+ msgstr ""
54
+ "Если включить эту опцию, плагин начнет сохранять локальную копию Google \n"
55
+ "Analytics, чтобы ускорить загрузку вашего сайта и улучшить показатели "
56
+ "Google \n"
57
+ "Page speed. ВНИМАНИЕ! Перед использованием этой опции, удалите ранее \n"
58
+ "установленный код Google Analytics в вашей теме или плагины, связанные с \n"
59
+ "этой функцией!"
60
+
61
+ #: admin/options.php:33
62
+ msgid ""
63
+ "ATTENTION! Before using this option, remove the previously installed Google "
64
+ "Analytics code inside your theme or plugins associated with this feature!"
65
+ msgstr ""
66
+ "ВНИМАНИЕ! Перед использованием этой опции, удалите ранее установленный код \n"
67
+ "Google Analytics в вашей теме или плагины, связанные с этой функцией!"
68
+
69
+ #: admin/options.php:51
70
+ msgid "Google analytic Code"
71
+ msgstr "Код Google аналитики"
72
+
73
+ #: admin/options.php:53
74
+ msgid "Set the Google Analytics tracking code."
75
+ msgstr "Установите код отслеживания Google Analytics."
76
+
77
+ #: admin/options.php:64
78
+ msgid "Save GA in"
79
+ msgstr "Использовать код аналитики в"
80
+
81
+ #: admin/options.php:65
82
+ msgid "Select location for the Google Analytics code."
83
+ msgstr "Выберите местоположение для кода Google Analytics."
84
+
85
+ #: admin/options.php:72
86
+ msgid "Use adjusted bounce rate?"
87
+ msgstr "Показатель отказов?"
88
+
89
+ #: admin/options.php:75
90
+ msgid ""
91
+ "Essentially, you set up an event which is triggered after a user spends a "
92
+ "certain amount of time on the landing page, telling Google Analytics not to "
93
+ "count these users as bounces. A user may come to your website, find all of "
94
+ "the information they need (a phone number, for example) and then leave the "
95
+ "site without visiting another page. Without adjusted bounce rate, such a "
96
+ "user would be considered a bounce, even though they had a successful "
97
+ "experience. By defining a time limit after which you can consider a user to "
98
+ "be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
99
+ "more accurate idea of whether they found what they were looking for."
100
+ msgstr ""
101
+ "По сути, вы настраиваете событие, которое запускается после того, как \n"
102
+ "пользователь тратит определенное количество времени на целевую страницу, \n"
103
+ "сообщая Google Analytics не считать этих пользователей как отказы. \n"
104
+ "Пользователь может зайти на ваш сайт, найти всю необходимую информацию \n"
105
+ "(например, номер телефона), а затем покинуть сайт, не посещая другую \n"
106
+ "страницу. Без скорректированного коэффициента отказов такой пользователь \n"
107
+ "будет считаться отказом, хотя у них был успешный опыт. Определив лимит \n"
108
+ "времени, после которого вы можете считать пользователя «включенным», этот \n"
109
+ "пользователь больше не будет считаться отказом, и вы получите более точное \n"
110
+ "представление о том, нашли ли они то, что искали."
111
+
112
+ #: admin/options.php:81
113
+ msgid "Change enqueue order?"
114
+ msgstr "Сортировка скрипта?"
115
+
116
+ #: admin/options.php:84
117
+ msgid ""
118
+ "By default, Google Analytics code is loaded before other scripts and "
119
+ "javasscript code, but if you set the value to 100, the GA code will be "
120
+ "loaded after all other scripts. By changing the priority, you can set code "
121
+ "position on the page."
122
+ msgstr ""
123
+ "По умолчанию код Google Analytics загружается раньше остальных скриптов и \n"
124
+ "javasscript кода, но если вы установите к примеру значение 100, то код GA \n"
125
+ "будет загружен после всех остальных скриптов. Изменяя приоритет, вы можете \n"
126
+ "задавать положение кода на странице."
127
+
128
+ #: admin/options.php:90
129
+ msgid "Disable all display features functionality?"
130
+ msgstr "Отключить все функции для контекстно-медийной сети?"
131
+
132
+ #: admin/options.php:92
133
+ #, php-format
134
+ msgid "Disable all <a href=\"%s\">display features functionality?</a>"
135
+ msgstr "Отключить <a href=\"%s\">все функции для контекстно-медийной сети?</a>"
136
+
137
+ #: admin/options.php:99
138
+ msgid "Use Anonymize IP? (Required by law for some countries)"
139
+ msgstr ""
140
+ "Использовать анонимный IP-адрес? (Требуется по закону для некоторых стран)"
141
+
142
+ #: admin/options.php:101
143
+ #, php-format
144
+ msgid ""
145
+ "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
146
+ msgstr ""
147
+ "Использовать <a href=\"%s\">анонимный IP-адрес?</a> (Требуется по закону "
148
+ "для \n"
149
+ "некоторых стран)"
150
+
151
+ #: admin/options.php:108 admin/options.php:110
152
+ msgid "Track logged in Administrators?"
153
+ msgstr "Отслеживать, если вы авторизованы под администратором?"
154
+
155
+ #: admin/options.php:117
156
+ msgid "Remove script from wp-cron?"
157
+ msgstr "Удалить кеширования скрипта из крона?"
158
+
159
+ #: admin/options.php:119
160
+ msgid ""
161
+ "Clearfy creates a cron job to daily update Google Analytics cache scripts. "
162
+ "After enabling this option, the plugin will not update Google Analytics "
163
+ "cache file. Do not use this option if you do not understand why you need it!"
164
+ msgstr ""
165
+ "Плагин создает cron задание, чтобы ежедневно обновлять кеш скриптов Google \n"
166
+ "Analytics. После включения этой опции, плагин не будет обновлять кэш файл \n"
167
+ "Google Analytics. Не используйте эту опцию, если вы не понимаете, для чего \n"
168
+ "вам это нужно!"
169
+
170
+ #: admin/pages/ga_cache.php:50
171
+ msgid "General"
172
+ msgstr "Основные"
173
+
174
+ #: google-analytics-cache.php:22
175
+ msgid ""
176
+ "We found that you have the \"Clearfy - disable unused features\" plugin "
177
+ "installed, this plugin already has Google Analytics cache functions, so you "
178
+ "can deactivate plugin \"Google Analytics Cache\"!"
179
+ msgstr ""
180
+ "Мы обнаружили, что у вас установлен плагин «Clearfy - отключить \n"
181
+ "неиспользуемые функции», этот плагин уже имеет функцию кеширования Google "
182
+ "Analytics, поэтому вы можете отключить плагин «Google Analytics Cache»!"
183
+
184
+ #: google-analytics-cache.php:50
185
+ msgid "Webcraftic Google Analytics Cache"
186
+ msgstr ""
187
+
188
+ #: includes/classes/class.configurate-ga.php:40
189
+ msgid "Once Weekly"
190
+ msgstr ""
191
+
192
+ #: includes/classes/class.configurate-ga.php:45
193
+ msgid "Twice Monthly"
194
+ msgstr ""
195
+
196
+ #: includes/classes/class.configurate-ga.php:50
197
+ msgid "Once Monthly"
198
+ msgstr ""
libs/factory/adverts/boot.php CHANGED
@@ -1,50 +1,50 @@
1
- <?php
2
-
3
- use WBCR\Factory_Adverts_102\Base;
4
-
5
- /**
6
- * Factory Adverts
7
- *
8
- * @author Alexander Vitkalov <nechin.va@gmail.com>
9
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
10
- * @since 1.0.0
11
- *
12
- * @package factory-ad-inserter
13
- * @copyright (c) 2019, Webcraftic Ltd
14
- *
15
- * @version 1.2.3
16
- */
17
-
18
- // Exit if accessed directly
19
- if ( ! defined( 'ABSPATH' ) ) {
20
- exit;
21
- }
22
-
23
- if ( defined( 'FACTORY_ADVERTS_102_LOADED' ) || ( defined( 'FACTORY_ADVERTS_BLOCK' ) && FACTORY_ADVERTS_BLOCK ) ) {
24
- return;
25
- }
26
-
27
- # Устанавливаем константу, что модуль уже загружен
28
- define( 'FACTORY_ADVERTS_102_LOADED', true );
29
-
30
- # Устанавливаем версию модуля
31
- define( 'FACTORY_ADVERTS_102_VERSION', '1.0.2' );
32
-
33
- # Регистрируем тектовый домен, для интернализации интерфейса модуля
34
- load_plugin_textdomain( 'wbcr_factory_adverts_102', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
35
-
36
- # Устанавливаем директорию модуля
37
- define( 'FACTORY_ADVERTS_102_DIR', dirname( __FILE__ ) );
38
-
39
- # Устанавливаем url модуля
40
- define( 'FACTORY_ADVERTS_102_URL', plugins_url( null, __FILE__ ) );
41
-
42
- require_once( FACTORY_ADVERTS_102_DIR . '/includes/class-rest-request.php' );
43
- require_once( FACTORY_ADVERTS_102_DIR . '/includes/class-base.php' );
44
-
45
- /**
46
- * @param Wbcr_Factory420_Plugin $plugin
47
- */
48
- add_action( 'wbcr_factory_adverts_102_plugin_created', function ( $plugin ) {
49
- $plugin->set_adverts_manager( "WBCR\Factory_Adverts_102\Base" );
50
- } );
1
+ <?php
2
+
3
+ use WBCR\Factory_Adverts_124\Base;
4
+
5
+ /**
6
+ * Factory Adverts
7
+ *
8
+ * @author Alexander Vitkalov <nechin.va@gmail.com>
9
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
10
+ * @since 1.0.0
11
+ *
12
+ * @package factory-ad-inserter
13
+ * @copyright (c) 2019, Webcraftic Ltd
14
+ *
15
+ * @version 1.2.3
16
+ */
17
+
18
+ // Exit if accessed directly
19
+ if( !defined('ABSPATH') ) {
20
+ exit;
21
+ }
22
+
23
+ if( defined('FACTORY_ADVERTS_124_LOADED') || (defined('FACTORY_ADVERTS_BLOCK') && FACTORY_ADVERTS_BLOCK) ) {
24
+ return;
25
+ }
26
+
27
+ # Устанавливаем константу, что модуль уже загружен
28
+ define('FACTORY_ADVERTS_124_LOADED', true);
29
+
30
+ # Устанавливаем версию модуля
31
+ define('FACTORY_ADVERTS_124_VERSION', '1.2.4');
32
+
33
+ # Регистрируем тектовый домен, для интернализации интерфейса модуля
34
+ load_plugin_textdomain('wbcr_factory_adverts_124', false, dirname(plugin_basename(__FILE__)) . '/langs');
35
+
36
+ # Устанавливаем директорию модуля
37
+ define('FACTORY_ADVERTS_124_DIR', dirname(__FILE__));
38
+
39
+ # Устанавливаем url модуля
40
+ define('FACTORY_ADVERTS_124_URL', plugins_url(null, __FILE__));
41
+
42
+ require_once(FACTORY_ADVERTS_124_DIR . '/includes/class-rest-request.php');
43
+ require_once(FACTORY_ADVERTS_124_DIR . '/includes/class-base.php');
44
+
45
+ /**
46
+ * @param Wbcr_Factory446_Plugin $plugin
47
+ */
48
+ add_action('wbcr_factory_adverts_124_plugin_created', function ($plugin) {
49
+ $plugin->set_adverts_manager("WBCR\Factory_Adverts_124\Base");
50
+ });
libs/factory/adverts/includes/class-base.php CHANGED
@@ -1,319 +1,319 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_Adverts_102;
4
-
5
- // Exit if accessed directly
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- /**
11
- * Base class for adverts module.
12
- *
13
- * Contains methods for retrieving banner data for a specific position.
14
- * With this class user cat get advert content for a specific position.
15
- * This class use functional design pattern.
16
- *
17
- * @author Alexander Vitkalov <nechin.va@gmail.com>
18
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
19
- *
20
- * @since 1.0.0 Added
21
- * @package factory-adverts
22
- * @copyright (c) 2019 Webcraftic Ltd
23
- */
24
- class Base {
25
-
26
- /**
27
- * Экзепляр плагина с которым взаимодействует этот модуль
28
- *
29
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
30
- * @since 1.0.1
31
- * @var \Wbcr_Factory420_Plugin
32
- */
33
- private $plugin;
34
-
35
- /*
36
- * Contain array data with the plugin information and the module settings.
37
- * Mainly used to get the name of the plugin and how to get the adverts blocks.
38
- *
39
- * @since 1.0.0 Added
40
- *
41
- * @var array Example: array(
42
- * 'dashboard_widget' => true,
43
- * 'right_sidebar' => true,
44
- * 'notice' => true,
45
- * ...
46
- * )
47
- *
48
- */
49
- private $settings = [];
50
-
51
- /**
52
- * Экземпляр класса для работы API CreativeMotion
53
- *
54
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
55
- * @since 1.0.1
56
- * @var \WBCR\Factory_Adverts_102\Creative_Motion_API
57
- */
58
- private $api;
59
-
60
- /**
61
- * Сохраняем уже полученные данные, для объектного кеширования
62
- *
63
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
64
- * @since 1.0.1
65
- * @var array
66
- */
67
- private $placements = [];
68
-
69
- /**
70
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
71
- * @since 1.0.1
72
- * @var array
73
- */
74
- private $errors = [];
75
-
76
- /**
77
- * Wbcr_Factory_Adinserter constructor.
78
- *
79
- * - Store plugin information and settings.
80
- * - Add filter and actions.
81
- * - Include dashboard widget.
82
- *
83
- * @since 1.0.0 Added
84
- *
85
- * @param \Wbcr_Factory420_Plugin $plugin
86
- */
87
- public function __construct( \Wbcr_Factory420_Plugin $plugin, $settings ) {
88
- $this->plugin = $plugin;
89
-
90
- $this->settings = wp_parse_args( $settings, [
91
- 'dashboard_widget' => false, // show dashboard widget (default: false)
92
- 'right_sidebar' => false, // show adverts sidebar (default: false)
93
- 'notice' => false, // show notice message (default: false),
94
- 'business_suggetion' => false,
95
- 'support' => false
96
- ] );
97
-
98
- $this->api = new Creative_Motion_API( $this->plugin );
99
-
100
- add_filter( 'wbcr/factory/pages/impressive/widgets', [ $this, 'register_plugin_widgets' ], 10, 3 );
101
- add_action( 'wbcr/factory/admin_notices', [ $this, 'register_plugin_notice' ], 10, 2 );
102
- add_action( 'current_screen', [ $this, 'register_dashboard_widget' ], 10, 2 );
103
- }
104
-
105
- /**
106
- * Directly get advert content for selected position.
107
- *
108
- * @since 1.0.1 Rename method. Content should now be printed.
109
- * @since 1.0.0 Added
110
- *
111
- * @param string $position Custom position name
112
- *
113
- * @return void
114
- */
115
- public function render_placement( $position = 'right_sidebar' ) {
116
- $content = '';
117
-
118
- if ( $position ) {
119
- $content = $this->get_content( $position );
120
- }
121
-
122
- echo $content;
123
- }
124
-
125
- /**
126
- * Register widgets.
127
- *
128
- * Depending on the settings, register new widgets.
129
- *
130
- * @since 1.0.0 Added
131
- *
132
- * @param array $widgets Already existing registered widgets
133
- * @param string $position Position for the widget
134
- * @param string $plugin Plugin object for which the hook is run
135
- *
136
- * @return array array(
137
- * 'adverts_widget' => '<p></p>',
138
- * 'business_suggetion' => '<p></p>',
139
- * 'support' => '<p></p>',
140
- * ...
141
- * )
142
- */
143
- public function register_plugin_widgets( $widgets, $position, $plugin ) {
144
- if ( $plugin->getPluginName() == $this->plugin->getPluginName() && 'right' == $position ) {
145
-
146
- if ( $this->settings['right_sidebar'] ) {
147
- $content = $this->get_content( 'right_sidebar' );
148
- $widgets['adverts_widget'] = $content;
149
-
150
- if ( empty( $widgets['adverts_widget'] ) ) {
151
- if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
152
- $debug_message = '<div style="background: #fff4f1;padding: 10px;color: #a58074;">';
153
- $debug_message .= $this->get_debug_message( 'right_sidebar' );
154
- $debug_message .= '</div>';
155
-
156
- $widgets['adverts_widget'] = $debug_message;
157
- } else {
158
- unset( $widgets['adverts_widget'] );
159
- }
160
- }
161
- }
162
-
163
- if ( $this->settings['business_suggetion'] ) {
164
- $content = $this->get_content( 'business_suggetion' );
165
-
166
- if ( ! empty( $content ) ) {
167
- $widgets['business_suggetion'] = $content;
168
- }
169
- }
170
-
171
- if ( $this->settings['support'] ) {
172
- $content = $this->get_content( 'support' );
173
-
174
- if ( ! empty( $content ) ) {
175
- $widgets['support'] = $content;
176
- }
177
- }
178
- }
179
-
180
- return $widgets;
181
- }
182
-
183
- /**
184
- * Регистрирует уведомление для текущего плагина
185
- *
186
- * Мы добавляем уведомления в массив всех уведомлений плагина с ключем 'adverts_notice',
187
- * то есть если другие плагины, тоже добавят свои рекламные уведомления, они просто
188
- * будут перезаписывать друг друга, в итоге будет отображено только одно рекламное
189
- * уведомеление. Это нужно для того, чтобы ограничить пользователя от спама.
190
- *
191
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
192
- *
193
- * @since 1.0.1 Переделан полностью под интферфейс фреймворка. Используем встроенную систему уведомлений.
194
- * @since 1.0.0 Added
195
- *
196
- * @param array $notices Массив со списком всех уведомлений, которые будут напечатыны в админ панели
197
- * @param string $plugin_name Имя плагина, передано для того, чтобы выводить уведомления условно, только для конкретного плагина
198
- */
199
- public function register_plugin_notice( $notices, $plugin_name ) {
200
- if ( $plugin_name !== $this->plugin->getPluginName() ) {
201
- return $notices;
202
- }
203
-
204
- if ( $this->settings['notice'] ) {
205
- $notice_content = $this->get_content( 'notice' );
206
-
207
- if ( empty( $notice_content ) ) {
208
- # Информация для отладки
209
- if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
210
- $debug_message = $this->get_debug_message( 'notice' );
211
-
212
- $notices['adverts_notice'] = [
213
- 'id' => 'adverts_debug',
214
- 'type' => 'error',
215
- 'dismissible' => false,
216
- 'dismiss_expires' => 0,
217
- 'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $debug_message . '</p>'
218
- ];
219
- }
220
-
221
- return $notices;
222
- }
223
-
224
- $hash = md5( $notice_content );
225
-
226
- $notices['adverts_notice'] = [
227
- 'id' => 'adverts_' . $hash,
228
- 'type' => 'success',
229
- 'dismissible' => true,
230
- 'dismiss_expires' => 0,
231
- 'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $notice_content . '</p>'
232
- ];
233
- }
234
-
235
- return $notices;
236
- }
237
-
238
- /**
239
- * Include dashboard widget
240
- *
241
- * Include functionality the output of the widget on the dashboard.
242
- * Only one dashboard widget must be shown for some plugins with this setting (dashboard_widget).
243
- *
244
- * @since 1.0.0 Added
245
- */
246
- public function register_dashboard_widget() {
247
- if ( $this->settings['dashboard_widget'] && current_user_can( 'manage_options' ) ) {
248
- $current_screen = get_current_screen();
249
-
250
- if ( ! in_array( $current_screen->id, [ 'dashboard', 'dashboard-network' ] ) ) {
251
- return;
252
- }
253
-
254
- $content = $this->get_content( 'dashboard_widget' );
255
-
256
- if ( empty( $content ) && defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
257
- $content = $this->get_debug_message( 'dashboard_widget' );
258
- }
259
-
260
- require_once FACTORY_ADVERTS_102_DIR . '/includes/class-dashboard-widget.php';
261
- new Dashboard_Widget( $this->plugin, $content );
262
- }
263
- }
264
-
265
- /**
266
- * Позволяет получить сообщение об ошибках
267
- *
268
- * Метод проверяет последние ошибки, которые могли произойти в результате api запроса.
269
- * Если ошибки есть, он выводит предупреждение и список последних ошибок. Если ошибок нет,
270
- * метод вернет просто предупреждение, что реклама не настроена.
271
- *
272
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
273
- * @since 1.0.1
274
- *
275
- * @param string $position Position for the widget
276
- *
277
- * @return string Возвращает сообщение с последниеми ошибками для отладки
278
- */
279
- private function get_debug_message( $position ) {
280
- $debug_massage = 'Plugin ads not configured or server unavailable. See full error report below.<br>';
281
-
282
- if ( isset( $this->errors[ $position ] ) && ! empty( $this->errors ) ) {
283
- $debug_massage .= '<b>Last errors:</b><br>';
284
- foreach ( $this->errors[ $position ] as $error_code => $error_message ) {
285
- $debug_massage .= 'Code: ' . $error_code . ' Error: ' . $error_message . '<br>';
286
- }
287
- }
288
-
289
- return $debug_massage;
290
- }
291
-
292
- /**
293
- * Get advert content for selected position.
294
- *
295
- * @since 1.0.1 Полностью переписан
296
- * @since 1.0.0 Added
297
- *
298
- * @param string $position The position for advert
299
- *
300
- * @return string
301
- */
302
- private function get_content( $position ) {
303
- if ( isset( $this->placements[ $position ] ) ) {
304
- return $this->placements[ $position ];
305
- }
306
-
307
- $content = $this->api->get_content( $position );
308
-
309
- if ( is_wp_error( $content ) ) {
310
- $this->errors[ $position ][ $content->get_error_code() ] = $content->get_error_message();
311
-
312
- return null;
313
- }
314
-
315
- $this->placements[ $position ] = $content;
316
-
317
- return $content;
318
- }
319
- }
1
+ <?php
2
+
3
+ namespace WBCR\Factory_Adverts_124;
4
+
5
+ // Exit if accessed directly
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ exit;
8
+ }
9
+
10
+ /**
11
+ * Base class for adverts module.
12
+ *
13
+ * Contains methods for retrieving banner data for a specific position.
14
+ * With this class user cat get advert content for a specific position.
15
+ * This class use functional design pattern.
16
+ *
17
+ * @author Alexander Vitkalov <nechin.va@gmail.com>
18
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
19
+ *
20
+ * @since 1.0.0 Added
21
+ * @package factory-adverts
22
+ * @copyright (c) 2019 Webcraftic Ltd
23
+ */
24
+ class Base {
25
+
26
+ /**
27
+ * Экзепляр плагина с которым взаимодействует этот модуль
28
+ *
29
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
30
+ * @since 1.0.1
31
+ * @var \Wbcr_Factory446_Plugin
32
+ */
33
+ private $plugin;
34
+
35
+ /*
36
+ * Contain array data with the plugin information and the module settings.
37
+ * Mainly used to get the name of the plugin and how to get the adverts blocks.
38
+ *
39
+ * @since 1.0.0 Added
40
+ *
41
+ * @var array Example: array(
42
+ * 'dashboard_widget' => true,
43
+ * 'right_sidebar' => true,
44
+ * 'notice' => true,
45
+ * ...
46
+ * )
47
+ *
48
+ */
49
+ private $settings = [];
50
+
51
+ /**
52
+ * Экземпляр класса для работы API CreativeMotion
53
+ *
54
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
55
+ * @since 1.0.1
56
+ * @var \WBCR\Factory_Adverts_124\Creative_Motion_API
57
+ */
58
+ private $api;
59
+
60
+ /**
61
+ * Сохраняем уже полученные данные, для объектного кеширования
62
+ *
63
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
64
+ * @since 1.0.1
65
+ * @var array
66
+ */
67
+ private $placements = [];
68
+
69
+ /**
70
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
71
+ * @since 1.0.1
72
+ * @var array
73
+ */
74
+ private $errors = [];
75
+
76
+ /**
77
+ * Wbcr_Factory_Adinserter constructor.
78
+ *
79
+ * - Store plugin information and settings.
80
+ * - Add filter and actions.
81
+ * - Include dashboard widget.
82
+ *
83
+ * @since 1.0.0 Added
84
+ *
85
+ * @param \Wbcr_Factory446_Plugin $plugin
86
+ */
87
+ public function __construct( \Wbcr_Factory446_Plugin $plugin, $settings ) {
88
+ $this->plugin = $plugin;
89
+
90
+ $this->settings = wp_parse_args( $settings, [
91
+ 'dashboard_widget' => false, // show dashboard widget (default: false)
92
+ 'right_sidebar' => false, // show adverts sidebar (default: false)
93
+ 'notice' => false, // show notice message (default: false),
94
+ 'business_suggetion' => false,
95
+ 'support' => false
96
+ ] );
97
+
98
+ $this->api = new Creative_Motion_API( $this->plugin );
99
+
100
+ add_filter( 'wbcr/factory/pages/impressive/widgets', [ $this, 'register_plugin_widgets' ], 10, 3 );
101
+ add_action( 'wbcr/factory/admin_notices', [ $this, 'register_plugin_notice' ], 10, 2 );
102
+ add_action( 'current_screen', [ $this, 'register_dashboard_widget' ], 10, 2 );
103
+ }
104
+
105
+ /**
106
+ * Directly get advert content for selected position.
107
+ *
108
+ * @since 1.0.1 Rename method. Content should now be printed.
109
+ * @since 1.0.0 Added
110
+ *
111
+ * @param string $position Custom position name
112
+ *
113
+ * @return void
114
+ */
115
+ public function render_placement( $position = 'right_sidebar' ) {
116
+ $content = '';
117
+
118
+ if ( $position ) {
119
+ $content = $this->get_content( $position );
120
+ }
121
+
122
+ echo $content;
123
+ }
124
+
125
+ /**
126
+ * Register widgets.
127
+ *
128
+ * Depending on the settings, register new widgets.
129
+ *
130
+ * @since 1.0.0 Added
131
+ *
132
+ * @param array $widgets Already existing registered widgets
133
+ * @param string $position Position for the widget
134
+ * @param string $plugin Plugin object for which the hook is run
135
+ *
136
+ * @return array array(
137
+ * 'adverts_widget' => '<p></p>',
138
+ * 'business_suggetion' => '<p></p>',
139
+ * 'support' => '<p></p>',
140
+ * ...
141
+ * )
142
+ */
143
+ public function register_plugin_widgets( $widgets, $position, $plugin ) {
144
+ if ( $plugin->getPluginName() == $this->plugin->getPluginName() && 'right' == $position ) {
145
+
146
+ if ( $this->settings['right_sidebar'] ) {
147
+ $content = $this->get_content( 'right_sidebar' );
148
+ $widgets['adverts_widget'] = $content;
149
+
150
+ if ( empty( $widgets['adverts_widget'] ) ) {
151
+ if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
152
+ $debug_message = '<div style="background: #fff4f1;padding: 10px;color: #a58074;">';
153
+ $debug_message .= $this->get_debug_message( 'right_sidebar' );
154
+ $debug_message .= '</div>';
155
+
156
+ $widgets['adverts_widget'] = $debug_message;
157
+ } else {
158
+ unset( $widgets['adverts_widget'] );
159
+ }
160
+ }
161
+ }
162
+
163
+ if ( $this->settings['business_suggetion'] ) {
164
+ $content = $this->get_content( 'business_suggetion' );
165
+
166
+ if ( ! empty( $content ) ) {
167
+ $widgets['business_suggetion'] = $content;
168
+ }
169
+ }
170
+
171
+ if ( $this->settings['support'] ) {
172
+ $content = $this->get_content( 'support' );
173
+
174
+ if ( ! empty( $content ) ) {
175
+ $widgets['support'] = $content;
176
+ }
177
+ }
178
+ }
179
+
180
+ return $widgets;
181
+ }
182
+
183
+ /**
184
+ * Регистрирует уведомление для текущего плагина
185
+ *
186
+ * Мы добавляем уведомления в массив всех уведомлений плагина с ключем 'adverts_notice',
187
+ * то есть если другие плагины, тоже добавят свои рекламные уведомления, они просто
188
+ * будут перезаписывать друг друга, в итоге будет отображено только одно рекламное
189
+ * уведомеление. Это нужно для того, чтобы ограничить пользователя от спама.
190
+ *
191
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
192
+ *
193
+ * @since 1.0.1 Переделан полностью под интферфейс фреймворка. Используем встроенную систему уведомлений.
194
+ * @since 1.0.0 Added
195
+ *
196
+ * @param array $notices Массив со списком всех уведомлений, которые будут напечатыны в админ панели
197
+ * @param string $plugin_name Имя плагина, передано для того, чтобы выводить уведомления условно, только для конкретного плагина
198
+ */
199
+ public function register_plugin_notice( $notices, $plugin_name ) {
200
+ if ( $plugin_name !== $this->plugin->getPluginName() ) {
201
+ return $notices;
202
+ }
203
+
204
+ if ( $this->settings['notice'] ) {
205
+ $notice_content = $this->get_content( 'notice' );
206
+
207
+ if ( empty( $notice_content ) ) {
208
+ # Информация для отладки
209
+ if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
210
+ $debug_message = $this->get_debug_message( 'notice' );
211
+
212
+ $notices['adverts_notice'] = [
213
+ 'id' => 'adverts_debug',
214
+ 'type' => 'error',
215
+ 'dismissible' => false,
216
+ 'dismiss_expires' => 0,
217
+ 'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $debug_message . '</p>'
218
+ ];
219
+ }
220
+
221
+ return $notices;
222
+ }
223
+
224
+ $hash = md5( $notice_content );
225
+
226
+ $notices['adverts_notice'] = [
227
+ 'id' => 'adverts_' . $hash,
228
+ 'type' => 'success',
229
+ 'dismissible' => true,
230
+ 'dismiss_expires' => 0,
231
+ 'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $notice_content . '</p>'
232
+ ];
233
+ }
234
+
235
+ return $notices;
236
+ }
237
+
238
+ /**
239
+ * Include dashboard widget
240
+ *
241
+ * Include functionality the output of the widget on the dashboard.
242
+ * Only one dashboard widget must be shown for some plugins with this setting (dashboard_widget).
243
+ *
244
+ * @since 1.0.0 Added
245
+ */
246
+ public function register_dashboard_widget() {
247
+ if ( $this->settings['dashboard_widget'] && current_user_can( 'manage_options' ) ) {
248
+ $current_screen = get_current_screen();
249
+
250
+ if ( ! in_array( $current_screen->id, [ 'dashboard', 'dashboard-network' ] ) ) {
251
+ return;
252
+ }
253
+
254
+ $content = $this->get_content( 'dashboard_widget' );
255
+
256
+ if ( empty( $content ) && defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
257
+ $content = $this->get_debug_message( 'dashboard_widget' );
258
+ }
259
+
260
+ require_once FACTORY_ADVERTS_124_DIR . '/includes/class-dashboard-widget.php';
261
+ new Dashboard_Widget( $this->plugin, $content );
262
+ }
263
+ }
264
+
265
+ /**
266
+ * Позволяет получить сообщение об ошибках
267
+ *
268
+ * Метод проверяет последние ошибки, которые могли произойти в результате api запроса.
269
+ * Если ошибки есть, он выводит предупреждение и список последних ошибок. Если ошибок нет,
270
+ * метод вернет просто предупреждение, что реклама не настроена.
271
+ *
272
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
273
+ * @since 1.0.1
274
+ *
275
+ * @param string $position Position for the widget
276
+ *
277
+ * @return string Возвращает сообщение с последниеми ошибками для отладки
278
+ */
279
+ private function get_debug_message( $position ) {
280
+ $debug_massage = 'Plugin ads not configured or server unavailable. See full error report below.<br>';
281
+
282
+ if ( isset( $this->errors[ $position ] ) && ! empty( $this->errors ) ) {
283
+ $debug_massage .= '<b>Last errors:</b><br>';
284
+ foreach ( $this->errors[ $position ] as $error_code => $error_message ) {
285
+ $debug_massage .= 'Code: ' . $error_code . ' Error: ' . $error_message . '<br>';
286
+ }
287
+ }
288
+
289
+ return $debug_massage;
290
+ }
291
+
292
+ /**
293
+ * Get advert content for selected position.
294
+ *
295
+ * @since 1.0.1 Полностью переписан
296
+ * @since 1.0.0 Added
297
+ *
298
+ * @param string $position The position for advert
299
+ *
300
+ * @return string
301
+ */
302
+ private function get_content( $position ) {
303
+ if ( isset( $this->placements[ $position ] ) ) {
304
+ return $this->placements[ $position ];
305
+ }
306
+
307
+ $content = $this->api->get_content( $position );
308
+
309
+ if ( is_wp_error( $content ) ) {
310
+ $this->errors[ $position ][ $content->get_error_code() ] = $content->get_error_message();
311
+
312
+ return null;
313
+ }
314
+
315
+ $this->placements[ $position ] = $content;
316
+
317
+ return $content;
318
+ }
319
+ }
libs/factory/adverts/includes/class-dashboard-widget.php CHANGED
@@ -1,125 +1,125 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_Adverts_102;
4
-
5
- // Exit if accessed directly
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- /**
11
- * Adverts Dashboard Widget.
12
- *
13
- * Adds a widget with a banner or a list of news.
14
- *
15
- * @author Alexander Vitkalov <nechin.va@gmail.com>
16
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
17
- *
18
- * @since 1.0.0 Added
19
- * @package factory-adverts
20
- * @copyright (c) 2019 Webcraftic Ltd
21
- */
22
- class Dashboard_Widget {
23
-
24
- /**
25
- * Контент, который должен быть напечатан внутри дашбоард виджета
26
- *
27
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
28
- * @since 1.0.1
29
- * @var string
30
- */
31
- private $content;
32
-
33
- /**
34
- * Экзепляр плагина с которым взаимодействует этот модуль
35
- *
36
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
37
- * @since 1.0.1
38
- * @var \Wbcr_Factory420_Plugin
39
- */
40
- private $plugin;
41
-
42
- /**
43
- * Dashboard_Widget constructor.
44
- *
45
- * Call parent constructor. Registration hooks.
46
- *
47
- * @since 1.0.0 Added
48
- *
49
- * @param \Wbcr_Factory420_Plugin $plugin
50
- * @param string $content
51
- */
52
- public function __construct( \Wbcr_Factory420_Plugin $plugin, $content ) {
53
-
54
- $this->plugin = $plugin;
55
- $this->content = $content;
56
-
57
- if ( ! empty( $this->content ) ) {
58
- if ( $this->plugin->isNetworkActive() && $this->plugin->isNetworkAdmin() ) {
59
- add_action( 'wp_network_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
60
-
61
- return;
62
- }
63
-
64
- add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
65
- }
66
- }
67
-
68
- /**
69
- * Add the News widget to the dashboard.
70
- *
71
- * @since 1.0.0 Added
72
- */
73
- public function add_dashboard_widgets() {
74
- $widget_id = 'wbcr-factory-adverts-widget';
75
-
76
- wp_add_dashboard_widget( $widget_id, $this->plugin->getPluginTitle() . ' News', [
77
- $this,
78
- 'print_widget_content'
79
- ] );
80
-
81
- $this->sort_dashboard_widgets( $widget_id );
82
- }
83
-
84
- /**
85
- * Create the function to output the contents of the Dashboard Widget.
86
- *
87
- * @since 1.0.0 Added
88
- */
89
- public function print_widget_content() {
90
- ?>
91
- <div class="wordpress-news hide-if-no-js">
92
- <div class="rss-widget">
93
- <?php echo $this->content; ?>
94
- </div>
95
- </div>
96
- <?php
97
-
98
- }
99
-
100
- /**
101
- * Сортируем виджеты на странице дашбоард
102
- *
103
- * Виджеты должны быть в таком порядке, чтобы наш виджет был выше всех.
104
- *
105
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
106
- * @author Alexander Vitkalov <nechin.va@gmail.com>
107
- *
108
- * @since 1.0.2 Добавлена поддержка мультисайтов
109
- * @since 1.0.0 Добавлен
110
- *
111
- * @param string $widget_id ID нашего виджета
112
- */
113
- private function sort_dashboard_widgets( $widget_id ) {
114
- global $wp_meta_boxes;
115
-
116
- $location = $this->plugin->isNetworkAdmin() ? 'dashboard-network' : 'dashboard';
117
-
118
- $normal_core = $wp_meta_boxes[ $location ]['normal']['core'];
119
- $widget_backup = [ $widget_id => $normal_core[ $widget_id ] ];
120
- unset( $normal_core[ $widget_id ] );
121
- $sorted_core = array_merge( $widget_backup, $normal_core );
122
-
123
- $wp_meta_boxes['dashboard']['normal']['core'] = $sorted_core;
124
- }
125
- }
1
+ <?php
2
+
3
+ namespace WBCR\Factory_Adverts_124;
4
+
5
+ // Exit if accessed directly
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ exit;
8
+ }
9
+
10
+ /**
11
+ * Adverts Dashboard Widget.
12
+ *
13
+ * Adds a widget with a banner or a list of news.
14
+ *
15
+ * @author Alexander Vitkalov <nechin.va@gmail.com>
16
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
17
+ *
18
+ * @since 1.0.0 Added
19
+ * @package factory-adverts
20
+ * @copyright (c) 2019 Webcraftic Ltd
21
+ */
22
+ class Dashboard_Widget {
23
+
24
+ /**
25
+ * Контент, который должен быть напечатан внутри дашбоард виджета
26
+ *
27
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
28
+ * @since 1.0.1
29
+ * @var string
30
+ */
31
+ private $content;
32
+
33
+ /**
34
+ * Экзепляр плагина с которым взаимодействует этот модуль
35
+ *
36
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
37
+ * @since 1.0.1
38
+ * @var \Wbcr_Factory446_Plugin
39
+ */
40
+ private $plugin;
41
+
42
+ /**
43
+ * Dashboard_Widget constructor.
44
+ *
45
+ * Call parent constructor. Registration hooks.
46
+ *
47
+ * @since 1.0.0 Added
48
+ *
49
+ * @param \Wbcr_Factory446_Plugin $plugin
50
+ * @param string $content
51
+ */
52
+ public function __construct( \Wbcr_Factory446_Plugin $plugin, $content ) {
53
+
54
+ $this->plugin = $plugin;
55
+ $this->content = $content;
56
+
57
+ if ( ! empty( $this->content ) ) {
58
+ if ( $this->plugin->isNetworkActive() && $this->plugin->isNetworkAdmin() ) {
59
+ add_action( 'wp_network_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
60
+
61
+ return;
62
+ }
63
+
64
+ add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Add the News widget to the dashboard.
70
+ *
71
+ * @since 1.0.0 Added
72
+ */
73
+ public function add_dashboard_widgets() {
74
+ $widget_id = 'wbcr-factory-adverts-widget';
75
+
76
+ wp_add_dashboard_widget( $widget_id, $this->plugin->getPluginTitle() . ' News', [
77
+ $this,
78
+ 'print_widget_content'
79
+ ] );
80
+
81
+ $this->sort_dashboard_widgets( $widget_id );
82
+ }
83
+
84
+ /**
85
+ * Create the function to output the contents of the Dashboard Widget.
86
+ *
87
+ * @since 1.0.0 Added
88
+ */
89
+ public function print_widget_content() {
90
+ ?>
91
+ <div class="wordpress-news hide-if-no-js">
92
+ <div class="rss-widget">
93
+ <?php echo $this->content; ?>
94
+ </div>
95
+ </div>
96
+ <?php
97
+
98
+ }
99
+
100
+ /**
101
+ * Сортируем виджеты на странице дашбоард
102
+ *
103
+ * Виджеты должны быть в таком порядке, чтобы наш виджет был выше всех.
104
+ *
105
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
106
+ * @author Alexander Vitkalov <nechin.va@gmail.com>
107
+ *
108
+ * @since 1.0.2 Добавлена поддержка мультисайтов
109
+ * @since 1.0.0 Добавлен
110
+ *
111
+ * @param string $widget_id ID нашего виджета
112
+ */
113
+ private function sort_dashboard_widgets( $widget_id ) {
114
+ global $wp_meta_boxes;
115
+
116
+ $location = $this->plugin->isNetworkAdmin() ? 'dashboard-network' : 'dashboard';
117
+
118
+ $normal_core = $wp_meta_boxes[ $location ]['normal']['core'];
119
+ $widget_backup = [ $widget_id => $normal_core[ $widget_id ] ];
120
+ unset( $normal_core[ $widget_id ] );
121
+ $sorted_core = array_merge( $widget_backup, $normal_core );
122
+
123
+ $wp_meta_boxes['dashboard']['normal']['core'] = $sorted_core;
124
+ }
125
+ }
libs/factory/adverts/includes/class-rest-request.php CHANGED
@@ -1,197 +1,217 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_Adverts_102;
4
-
5
- // Exit if accessed directly
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- /**
11
- * Factory request class.
12
- *
13
- * Performs a server request, retrieves banner data and stores it in the cache.
14
- *
15
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
16
- * @author Alexander Vitkalov <nechin.va@gmail.com>
17
- *
18
- * @since 1.0.1 Изменил имя класса и доработал его.
19
- * @since 1.0.0 Added
20
- *
21
- * @package factory-adverts
22
- * @copyright (c) 2019 Webcraftic Ltd
23
- */
24
- class Creative_Motion_API {
25
-
26
- /**
27
- * Rest request url.
28
- *
29
- * Define rest request url for rest request to remote server.
30
- *
31
- * @since 1.2.1
32
- */
33
- const SERVER_URL = 'https://api.cm-wp.com';
34
-
35
- /**
36
- * Rest route path.
37
- *
38
- * Define rest route path for rest request.
39
- *
40
- * @since 1.0.0
41
- */
42
- const REST_ROUTE = '/adverds/v1/advt';
43
-
44
- /**
45
- * Интервал между запросами по умолчанию
46
- *
47
- * Значение в часах.
48
- *
49
- * @since 1.0.1
50
- */
51
- const DEFAULT_REQUESTS_INTERVAL = 24;
52
-
53
- /**
54
- * Интервал между запросами, если сервер недоступен
55
- *
56
- * Значение в часах.
57
- *
58
- * @since 1.0.1
59
- */
60
- const SERVER_UNAVAILABLE_INTERVAL = 4;
61
-
62
-
63
- /**
64
- * Экзепляр плагина с которым взаимодействует этот модуль
65
- *
66
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
67
- * @since 1.0.1
68
- * @var \Wbcr_Factory420_Plugin
69
- */
70
- private $plugin;
71
-
72
-
73
- /**
74
- * Request constructor.
75
- *
76
- * Variable initialization.
77
- *
78
- * @since 1.0.0 Added
79
- *
80
- * @param \Wbcr_Factory420_Plugin $plugin_name
81
- */
82
- public function __construct( \Wbcr_Factory420_Plugin $plugin ) {
83
- $this->plugin = $plugin;
84
- }
85
-
86
- /**
87
- * Get adverts content.
88
- *
89
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
90
- * @since 1.0.1
91
- *
92
- * @param $position
93
- *
94
- * @return string|\WP_Error
95
- */
96
- public function get_content( $position ) {
97
- $data = $this->get_cache( $position );
98
-
99
- if ( is_wp_error( $data ) ) {
100
- return $data;
101
- }
102
-
103
- return strip_tags( $data['content'], '<b>,<a>,<i>,<strong>,<img>,<ul>,<ol>,<li>' );
104
- }
105
-
106
- /**
107
- * Get data from cache.
108
- *
109
- * If data in the cache, not empty and not expired, then get data from cache. Or get data from server.
110
- *
111
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
112
- *
113
- * @since 1.0.1 Полностью переписан, с перехватом api ошибок
114
- * @since 1.0.0 Added
115
- *
116
- * @return mixed array(
117
- * 'plugin' => 'wbcr_insert_php',
118
- * 'content' => '<p></p>',
119
- * 'expires' => 1563542199,
120
- * );
121
- */
122
- private function get_cache( $position ) {
123
-
124
- if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
125
- return $this->do_api_request( $position );
126
- }
127
-
128
- $key = $this->plugin->getPrefix() . md5( $position . 'advert_transient_' );
129
-
130
- $cached = get_transient( $key );
131
-
132
- if ( $cached !== false ) {
133
- if ( isset( $cached['error_code'] ) && isset( $cached['error'] ) ) {
134
- return new \WP_Error( $cached['error_code'], $cached['error'] );
135
- }
136
-
137
- return $cached;
138
- }
139
-
140
- $data = $this->do_api_request( $position );
141
-
142
- if ( is_wp_error( $data ) ) {
143
- set_transient( $key, [
144
- 'error' => $data->get_error_message(),
145
- 'error_code' => $data->get_error_code()
146
- ], self::SERVER_UNAVAILABLE_INTERVAL * HOUR_IN_SECONDS );
147
-
148
- return $data;
149
- }
150
-
151
- set_transient( $key, $data, $data['expires'] );
152
-
153
- return $data;
154
- }
155
-
156
- /**
157
- * Performs rest api request.
158
- *
159
- * In some case on the server (Apache) in the .htaccess must be set
160
- * RewriteRule ^wp-json/(.*)[?](.*) /?rest_route=/$1&$2 [L]
161
- *
162
- * @since 1.0.1 Добавлен перехват ошибок, рефакторинг кода.
163
- * @since 1.0.0 Added
164
- *
165
- * @return mixed array(
166
- * 'plugin' => 'wbcr_insert_php',
167
- * 'content' => '<p></p>',
168
- * 'expires' => 1563542199,
169
- * );
170
- */
171
- private function do_api_request( $position ) {
172
- $default_result = [
173
- 'content' => '',
174
- 'expires' => self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS,
175
- ];
176
-
177
- $url = untrailingslashit( self::SERVER_URL ) . '/wp-json' . self::REST_ROUTE;
178
- $url = add_query_arg( [ 'plugin' => $this->plugin->getPluginName(), 'position' => $position ], $url );
179
-
180
- $response = wp_remote_get( $url );
181
-
182
- $code = wp_remote_retrieve_response_code( $response );
183
- $body = wp_remote_retrieve_body( $response );
184
-
185
- $data = @json_decode( $body, true );
186
-
187
- if ( is_wp_error( $response ) ) {
188
- return $response;
189
- }
190
-
191
- if ( 200 !== $code ) {
192
- return new \WP_Error( 'http_request_error', 'Failed request to the remote server. Code: ' . $code );
193
- }
194
-
195
- return wp_parse_args( $data, $default_result );
196
- }
197
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WBCR\Factory_Adverts_124;
4
+
5
+ // Exit if accessed directly
6
+ if( !defined('ABSPATH') ) {
7
+ exit;
8
+ }
9
+
10
+ /**
11
+ * Factory request class.
12
+ *
13
+ * Performs a server request, retrieves banner data and stores it in the cache.
14
+ *
15
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
16
+ * @author Alexander Vitkalov <nechin.va@gmail.com>
17
+ *
18
+ * @since 1.0.1 Изменил имя класса и доработал его.
19
+ * @since 1.0.0 Added
20
+ *
21
+ * @package factory-adverts
22
+ * @copyright (c) 2019 Webcraftic Ltd
23
+ */
24
+ class Creative_Motion_API {
25
+
26
+ /**
27
+ * Rest request url.
28
+ *
29
+ * Define rest request url for rest request to remote server.
30
+ *
31
+ * @since 1.2.1
32
+ */
33
+ const SERVER_URL = 'https://api.cm-wp.com';
34
+
35
+ /**
36
+ * Rest route path.
37
+ *
38
+ * Define rest route path for rest request.
39
+ *
40
+ * @since 1.0.0
41
+ */
42
+ const REST_ROUTE = '/adverds/v1/advt';
43
+
44
+ /**
45
+ * Интервал между запросами по умолчанию
46
+ *
47
+ * Значение в часах.
48
+ *
49
+ * @since 1.0.1
50
+ */
51
+ const DEFAULT_REQUESTS_INTERVAL = 24;
52
+
53
+ /**
54
+ * Интервал между запросами, если сервер недоступен
55
+ *
56
+ * Значение в часах.
57
+ *
58
+ * @since 1.0.1
59
+ */
60
+ const SERVER_UNAVAILABLE_INTERVAL = 4;
61
+
62
+
63
+ /**
64
+ * Экзепляр плагина с которым взаимодействует этот модуль
65
+ *
66
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
67
+ * @since 1.0.1
68
+ * @var \Wbcr_Factory446_Plugin
69
+ */
70
+ private $plugin;
71
+
72
+
73
+ /**
74
+ * Request constructor.
75
+ *
76
+ * Variable initialization.
77
+ *
78
+ * @param \Wbcr_Factory446_Plugin $plugin_name
79
+ * @since 1.0.0 Added
80
+ *
81
+ */
82
+ public function __construct(\Wbcr_Factory446_Plugin $plugin)
83
+ {
84
+ $this->plugin = $plugin;
85
+ }
86
+
87
+ /**
88
+ * Get adverts content.
89
+ *
90
+ * @param $position
91
+ *
92
+ * @return string|\WP_Error
93
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
94
+ * @since 1.0.1
95
+ *
96
+ */
97
+ public function get_content($position)
98
+ {
99
+ $data = $this->get_cache($position);
100
+
101
+ if( is_wp_error($data) ) {
102
+ return $data;
103
+ }
104
+
105
+ return strip_tags($data['content'], '<b>,<a>,<i>,<strong>,<img>,<ul>,<ol>,<li>');
106
+ }
107
+
108
+ /**
109
+ * Get data from cache.
110
+ *
111
+ * If data in the cache, not empty and not expired, then get data from cache. Or get data from server.
112
+ *
113
+ * @return mixed array(
114
+ * 'plugin' => 'wbcr_insert_php',
115
+ * 'content' => '<p></p>',
116
+ * 'expires' => 1563542199,
117
+ * );
118
+ * @since 1.0.1 Полностью переписан, с перехватом api ошибок
119
+ * @since 1.0.0 Added
120
+ *
121
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
122
+ *
123
+ */
124
+ private function get_cache($position)
125
+ {
126
+
127
+ if( defined('FACTORY_ADVERTS_DEBUG') && FACTORY_ADVERTS_DEBUG ) {
128
+ return $this->do_api_request($position);
129
+ }
130
+
131
+ $key = $this->plugin->getPrefix() . md5($position . 'adverts_transient_');
132
+
133
+ if( 'ru_RU' === get_locale() ) {
134
+ $key .= 'ru_';
135
+ }
136
+
137
+ $cached = get_transient($key);
138
+
139
+ if( $cached !== false ) {
140
+ if( isset($cached['error_code']) && isset($cached['error']) ) {
141
+ return new \WP_Error($cached['error_code'], $cached['error']);
142
+ }
143
+
144
+ return $cached;
145
+ }
146
+
147
+ $data = $this->do_api_request($position);
148
+
149
+ if( is_wp_error($data) ) {
150
+ set_transient($key, [
151
+ 'error' => $data->get_error_message(),
152
+ 'error_code' => $data->get_error_code()
153
+ ], self::SERVER_UNAVAILABLE_INTERVAL * HOUR_IN_SECONDS);
154
+
155
+ return $data;
156
+ }
157
+
158
+ set_transient($key, $data, self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS);
159
+
160
+ return $data;
161
+ }
162
+
163
+ /**
164
+ * Performs rest api request.
165
+ *
166
+ * In some case on the server (Apache) in the .htaccess must be set
167
+ * RewriteRule ^wp-json/(.*)[?](.*) /?rest_route=/$1&$2 [L]
168
+ *
169
+ * @return mixed array(
170
+ * 'plugin' => 'wbcr_insert_php',
171
+ * 'content' => '<p></p>',
172
+ * 'expires' => 1563542199,
173
+ * );
174
+ * @since 1.0.0 Added
175
+ *
176
+ * @since 1.0.1 Добавлен перехват ошибок, рефакторинг кода.
177
+ */
178
+ private function do_api_request($position)
179
+ {
180
+ $default_result = [
181
+ 'content' => '',
182
+ 'expires' => self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS,
183
+ ];
184
+
185
+ $url = untrailingslashit(self::SERVER_URL) . '/wp-json' . self::REST_ROUTE;
186
+
187
+ $ads_ID = $this->plugin->getPluginName();
188
+
189
+ if( 'ru_RU' === get_locale() ) {
190
+ $ads_ID .= '-ru';
191
+ }
192
+
193
+ $url = add_query_arg([
194
+ 'plugin' => $ads_ID,
195
+ 'position' => $position,
196
+ 'plugin_title' => $this->plugin->getPluginTitle(),
197
+ 'lang' => get_locale()
198
+ ], $url);
199
+
200
+ $response = wp_remote_get($url);
201
+
202
+ $code = wp_remote_retrieve_response_code($response);
203
+ $body = wp_remote_retrieve_body($response);
204
+
205
+ $data = @json_decode($body, true);
206
+
207
+ if( is_wp_error($response) ) {
208
+ return $response;
209
+ }
210
+
211
+ if( 200 !== $code ) {
212
+ return new \WP_Error('http_request_error', 'Failed request to the remote server. Code: ' . $code);
213
+ }
214
+
215
+ return wp_parse_args($data, $default_result);
216
+ }
217
+ }
libs/factory/adverts/includes/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
- // Silence is golden.
1
+ <?php
2
+ // Silence is golden.
libs/factory/adverts/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
- // Silence is golden.
1
+ <?php
2
+ // Silence is golden.
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_124-ru_RU.mo} RENAMED
File without changes
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_124-ru_RU.po} RENAMED
@@ -1,83 +1,83 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: factory_forms\n"
4
- "POT-Creation-Date: 2018-10-16 22:44+0300\n"
5
- "PO-Revision-Date: 2018-10-16 22:45+0300\n"
6
- "Last-Translator: \n"
7
- "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
- "Language: ru_RU\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.1.1\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
-
20
- #: includes/check-compatibility.php:80
21
- msgid "warning"
22
- msgstr "предупреждение"
23
-
24
- #: includes/check-compatibility.php:82
25
- #, php-format
26
- msgid "The %s plugin has stopped."
27
- msgstr "Работа плагина %s была остановлена."
28
-
29
- #: includes/check-compatibility.php:83
30
- msgid "Possible reasons:"
31
- msgstr "Возможные причины:"
32
-
33
- #: includes/check-compatibility.php:89
34
- #, php-format
35
- msgid "You need to update the PHP version to %s or higher!"
36
- msgstr "Вам нужно обновить версию PHP до %s или выше!"
37
-
38
- #: includes/check-compatibility.php:94
39
- #, php-format
40
- msgid "You need to update WordPress to %s or higher!"
41
- msgstr "Вам нужно обновить WordPress до %s или выше!"
42
-
43
- #: includes/functions.php:132
44
- #, php-format
45
- msgid ""
46
- "%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."
47
- msgstr ""
48
- "%1$s является <strong>устаревшим,</strong> начиная с версии %2$s в "
49
- "Wordpress! Используйте %3$s."
50
-
51
- #: includes/functions.php:134
52
- #, php-format
53
- msgid ""
54
- "%1$s is <strong>deprecated</strong> since version %2$s with no alternative "
55
- "available."
56
- msgstr ""
57
- "%1$s был вызван с параметром, который является <strong>устаревшими</strong> "
58
- "начиная с версии %2$s , в настоящее время доступных альтернатив нет."
59
-
60
- #: includes/plugin.class.php:202 includes/plugin.class.php:237
61
- msgid ""
62
- "You are trying to call this earlier than the plugin menu will be registered."
63
- msgstr ""
64
- "Вы пытаетесь вызвать это раньше, чем будет зарегистрировано меню плагина."
65
-
66
- #: includes/plugin.class.php:220
67
- msgid ""
68
- "You are trying to get a link to a page that does not have multisite mode. "
69
- "Clicking this link will lead the user to a non-existent page."
70
- msgstr ""
71
- "Вы пытаетесь получить ссылку на страницу, которая не имеет "
72
- "многопользовательского режима. Щелчок по этой ссылке приведет пользователя "
73
- "к несуществующей странице."
74
-
75
- #: includes/plugin.class.php:222
76
- msgid ""
77
- "Trying to get a link to an unregistered page. You are trying to call this "
78
- "earlier than the plugin menu will be registered."
79
- msgstr ""
80
- "Попытка получить ссылку на незарегистрированную страницу. Вы пытаетесь "
81
- "вызвать это раньше, чем будет зарегистрировано меню плагина."
82
-
83
-
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: factory_forms\n"
4
+ "POT-Creation-Date: 2018-10-16 22:44+0300\n"
5
+ "PO-Revision-Date: 2018-10-16 22:45+0300\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
8
+ "Language: ru_RU\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.1.1\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
15
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+
20
+ #: includes/check-compatibility.php:80
21
+ msgid "warning"
22
+ msgstr "предупреждение"
23
+
24
+ #: includes/check-compatibility.php:82
25
+ #, php-format
26
+ msgid "The %s plugin has stopped."
27
+ msgstr "Работа плагина %s была остановлена."
28
+
29
+ #: includes/check-compatibility.php:83
30
+ msgid "Possible reasons:"
31
+ msgstr "Возможные причины:"
32
+
33
+ #: includes/check-compatibility.php:89
34
+ #, php-format
35
+ msgid "You need to update the PHP version to %s or higher!"
36
+ msgstr "Вам нужно обновить версию PHP до %s или выше!"
37
+
38
+ #: includes/check-compatibility.php:94
39
+ #, php-format
40
+ msgid "You need to update WordPress to %s or higher!"
41
+ msgstr "Вам нужно обновить WordPress до %s или выше!"
42
+
43
+ #: includes/functions.php:132
44
+ #, php-format
45
+ msgid ""
46
+ "%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."
47
+ msgstr ""
48
+ "%1$s является <strong>устаревшим,</strong> начиная с версии %2$s в "
49
+ "Wordpress! Используйте %3$s."
50
+
51
+ #: includes/functions.php:134
52
+ #, php-format
53
+ msgid ""
54
+ "%1$s is <strong>deprecated</strong> since version %2$s with no alternative "
55
+ "available."
56
+ msgstr ""
57
+ "%1$s был вызван с параметром, который является <strong>устаревшими</strong> "
58
+ "начиная с версии %2$s , в настоящее время доступных альтернатив нет."
59
+
60
+ #: includes/plugin.class.php:202 includes/plugin.class.php:237
61
+ msgid ""
62
+ "You are trying to call this earlier than the plugin menu will be registered."
63
+ msgstr ""
64
+ "Вы пытаетесь вызвать это раньше, чем будет зарегистрировано меню плагина."
65
+
66
+ #: includes/plugin.class.php:220
67
+ msgid ""
68
+ "You are trying to get a link to a page that does not have multisite mode. "
69
+ "Clicking this link will lead the user to a non-existent page."
70
+ msgstr ""
71
+ "Вы пытаетесь получить ссылку на страницу, которая не имеет "
72
+ "многопользовательского режима. Щелчок по этой ссылке приведет пользователя "
73
+ "к несуществующей странице."
74
+
75
+ #: includes/plugin.class.php:222
76
+ msgid ""
77
+ "Trying to get a link to an unregistered page. You are trying to call this "
78
+ "earlier than the plugin menu will be registered."
79
+ msgstr ""
80
+ "Попытка получить ссылку на незарегистрированную страницу. Вы пытаетесь "
81
+ "вызвать это раньше, чем будет зарегистрировано меню плагина."
82
+
83
+
libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-accordion{margin:0 0 30px;border-top:1px solid #DDD;border-right:1px solid #DDD;border-left:1px solid #DDD;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.factory-bootstrap-421 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-421 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-421 .factory-accordion-item{display:none}.factory-bootstrap-421 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-421 .factory-accordion>h3.active:hover{cursor:default}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-accordion{margin:0 0 30px;border-top:1px solid #DDD;border-right:1px solid #DDD;border-left:1px solid #DDD;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.factory-bootstrap-446 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-446 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-446 .factory-accordion-item{display:none}.factory-bootstrap-446 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-446 .factory-accordion>h3.active:hover{cursor:default}
libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#e1a948;border-color:#d39323;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#e1a948;border-color:#d39323;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#c7a589;border-color:#b78a66;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#c7a589;border-color:#b78a66;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css CHANGED
@@ -1,25 +1,25 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 article,.factory-bootstrap-421 aside,.factory-bootstrap-421 details,.factory-bootstrap-421 figcaption,.factory-bootstrap-421 figure,.factory-bootstrap-421 footer,.factory-bootstrap-421 header,.factory-bootstrap-421 hgroup,.factory-bootstrap-421 main,.factory-bootstrap-421 nav,.factory-bootstrap-421 section,.factory-bootstrap-421 summary{display:block}.factory-bootstrap-421 audio,.factory-bootstrap-421 canvas,.factory-bootstrap-421 video{display:inline-block}.factory-bootstrap-421 audio:not([controls]){display:none;height:0}.factory-bootstrap-421 [hidden],.factory-bootstrap-421 template{display:none}.factory-bootstrap-421 body{margin:0}.factory-bootstrap-421 a{background:0 0}.factory-bootstrap-421 a:focus{outline:thin dotted}.factory-bootstrap-421 a:active,.factory-bootstrap-421 a:hover{outline:0}.factory-bootstrap-421 h1{margin:.67em 0}.factory-bootstrap-421 b,.factory-bootstrap-421 strong{font-weight:700}.factory-bootstrap-421 dfn{font-style:italic}.factory-bootstrap-421 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 mark{color:#000;background:#ff0}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-size:1em}.factory-bootstrap-421 pre{white-space:pre-wrap}.factory-bootstrap-421 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-421 sub,.factory-bootstrap-421 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-421 sup{top:-.5em}.factory-bootstrap-421 sub{bottom:-.25em}.factory-bootstrap-421 img{border:0}.factory-bootstrap-421 svg:not(:root){overflow:hidden}.factory-bootstrap-421 figure{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 select{text-transform:none}.factory-bootstrap-421 select{padding-right:4px!important}.factory-bootstrap-421 button,.factory-bootstrap-421 input[type=reset],.factory-bootstrap-421 input[type=submit],html .factory-bootstrap-421 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-421 button[disabled],html .factory-bootstrap-421 input[disabled]{cursor:default}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-421 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-421 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-421 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-421 button::-moz-focus-inner,.factory-bootstrap-421 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-421 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-421 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-421 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-421 a,.factory-bootstrap-421 a:visited{text-decoration:underline}.factory-bootstrap-421 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-421 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-421 a[href^="javascript:"]:after,.factory-bootstrap-421 a[href^="#"]:after{content:""}.factory-bootstrap-421 blockquote,.factory-bootstrap-421 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-421 thead{display:table-header-group}.factory-bootstrap-421 img,.factory-bootstrap-421 tr{page-break-inside:avoid}.factory-bootstrap-421 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 p{orphans:3;widows:3}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{page-break-after:avoid}.factory-bootstrap-421 select{background:#fff!important}.factory-bootstrap-421 .navbar{display:none}.factory-bootstrap-421 .table td,.factory-bootstrap-421 .table th{background-color:#fff!important}.factory-bootstrap-421 .btn>.caret,.factory-bootstrap-421 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-421 .label{border:1px solid #000}.factory-bootstrap-421 .table{border-collapse:collapse!important}.factory-bootstrap-421 .table-bordered td,.factory-bootstrap-421 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-421 *,.factory-bootstrap-421 :after,.factory-bootstrap-421 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-421{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-421 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-421 img{vertical-align:middle}.factory-bootstrap-421 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-421 .img-rounded{border-radius:6px}.factory-bootstrap-421 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .img-circle{border-radius:50%}.factory-bootstrap-421 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-421 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-421 .h1,.factory-bootstrap-421 .h2,.factory-bootstrap-421 .h3,.factory-bootstrap-421 .h4,.factory-bootstrap-421 .h5,.factory-bootstrap-421 .h6,.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-421 .h1 .small,.factory-bootstrap-421 .h1 small,.factory-bootstrap-421 .h2 .small,.factory-bootstrap-421 .h2 small,.factory-bootstrap-421 .h3 .small,.factory-bootstrap-421 .h3 small,.factory-bootstrap-421 .h4 .small,.factory-bootstrap-421 .h4 small,.factory-bootstrap-421 .h5 .small,.factory-bootstrap-421 .h5 small,.factory-bootstrap-421 .h6 .small,.factory-bootstrap-421 .h6 small,.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small,.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small{font-size:65%}.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-size:75%}.factory-bootstrap-421 .h1,.factory-bootstrap-421 h1{font-size:36px}.factory-bootstrap-421 .h2,.factory-bootstrap-421 h2{font-size:30px}.factory-bootstrap-421 .h3,.factory-bootstrap-421 h3{font-size:24px}.factory-bootstrap-421 .h4,.factory-bootstrap-421 h4{font-size:18px}.factory-bootstrap-421 .h5,.factory-bootstrap-421 h5{font-size:14px}.factory-bootstrap-421 .h6,.factory-bootstrap-421 h6{font-size:12px}.factory-bootstrap-421 p{margin:0 0 10px}.factory-bootstrap-421 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-421 .small,.factory-bootstrap-421 small{font-size:85%}.factory-bootstrap-421 cite{font-style:normal}.factory-bootstrap-421 .text-muted{color:#999}.factory-bootstrap-421 .text-primary{color:#428bca}.factory-bootstrap-421 .text-primary:hover{color:#3071a9}.factory-bootstrap-421 .text-warning{color:#8a6d3b}.factory-bootstrap-421 .text-warning:hover{color:#66512c}.factory-bootstrap-421 .text-danger{color:#a94442}.factory-bootstrap-421 .text-danger:hover{color:#843534}.factory-bootstrap-421 .text-success{color:#3c763d}.factory-bootstrap-421 .text-success:hover{color:#2b542c}.factory-bootstrap-421 .text-info{color:#31708f}.factory-bootstrap-421 .text-info:hover{color:#245269}.factory-bootstrap-421 .text-left{text-align:left}.factory-bootstrap-421 .text-right{text-align:right}.factory-bootstrap-421 .text-center{text-align:center}.factory-bootstrap-421 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-421 ol,.factory-bootstrap-421 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-421 ol ol,.factory-bootstrap-421 ol ul,.factory-bootstrap-421 ul ol,.factory-bootstrap-421 ul ul{margin-bottom:0}.factory-bootstrap-421 .list-inline,.factory-bootstrap-421 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-421 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-421 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-421 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-421 dd,.factory-bootstrap-421 dt{line-height:1.428571429}.factory-bootstrap-421 dt{font-weight:700}.factory-bootstrap-421 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-421 abbr[data-original-title],.factory-bootstrap-421 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-421 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-421 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-421 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-421 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-421 blockquote .small,.factory-bootstrap-421 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-421 blockquote .small:before,.factory-bootstrap-421 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-421 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-421 blockquote.pull-right .small,.factory-bootstrap-421 blockquote.pull-right p,.factory-bootstrap-421 blockquote.pull-right small{text-align:right}.factory-bootstrap-421 blockquote.pull-right .small:before,.factory-bootstrap-421 blockquote.pull-right small:before{content:''}.factory-bootstrap-421 blockquote.pull-right .small:after,.factory-bootstrap-421 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-421 blockquote:after,.factory-bootstrap-421 blockquote:before{content:""}.factory-bootstrap-421 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-421 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-421 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-421 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-421 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .container:after,.factory-bootstrap-421 .container:before{display:table;content:" "}.factory-bootstrap-421 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-421 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .row:after,.factory-bootstrap-421 .row:before{display:table;content:" "}.factory-bootstrap-421 .row:after{clear:both}.factory-bootstrap-421 .col-lg-1,.factory-bootstrap-421 .col-lg-10,.factory-bootstrap-421 .col-lg-11,.factory-bootstrap-421 .col-lg-12,.factory-bootstrap-421 .col-lg-2,.factory-bootstrap-421 .col-lg-3,.factory-bootstrap-421 .col-lg-4,.factory-bootstrap-421 .col-lg-5,.factory-bootstrap-421 .col-lg-6,.factory-bootstrap-421 .col-lg-7,.factory-bootstrap-421 .col-lg-8,.factory-bootstrap-421 .col-lg-9,.factory-bootstrap-421 .col-md-1,.factory-bootstrap-421 .col-md-10,.factory-bootstrap-421 .col-md-11,.factory-bootstrap-421 .col-md-12,.factory-bootstrap-421 .col-md-2,.factory-bootstrap-421 .col-md-3,.factory-bootstrap-421 .col-md-4,.factory-bootstrap-421 .col-md-5,.factory-bootstrap-421 .col-md-6,.factory-bootstrap-421 .col-md-7,.factory-bootstrap-421 .col-md-8,.factory-bootstrap-421 .col-md-9,.factory-bootstrap-421 .col-sm-1,.factory-bootstrap-421 .col-sm-10,.factory-bootstrap-421 .col-sm-11,.factory-bootstrap-421 .col-sm-12,.factory-bootstrap-421 .col-sm-2,.factory-bootstrap-421 .col-sm-3,.factory-bootstrap-421 .col-sm-4,.factory-bootstrap-421 .col-sm-5,.factory-bootstrap-421 .col-sm-6,.factory-bootstrap-421 .col-sm-7,.factory-bootstrap-421 .col-sm-8,.factory-bootstrap-421 .col-sm-9,.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{float:left}.factory-bootstrap-421 .col-xs-12{width:100%}.factory-bootstrap-421 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-421 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-421 .col-xs-9{width:75%}.factory-bootstrap-421 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-421 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-421 .col-xs-6{width:50%}.factory-bootstrap-421 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-421 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-421 .col-xs-3{width:25%}.factory-bootstrap-421 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-421 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-12{right:100%}.factory-bootstrap-421 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-421 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-421 .col-xs-pull-9{right:75%}.factory-bootstrap-421 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-421 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-421 .col-xs-pull-6{right:50%}.factory-bootstrap-421 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-421 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-421 .col-xs-pull-3{right:25%}.factory-bootstrap-421 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-421 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-0{right:0}.factory-bootstrap-421 .col-xs-push-12{left:100%}.factory-bootstrap-421 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-421 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-421 .col-xs-push-9{left:75%}.factory-bootstrap-421 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-421 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-421 .col-xs-push-6{left:50%}.factory-bootstrap-421 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-421 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-421 .col-xs-push-3{left:25%}.factory-bootstrap-421 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-421 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-421 .col-xs-push-0{left:0}.factory-bootstrap-421 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-421 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-421 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-421 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-421 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-421 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-421 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-421 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-421 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-421 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-421 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-421 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-421 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-421 table{max-width:100%;background-color:transparent}.factory-bootstrap-421 th{text-align:left}.factory-bootstrap-421 .table{width:100%;margin-bottom:20px}.factory-bootstrap-421 .table>tbody>tr>td,.factory-bootstrap-421 .table>tbody>tr>th,.factory-bootstrap-421 .table>tfoot>tr>td,.factory-bootstrap-421 .table>tfoot>tr>th,.factory-bootstrap-421 .table>thead>tr>td,.factory-bootstrap-421 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-421 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-421 .table>caption+thead>tr:first-child>td,.factory-bootstrap-421 .table>caption+thead>tr:first-child>th,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-421 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-421 .table .table{background-color:#fff}.factory-bootstrap-421 .table-condensed>tbody>tr>td,.factory-bootstrap-421 .table-condensed>tbody>tr>th,.factory-bootstrap-421 .table-condensed>tfoot>tr>td,.factory-bootstrap-421 .table-condensed>tfoot>tr>th,.factory-bootstrap-421 .table-condensed>thead>tr>td,.factory-bootstrap-421 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-421 .table-bordered,.factory-bootstrap-421 .table-bordered>tbody>tr>td,.factory-bootstrap-421 .table-bordered>tbody>tr>th,.factory-bootstrap-421 .table-bordered>tfoot>tr>td,.factory-bootstrap-421 .table-bordered>tfoot>tr>th,.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-421 .table-hover>tbody>tr:hover>td,.factory-bootstrap-421 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-421 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-421 table td[class*=col-],.factory-bootstrap-421 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-421 .table>tbody>.active>td,.factory-bootstrap-421 .table>tbody>.active>th,.factory-bootstrap-421 .table>tbody>tr>.active,.factory-bootstrap-421 .table>tfoot>.active>td,.factory-bootstrap-421 .table>tfoot>.active>th,.factory-bootstrap-421 .table>tfoot>tr>.active,.factory-bootstrap-421 .table>thead>.active>td,.factory-bootstrap-421 .table>thead>.active>th,.factory-bootstrap-421 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-421 .table-hover>tbody>.active:hover>td,.factory-bootstrap-421 .table-hover>tbody>.active:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-421 .table>tbody>.success>td,.factory-bootstrap-421 .table>tbody>.success>th,.factory-bootstrap-421 .table>tbody>tr>.success,.factory-bootstrap-421 .table>tfoot>.success>td,.factory-bootstrap-421 .table>tfoot>.success>th,.factory-bootstrap-421 .table>tfoot>tr>.success,.factory-bootstrap-421 .table>thead>.success>td,.factory-bootstrap-421 .table>thead>.success>th,.factory-bootstrap-421 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-421 .table-hover>tbody>.success:hover>td,.factory-bootstrap-421 .table-hover>tbody>.success:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-421 .table>tbody>.danger>td,.factory-bootstrap-421 .table>tbody>.danger>th,.factory-bootstrap-421 .table>tbody>tr>.danger,.factory-bootstrap-421 .table>tfoot>.danger>td,.factory-bootstrap-421 .table>tfoot>.danger>th,.factory-bootstrap-421 .table>tfoot>tr>.danger,.factory-bootstrap-421 .table>thead>.danger>td,.factory-bootstrap-421 .table>thead>.danger>th,.factory-bootstrap-421 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-421 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-421 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-421 .table>tbody>.warning>td,.factory-bootstrap-421 .table>tbody>.warning>th,.factory-bootstrap-421 .table>tbody>tr>.warning,.factory-bootstrap-421 .table>tfoot>.warning>td,.factory-bootstrap-421 .table>tfoot>.warning>th,.factory-bootstrap-421 .table>tfoot>tr>.warning,.factory-bootstrap-421 .table>thead>.warning>td,.factory-bootstrap-421 .table>thead>.warning>th,.factory-bootstrap-421 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-421 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-421 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-421 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-421 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-421 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-421 input[type=file]{display:block}.factory-bootstrap-421 select[multiple],.factory-bootstrap-421 select[size]{height:auto}.factory-bootstrap-421 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-421 input[type=checkbox]:focus,.factory-bootstrap-421 input[type=file]:focus,.factory-bootstrap-421 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-421 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-421 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-421 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-421 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-421 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-421 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-421 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-421 .form-control[disabled],.factory-bootstrap-421 .form-control[readonly],.factory-bootstrap-421 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-421 textarea.form-control{height:auto}.factory-bootstrap-421 .form-group{margin-bottom:15px}.factory-bootstrap-421 .checkbox,.factory-bootstrap-421 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-421 .checkbox label,.factory-bootstrap-421 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-421 .checkbox input[type=checkbox],.factory-bootstrap-421 .checkbox-inline input[type=checkbox],.factory-bootstrap-421 .radio input[type=radio],.factory-bootstrap-421 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-421 .checkbox+.checkbox,.factory-bootstrap-421 .radio+.radio{margin-top:-5px}.factory-bootstrap-421 .checkbox-inline,.factory-bootstrap-421 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-421 .checkbox-inline+.checkbox-inline,.factory-bootstrap-421 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-421 .checkbox-inline[disabled],.factory-bootstrap-421 .checkbox[disabled],.factory-bootstrap-421 .radio-inline[disabled],.factory-bootstrap-421 .radio[disabled],.factory-bootstrap-421 fieldset[disabled] .checkbox,.factory-bootstrap-421 fieldset[disabled] .checkbox-inline,.factory-bootstrap-421 fieldset[disabled] .radio,.factory-bootstrap-421 fieldset[disabled] .radio-inline,.factory-bootstrap-421 fieldset[disabled] input[type=checkbox],.factory-bootstrap-421 fieldset[disabled] input[type=radio],.factory-bootstrap-421 input[type=checkbox][disabled],.factory-bootstrap-421 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-421 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-sm{height:auto}.factory-bootstrap-421 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-lg{height:auto}.factory-bootstrap-421 .has-warning .checkbox,.factory-bootstrap-421 .has-warning .checkbox-inline,.factory-bootstrap-421 .has-warning .control-label,.factory-bootstrap-421 .has-warning .help-block,.factory-bootstrap-421 .has-warning .radio,.factory-bootstrap-421 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-421 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-421 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-421 .has-error .checkbox,.factory-bootstrap-421 .has-error .checkbox-inline,.factory-bootstrap-421 .has-error .control-label,.factory-bootstrap-421 .has-error .help-block,.factory-bootstrap-421 .has-error .radio,.factory-bootstrap-421 .has-error .radio-inline{color:#a94442}.factory-bootstrap-421 .controls{display:block}.factory-bootstrap-421 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-421 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-421 .has-success .checkbox,.factory-bootstrap-421 .has-success .checkbox-inline,.factory-bootstrap-421 .has-success .control-label,.factory-bootstrap-421 .has-success .help-block,.factory-bootstrap-421 .has-success .radio,.factory-bootstrap-421 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-421 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-421 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-421 .form-control-static{margin-bottom:0}.factory-bootstrap-421 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .checkbox-inline,.factory-bootstrap-421 .form-horizontal .control-label,.factory-bootstrap-421 .form-horizontal .radio,.factory-bootstrap-421 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-421 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .radio{min-height:27px}.factory-bootstrap-421 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .form-horizontal .form-group:after,.factory-bootstrap-421 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-421 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-421 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-421 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-421 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 .btn{text-decoration:none}.factory-bootstrap-421 .btn:focus,.factory-bootstrap-421 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-421 .btn.disabled,.factory-bootstrap-421 .btn[disabled],.factory-bootstrap-421 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-default:focus,.factory-bootstrap-421 .btn-default:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-421 .btn-default.disabled,.factory-bootstrap-421 .btn-default.disabled.active,.factory-bootstrap-421 .btn-default.disabled:active,.factory-bootstrap-421 .btn-default.disabled:focus,.factory-bootstrap-421 .btn-default.disabled:hover,.factory-bootstrap-421 .btn-default[disabled],.factory-bootstrap-421 .btn-default[disabled].active,.factory-bootstrap-421 .btn-default[disabled]:active,.factory-bootstrap-421 .btn-default[disabled]:focus,.factory-bootstrap-421 .btn-default[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-default,.factory-bootstrap-421 fieldset[disabled] .btn-default.active,.factory-bootstrap-421 fieldset[disabled] .btn-default:active,.factory-bootstrap-421 fieldset[disabled] .btn-default:focus,.factory-bootstrap-421 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-421 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-421 .btn-primary.disabled,.factory-bootstrap-421 .btn-primary.disabled.active,.factory-bootstrap-421 .btn-primary.disabled:active,.factory-bootstrap-421 .btn-primary.disabled:focus,.factory-bootstrap-421 .btn-primary.disabled:hover,.factory-bootstrap-421 .btn-primary[disabled],.factory-bootstrap-421 .btn-primary[disabled].active,.factory-bootstrap-421 .btn-primary[disabled]:active,.factory-bootstrap-421 .btn-primary[disabled]:focus,.factory-bootstrap-421 .btn-primary[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-primary,.factory-bootstrap-421 fieldset[disabled] .btn-primary.active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-421 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-421 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-421 .btn-warning.disabled,.factory-bootstrap-421 .btn-warning.disabled.active,.factory-bootstrap-421 .btn-warning.disabled:active,.factory-bootstrap-421 .btn-warning.disabled:focus,.factory-bootstrap-421 .btn-warning.disabled:hover,.factory-bootstrap-421 .btn-warning[disabled],.factory-bootstrap-421 .btn-warning[disabled].active,.factory-bootstrap-421 .btn-warning[disabled]:active,.factory-bootstrap-421 .btn-warning[disabled]:focus,.factory-bootstrap-421 .btn-warning[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-warning,.factory-bootstrap-421 fieldset[disabled] .btn-warning.active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-421 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-421 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-421 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-421 .btn-success.disabled,.factory-bootstrap-421 .btn-success.disabled.active,.factory-bootstrap-421 .btn-success.disabled:active,.factory-bootstrap-421 .btn-success.disabled:focus,.factory-bootstrap-421 .btn-success.disabled:hover,.factory-bootstrap-421 .btn-success[disabled],.factory-bootstrap-421 .btn-success[disabled].active,.factory-bootstrap-421 .btn-success[disabled]:active,.factory-bootstrap-421 .btn-success[disabled]:focus,.factory-bootstrap-421 .btn-success[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-success,.factory-bootstrap-421 fieldset[disabled] .btn-success.active,.factory-bootstrap-421 fieldset[disabled] .btn-success:active,.factory-bootstrap-421 fieldset[disabled] .btn-success:focus,.factory-bootstrap-421 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-421 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-421 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-421 .btn-info.disabled,.factory-bootstrap-421 .btn-info.disabled.active,.factory-bootstrap-421 .btn-info.disabled:active,.factory-bootstrap-421 .btn-info.disabled:focus,.factory-bootstrap-421 .btn-info.disabled:hover,.factory-bootstrap-421 .btn-info[disabled],.factory-bootstrap-421 .btn-info[disabled].active,.factory-bootstrap-421 .btn-info[disabled]:active,.factory-bootstrap-421 .btn-info[disabled]:focus,.factory-bootstrap-421 .btn-info[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-info,.factory-bootstrap-421 fieldset[disabled] .btn-info.active,.factory-bootstrap-421 fieldset[disabled] .btn-info:active,.factory-bootstrap-421 fieldset[disabled] .btn-info:focus,.factory-bootstrap-421 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-421 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-421 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link[disabled],.factory-bootstrap-421 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{border-color:transparent}.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-421 .btn-link[disabled]:focus,.factory-bootstrap-421 .btn-link[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-link:focus,.factory-bootstrap-421 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-421 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-421 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-421 input[type=button].btn-block,.factory-bootstrap-421 input[type=reset].btn-block,.factory-bootstrap-421 input[type=submit].btn-block{width:100%}.factory-bootstrap-421 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-421 .fade.in{opacity:1}.factory-bootstrap-421 .collapse{display:none}.factory-bootstrap-421 .collapse.in{display:block}.factory-bootstrap-421 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-421 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-421 .glyphicon:empty{width:1em}.factory-bootstrap-421 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-421 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-421 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-421 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-421 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-421 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-421 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-421 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-421 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-421 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-421 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-421 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-421 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-421 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-421 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-421 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-421 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-421 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-421 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-421 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-421 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-421 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-421 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-421 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-421 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-421 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-421 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-421 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-421 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-421 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-421 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-421 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-421 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-421 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-421 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-421 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-421 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-421 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-421 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-421 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-421 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-421 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-421 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-421 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-421 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-421 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-421 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-421 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-421 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-421 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-421 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-421 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-421 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-421 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-421 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-421 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-421 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-421 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-421 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-421 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-421 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-421 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-421 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-421 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-421 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-421 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-421 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-421 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-421 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-421 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-421 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-421 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-421 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-421 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-421 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-421 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-421 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-421 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-421 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-421 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-421 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-421 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-421 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-421 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-421 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-421 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-421 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-421 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-421 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-421 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-421 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-421 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-421 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-421 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-421 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-421 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-421 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-421 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-421 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-421 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-421 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-421 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-421 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-421 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-421 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-421 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-421 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-421 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-421 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-421 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-421 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-421 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-421 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-421 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-421 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-421 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-421 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-421 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-421 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-421 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-421 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-421 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-421 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-421 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-421 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-421 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-421 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-421 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-421 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-421 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-421 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-421 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-421 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-421 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-421 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-421 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-421 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-421 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-421 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-421 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-421 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-421 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-421 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-421 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-421 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-421 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-421 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-421 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-421 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-421 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-421 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-421 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-421 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-421 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-421 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-421 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-421 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-421 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-421 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-421 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-421 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-421 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-421 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-421 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-421 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-421 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-421 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-421 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-421 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-421 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-421 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-421 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-421 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-421 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-421 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-421 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-421 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-421 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-421 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-421 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-421 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-421 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-421 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-421 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-421 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-421 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-421 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-421 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-421 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-421 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-421 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-421 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-421 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-421 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-421 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-421 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-421 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-421 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-421 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-421 .dropdown{position:relative}.factory-bootstrap-421 .dropdown-toggle:focus{outline:0}.factory-bootstrap-421 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-421 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-421 .dropdown-menu>.disabled>a,.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .open>.dropdown-menu{display:block}.factory-bootstrap-421 .open>a{outline:0}.factory-bootstrap-421 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-421 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-421 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-421 .dropup .caret,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-421 .dropup .dropdown-menu,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-421 .btn-group,.factory-bootstrap-421 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-421 .btn-group-vertical>.btn.active,.factory-bootstrap-421 .btn-group-vertical>.btn:active,.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group-vertical>.btn:hover,.factory-bootstrap-421 .btn-group>.btn.active,.factory-bootstrap-421 .btn-group>.btn:active,.factory-bootstrap-421 .btn-group>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:focus{outline:0}.factory-bootstrap-421 .btn-group .btn+.btn,.factory-bootstrap-421 .btn-group .btn+.btn-group,.factory-bootstrap-421 .btn-group .btn-group+.btn,.factory-bootstrap-421 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-421 .btn-toolbar:after,.factory-bootstrap-421 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-421 .btn-toolbar:after{clear:both}.factory-bootstrap-421 .btn-toolbar .btn-group{float:left}.factory-bootstrap-421 .btn-toolbar>.btn+.btn,.factory-bootstrap-421 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-421 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-421 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-421 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-421 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group>.btn-group{float:left}.factory-bootstrap-421 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group .dropdown-toggle:active,.factory-bootstrap-421 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-421 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-421 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-421 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-421 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-421 .btn .caret{margin-left:0}.factory-bootstrap-421 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-421 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after,.factory-bootstrap-421 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-421 .btn-group-vertical>.btn+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-421 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-421 .btn-group-justified>.btn,.factory-bootstrap-421 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-421 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-421 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-421 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-421 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-421 .input-group-lg>.form-control,.factory-bootstrap-421 .input-group-lg>.input-group-addon,.factory-bootstrap-421 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-group-lg>.form-control,.factory-bootstrap-421 select.input-group-lg>.input-group-addon,.factory-bootstrap-421 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-group-lg>.form-control,.factory-bootstrap-421 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-421 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group-sm>.form-control,.factory-bootstrap-421 .input-group-sm>.input-group-addon,.factory-bootstrap-421 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-group-sm>.form-control,.factory-bootstrap-421 select.input-group-sm>.input-group-addon,.factory-bootstrap-421 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-group-sm>.form-control,.factory-bootstrap-421 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-421 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group .form-control,.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{display:table-cell}.factory-bootstrap-421 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-421 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-421 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-421 .input-group-addon input[type=checkbox],.factory-bootstrap-421 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-421 .input-group .form-control:first-child,.factory-bootstrap-421 .input-group-addon:first-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn,.factory-bootstrap-421 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-421 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .input-group-addon:first-child{border-right:0}.factory-bootstrap-421 .input-group .form-control:last-child,.factory-bootstrap-421 .input-group-addon:last-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-421 .input-group-btn:last-child>.btn,.factory-bootstrap-421 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .input-group-addon:last-child{border-left:0}.factory-bootstrap-421 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-421 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-421 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-421 .input-group-btn>.btn{position:relative}.factory-bootstrap-421 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-421 .input-group-btn>.btn:active,.factory-bootstrap-421 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-421 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-421 .nav:after,.factory-bootstrap-421 .nav:before{display:table;content:" "}.factory-bootstrap-421 .nav:after{clear:both}.factory-bootstrap-421 .nav>li{position:relative;display:block}.factory-bootstrap-421 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-421 .nav>li>a:focus,.factory-bootstrap-421 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .nav>li.disabled>a{color:#999}.factory-bootstrap-421 .nav>li.disabled>a:focus,.factory-bootstrap-421 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-421 .nav .open>a,.factory-bootstrap-421 .nav .open>a:focus,.factory-bootstrap-421 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-421 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .nav>li>a>img{max-width:none}.factory-bootstrap-421 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-421 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-421 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-421 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-421 .nav-tabs>li.active>a,.factory-bootstrap-421 .nav-tabs>li.active>a:focus,.factory-bootstrap-421 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-421 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-421 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .nav-pills>li{float:left}.factory-bootstrap-421 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-421 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-421 .nav-pills>li.active>a,.factory-bootstrap-421 .nav-pills>li.active>a:focus,.factory-bootstrap-421 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-421 .nav-stacked>li{float:none}.factory-bootstrap-421 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-421 .nav-justified{width:100%}.factory-bootstrap-421 .nav-justified>li{float:none}.factory-bootstrap-421 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-421 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs-justified>.active>a,.factory-bootstrap-421 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .tab-content>.tab-pane{display:none}.factory-bootstrap-421 .tab-content>.active{display:block}.factory-bootstrap-421 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-421 .navbar:after,.factory-bootstrap-421 .navbar:before{display:table;content:" "}.factory-bootstrap-421 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-421 .navbar-header:after,.factory-bootstrap-421 .navbar-header:before{display:table;content:" "}.factory-bootstrap-421 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-421 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-421 .navbar-collapse:after,.factory-bootstrap-421 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-421 .navbar-collapse:after{clear:both}.factory-bootstrap-421 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-421 .container>.navbar-collapse,.factory-bootstrap-421 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-421 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-421 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-421 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-421 .navbar-brand:focus,.factory-bootstrap-421 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-421 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-421 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-421 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-421 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-421 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-421 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-421 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-421 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-421 .navbar-default .navbar-brand:focus,.factory-bootstrap-421 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a,.factory-bootstrap-421 .navbar-default .navbar-text{color:#777}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle:focus,.factory-bootstrap-421 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-421 .navbar-default .navbar-collapse,.factory-bootstrap-421 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-421 .navbar-default .navbar-link{color:#777}.factory-bootstrap-421 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-421 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-421 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-421 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-421 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-421 .navbar-inverse .navbar-collapse,.factory-bootstrap-421 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-421 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-421 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-421 .breadcrumb>li{display:inline-block}.factory-bootstrap-421 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-421 .breadcrumb>.active{color:#999}.factory-bootstrap-421 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-421 .pagination>li{display:inline}.factory-bootstrap-421 .pagination>li>a,.factory-bootstrap-421 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .pagination>li:first-child>a,.factory-bootstrap-421 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .pagination>li:last-child>a,.factory-bootstrap-421 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-421 .pagination>li>a:focus,.factory-bootstrap-421 .pagination>li>a:hover,.factory-bootstrap-421 .pagination>li>span:focus,.factory-bootstrap-421 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-421 .pagination>.disabled>a,.factory-bootstrap-421 .pagination>.disabled>a:focus,.factory-bootstrap-421 .pagination>.disabled>a:hover,.factory-bootstrap-421 .pagination>.disabled>span,.factory-bootstrap-421 .pagination>.disabled>span:focus,.factory-bootstrap-421 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-421 .pagination-lg>li>a,.factory-bootstrap-421 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-421 .pagination-lg>li:first-child>a,.factory-bootstrap-421 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-421 .pagination-lg>li:last-child>a,.factory-bootstrap-421 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-421 .pagination-sm>li>a,.factory-bootstrap-421 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-421 .pagination-sm>li:first-child>a,.factory-bootstrap-421 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .pagination-sm>li:last-child>a,.factory-bootstrap-421 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-421 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-421 .pager:after,.factory-bootstrap-421 .pager:before{display:table;content:" "}.factory-bootstrap-421 .pager:after{clear:both}.factory-bootstrap-421 .pager li{display:inline}.factory-bootstrap-421 .pager li>a,.factory-bootstrap-421 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-421 .pager li>a:focus,.factory-bootstrap-421 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .pager .next>a,.factory-bootstrap-421 .pager .next>span{float:right}.factory-bootstrap-421 .pager .previous>a,.factory-bootstrap-421 .pager .previous>span{float:left}.factory-bootstrap-421 .pager .disabled>a,.factory-bootstrap-421 .pager .disabled>a:focus,.factory-bootstrap-421 .pager .disabled>a:hover,.factory-bootstrap-421 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-421 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-421 .label[href]:focus,.factory-bootstrap-421 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .label:empty{display:none}.factory-bootstrap-421 .btn .label{position:relative;top:-1px}.factory-bootstrap-421 .label-default{background-color:#999}.factory-bootstrap-421 .label-default[href]:focus,.factory-bootstrap-421 .label-default[href]:hover{background-color:gray}.factory-bootstrap-421 .label-primary{background-color:#428bca}.factory-bootstrap-421 .label-primary[href]:focus,.factory-bootstrap-421 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-421 .label-success{background-color:#5cb85c}.factory-bootstrap-421 .label-success[href]:focus,.factory-bootstrap-421 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-421 .label-info{background-color:#5bc0de}.factory-bootstrap-421 .label-info[href]:focus,.factory-bootstrap-421 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-421 .label-warning{background-color:#f0ad4e}.factory-bootstrap-421 .label-warning[href]:focus,.factory-bootstrap-421 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-421 .label-danger{background-color:#d9534f}.factory-bootstrap-421 .label-danger[href]:focus,.factory-bootstrap-421 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-421 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-421 .badge:empty{display:none}.factory-bootstrap-421 .btn .badge{position:relative;top:-1px}.factory-bootstrap-421 a.badge:focus,.factory-bootstrap-421 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .nav-pills>.active>a>.badge,.factory-bootstrap-421 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-421 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-421 .jumbotron .h1,.factory-bootstrap-421 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-421 .jumbotron p{line-height:1.4}.factory-bootstrap-421 .container .jumbotron{border-radius:6px}.factory-bootstrap-421 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-421 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .thumbnail a>img,.factory-bootstrap-421 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-421 a.thumbnail.active,.factory-bootstrap-421 a.thumbnail:focus,.factory-bootstrap-421 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-421 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-421 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-421 .alert .alert-link{font-weight:700}.factory-bootstrap-421 .alert>p,.factory-bootstrap-421 .alert>ul{margin-bottom:0}.factory-bootstrap-421 .alert>p+p{margin-top:5px}.factory-bootstrap-421 .alert-dismissable{padding-right:35px}.factory-bootstrap-421 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-421 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-421 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-421 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-421 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-421 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-421 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-421 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-421 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-421 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-421 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-421 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-421 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media .media{margin-top:15px}.factory-bootstrap-421 .media:first-child{margin-top:0}.factory-bootstrap-421 .media-object{display:block}.factory-bootstrap-421 .media-heading{margin:0 0 5px}.factory-bootstrap-421 .media>.pull-left{margin-right:10px}.factory-bootstrap-421 .media>.pull-right{margin-left:10px}.factory-bootstrap-421 .media-list{padding-left:0;list-style:none}.factory-bootstrap-421 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-421 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-421 .list-group-item>.badge{float:right}.factory-bootstrap-421 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-421 a.list-group-item{color:#555}.factory-bootstrap-421 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-421 a.list-group-item:focus,.factory-bootstrap-421 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-421 a.list-group-item.active,.factory-bootstrap-421 a.list-group-item.active:focus,.factory-bootstrap-421 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-421 a.list-group-item.active .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-421 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-421 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-421 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .panel-body{padding:15px}.factory-bootstrap-421 .panel-body:after,.factory-bootstrap-421 .panel-body:before{display:table;content:" "}.factory-bootstrap-421 .panel-body:after{clear:both}.factory-bootstrap-421 .panel>.list-group{margin-bottom:0}.factory-bootstrap-421 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-421 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-421 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-421 .panel>.table,.factory-bootstrap-421 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-421 .panel>.panel-body+.table,.factory-bootstrap-421 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-421 .panel>.table>tbody:first-child td,.factory-bootstrap-421 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-421 .panel>.table-bordered,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-421 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-421 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-421 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-421 .panel-title>a{color:inherit}.factory-bootstrap-421 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-421 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-421 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-421 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-421 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-421 .panel-group .panel-footer{border-top:0}.factory-bootstrap-421 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-421 .panel-default{border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-421 .panel-primary{border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-421 .panel-success{border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-421 .panel-warning{border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-421 .panel-danger{border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-421 .panel-info{border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-421 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-421 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-421 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-421 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-421 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-421 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-421 .close:focus,.factory-bootstrap-421 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-421 .modal-open{overflow:hidden}.factory-bootstrap-421 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-421 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-421 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-421 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-421 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-421 .modal-backdrop,.factory-bootstrap-421-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-421 .modal-backdrop.fade,.factory-bootstrap-421-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-421 .modal-backdrop.in,.factory-bootstrap-421-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-421 .modal-header .close{margin-top:-2px}.factory-bootstrap-421 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-421 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-421 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-421 .modal-footer:after,.factory-bootstrap-421 .modal-footer:before{display:table;content:" "}.factory-bootstrap-421 .modal-footer:after{clear:both}.factory-bootstrap-421 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-421 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-421 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-421 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-421 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-421 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-421 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-421 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-421 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-421 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-421 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-421 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-421 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-421 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-421 .popover.top{margin-top:-10px}.factory-bootstrap-421 .popover.right{margin-left:10px}.factory-bootstrap-421 .popover.bottom{margin-top:10px}.factory-bootstrap-421 .popover.left{margin-left:-10px}.factory-bootstrap-421 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-421 .popover-content{padding:9px 14px}.factory-bootstrap-421 .popover .arrow,.factory-bootstrap-421 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .popover .arrow{border-width:11px}.factory-bootstrap-421 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-421 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-421 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-421 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-421 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-421 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-421 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-421 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-421 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-421 .carousel{position:relative}.factory-bootstrap-421 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-421 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-421 .carousel-inner>.item>a>img,.factory-bootstrap-421 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-421 .carousel-inner>.active,.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{display:block}.factory-bootstrap-421 .carousel-inner>.active{left:0}.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-421 .carousel-inner>.next{left:100%}.factory-bootstrap-421 .carousel-inner>.prev{left:-100%}.factory-bootstrap-421 .carousel-inner>.next.left,.factory-bootstrap-421 .carousel-inner>.prev.right{left:0}.factory-bootstrap-421 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-421 .carousel-inner>.active.right{left:100%}.factory-bootstrap-421 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-421 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-421 .carousel-control:focus,.factory-bootstrap-421 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .icon-prev{left:50%}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next{right:50%}.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-421 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-421 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-421 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-421 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-421 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-421 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-421 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-421 .clearfix:after,.factory-bootstrap-421 .clearfix:before{display:table;content:" "}.factory-bootstrap-421 .clearfix:after{clear:both}.factory-bootstrap-421 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .pull-right{float:right!important}.factory-bootstrap-421 .pull-left{float:left!important}.factory-bootstrap-421 .hide{display:none!important}.factory-bootstrap-421 .show{display:block!important}.factory-bootstrap-421 .invisible{visibility:hidden}.factory-bootstrap-421 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-421 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-421 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-421 .visible-lg,.factory-bootstrap-421 .visible-md,.factory-bootstrap-421 .visible-sm,.factory-bootstrap-421 .visible-xs,.factory-bootstrap-421 td.visible-lg,.factory-bootstrap-421 td.visible-md,.factory-bootstrap-421 td.visible-sm,.factory-bootstrap-421 td.visible-xs,.factory-bootstrap-421 th.visible-lg,.factory-bootstrap-421 th.visible-md,.factory-bootstrap-421 th.visible-sm,.factory-bootstrap-421 th.visible-xs,.factory-bootstrap-421 tr.visible-lg,.factory-bootstrap-421 tr.visible-md,.factory-bootstrap-421 tr.visible-sm,.factory-bootstrap-421 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-421 .hidden-xs{display:block!important}.factory-bootstrap-421 table.hidden-xs{display:table}.factory-bootstrap-421 tr.hidden-xs{display:table-row!important}.factory-bootstrap-421 td.hidden-xs,.factory-bootstrap-421 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-sm{display:block!important}.factory-bootstrap-421 table.hidden-sm{display:table}.factory-bootstrap-421 tr.hidden-sm{display:table-row!important}.factory-bootstrap-421 td.hidden-sm,.factory-bootstrap-421 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-md{display:block!important}.factory-bootstrap-421 table.hidden-md{display:table}.factory-bootstrap-421 tr.hidden-md{display:table-row!important}.factory-bootstrap-421 td.hidden-md,.factory-bootstrap-421 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-lg{display:block!important}.factory-bootstrap-421 table.hidden-lg{display:table}.factory-bootstrap-421 tr.hidden-lg{display:table-row!important}.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-421 .hidden-lg.hidden-xs,.factory-bootstrap-421 td.hidden-lg.hidden-xs,.factory-bootstrap-421 th.hidden-lg.hidden-xs,.factory-bootstrap-421 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-421 .hidden-lg.hidden-sm,.factory-bootstrap-421 td.hidden-lg.hidden-sm,.factory-bootstrap-421 th.hidden-lg.hidden-sm,.factory-bootstrap-421 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-421 .hidden-lg.hidden-md,.factory-bootstrap-421 td.hidden-lg.hidden-md,.factory-bootstrap-421 th.hidden-lg.hidden-md,.factory-bootstrap-421 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-421 .hidden-lg,.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg,.factory-bootstrap-421 tr.hidden-lg{display:none!important}}.factory-bootstrap-421 .visible-print,.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print,.factory-bootstrap-421 tr.visible-print{display:none!important}@media print{.factory-bootstrap-421 .visible-print{display:block!important}.factory-bootstrap-421 table.visible-print{display:table}.factory-bootstrap-421 tr.visible-print{display:table-row!important}.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print{display:table-cell!important}.factory-bootstrap-421 .hidden-print,.factory-bootstrap-421 td.hidden-print,.factory-bootstrap-421 th.hidden-print,.factory-bootstrap-421 tr.hidden-print{display:none!important}}/*!
12
- * Factory Default Bootstrap Theme
13
- *
14
- * The code is based on Bootstrap v2.1.1
15
- *
16
- * Bootstrap v3.0.3 (http://getbootstrap.com)
17
- * Copyright 2013 Twitter, Inc.
18
- * Licensed under http://www.apache.org/licenses/LICENSE-2.0
19
- *
20
- * @author Paul Kashtanoff <paul@byonepress.com>
21
- * @copyright (c) 2013, OnePress Ltd
22
- *
23
- * @package factory-bootstrap
24
- * @since 1.0.0
25
- */.factory-bootstrap-421 .btn-danger,.factory-bootstrap-421 .btn-default,.factory-bootstrap-421 .btn-info,.factory-bootstrap-421 .btn-primary,.factory-bootstrap-421 .btn-success,.factory-bootstrap-421 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-421 .btn.active,.factory-bootstrap-421 .btn:active{background-image:none}.factory-bootstrap-421 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-421 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-421 .btn-gold:focus,.factory-bootstrap-421 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-421 .btn-gold.active,.factory-bootstrap-421 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-421 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-421 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-421 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-421 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-danger:focus,.factory-bootstrap-421 .btn-danger:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-421 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-421 .img-thumbnail,.factory-bootstrap-421 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-brand,.factory-bootstrap-421 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-421 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-inverse .navbar-brand,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top,.factory-bootstrap-421 .navbar-static-top{border-radius:0}.factory-bootstrap-421 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .alert .actions{padding-top:10px}.factory-bootstrap-421 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-421 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-421 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-421 .alert-normal,.factory-bootstrap-421 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-421 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-421 .alert-danger a:not(.btn),.factory-bootstrap-421 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-421 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-421 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-421 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-421 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-421 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-421 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-421 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .list-group-item.active,.factory-bootstrap-421 .list-group-item.active:focus,.factory-bootstrap-421 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-421 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-421 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-421 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-421 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-421 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-421 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-421 .factory-hidden{display:none}.factory-bootstrap-421 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 article,.factory-bootstrap-446 aside,.factory-bootstrap-446 details,.factory-bootstrap-446 figcaption,.factory-bootstrap-446 figure,.factory-bootstrap-446 footer,.factory-bootstrap-446 header,.factory-bootstrap-446 hgroup,.factory-bootstrap-446 main,.factory-bootstrap-446 nav,.factory-bootstrap-446 section,.factory-bootstrap-446 summary{display:block}.factory-bootstrap-446 audio,.factory-bootstrap-446 canvas,.factory-bootstrap-446 video{display:inline-block}.factory-bootstrap-446 audio:not([controls]){display:none;height:0}.factory-bootstrap-446 [hidden],.factory-bootstrap-446 template{display:none}.factory-bootstrap-446 body{margin:0}.factory-bootstrap-446 a{background:0 0}.factory-bootstrap-446 a:focus{outline:thin dotted}.factory-bootstrap-446 a:active,.factory-bootstrap-446 a:hover{outline:0}.factory-bootstrap-446 h1{margin:.67em 0}.factory-bootstrap-446 b,.factory-bootstrap-446 strong{font-weight:700}.factory-bootstrap-446 dfn{font-style:italic}.factory-bootstrap-446 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-446 mark{color:#000;background:#ff0}.factory-bootstrap-446 code,.factory-bootstrap-446 kbd,.factory-bootstrap-446 pre,.factory-bootstrap-446 samp{font-size:1em}.factory-bootstrap-446 pre{white-space:pre-wrap}.factory-bootstrap-446 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-446 sub,.factory-bootstrap-446 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-446 sup{top:-.5em}.factory-bootstrap-446 sub{bottom:-.25em}.factory-bootstrap-446 img{border:0}.factory-bootstrap-446 svg:not(:root){overflow:hidden}.factory-bootstrap-446 figure{margin:0}.factory-bootstrap-446 button,.factory-bootstrap-446 input,.factory-bootstrap-446 select,.factory-bootstrap-446 textarea{margin:0}.factory-bootstrap-446 button,.factory-bootstrap-446 select{text-transform:none}.factory-bootstrap-446 select{padding-right:4px!important}.factory-bootstrap-446 button,.factory-bootstrap-446 input[type=reset],.factory-bootstrap-446 input[type=submit],html .factory-bootstrap-446 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-446 button[disabled],html .factory-bootstrap-446 input[disabled]{cursor:default}.factory-bootstrap-446 input[type=checkbox],.factory-bootstrap-446 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-446 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-446 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-446 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-446 button::-moz-focus-inner,.factory-bootstrap-446 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-446 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-446 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-446 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-446 a,.factory-bootstrap-446 a:visited{text-decoration:underline}.factory-bootstrap-446 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-446 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-446 a[href^="javascript:"]:after,.factory-bootstrap-446 a[href^="#"]:after{content:""}.factory-bootstrap-446 blockquote,.factory-bootstrap-446 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-446 thead{display:table-header-group}.factory-bootstrap-446 img,.factory-bootstrap-446 tr{page-break-inside:avoid}.factory-bootstrap-446 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-446 h2,.factory-bootstrap-446 h3,.factory-bootstrap-446 p{orphans:3;widows:3}.factory-bootstrap-446 h2,.factory-bootstrap-446 h3{page-break-after:avoid}.factory-bootstrap-446 select{background:#fff!important}.factory-bootstrap-446 .navbar{display:none}.factory-bootstrap-446 .table td,.factory-bootstrap-446 .table th{background-color:#fff!important}.factory-bootstrap-446 .btn>.caret,.factory-bootstrap-446 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-446 .label{border:1px solid #000}.factory-bootstrap-446 .table{border-collapse:collapse!important}.factory-bootstrap-446 .table-bordered td,.factory-bootstrap-446 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-446 *,.factory-bootstrap-446 :after,.factory-bootstrap-446 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-446{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-446 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-446 button,.factory-bootstrap-446 input,.factory-bootstrap-446 select,.factory-bootstrap-446 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-446 img{vertical-align:middle}.factory-bootstrap-446 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-446 .img-rounded{border-radius:6px}.factory-bootstrap-446 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-446 .img-circle{border-radius:50%}.factory-bootstrap-446 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-446 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-446 .h1,.factory-bootstrap-446 .h2,.factory-bootstrap-446 .h3,.factory-bootstrap-446 .h4,.factory-bootstrap-446 .h5,.factory-bootstrap-446 .h6,.factory-bootstrap-446 h1,.factory-bootstrap-446 h2,.factory-bootstrap-446 h3,.factory-bootstrap-446 h4,.factory-bootstrap-446 h5,.factory-bootstrap-446 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-446 .h1 .small,.factory-bootstrap-446 .h1 small,.factory-bootstrap-446 .h2 .small,.factory-bootstrap-446 .h2 small,.factory-bootstrap-446 .h3 .small,.factory-bootstrap-446 .h3 small,.factory-bootstrap-446 .h4 .small,.factory-bootstrap-446 .h4 small,.factory-bootstrap-446 .h5 .small,.factory-bootstrap-446 .h5 small,.factory-bootstrap-446 .h6 .small,.factory-bootstrap-446 .h6 small,.factory-bootstrap-446 h1 .small,.factory-bootstrap-446 h1 small,.factory-bootstrap-446 h2 .small,.factory-bootstrap-446 h2 small,.factory-bootstrap-446 h3 .small,.factory-bootstrap-446 h3 small,.factory-bootstrap-446 h4 .small,.factory-bootstrap-446 h4 small,.factory-bootstrap-446 h5 .small,.factory-bootstrap-446 h5 small,.factory-bootstrap-446 h6 .small,.factory-bootstrap-446 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-446 h1,.factory-bootstrap-446 h2,.factory-bootstrap-446 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-446 h1 .small,.factory-bootstrap-446 h1 small,.factory-bootstrap-446 h2 .small,.factory-bootstrap-446 h2 small,.factory-bootstrap-446 h3 .small,.factory-bootstrap-446 h3 small{font-size:65%}.factory-bootstrap-446 h4,.factory-bootstrap-446 h5,.factory-bootstrap-446 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-446 h4 .small,.factory-bootstrap-446 h4 small,.factory-bootstrap-446 h5 .small,.factory-bootstrap-446 h5 small,.factory-bootstrap-446 h6 .small,.factory-bootstrap-446 h6 small{font-size:75%}.factory-bootstrap-446 .h1,.factory-bootstrap-446 h1{font-size:36px}.factory-bootstrap-446 .h2,.factory-bootstrap-446 h2{font-size:30px}.factory-bootstrap-446 .h3,.factory-bootstrap-446 h3{font-size:24px}.factory-bootstrap-446 .h4,.factory-bootstrap-446 h4{font-size:18px}.factory-bootstrap-446 .h5,.factory-bootstrap-446 h5{font-size:14px}.factory-bootstrap-446 .h6,.factory-bootstrap-446 h6{font-size:12px}.factory-bootstrap-446 p{margin:0 0 10px}.factory-bootstrap-446 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-446 .small,.factory-bootstrap-446 small{font-size:85%}.factory-bootstrap-446 cite{font-style:normal}.factory-bootstrap-446 .text-muted{color:#999}.factory-bootstrap-446 .text-primary{color:#428bca}.factory-bootstrap-446 .text-primary:hover{color:#3071a9}.factory-bootstrap-446 .text-warning{color:#8a6d3b}.factory-bootstrap-446 .text-warning:hover{color:#66512c}.factory-bootstrap-446 .text-danger{color:#a94442}.factory-bootstrap-446 .text-danger:hover{color:#843534}.factory-bootstrap-446 .text-success{color:#3c763d}.factory-bootstrap-446 .text-success:hover{color:#2b542c}.factory-bootstrap-446 .text-info{color:#31708f}.factory-bootstrap-446 .text-info:hover{color:#245269}.factory-bootstrap-446 .text-left{text-align:left}.factory-bootstrap-446 .text-right{text-align:right}.factory-bootstrap-446 .text-center{text-align:center}.factory-bootstrap-446 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-446 ol,.factory-bootstrap-446 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-446 ol ol,.factory-bootstrap-446 ol ul,.factory-bootstrap-446 ul ol,.factory-bootstrap-446 ul ul{margin-bottom:0}.factory-bootstrap-446 .list-inline,.factory-bootstrap-446 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-446 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-446 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-446 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-446 dd,.factory-bootstrap-446 dt{line-height:1.428571429}.factory-bootstrap-446 dt{font-weight:700}.factory-bootstrap-446 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-446 abbr[data-original-title],.factory-bootstrap-446 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-446 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-446 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-446 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-446 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-446 blockquote .small,.factory-bootstrap-446 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-446 blockquote .small:before,.factory-bootstrap-446 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-446 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-446 blockquote.pull-right .small,.factory-bootstrap-446 blockquote.pull-right p,.factory-bootstrap-446 blockquote.pull-right small{text-align:right}.factory-bootstrap-446 blockquote.pull-right .small:before,.factory-bootstrap-446 blockquote.pull-right small:before{content:''}.factory-bootstrap-446 blockquote.pull-right .small:after,.factory-bootstrap-446 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-446 blockquote:after,.factory-bootstrap-446 blockquote:before{content:""}.factory-bootstrap-446 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-446 code,.factory-bootstrap-446 kbd,.factory-bootstrap-446 pre,.factory-bootstrap-446 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-446 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-446 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-446 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-446 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-446 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-446 .container:after,.factory-bootstrap-446 .container:before{display:table;content:" "}.factory-bootstrap-446 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-446 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-446 .row:after,.factory-bootstrap-446 .row:before{display:table;content:" "}.factory-bootstrap-446 .row:after{clear:both}.factory-bootstrap-446 .col-lg-1,.factory-bootstrap-446 .col-lg-10,.factory-bootstrap-446 .col-lg-11,.factory-bootstrap-446 .col-lg-12,.factory-bootstrap-446 .col-lg-2,.factory-bootstrap-446 .col-lg-3,.factory-bootstrap-446 .col-lg-4,.factory-bootstrap-446 .col-lg-5,.factory-bootstrap-446 .col-lg-6,.factory-bootstrap-446 .col-lg-7,.factory-bootstrap-446 .col-lg-8,.factory-bootstrap-446 .col-lg-9,.factory-bootstrap-446 .col-md-1,.factory-bootstrap-446 .col-md-10,.factory-bootstrap-446 .col-md-11,.factory-bootstrap-446 .col-md-12,.factory-bootstrap-446 .col-md-2,.factory-bootstrap-446 .col-md-3,.factory-bootstrap-446 .col-md-4,.factory-bootstrap-446 .col-md-5,.factory-bootstrap-446 .col-md-6,.factory-bootstrap-446 .col-md-7,.factory-bootstrap-446 .col-md-8,.factory-bootstrap-446 .col-md-9,.factory-bootstrap-446 .col-sm-1,.factory-bootstrap-446 .col-sm-10,.factory-bootstrap-446 .col-sm-11,.factory-bootstrap-446 .col-sm-12,.factory-bootstrap-446 .col-sm-2,.factory-bootstrap-446 .col-sm-3,.factory-bootstrap-446 .col-sm-4,.factory-bootstrap-446 .col-sm-5,.factory-bootstrap-446 .col-sm-6,.factory-bootstrap-446 .col-sm-7,.factory-bootstrap-446 .col-sm-8,.factory-bootstrap-446 .col-sm-9,.factory-bootstrap-446 .col-xs-1,.factory-bootstrap-446 .col-xs-10,.factory-bootstrap-446 .col-xs-11,.factory-bootstrap-446 .col-xs-12,.factory-bootstrap-446 .col-xs-2,.factory-bootstrap-446 .col-xs-3,.factory-bootstrap-446 .col-xs-4,.factory-bootstrap-446 .col-xs-5,.factory-bootstrap-446 .col-xs-6,.factory-bootstrap-446 .col-xs-7,.factory-bootstrap-446 .col-xs-8,.factory-bootstrap-446 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-446 .col-xs-1,.factory-bootstrap-446 .col-xs-10,.factory-bootstrap-446 .col-xs-11,.factory-bootstrap-446 .col-xs-12,.factory-bootstrap-446 .col-xs-2,.factory-bootstrap-446 .col-xs-3,.factory-bootstrap-446 .col-xs-4,.factory-bootstrap-446 .col-xs-5,.factory-bootstrap-446 .col-xs-6,.factory-bootstrap-446 .col-xs-7,.factory-bootstrap-446 .col-xs-8,.factory-bootstrap-446 .col-xs-9{float:left}.factory-bootstrap-446 .col-xs-12{width:100%}.factory-bootstrap-446 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-446 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-446 .col-xs-9{width:75%}.factory-bootstrap-446 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-446 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-446 .col-xs-6{width:50%}.factory-bootstrap-446 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-446 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-446 .col-xs-3{width:25%}.factory-bootstrap-446 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-446 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-446 .col-xs-pull-12{right:100%}.factory-bootstrap-446 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-446 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-446 .col-xs-pull-9{right:75%}.factory-bootstrap-446 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-446 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-446 .col-xs-pull-6{right:50%}.factory-bootstrap-446 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-446 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-446 .col-xs-pull-3{right:25%}.factory-bootstrap-446 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-446 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-446 .col-xs-pull-0{right:0}.factory-bootstrap-446 .col-xs-push-12{left:100%}.factory-bootstrap-446 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-446 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-446 .col-xs-push-9{left:75%}.factory-bootstrap-446 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-446 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-446 .col-xs-push-6{left:50%}.factory-bootstrap-446 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-446 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-446 .col-xs-push-3{left:25%}.factory-bootstrap-446 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-446 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-446 .col-xs-push-0{left:0}.factory-bootstrap-446 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-446 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-446 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-446 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-446 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-446 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-446 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-446 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-446 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-446 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-446 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-446 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-446 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-446 table{max-width:100%;background-color:transparent}.factory-bootstrap-446 th{text-align:left}.factory-bootstrap-446 .table{width:100%;margin-bottom:20px}.factory-bootstrap-446 .table>tbody>tr>td,.factory-bootstrap-446 .table>tbody>tr>th,.factory-bootstrap-446 .table>tfoot>tr>td,.factory-bootstrap-446 .table>tfoot>tr>th,.factory-bootstrap-446 .table>thead>tr>td,.factory-bootstrap-446 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-446 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-446 .table>caption+thead>tr:first-child>td,.factory-bootstrap-446 .table>caption+thead>tr:first-child>th,.factory-bootstrap-446 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-446 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-446 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-446 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-446 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-446 .table .table{background-color:#fff}.factory-bootstrap-446 .table-condensed>tbody>tr>td,.factory-bootstrap-446 .table-condensed>tbody>tr>th,.factory-bootstrap-446 .table-condensed>tfoot>tr>td,.factory-bootstrap-446 .table-condensed>tfoot>tr>th,.factory-bootstrap-446 .table-condensed>thead>tr>td,.factory-bootstrap-446 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-446 .table-bordered,.factory-bootstrap-446 .table-bordered>tbody>tr>td,.factory-bootstrap-446 .table-bordered>tbody>tr>th,.factory-bootstrap-446 .table-bordered>tfoot>tr>td,.factory-bootstrap-446 .table-bordered>tfoot>tr>th,.factory-bootstrap-446 .table-bordered>thead>tr>td,.factory-bootstrap-446 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-446 .table-bordered>thead>tr>td,.factory-bootstrap-446 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-446 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-446 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-446 .table-hover>tbody>tr:hover>td,.factory-bootstrap-446 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-446 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-446 table td[class*=col-],.factory-bootstrap-446 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-446 .table>tbody>.active>td,.factory-bootstrap-446 .table>tbody>.active>th,.factory-bootstrap-446 .table>tbody>tr>.active,.factory-bootstrap-446 .table>tfoot>.active>td,.factory-bootstrap-446 .table>tfoot>.active>th,.factory-bootstrap-446 .table>tfoot>tr>.active,.factory-bootstrap-446 .table>thead>.active>td,.factory-bootstrap-446 .table>thead>.active>th,.factory-bootstrap-446 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-446 .table-hover>tbody>.active:hover>td,.factory-bootstrap-446 .table-hover>tbody>.active:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-446 .table>tbody>.success>td,.factory-bootstrap-446 .table>tbody>.success>th,.factory-bootstrap-446 .table>tbody>tr>.success,.factory-bootstrap-446 .table>tfoot>.success>td,.factory-bootstrap-446 .table>tfoot>.success>th,.factory-bootstrap-446 .table>tfoot>tr>.success,.factory-bootstrap-446 .table>thead>.success>td,.factory-bootstrap-446 .table>thead>.success>th,.factory-bootstrap-446 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-446 .table-hover>tbody>.success:hover>td,.factory-bootstrap-446 .table-hover>tbody>.success:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-446 .table>tbody>.danger>td,.factory-bootstrap-446 .table>tbody>.danger>th,.factory-bootstrap-446 .table>tbody>tr>.danger,.factory-bootstrap-446 .table>tfoot>.danger>td,.factory-bootstrap-446 .table>tfoot>.danger>th,.factory-bootstrap-446 .table>tfoot>tr>.danger,.factory-bootstrap-446 .table>thead>.danger>td,.factory-bootstrap-446 .table>thead>.danger>th,.factory-bootstrap-446 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-446 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-446 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-446 .table>tbody>.warning>td,.factory-bootstrap-446 .table>tbody>.warning>th,.factory-bootstrap-446 .table>tbody>tr>.warning,.factory-bootstrap-446 .table>tfoot>.warning>td,.factory-bootstrap-446 .table>tfoot>.warning>th,.factory-bootstrap-446 .table>tfoot>tr>.warning,.factory-bootstrap-446 .table>thead>.warning>td,.factory-bootstrap-446 .table>thead>.warning>th,.factory-bootstrap-446 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-446 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-446 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-446 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-446 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-446 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-446 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-446 input[type=checkbox],.factory-bootstrap-446 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-446 input[type=file]{display:block}.factory-bootstrap-446 select[multiple],.factory-bootstrap-446 select[size]{height:auto}.factory-bootstrap-446 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-446 input[type=checkbox]:focus,.factory-bootstrap-446 input[type=file]:focus,.factory-bootstrap-446 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-446 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-446 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-446 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-446 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-446 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-446 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-446 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-446 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-446 .form-control[disabled],.factory-bootstrap-446 .form-control[readonly],.factory-bootstrap-446 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-446 textarea.form-control{height:auto}.factory-bootstrap-446 .form-group{margin-bottom:15px}.factory-bootstrap-446 .checkbox,.factory-bootstrap-446 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-446 .checkbox label,.factory-bootstrap-446 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-446 .checkbox input[type=checkbox],.factory-bootstrap-446 .checkbox-inline input[type=checkbox],.factory-bootstrap-446 .radio input[type=radio],.factory-bootstrap-446 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-446 .checkbox+.checkbox,.factory-bootstrap-446 .radio+.radio{margin-top:-5px}.factory-bootstrap-446 .checkbox-inline,.factory-bootstrap-446 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-446 .checkbox-inline+.checkbox-inline,.factory-bootstrap-446 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-446 .checkbox-inline[disabled],.factory-bootstrap-446 .checkbox[disabled],.factory-bootstrap-446 .radio-inline[disabled],.factory-bootstrap-446 .radio[disabled],.factory-bootstrap-446 fieldset[disabled] .checkbox,.factory-bootstrap-446 fieldset[disabled] .checkbox-inline,.factory-bootstrap-446 fieldset[disabled] .radio,.factory-bootstrap-446 fieldset[disabled] .radio-inline,.factory-bootstrap-446 fieldset[disabled] input[type=checkbox],.factory-bootstrap-446 fieldset[disabled] input[type=radio],.factory-bootstrap-446 input[type=checkbox][disabled],.factory-bootstrap-446 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-446 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-446 textarea.input-sm{height:auto}.factory-bootstrap-446 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-446 textarea.input-lg{height:auto}.factory-bootstrap-446 .has-warning .checkbox,.factory-bootstrap-446 .has-warning .checkbox-inline,.factory-bootstrap-446 .has-warning .control-label,.factory-bootstrap-446 .has-warning .help-block,.factory-bootstrap-446 .has-warning .radio,.factory-bootstrap-446 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-446 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-446 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-446 .has-error .checkbox,.factory-bootstrap-446 .has-error .checkbox-inline,.factory-bootstrap-446 .has-error .control-label,.factory-bootstrap-446 .has-error .help-block,.factory-bootstrap-446 .has-error .radio,.factory-bootstrap-446 .has-error .radio-inline{color:#a94442}.factory-bootstrap-446 .controls{display:block}.factory-bootstrap-446 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-446 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-446 .has-success .checkbox,.factory-bootstrap-446 .has-success .checkbox-inline,.factory-bootstrap-446 .has-success .control-label,.factory-bootstrap-446 .has-success .help-block,.factory-bootstrap-446 .has-success .radio,.factory-bootstrap-446 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-446 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-446 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-446 .form-control-static{margin-bottom:0}.factory-bootstrap-446 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-446 .form-horizontal .checkbox,.factory-bootstrap-446 .form-horizontal .checkbox-inline,.factory-bootstrap-446 .form-horizontal .control-label,.factory-bootstrap-446 .form-horizontal .radio,.factory-bootstrap-446 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-446 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-446 .form-horizontal .checkbox,.factory-bootstrap-446 .form-horizontal .radio{min-height:27px}.factory-bootstrap-446 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-446 .form-horizontal .form-group:after,.factory-bootstrap-446 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-446 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-446 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-446 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-446 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-446 .btn{text-decoration:none}.factory-bootstrap-446 .btn:focus,.factory-bootstrap-446 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-446 .btn.disabled,.factory-bootstrap-446 .btn[disabled],.factory-bootstrap-446 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .btn-default:focus,.factory-bootstrap-446 .btn-default:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-446 .btn-default.disabled,.factory-bootstrap-446 .btn-default.disabled.active,.factory-bootstrap-446 .btn-default.disabled:active,.factory-bootstrap-446 .btn-default.disabled:focus,.factory-bootstrap-446 .btn-default.disabled:hover,.factory-bootstrap-446 .btn-default[disabled],.factory-bootstrap-446 .btn-default[disabled].active,.factory-bootstrap-446 .btn-default[disabled]:active,.factory-bootstrap-446 .btn-default[disabled]:focus,.factory-bootstrap-446 .btn-default[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-default,.factory-bootstrap-446 fieldset[disabled] .btn-default.active,.factory-bootstrap-446 fieldset[disabled] .btn-default:active,.factory-bootstrap-446 fieldset[disabled] .btn-default:focus,.factory-bootstrap-446 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-446 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-446 .btn-primary.disabled,.factory-bootstrap-446 .btn-primary.disabled.active,.factory-bootstrap-446 .btn-primary.disabled:active,.factory-bootstrap-446 .btn-primary.disabled:focus,.factory-bootstrap-446 .btn-primary.disabled:hover,.factory-bootstrap-446 .btn-primary[disabled],.factory-bootstrap-446 .btn-primary[disabled].active,.factory-bootstrap-446 .btn-primary[disabled]:active,.factory-bootstrap-446 .btn-primary[disabled]:focus,.factory-bootstrap-446 .btn-primary[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-primary,.factory-bootstrap-446 fieldset[disabled] .btn-primary.active,.factory-bootstrap-446 fieldset[disabled] .btn-primary:active,.factory-bootstrap-446 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-446 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-446 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-446 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active,.factory-bootstrap-446 .btn-warning:focus,.factory-bootstrap-446 .btn-warning:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-446 .btn-warning.disabled,.factory-bootstrap-446 .btn-warning.disabled.active,.factory-bootstrap-446 .btn-warning.disabled:active,.factory-bootstrap-446 .btn-warning.disabled:focus,.factory-bootstrap-446 .btn-warning.disabled:hover,.factory-bootstrap-446 .btn-warning[disabled],.factory-bootstrap-446 .btn-warning[disabled].active,.factory-bootstrap-446 .btn-warning[disabled]:active,.factory-bootstrap-446 .btn-warning[disabled]:focus,.factory-bootstrap-446 .btn-warning[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-warning,.factory-bootstrap-446 fieldset[disabled] .btn-warning.active,.factory-bootstrap-446 fieldset[disabled] .btn-warning:active,.factory-bootstrap-446 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-446 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-446 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-446 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .btn-success:focus,.factory-bootstrap-446 .btn-success:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-446 .btn-success.disabled,.factory-bootstrap-446 .btn-success.disabled.active,.factory-bootstrap-446 .btn-success.disabled:active,.factory-bootstrap-446 .btn-success.disabled:focus,.factory-bootstrap-446 .btn-success.disabled:hover,.factory-bootstrap-446 .btn-success[disabled],.factory-bootstrap-446 .btn-success[disabled].active,.factory-bootstrap-446 .btn-success[disabled]:active,.factory-bootstrap-446 .btn-success[disabled]:focus,.factory-bootstrap-446 .btn-success[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-success,.factory-bootstrap-446 fieldset[disabled] .btn-success.active,.factory-bootstrap-446 fieldset[disabled] .btn-success:active,.factory-bootstrap-446 fieldset[disabled] .btn-success:focus,.factory-bootstrap-446 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-446 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-446 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .btn-info:focus,.factory-bootstrap-446 .btn-info:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-446 .btn-info.disabled,.factory-bootstrap-446 .btn-info.disabled.active,.factory-bootstrap-446 .btn-info.disabled:active,.factory-bootstrap-446 .btn-info.disabled:focus,.factory-bootstrap-446 .btn-info.disabled:hover,.factory-bootstrap-446 .btn-info[disabled],.factory-bootstrap-446 .btn-info[disabled].active,.factory-bootstrap-446 .btn-info[disabled]:active,.factory-bootstrap-446 .btn-info[disabled]:focus,.factory-bootstrap-446 .btn-info[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-info,.factory-bootstrap-446 fieldset[disabled] .btn-info.active,.factory-bootstrap-446 fieldset[disabled] .btn-info:active,.factory-bootstrap-446 fieldset[disabled] .btn-info:focus,.factory-bootstrap-446 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-446 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-446 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-446 .btn-link,.factory-bootstrap-446 .btn-link:active,.factory-bootstrap-446 .btn-link[disabled],.factory-bootstrap-446 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-link,.factory-bootstrap-446 .btn-link:active,.factory-bootstrap-446 .btn-link:focus,.factory-bootstrap-446 .btn-link:hover{border-color:transparent}.factory-bootstrap-446 .btn-link:focus,.factory-bootstrap-446 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-446 .btn-link[disabled]:focus,.factory-bootstrap-446 .btn-link[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-link:focus,.factory-bootstrap-446 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-446 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-446 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-446 input[type=button].btn-block,.factory-bootstrap-446 input[type=reset].btn-block,.factory-bootstrap-446 input[type=submit].btn-block{width:100%}.factory-bootstrap-446 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-446 .fade.in{opacity:1}.factory-bootstrap-446 .collapse{display:none}.factory-bootstrap-446 .collapse.in{display:block}.factory-bootstrap-446 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-446 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-446 .glyphicon:empty{width:1em}.factory-bootstrap-446 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-446 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-446 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-446 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-446 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-446 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-446 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-446 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-446 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-446 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-446 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-446 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-446 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-446 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-446 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-446 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-446 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-446 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-446 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-446 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-446 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-446 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-446 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-446 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-446 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-446 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-446 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-446 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-446 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-446 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-446 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-446 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-446 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-446 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-446 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-446 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-446 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-446 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-446 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-446 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-446 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-446 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-446 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-446 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-446 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-446 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-446 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-446 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-446 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-446 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-446 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-446 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-446 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-446 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-446 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-446 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-446 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-446 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-446 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-446 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-446 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-446 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-446 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-446 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-446 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-446 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-446 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-446 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-446 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-446 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-446 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-446 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-446 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-446 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-446 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-446 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-446 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-446 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-446 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-446 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-446 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-446 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-446 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-446 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-446 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-446 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-446 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-446 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-446 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-446 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-446 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-446 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-446 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-446 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-446 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-446 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-446 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-446 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-446 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-446 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-446 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-446 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-446 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-446 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-446 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-446 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-446 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-446 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-446 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-446 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-446 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-446 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-446 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-446 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-446 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-446 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-446 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-446 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-446 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-446 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-446 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-446 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-446 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-446 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-446 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-446 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-446 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-446 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-446 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-446 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-446 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-446 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-446 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-446 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-446 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-446 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-446 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-446 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-446 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-446 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-446 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-446 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-446 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-446 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-446 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-446 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-446 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-446 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-446 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-446 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-446 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-446 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-446 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-446 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-446 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-446 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-446 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-446 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-446 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-446 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-446 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-446 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-446 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-446 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-446 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-446 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-446 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-446 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-446 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-446 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-446 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-446 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-446 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-446 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-446 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-446 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-446 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-446 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-446 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-446 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-446 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-446 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-446 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-446 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-446 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-446 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-446 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-446 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-446 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-446 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-446 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-446 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-446 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-446 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-446 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-446 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-446 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-446 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-446 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-446 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-446 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-446 .dropdown{position:relative}.factory-bootstrap-446 .dropdown-toggle:focus{outline:0}.factory-bootstrap-446 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-446 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-446 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-446 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-446 .dropdown-menu>li>a:focus,.factory-bootstrap-446 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-446 .dropdown-menu>.active>a,.factory-bootstrap-446 .dropdown-menu>.active>a:focus,.factory-bootstrap-446 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-446 .dropdown-menu>.disabled>a,.factory-bootstrap-446 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-446 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-446 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-446 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .open>.dropdown-menu{display:block}.factory-bootstrap-446 .open>a{outline:0}.factory-bootstrap-446 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-446 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-446 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-446 .dropup .caret,.factory-bootstrap-446 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-446 .dropup .dropdown-menu,.factory-bootstrap-446 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-446 .btn-group,.factory-bootstrap-446 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-446 .btn-group-vertical>.btn,.factory-bootstrap-446 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-446 .btn-group-vertical>.btn.active,.factory-bootstrap-446 .btn-group-vertical>.btn:active,.factory-bootstrap-446 .btn-group-vertical>.btn:focus,.factory-bootstrap-446 .btn-group-vertical>.btn:hover,.factory-bootstrap-446 .btn-group>.btn.active,.factory-bootstrap-446 .btn-group>.btn:active,.factory-bootstrap-446 .btn-group>.btn:focus,.factory-bootstrap-446 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-446 .btn-group-vertical>.btn:focus,.factory-bootstrap-446 .btn-group>.btn:focus{outline:0}.factory-bootstrap-446 .btn-group .btn+.btn,.factory-bootstrap-446 .btn-group .btn+.btn-group,.factory-bootstrap-446 .btn-group .btn-group+.btn,.factory-bootstrap-446 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-446 .btn-toolbar:after,.factory-bootstrap-446 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-446 .btn-toolbar:after{clear:both}.factory-bootstrap-446 .btn-toolbar .btn-group{float:left}.factory-bootstrap-446 .btn-toolbar>.btn+.btn,.factory-bootstrap-446 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-446 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-446 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-446 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-446 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-446 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-446 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group>.btn-group{float:left}.factory-bootstrap-446 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-446 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-446 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group .dropdown-toggle:active,.factory-bootstrap-446 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-446 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-446 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-446 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-446 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-446 .btn .caret{margin-left:0}.factory-bootstrap-446 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-446 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-446 .btn-group-vertical>.btn,.factory-bootstrap-446 .btn-group-vertical>.btn-group,.factory-bootstrap-446 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-446 .btn-group-vertical>.btn-group:after,.factory-bootstrap-446 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-446 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-446 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-446 .btn-group-vertical>.btn+.btn,.factory-bootstrap-446 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-446 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-446 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-446 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-446 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-446 .btn-group-justified>.btn,.factory-bootstrap-446 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-446 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-446 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-446 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-446 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-446 .input-group-lg>.form-control,.factory-bootstrap-446 .input-group-lg>.input-group-addon,.factory-bootstrap-446 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 select.input-group-lg>.form-control,.factory-bootstrap-446 select.input-group-lg>.input-group-addon,.factory-bootstrap-446 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-446 textarea.input-group-lg>.form-control,.factory-bootstrap-446 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-446 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-446 .input-group-sm>.form-control,.factory-bootstrap-446 .input-group-sm>.input-group-addon,.factory-bootstrap-446 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 select.input-group-sm>.form-control,.factory-bootstrap-446 select.input-group-sm>.input-group-addon,.factory-bootstrap-446 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-446 textarea.input-group-sm>.form-control,.factory-bootstrap-446 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-446 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-446 .input-group .form-control,.factory-bootstrap-446 .input-group-addon,.factory-bootstrap-446 .input-group-btn{display:table-cell}.factory-bootstrap-446 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-446 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-446 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-446 .input-group-addon,.factory-bootstrap-446 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-446 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-446 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-446 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-446 .input-group-addon input[type=checkbox],.factory-bootstrap-446 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-446 .input-group .form-control:first-child,.factory-bootstrap-446 .input-group-addon:first-child,.factory-bootstrap-446 .input-group-btn:first-child>.btn,.factory-bootstrap-446 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-446 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .input-group-addon:first-child{border-right:0}.factory-bootstrap-446 .input-group .form-control:last-child,.factory-bootstrap-446 .input-group-addon:last-child,.factory-bootstrap-446 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-446 .input-group-btn:last-child>.btn,.factory-bootstrap-446 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .input-group-addon:last-child{border-left:0}.factory-bootstrap-446 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-446 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-446 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-446 .input-group-btn>.btn{position:relative}.factory-bootstrap-446 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-446 .input-group-btn>.btn:active,.factory-bootstrap-446 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-446 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-446 .nav:after,.factory-bootstrap-446 .nav:before{display:table;content:" "}.factory-bootstrap-446 .nav:after{clear:both}.factory-bootstrap-446 .nav>li{position:relative;display:block}.factory-bootstrap-446 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-446 .nav>li>a:focus,.factory-bootstrap-446 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-446 .nav>li.disabled>a{color:#999}.factory-bootstrap-446 .nav>li.disabled>a:focus,.factory-bootstrap-446 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-446 .nav .open>a,.factory-bootstrap-446 .nav .open>a:focus,.factory-bootstrap-446 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-446 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-446 .nav>li>a>img{max-width:none}.factory-bootstrap-446 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-446 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-446 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-446 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-446 .nav-tabs>li.active>a,.factory-bootstrap-446 .nav-tabs>li.active>a:focus,.factory-bootstrap-446 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-446 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-446 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-446 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-446 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-446 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-446 .nav-pills>li{float:left}.factory-bootstrap-446 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-446 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-446 .nav-pills>li.active>a,.factory-bootstrap-446 .nav-pills>li.active>a:focus,.factory-bootstrap-446 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-446 .nav-stacked>li{float:none}.factory-bootstrap-446 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-446 .nav-justified{width:100%}.factory-bootstrap-446 .nav-justified>li{float:none}.factory-bootstrap-446 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-446 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-446 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-446 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-446 .nav-tabs-justified>.active>a,.factory-bootstrap-446 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-446 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-446 .tab-content>.tab-pane{display:none}.factory-bootstrap-446 .tab-content>.active{display:block}.factory-bootstrap-446 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-446 .navbar:after,.factory-bootstrap-446 .navbar:before{display:table;content:" "}.factory-bootstrap-446 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-446 .navbar-header:after,.factory-bootstrap-446 .navbar-header:before{display:table;content:" "}.factory-bootstrap-446 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-446 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-446 .navbar-collapse:after,.factory-bootstrap-446 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-446 .navbar-collapse:after{clear:both}.factory-bootstrap-446 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-446 .container>.navbar-collapse,.factory-bootstrap-446 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-446 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-446 .navbar-fixed-bottom,.factory-bootstrap-446 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-446 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-446 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-446 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-446 .navbar-brand:focus,.factory-bootstrap-446 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-446 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-446 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-446 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-446 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-446 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-446 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-446 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-446 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-446 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-446 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-446 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-446 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-446 .navbar-default .navbar-brand:focus,.factory-bootstrap-446 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-nav>li>a,.factory-bootstrap-446 .navbar-default .navbar-text{color:#777}.factory-bootstrap-446 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-446 .navbar-default .navbar-toggle:focus,.factory-bootstrap-446 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-446 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-446 .navbar-default .navbar-collapse,.factory-bootstrap-446 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-446 .navbar-default .navbar-link{color:#777}.factory-bootstrap-446 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-446 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-446 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-446 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-446 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-446 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-446 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-446 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-446 .navbar-inverse .navbar-collapse,.factory-bootstrap-446 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-446 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-446 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-446 .breadcrumb>li{display:inline-block}.factory-bootstrap-446 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-446 .breadcrumb>.active{color:#999}.factory-bootstrap-446 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-446 .pagination>li{display:inline}.factory-bootstrap-446 .pagination>li>a,.factory-bootstrap-446 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-446 .pagination>li:first-child>a,.factory-bootstrap-446 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-446 .pagination>li:last-child>a,.factory-bootstrap-446 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-446 .pagination>li>a:focus,.factory-bootstrap-446 .pagination>li>a:hover,.factory-bootstrap-446 .pagination>li>span:focus,.factory-bootstrap-446 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-446 .pagination>.disabled>a,.factory-bootstrap-446 .pagination>.disabled>a:focus,.factory-bootstrap-446 .pagination>.disabled>a:hover,.factory-bootstrap-446 .pagination>.disabled>span,.factory-bootstrap-446 .pagination>.disabled>span:focus,.factory-bootstrap-446 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-446 .pagination-lg>li>a,.factory-bootstrap-446 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-446 .pagination-lg>li:first-child>a,.factory-bootstrap-446 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-446 .pagination-lg>li:last-child>a,.factory-bootstrap-446 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-446 .pagination-sm>li>a,.factory-bootstrap-446 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-446 .pagination-sm>li:first-child>a,.factory-bootstrap-446 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-446 .pagination-sm>li:last-child>a,.factory-bootstrap-446 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-446 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-446 .pager:after,.factory-bootstrap-446 .pager:before{display:table;content:" "}.factory-bootstrap-446 .pager:after{clear:both}.factory-bootstrap-446 .pager li{display:inline}.factory-bootstrap-446 .pager li>a,.factory-bootstrap-446 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-446 .pager li>a:focus,.factory-bootstrap-446 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-446 .pager .next>a,.factory-bootstrap-446 .pager .next>span{float:right}.factory-bootstrap-446 .pager .previous>a,.factory-bootstrap-446 .pager .previous>span{float:left}.factory-bootstrap-446 .pager .disabled>a,.factory-bootstrap-446 .pager .disabled>a:focus,.factory-bootstrap-446 .pager .disabled>a:hover,.factory-bootstrap-446 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-446 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-446 .label[href]:focus,.factory-bootstrap-446 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-446 .label:empty{display:none}.factory-bootstrap-446 .btn .label{position:relative;top:-1px}.factory-bootstrap-446 .label-default{background-color:#999}.factory-bootstrap-446 .label-default[href]:focus,.factory-bootstrap-446 .label-default[href]:hover{background-color:gray}.factory-bootstrap-446 .label-primary{background-color:#428bca}.factory-bootstrap-446 .label-primary[href]:focus,.factory-bootstrap-446 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-446 .label-success{background-color:#5cb85c}.factory-bootstrap-446 .label-success[href]:focus,.factory-bootstrap-446 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-446 .label-info{background-color:#5bc0de}.factory-bootstrap-446 .label-info[href]:focus,.factory-bootstrap-446 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-446 .label-warning{background-color:#f0ad4e}.factory-bootstrap-446 .label-warning[href]:focus,.factory-bootstrap-446 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-446 .label-danger{background-color:#d9534f}.factory-bootstrap-446 .label-danger[href]:focus,.factory-bootstrap-446 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-446 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-446 .badge:empty{display:none}.factory-bootstrap-446 .btn .badge{position:relative;top:-1px}.factory-bootstrap-446 a.badge:focus,.factory-bootstrap-446 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-446 .nav-pills>.active>a>.badge,.factory-bootstrap-446 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-446 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-446 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-446 .jumbotron .h1,.factory-bootstrap-446 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-446 .jumbotron p{line-height:1.4}.factory-bootstrap-446 .container .jumbotron{border-radius:6px}.factory-bootstrap-446 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-446 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-446 .thumbnail a>img,.factory-bootstrap-446 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-446 a.thumbnail.active,.factory-bootstrap-446 a.thumbnail:focus,.factory-bootstrap-446 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-446 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-446 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-446 .alert .alert-link{font-weight:700}.factory-bootstrap-446 .alert>p,.factory-bootstrap-446 .alert>ul{margin-bottom:0}.factory-bootstrap-446 .alert>p+p{margin-top:5px}.factory-bootstrap-446 .alert-dismissable{padding-right:35px}.factory-bootstrap-446 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-446 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-446 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-446 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-446 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-446 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-446 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-446 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-446 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-446 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-446 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-446 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-446 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .media,.factory-bootstrap-446 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-446 .media,.factory-bootstrap-446 .media .media{margin-top:15px}.factory-bootstrap-446 .media:first-child{margin-top:0}.factory-bootstrap-446 .media-object{display:block}.factory-bootstrap-446 .media-heading{margin:0 0 5px}.factory-bootstrap-446 .media>.pull-left{margin-right:10px}.factory-bootstrap-446 .media>.pull-right{margin-left:10px}.factory-bootstrap-446 .media-list{padding-left:0;list-style:none}.factory-bootstrap-446 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-446 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-446 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-446 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-446 .list-group-item>.badge{float:right}.factory-bootstrap-446 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-446 a.list-group-item{color:#555}.factory-bootstrap-446 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-446 a.list-group-item:focus,.factory-bootstrap-446 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-446 a.list-group-item.active,.factory-bootstrap-446 a.list-group-item.active:focus,.factory-bootstrap-446 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-446 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-446 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-446 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-446 a.list-group-item.active .list-group-item-text,.factory-bootstrap-446 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-446 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-446 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-446 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-446 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .panel-body{padding:15px}.factory-bootstrap-446 .panel-body:after,.factory-bootstrap-446 .panel-body:before{display:table;content:" "}.factory-bootstrap-446 .panel-body:after{clear:both}.factory-bootstrap-446 .panel>.list-group{margin-bottom:0}.factory-bootstrap-446 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-446 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-446 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-446 .panel>.table,.factory-bootstrap-446 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-446 .panel>.panel-body+.table,.factory-bootstrap-446 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-446 .panel>.table>tbody:first-child td,.factory-bootstrap-446 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-446 .panel>.table-bordered,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-446 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-446 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-446 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-446 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-446 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-446 .panel-title>a{color:inherit}.factory-bootstrap-446 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-446 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-446 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-446 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-446 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-446 .panel-group .panel-footer{border-top:0}.factory-bootstrap-446 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-446 .panel-default{border-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-446 .panel-primary{border-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-446 .panel-success{border-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-446 .panel-warning{border-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-446 .panel-danger{border-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-446 .panel-info{border-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-446 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-446 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-446 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-446 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-446 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-446 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-446 .close:focus,.factory-bootstrap-446 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-446 .modal-open{overflow:hidden}.factory-bootstrap-446 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-446 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-446 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-446 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-446 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-446 .modal-backdrop,.factory-bootstrap-446-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-446 .modal-backdrop.fade,.factory-bootstrap-446-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-446 .modal-backdrop.in,.factory-bootstrap-446-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-446 .modal-header .close{margin-top:-2px}.factory-bootstrap-446 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-446 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-446 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-446 .modal-footer:after,.factory-bootstrap-446 .modal-footer:before{display:table;content:" "}.factory-bootstrap-446 .modal-footer:after{clear:both}.factory-bootstrap-446 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-446 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-446 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-446 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-446 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-446 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-446 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-446 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-446 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-446 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-446 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-446 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-446 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-446 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-446 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-446 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-446 .popover.top{margin-top:-10px}.factory-bootstrap-446 .popover.right{margin-left:10px}.factory-bootstrap-446 .popover.bottom{margin-top:10px}.factory-bootstrap-446 .popover.left{margin-left:-10px}.factory-bootstrap-446 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-446 .popover-content{padding:9px 14px}.factory-bootstrap-446 .popover .arrow,.factory-bootstrap-446 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-446 .popover .arrow{border-width:11px}.factory-bootstrap-446 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-446 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-446 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-446 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-446 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-446 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-446 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-446 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-446 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-446 .carousel{position:relative}.factory-bootstrap-446 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-446 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-446 .carousel-inner>.item>a>img,.factory-bootstrap-446 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-446 .carousel-inner>.active,.factory-bootstrap-446 .carousel-inner>.next,.factory-bootstrap-446 .carousel-inner>.prev{display:block}.factory-bootstrap-446 .carousel-inner>.active{left:0}.factory-bootstrap-446 .carousel-inner>.next,.factory-bootstrap-446 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-446 .carousel-inner>.next{left:100%}.factory-bootstrap-446 .carousel-inner>.prev{left:-100%}.factory-bootstrap-446 .carousel-inner>.next.left,.factory-bootstrap-446 .carousel-inner>.prev.right{left:0}.factory-bootstrap-446 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-446 .carousel-inner>.active.right{left:100%}.factory-bootstrap-446 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-446 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-446 .carousel-control:focus,.factory-bootstrap-446 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-446 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-446 .carousel-control .icon-next,.factory-bootstrap-446 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-446 .carousel-control .icon-prev{left:50%}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-446 .carousel-control .icon-next{right:50%}.factory-bootstrap-446 .carousel-control .icon-next,.factory-bootstrap-446 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-446 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-446 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-446 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-446 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-446 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-446 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-446 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-446 .clearfix:after,.factory-bootstrap-446 .clearfix:before{display:table;content:" "}.factory-bootstrap-446 .clearfix:after{clear:both}.factory-bootstrap-446 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-446 .pull-right{float:right!important}.factory-bootstrap-446 .pull-left{float:left!important}.factory-bootstrap-446 .hide{display:none!important}.factory-bootstrap-446 .show{display:block!important}.factory-bootstrap-446 .invisible{visibility:hidden}.factory-bootstrap-446 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-446 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-446 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-446 .visible-lg,.factory-bootstrap-446 .visible-md,.factory-bootstrap-446 .visible-sm,.factory-bootstrap-446 .visible-xs,.factory-bootstrap-446 td.visible-lg,.factory-bootstrap-446 td.visible-md,.factory-bootstrap-446 td.visible-sm,.factory-bootstrap-446 td.visible-xs,.factory-bootstrap-446 th.visible-lg,.factory-bootstrap-446 th.visible-md,.factory-bootstrap-446 th.visible-sm,.factory-bootstrap-446 th.visible-xs,.factory-bootstrap-446 tr.visible-lg,.factory-bootstrap-446 tr.visible-md,.factory-bootstrap-446 tr.visible-sm,.factory-bootstrap-446 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-446 .hidden-xs{display:block!important}.factory-bootstrap-446 table.hidden-xs{display:table}.factory-bootstrap-446 tr.hidden-xs{display:table-row!important}.factory-bootstrap-446 td.hidden-xs,.factory-bootstrap-446 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-sm{display:block!important}.factory-bootstrap-446 table.hidden-sm{display:table}.factory-bootstrap-446 tr.hidden-sm{display:table-row!important}.factory-bootstrap-446 td.hidden-sm,.factory-bootstrap-446 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-md{display:block!important}.factory-bootstrap-446 table.hidden-md{display:table}.factory-bootstrap-446 tr.hidden-md{display:table-row!important}.factory-bootstrap-446 td.hidden-md,.factory-bootstrap-446 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-lg{display:block!important}.factory-bootstrap-446 table.hidden-lg{display:table}.factory-bootstrap-446 tr.hidden-lg{display:table-row!important}.factory-bootstrap-446 td.hidden-lg,.factory-bootstrap-446 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-446 .hidden-lg.hidden-xs,.factory-bootstrap-446 td.hidden-lg.hidden-xs,.factory-bootstrap-446 th.hidden-lg.hidden-xs,.factory-bootstrap-446 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-446 .hidden-lg.hidden-sm,.factory-bootstrap-446 td.hidden-lg.hidden-sm,.factory-bootstrap-446 th.hidden-lg.hidden-sm,.factory-bootstrap-446 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-446 .hidden-lg.hidden-md,.factory-bootstrap-446 td.hidden-lg.hidden-md,.factory-bootstrap-446 th.hidden-lg.hidden-md,.factory-bootstrap-446 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-446 .hidden-lg,.factory-bootstrap-446 td.hidden-lg,.factory-bootstrap-446 th.hidden-lg,.factory-bootstrap-446 tr.hidden-lg{display:none!important}}.factory-bootstrap-446 .visible-print,.factory-bootstrap-446 td.visible-print,.factory-bootstrap-446 th.visible-print,.factory-bootstrap-446 tr.visible-print{display:none!important}@media print{.factory-bootstrap-446 .visible-print{display:block!important}.factory-bootstrap-446 table.visible-print{display:table}.factory-bootstrap-446 tr.visible-print{display:table-row!important}.factory-bootstrap-446 td.visible-print,.factory-bootstrap-446 th.visible-print{display:table-cell!important}.factory-bootstrap-446 .hidden-print,.factory-bootstrap-446 td.hidden-print,.factory-bootstrap-446 th.hidden-print,.factory-bootstrap-446 tr.hidden-print{display:none!important}}/*!
12
+ * Factory Default Bootstrap Theme
13
+ *
14
+ * The code is based on Bootstrap v2.1.1
15
+ *
16
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
17
+ * Copyright 2013 Twitter, Inc.
18
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
19
+ *
20
+ * @author Paul Kashtanoff <paul@byonepress.com>
21
+ * @copyright (c) 2013, OnePress Ltd
22
+ *
23
+ * @package factory-bootstrap
24
+ * @since 1.0.0
25
+ */.factory-bootstrap-446 .btn-danger,.factory-bootstrap-446 .btn-default,.factory-bootstrap-446 .btn-info,.factory-bootstrap-446 .btn-primary,.factory-bootstrap-446 .btn-success,.factory-bootstrap-446 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .btn-danger.active,.factory-bootstrap-446 .btn-danger:active,.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-446 .btn.active,.factory-bootstrap-446 .btn:active{background-image:none}.factory-bootstrap-446 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-446 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-446 .btn-gold:focus,.factory-bootstrap-446 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-446 .btn-gold.active,.factory-bootstrap-446 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-446 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-446 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-success:focus,.factory-bootstrap-446 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-446 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-warning:focus,.factory-bootstrap-446 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-446 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-446 .btn-danger.active,.factory-bootstrap-446 .btn-danger:active,.factory-bootstrap-446 .btn-danger:focus,.factory-bootstrap-446 .btn-danger:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-446 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-info:focus,.factory-bootstrap-446 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-446 .img-thumbnail,.factory-bootstrap-446 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-446 .dropdown-menu>li>a:focus,.factory-bootstrap-446 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-446 .dropdown-menu>.active>a,.factory-bootstrap-446 .dropdown-menu>.active>a:focus,.factory-bootstrap-446 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-446 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-446 .navbar-brand,.factory-bootstrap-446 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-446 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-446 .navbar-inverse .navbar-brand,.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-446 .navbar-fixed-bottom,.factory-bootstrap-446 .navbar-fixed-top,.factory-bootstrap-446 .navbar-static-top{border-radius:0}.factory-bootstrap-446 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-446 .alert .actions{padding-top:10px}.factory-bootstrap-446 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-446 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-446 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-446 .alert-normal,.factory-bootstrap-446 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-446 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-446 .alert-danger a:not(.btn),.factory-bootstrap-446 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-446 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-446 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-446 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-446 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-446 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-446 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-446 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-446 .list-group-item.active,.factory-bootstrap-446 .list-group-item.active:focus,.factory-bootstrap-446 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-446 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-446 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-446 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-446 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-446 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-446 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-446 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-446 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-446 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-446 .factory-hidden{display:none}.factory-bootstrap-446 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
libs/factory/bootstrap/assets/css-min/bootstrap.datepicker.min.css CHANGED
@@ -1,17 +1,17 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- /*!
12
- * Datepicker for Bootstrap v1.5.0-dev (https://github.com/eternicode/bootstrap-datepicker)
13
- *
14
- * Copyright 2012 Stefan Petre
15
- * Improvements by Andrew Rowls
16
- * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
17
  */.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:0}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{background-image:none}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{background-image:none}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-size:13px;line-height:1.42857143}.datepicker.datepicker-inline td,.datepicker.datepicker-inline th,.datepicker.dropdown-menu td,.datepicker.dropdown-menu th{padding:0 5px}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ /*!
12
+ * Datepicker for Bootstrap v1.5.0-dev (https://github.com/eternicode/bootstrap-datepicker)
13
+ *
14
+ * Copyright 2012 Stefan Petre
15
+ * Improvements by Andrew Rowls
16
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
17
  */.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:0}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{background-image:none}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{background-image:none}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-size:13px;line-height:1.42857143}.datepicker.datepicker-inline td,.datepicker.datepicker-inline th,.datepicker.dropdown-menu td,.datepicker.dropdown-menu th{padding:0 5px}
libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#a3b745;border-color:#839237;color:#fff;-webkit-box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#a3b745;border-color:#839237;color:#fff;-webkit-box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-421 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-421 .factory-form-group .factory-hint-icon{display:block;width:16px;height:16px;line-height:13px;padding:0;font-size:11px;text-align:center;position:absolute;top:-5px;right:-3px;color:#fff;background:#E91E63;border-radius:3px}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-421 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-421 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-421 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-421 .factory-form-group legend+.control-group{margin-top:0}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-446 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-446 .factory-form-group .factory-hint-icon{display:block;width:16px;height:16px;line-height:13px;padding:0;font-size:11px;text-align:center;position:absolute;top:-5px;right:-3px;color:#fff;background:#E91E63;border-radius:3px}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-446 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-446 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-446 .factory-form-group legend+.control-group{margin-top:0}
libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#04a4cc;border-color:#037c9a;color:#fff;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#04a4cc;border-color:#037c9a;color:#fff;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#e14d43;border-color:#d02a21;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#e14d43;border-color:#d02a21;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#9ebaa0;border-color:#80a583;color:#fff;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#9ebaa0;border-color:#80a583;color:#fff;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .btn-primary{background:#dd823b;border-color:#c36822;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-421 .btn-primary:active{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-421 .btn-primary:disabled,.factory-bootstrap-421 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-421 .btn-group .btn.active.value{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .btn-primary{background:#dd823b;border-color:#c36822;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
libs/factory/bootstrap/assets/css-min/control.checkbox.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- #side-sortables .factory-bootstrap-421 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-421 .factory-buttons-way .factory-on.active{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-421 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-421 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-421 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ #side-sortables .factory-bootstrap-446 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .factory-checkbox-disabled button,.factory-bootstrap-446 .factory-checkbox-disabled input{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-446 .factory-buttons-way .factory-on.active{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-446 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-446 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
libs/factory/bootstrap/assets/css-min/control.dropdown.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-421 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-421 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-421 .factory-dropdown.factory-buttons-way .active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-421 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-446 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-446 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-421 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item{position:absolute;top:0;right:0;bottom:0;width:40px;border-radius:0 3px 3px 0;outline:0}.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-421 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-421 .factory-mtextbox-add-item{display:block;margin-top:10px}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-446 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item{position:absolute;top:0;right:0;bottom:0;width:40px;border-radius:0 3px 3px 0;outline:0}.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-446 .factory-mtextbox-add-item{display:block;margin-top:10px}
libs/factory/bootstrap/assets/css-min/holder.more-link.min.css CHANGED
@@ -1,11 +1,11 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
-
11
- .factory-bootstrap-421 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-421 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-421 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-421 .factory-tab .factory-more-link-hide{position:absolute;margin-top:-35px;background-color:#fff;padding:0 5px;right:20px;color:#bbb;text-decoration:none}.factory-bootstrap-421 .factory-tab .factory-more-link-hide:hover{color:#999}
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+
11
+ .factory-bootstrap-446 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-446 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-446 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-446 .factory-tab .factory-more-link-hide{position:absolute;margin-top:-35px;background-color:#fff;padding:0 5px;right:20px;color:#bbb;text-decoration:none}.factory-bootstrap-446 .factory-tab .factory-more-link-hide:hover{color:#999}
libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
- +function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.factoryBootstrap421_dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.factoryBootstrap421_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+ +function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.factoryBootstrap446_dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.factoryBootstrap446_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
libs/factory/bootstrap/assets/js-min/bootstrap.tooltip.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
  +function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this},a(function(){a('[data-toggle="factory-tooltip"]').tooltip({html:!0})})}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
  +function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this},a(function(){a('[data-toggle="factory-tooltip"]').tooltip({html:!0})})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.checkbox.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
- !function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.attr("checked","checked"),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.removeAttr("checked"),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&(console.log(l[m]),a(m).val(l[m]))}}}},this.executeEvents(this.$result)};a.fn.factoryBootstrap421_checkboxControl=function(c){if("string"==typeof c){var d=a(this).data("factory.checkbox.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.checkbox.control");d||c.data("factory.checkbox.control",d=new b(this))})},a.fn.factoryBootstrap421_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-checkbox.factory-buttons-way").factoryBootstrap421_checkboxControl()})}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+ !function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.prop("checked",!0),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.prop("checked",!1),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&a(m).val(l[m])}}}},this.executeEvents(this.$result)};a.fn.factoryBootstrap446_checkboxControl=function(c){if("string"==typeof c){var d=a(this).data("factory.checkbox.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.checkbox.control");d||c.data("factory.checkbox.control",d=new b(this))})},a.fn.factoryBootstrap446_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-checkbox.factory-buttons-way").factoryBootstrap446_checkboxControl(),a(".factory-bootstrap-446 .factory-checkbox").not(".factory-buttons-way").click(function(){a(this).prop("checked")?a(this).val(1):a(this).val(0)})})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.dropdown.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
- !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.factoryBootstrap421_dropdownControl=function(c){if("string"==typeof c){var d=a(this).data("factory.dropdown.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.dropdown.control");d||c.data("factory.dropdown.control",d=new b(this))})},a.fn.factoryBootstrap421_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-dropdown").factoryBootstrap421_dropdownControl()})}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.factoryBootstrap446_dropdownControl=function(c){if("string"==typeof c){var d=a(this).data("factory.dropdown.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.dropdown.control");d||c.data("factory.dropdown.control",d=new b(this))})},a.fn.factoryBootstrap446_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-dropdown").factoryBootstrap446_dropdownControl()})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.list.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
- !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.factoryBootstrap421_listControl=function(c){if("string"==typeof c){var d=a(this).data("factory.list.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.list.control");d||c.data("factory.list.control",d=new b(this))})},a.fn.factoryBootstrap421_listControl.Constructor=b,a(function(){a(".factory-bootstrap-421 .factory-list").factoryBootstrap421_listControl()})}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+ !function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.factoryBootstrap446_listControl=function(c){if("string"==typeof c){var d=a(this).data("factory.list.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.list.control");d||c.data("factory.list.control",d=new b(this))})},a.fn.factoryBootstrap446_listControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-list").factoryBootstrap446_listControl()})}(jQuery);
libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js CHANGED
@@ -1,10 +1,10 @@
1
- /*!
2
- * Bootstrap generator - v1.0.1, 2018-02-26
3
- * Webcraftic factory build
4
- *
5
- * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
- * Site: http://webcraftic.com
7
- * Support: http://webcraftic.com/contact-us/
8
- */
9
-
10
- !function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.factoryBootstrap421_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-421 .factory-multiple-textbox-group").factoryBootstrap421_MultipleTextboxControl()})}(jQuery);
1
+ /*!
2
+ * Bootstrap generator - v1.0.1, 2021-02-04
3
+ * Webcraftic factory build
4
+ *
5
+ * Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
6
+ * Site: http://webcraftic.com
7
+ * Support: http://webcraftic.com/contact-us/
8
+ */
9
+
10
+ !function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.factoryBootstrap446_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-446 .factory-multiple-textbox-group").factoryBootstrap446_MultipleTextboxControl()})}(jQuery);
libs/factory/bootstrap/boot.php CHANGED
@@ -1,46 +1,46 @@
1
- <?php
2
- /**
3
- * Factory Bootstrap
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>
6
- * @since 1.0.0
7
- * @package factory-bootstrap
8
- * @copyright (c) 2018, Webcraftic Ltd
9
- *
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- // module provides function only for the admin area
18
- if ( ! is_admin() ) {
19
- return;
20
- }
21
-
22
- if ( defined( 'FACTORY_BOOTSTRAP_421_LOADED' ) ) {
23
- return;
24
- }
25
-
26
- define( 'FACTORY_BOOTSTRAP_421_VERSION', '4.2.1' );
27
- define( 'FACTORY_BOOTSTRAP_421_LOADED', true );
28
-
29
- if ( ! defined( 'FACTORY_FLAT_ADMIN' ) ) {
30
- define( 'FACTORY_FLAT_ADMIN', true );
31
- }
32
-
33
- define( 'FACTORY_BOOTSTRAP_421_DIR', dirname( __FILE__ ) );
34
- define( 'FACTORY_BOOTSTRAP_421_URL', plugins_url( null, __FILE__ ) );
35
-
36
- require_once( FACTORY_BOOTSTRAP_421_DIR . '/includes/functions.php' );
37
-
38
- /**
39
- * @param Wbcr_Factory420_Plugin $plugin
40
- */
41
- add_action( 'wbcr_factory_bootstrap_421_plugin_created', function ( $plugin ) {
42
- $manager = new Wbcr_FactoryBootstrap421_Manager( $plugin );
43
- $plugin->setBootstap( $manager );
44
- } );
45
-
46
-
1
+ <?php
2
+ /**
3
+ * Factory Bootstrap
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
6
+ * @since 1.0.0
7
+ * @package factory-bootstrap
8
+ * @copyright (c) 2018, Webcraftic Ltd
9
+ *
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
+ exit;
15
+ }
16
+
17
+ // module provides function only for the admin area
18
+ if( !is_admin() ) {
19
+ return;
20
+ }
21
+
22
+ if( defined('FACTORY_BOOTSTRAP_446_LOADED') ) {
23
+ return;
24
+ }
25
+
26
+ define('FACTORY_BOOTSTRAP_446_VERSION', '4.4.6');
27
+ define('FACTORY_BOOTSTRAP_446_LOADED', true);
28
+
29
+ if( !defined('FACTORY_FLAT_ADMIN') ) {
30
+ define('FACTORY_FLAT_ADMIN', true);
31
+ }
32
+
33
+ define('FACTORY_BOOTSTRAP_446_DIR', dirname(__FILE__));
34
+ define('FACTORY_BOOTSTRAP_446_URL', plugins_url(null, __FILE__));
35
+
36
+ require_once(FACTORY_BOOTSTRAP_446_DIR . '/includes/functions.php');
37
+
38
+ /**
39
+ * @param Wbcr_Factory446_Plugin $plugin
40
+ */
41
+ add_action('wbcr_factory_bootstrap_446_plugin_created', function ($plugin) {
42
+ $manager = new Wbcr_FactoryBootstrap446_Manager($plugin);
43
+ $plugin->setBootstap($manager);
44
+ });
45
+
46
+
libs/factory/bootstrap/includes/functions.php CHANGED
@@ -1,286 +1,236 @@
1
- <?php
2
- /**
3
- * This file manages assets of the Factory Bootstap.
4
- *
5
- * @author Alex Kovalev <alex@byonepress.com>
6
- * @author Paul Kashtanoff <paul@byonepress.com>
7
- * @since 1.0.0
8
- * @package factory-bootstrap
9
- * @copyright (c) 2018, OnePress Ltd
10
- *
11
- */
12
-
13
- // Exit if accessed directly
14
- if ( ! defined( 'ABSPATH' ) ) {
15
- exit;
16
- }
17
-
18
- /**
19
- * The Bootstrap Manager class.
20
- *
21
- * @since 3.2.0
22
- */
23
- class Wbcr_FactoryBootstrap421_Manager {
24
-
25
- /**
26
- * A plugin for which the manager was created.
27
- *
28
- * @since 3.2.0
29
- * @var Wbcr_Factory420_Plugin
30
- */
31
- public $plugin;
32
-
33
- /**
34
- * Contains scripts to include.
35
- *
36
- * @since 3.2.0
37
- * @var string[]
38
- */
39
- public $scripts = [];
40
-
41
- /**
42
- * Contains styles to include.
43
- *
44
- * @since 3.2.0
45
- * @var string[]
46
- */
47
- public $styles = [];
48
-
49
- /**
50
- * Createas a new instance of the license api for a given plugin.
51
- *
52
- * @since 1.0.0
53
- */
54
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
55
- $this->plugin = $plugin;
56
-
57
- add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
58
- add_filter( 'admin_body_class', [ $this, 'adminBodyClass' ] );
59
- }
60
-
61
- /**
62
- * Includes the Bootstrap scripts.
63
- *
64
- * @since 3.2.0
65
- *
66
- * @param array|string $scripts
67
- */
68
- public function enqueueScript( $scripts ) {
69
- if ( is_array( $scripts ) ) {
70
- foreach ( $scripts as $script ) {
71
- if ( ! in_array( $script, $this->scripts ) ) {
72
- $this->scripts[] = $script;
73
- }
74
- }
75
- } else {
76
- if ( ! in_array( $scripts, $this->scripts ) ) {
77
- $this->scripts[] = $scripts;
78
- }
79
- }
80
- }
81
-
82
- /**
83
- * * Includes the Bootstrap styles.
84
- *
85
- * @since 3.2.0
86
- *
87
- * @param array|string $styles
88
- */
89
- public function enqueueStyle( $styles ) {
90
-
91
- if ( is_array( $styles ) ) {
92
- foreach ( $styles as $style ) {
93
- if ( ! in_array( $style, $this->styles ) ) {
94
- $this->styles[] = $style;
95
- }
96
- }
97
- } else {
98
- if ( ! in_array( $styles, $this->styles ) ) {
99
- $this->styles[] = $styles;
100
- }
101
- }
102
- }
103
-
104
- /**
105
- * Loads Bootstrap assets.
106
- *
107
- * @since 3.2.0
108
- * @return void
109
- * @see admin_enqueue_scripts
110
- *
111
- */
112
- public function loadAssets( $hook ) {
113
-
114
- do_action( 'wbcr_factory_420_bootstrap_enqueue_scripts', $hook );
115
- do_action( 'wbcr_factory_420_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
116
-
117
- $dependencies = [];
118
- if ( ! empty( $this->scripts ) ) {
119
- $dependencies[] = 'jquery';
120
- $dependencies[] = 'jquery-ui-core';
121
- $dependencies[] = 'jquery-ui-widget';
122
- }
123
-
124
- foreach ( $this->scripts as $script ) {
125
- switch ( $script ) {
126
- case 'plugin.iris':
127
- $dependencies[] = 'jquery-ui-widget';
128
- $dependencies[] = 'jquery-ui-slider';
129
- $dependencies[] = 'jquery-ui-draggable';
130
- break;
131
- }
132
- }
133
-
134
- if ( ! empty( $this->scripts ) ) {
135
- $this->enqueueScripts( $this->scripts, 'js', $dependencies );
136
- }
137
- if ( ! empty( $this->styles ) ) {
138
- $this->enqueueScripts( $this->styles, 'css', $dependencies );
139
- }
140
-
141
- $user_id = get_current_user_id();
142
- $color_name = get_user_meta( $user_id, 'admin_color', true );
143
-
144
- if ( $color_name !== 'fresh' ) {
145
- if ( file_exists( FACTORY_BOOTSTRAP_421_DIR . '/assets/flat/css/bootstrap.' . $color_name . '.css' ) ) {
146
- wp_enqueue_style( 'wbcr-factory-bootstrap-421-colors', FACTORY_BOOTSTRAP_421_URL . '/assets/flat/css/bootstrap.' . $color_name . '.css' );
147
- }
148
- }
149
-
150
- if ( $color_name == 'light' ) {
151
- $primary_dark = '#037c9a';
152
- $primary_light = '#04a4cc';
153
- } else if ( $color_name == 'blue' ) {
154
- $primary_dark = '#d39323';
155
- $primary_light = '#e1a948';
156
- } else if ( $color_name == 'coffee' ) {
157
- $primary_dark = '#b78a66';
158
- $primary_light = '#c7a589';
159
- } else if ( $color_name == 'ectoplasm' ) {
160
- $primary_dark = '#839237';
161
- $primary_light = '#a3b745';
162
- } else if ( $color_name == 'ocean' ) {
163
- $primary_dark = '#80a583';
164
- $primary_light = '#9ebaa0';
165
- } else if ( $color_name == 'midnight' ) {
166
- $primary_dark = '#d02a21';
167
- $primary_light = '#e14d43';
168
- } else if ( $color_name == 'sunrise' ) {
169
- $primary_dark = '#c36822';
170
- $primary_light = '#dd823b';
171
- } else {
172
- $primary_dark = '#0074a2';
173
- $primary_light = '#2ea2cc';
174
- }
175
-
176
- ?>
177
- <script>
178
- if( !window.factory ) {
179
- window.factory = {};
180
- }
181
- if( !window.factory.factoryBootstrap421 ) {
182
- window.factory.factoryBootstrap421 = {};
183
- }
184
- window.factory.factoryBootstrap421.colors = {
185
- primaryDark: '<?php echo $primary_dark ?>',
186
- primaryLight: '<?php echo $primary_light ?>'
187
- };
188
- </script>
189
- <?php
190
- }
191
-
192
- /**
193
- * @param array $sripts
194
- * @param string $type
195
- * @param array $dependencies
196
- */
197
- protected function enqueueScripts( array $sripts, $type = 'js', array $dependencies ) {
198
-
199
- $is_first = true;
200
-
201
- /**
202
- * Sets permission for file caching and combining into one file.
203
- *
204
- * @since 4.1.0
205
- */
206
- $cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
207
-
208
- $cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
209
- $cache_dir_path = FACTORY_BOOTSTRAP_421_DIR . '/assets/cache/';
210
- $cache_dir_url = FACTORY_BOOTSTRAP_421_URL . '/assets/cache/';
211
-
212
- $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
213
- $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
214
-
215
- if ( $cache_enable && file_exists( $cache_filepath ) ) {
216
- if ( $type == 'js' ) {
217
- wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
218
- } else {
219
- wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
220
- }
221
- } else {
222
- $cache_dir_exists = false;
223
- if ( ! file_exists( $cache_dir_path ) ) {
224
- if ( @mkdir( $cache_dir_path, 0755 ) && wp_is_writable( $cache_dir_path ) ) {
225
- $cache_dir_exists = true;
226
- }
227
- } else {
228
- if ( wp_is_writable( $cache_dir_path ) ) {
229
- $cache_dir_exists = true;
230
- }
231
- }
232
-
233
- $concat_files = [];
234
- foreach ( $sripts as $script_to_load ) {
235
- $script_to_load = sanitize_text_field( $script_to_load );
236
- if ( $cache_enable && $cache_dir_exists ) {
237
- $fname = FACTORY_BOOTSTRAP_421_DIR . "/assets/$type-min/$script_to_load.min." . $type;
238
- if ( file_exists( $fname ) ) {
239
- $f = @fopen( $fname, 'r' );
240
- $concat_files[] = @fread( $f, filesize( $fname ) );
241
- @fclose( $f );
242
- }
243
- } else {
244
- if ( $type == 'js' ) {
245
- wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
246
- } else {
247
- wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
248
- }
249
- $is_first = false;
250
- }
251
- }
252
-
253
- if ( $cache_enable && $cache_dir_exists && ! empty( $concat_files ) ) {
254
-
255
- $cf = @fopen( $cache_filepath, 'w' );
256
- $write_content = implode( PHP_EOL, $concat_files );
257
- @fwrite( $cf, $write_content );
258
- @fclose( $cf );
259
- chmod( $cache_filepath, 0755 );
260
-
261
- if ( file_exists( $cache_filepath ) ) {
262
- if ( $type == 'js' ) {
263
- wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
264
- } else {
265
- wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
266
- }
267
- }
268
- }
269
- }
270
- }
271
-
272
- /**
273
- * Adds the body classes: 'factory-flat or 'factory-volumetric'.
274
- *
275
- * @since 3.2.0
276
- *
277
- * @param string $classes
278
- *
279
- * @return string
280
- */
281
- public function adminBodyClass( $classes ) {
282
- $classes .= FACTORY_FLAT_ADMIN ? ' factory-flat ' : ' factory-volumetric ';
283
-
284
- return $classes;
285
- }
286
- }
1
+ <?php
2
+ /**
3
+ * This file manages assets of the Factory Bootstap.
4
+ *
5
+ * @author Alex Kovalev <alex@byonepress.com>
6
+ * @author Paul Kashtanoff <paul@byonepress.com>
7
+ * @since 1.0.0
8
+ * @package factory-bootstrap
9
+ * @copyright (c) 2018, OnePress Ltd
10
+ *
11
+ */
12
+
13
+ // Exit if accessed directly
14
+ if ( ! defined( 'ABSPATH' ) ) {
15
+ exit;
16
+ }
17
+
18
+ /**
19
+ * The Bootstrap Manager class.
20
+ *
21
+ * @since 3.2.0
22
+ */
23
+ class Wbcr_FactoryBootstrap446_Manager {
24
+
25
+ /**
26
+ * A plugin for which the manager was created.
27
+ *
28
+ * @since 3.2.0
29
+ * @var Wbcr_Factory446_Plugin
30
+ */
31
+ public $plugin;
32
+
33
+ /**
34
+ * Contains scripts to include.
35
+ *
36
+ * @since 3.2.0
37
+ * @var string[]
38
+ */
39
+ public $scripts = [];
40
+
41
+ /**
42
+ * Contains styles to include.
43
+ *
44
+ * @since 3.2.0
45
+ * @var string[]
46
+ */
47
+ public $styles = [];
48
+
49
+ /**
50
+ * Createas a new instance of the license api for a given plugin.
51
+ *
52
+ * @since 1.0.0
53
+ */
54
+ public function __construct( Wbcr_Factory446_Plugin $plugin ) {
55
+ $this->plugin = $plugin;
56
+
57
+ add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
58
+ add_filter( 'admin_body_class', [ $this, 'adminBodyClass' ] );
59
+ }
60
+
61
+ /**
62
+ * Includes the Bootstrap scripts.
63
+ *
64
+ * @since 3.2.0
65
+ *
66
+ * @param array|string $scripts
67
+ */
68
+ public function enqueueScript( $scripts ) {
69
+ if ( is_array( $scripts ) ) {
70
+ foreach ( $scripts as $script ) {
71
+ if ( ! in_array( $script, $this->scripts ) ) {
72
+ $this->scripts[] = $script;
73
+ }
74
+ }
75
+ } else {
76
+ if ( ! in_array( $scripts, $this->scripts ) ) {
77
+ $this->scripts[] = $scripts;
78
+ }
79
+ }
80
+ }
81
+
82
+ /**
83
+ * * Includes the Bootstrap styles.
84
+ *
85
+ * @since 3.2.0
86
+ *
87
+ * @param array|string $styles
88
+ */
89
+ public function enqueueStyle( $styles ) {
90
+
91
+ if ( is_array( $styles ) ) {
92
+ foreach ( $styles as $style ) {
93
+ if ( ! in_array( $style, $this->styles ) ) {
94
+ $this->styles[] = $style;
95
+ }
96
+ }
97
+ } else {
98
+ if ( ! in_array( $styles, $this->styles ) ) {
99
+ $this->styles[] = $styles;
100
+ }
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Loads Bootstrap assets.
106
+ *
107
+ * @since 3.2.0
108
+ * @return void
109
+ * @see admin_enqueue_scripts
110
+ *
111
+ */
112
+ public function loadAssets( $hook ) {
113
+
114
+ do_action( 'wbcr_factory_446_bootstrap_enqueue_scripts', $hook );
115
+ do_action( 'wbcr_factory_446_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
116
+
117
+ $dependencies = [];
118
+ if ( ! empty( $this->scripts ) ) {
119
+ $dependencies[] = 'jquery';
120
+ $dependencies[] = 'jquery-ui-core';
121
+ $dependencies[] = 'jquery-ui-widget';
122
+ }
123
+
124
+ foreach ( $this->scripts as $script ) {
125
+ switch ( $script ) {
126
+ case 'plugin.iris':
127
+ $dependencies[] = 'jquery-ui-widget';
128
+ $dependencies[] = 'jquery-ui-slider';
129
+ $dependencies[] = 'jquery-ui-draggable';
130
+ break;
131
+ }
132
+ }
133
+
134
+ if ( ! empty( $this->scripts ) ) {
135
+ $this->enqueueScripts( $this->scripts, 'js', $dependencies );
136
+ }
137
+ if ( ! empty( $this->styles ) ) {
138
+ $this->enqueueScripts( $this->styles, 'css', $dependencies );
139
+ }
140
+ }
141
+
142
+ /**
143
+ * @param array $scripts
144
+ * @param string $type
145
+ * @param array $dependencies
146
+ */
147
+ protected function enqueueScripts( array $scripts, $type, array $dependencies ) {
148
+
149
+ $is_first = true;
150
+
151
+ /**
152
+ * Sets permission for file caching and combining into one file.
153
+ *
154
+ * @since 4.1.0
155
+ */
156
+ $cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
157
+
158
+ $cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
159
+ $cache_dir_path = FACTORY_BOOTSTRAP_446_DIR . '/assets/cache/';
160
+ $cache_dir_url = FACTORY_BOOTSTRAP_446_URL . '/assets/cache/';
161
+
162
+ $cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
163
+ $cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
164
+
165
+ if ( $cache_enable && file_exists( $cache_filepath ) ) {
166
+ if ( $type == 'js' ) {
167
+ wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
168
+ } else {
169
+ wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
170
+ }
171
+ } else {
172
+ $cache_dir_exists = false;
173
+ if ( ! file_exists( $cache_dir_path ) ) {
174
+ if ( @mkdir( $cache_dir_path, 0755 ) && wp_is_writable( $cache_dir_path ) ) {
175
+ $cache_dir_exists = true;
176
+ }
177
+ } else {
178
+ if ( wp_is_writable( $cache_dir_path ) ) {
179
+ $cache_dir_exists = true;
180
+ }
181
+ }
182
+
183
+ $concat_files = [];
184
+ foreach ( $scripts as $script_to_load ) {
185
+ $script_to_load = sanitize_text_field( $script_to_load );
186
+ if ( $cache_enable && $cache_dir_exists ) {
187
+ $fname = FACTORY_BOOTSTRAP_446_DIR . "/assets/$type-min/$script_to_load.min." . $type;
188
+ if ( file_exists( $fname ) ) {
189
+ $f = @fopen( $fname, 'r' );
190
+ $concat_files[] = @fread( $f, filesize( $fname ) );
191
+ @fclose( $f );
192
+ }
193
+ } else {
194
+ if ( $type == 'js' ) {
195
+ wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_446_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
196
+ } else {
197
+ wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_446_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
198
+ }
199
+ $is_first = false;
200
+ }
201
+ }
202
+
203
+ if ( $cache_enable && $cache_dir_exists && ! empty( $concat_files ) ) {
204
+
205
+ $cf = @fopen( $cache_filepath, 'w' );
206
+ $write_content = implode( PHP_EOL, $concat_files );
207
+ @fwrite( $cf, $write_content );
208
+ @fclose( $cf );
209
+ chmod( $cache_filepath, 0755 );
210
+
211
+ if ( file_exists( $cache_filepath ) ) {
212
+ if ( $type == 'js' ) {
213
+ wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
214
+ } else {
215
+ wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Adds the body classes: 'factory-flat or 'factory-volumetric'.
224
+ *
225
+ * @since 3.2.0
226
+ *
227
+ * @param string $classes
228
+ *
229
+ * @return string
230
+ */
231
+ public function adminBodyClass( $classes ) {
232
+ $classes .= FACTORY_FLAT_ADMIN ? ' factory-flat ' : ' factory-volumetric ';
233
+
234
+ return $classes;
235
+ }
236
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/bootstrap/includes/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  // Silence is golden.
1
+ <?php
2
  // Silence is golden.
libs/factory/bootstrap/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  // Silence is golden.
1
+ <?php
2
  // Silence is golden.
libs/factory/bootstrap/package-lock.json ADDED
@@ -0,0 +1,1810 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "bootstrap-generator",
3
+ "version": "1.0.1",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "abbrev": {
8
+ "version": "1.1.1",
9
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
10
+ "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
11
+ },
12
+ "amdefine": {
13
+ "version": "1.0.1",
14
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
15
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
16
+ "dev": true
17
+ },
18
+ "argparse": {
19
+ "version": "0.1.16",
20
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
21
+ "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=",
22
+ "dev": true,
23
+ "requires": {
24
+ "underscore": "~1.7.0",
25
+ "underscore.string": "~2.4.0"
26
+ },
27
+ "dependencies": {
28
+ "underscore.string": {
29
+ "version": "2.4.0",
30
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
31
+ "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
32
+ "dev": true
33
+ }
34
+ }
35
+ },
36
+ "arr-diff": {
37
+ "version": "4.0.0",
38
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
39
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
40
+ },
41
+ "arr-flatten": {
42
+ "version": "1.1.0",
43
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
44
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
45
+ },
46
+ "arr-union": {
47
+ "version": "3.1.0",
48
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
49
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
50
+ },
51
+ "array-each": {
52
+ "version": "1.0.1",
53
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
54
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
55
+ },
56
+ "array-slice": {
57
+ "version": "1.1.0",
58
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
59
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
60
+ },
61
+ "array-unique": {
62
+ "version": "0.3.2",
63
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
64
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
65
+ },
66
+ "assign-symbols": {
67
+ "version": "1.0.0",
68
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
69
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
70
+ },
71
+ "async": {
72
+ "version": "0.1.22",
73
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
74
+ "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
75
+ "dev": true
76
+ },
77
+ "atob": {
78
+ "version": "2.1.2",
79
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
80
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
81
+ },
82
+ "base": {
83
+ "version": "0.11.2",
84
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
85
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
86
+ "requires": {
87
+ "cache-base": "^1.0.1",
88
+ "class-utils": "^0.3.5",
89
+ "component-emitter": "^1.2.1",
90
+ "define-property": "^1.0.0",
91
+ "isobject": "^3.0.1",
92
+ "mixin-deep": "^1.2.0",
93
+ "pascalcase": "^0.1.1"
94
+ },
95
+ "dependencies": {
96
+ "define-property": {
97
+ "version": "1.0.0",
98
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
99
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
100
+ "requires": {
101
+ "is-descriptor": "^1.0.0"
102
+ }
103
+ },
104
+ "is-accessor-descriptor": {
105
+ "version": "1.0.0",
106
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
107
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
108
+ "requires": {
109
+ "kind-of": "^6.0.0"
110
+ }
111
+ },
112
+ "is-data-descriptor": {
113
+ "version": "1.0.0",
114
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
115
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
116
+ "requires": {
117
+ "kind-of": "^6.0.0"
118
+ }
119
+ },
120
+ "is-descriptor": {
121
+ "version": "1.0.2",
122
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
123
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
124
+ "requires": {
125
+ "is-accessor-descriptor": "^1.0.0",
126
+ "is-data-descriptor": "^1.0.0",
127
+ "kind-of": "^6.0.2"
128
+ }
129
+ }
130
+ }
131
+ },
132
+ "braces": {
133
+ "version": "2.3.2",
134
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
135
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
136
+ "requires": {
137
+ "arr-flatten": "^1.1.0",
138
+ "array-unique": "^0.3.2",
139
+ "extend-shallow": "^2.0.1",
140
+ "fill-range": "^4.0.0",
141
+ "isobject": "^3.0.1",
142
+ "repeat-element": "^1.1.2",
143
+ "snapdragon": "^0.8.1",
144
+ "snapdragon-node": "^2.0.1",
145
+ "split-string": "^3.0.2",
146
+ "to-regex": "^3.0.1"
147
+ },
148
+ "dependencies": {
149
+ "extend-shallow": {
150
+ "version": "2.0.1",
151
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
152
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
153
+ "requires": {
154
+ "is-extendable": "^0.1.0"
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "cache-base": {
160
+ "version": "1.0.1",
161
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
162
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
163
+ "requires": {
164
+ "collection-visit": "^1.0.0",
165
+ "component-emitter": "^1.2.1",
166
+ "get-value": "^2.0.6",
167
+ "has-value": "^1.0.0",
168
+ "isobject": "^3.0.1",
169
+ "set-value": "^2.0.0",
170
+ "to-object-path": "^0.3.0",
171
+ "union-value": "^1.0.0",
172
+ "unset-value": "^1.0.0"
173
+ }
174
+ },
175
+ "camelcase": {
176
+ "version": "1.2.1",
177
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
178
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
179
+ "dev": true
180
+ },
181
+ "class-utils": {
182
+ "version": "0.3.6",
183
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
184
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
185
+ "requires": {
186
+ "arr-union": "^3.1.0",
187
+ "define-property": "^0.2.5",
188
+ "isobject": "^3.0.0",
189
+ "static-extend": "^0.1.1"
190
+ },
191
+ "dependencies": {
192
+ "define-property": {
193
+ "version": "0.2.5",
194
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
195
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
196
+ "requires": {
197
+ "is-descriptor": "^0.1.0"
198
+ }
199
+ }
200
+ }
201
+ },
202
+ "clean-css": {
203
+ "version": "2.0.8",
204
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.0.8.tgz",
205
+ "integrity": "sha1-6TfN/cxXgaAIF67EB56Fs+wVeiA=",
206
+ "dev": true,
207
+ "requires": {
208
+ "commander": "2.0.x"
209
+ }
210
+ },
211
+ "cli": {
212
+ "version": "0.4.5",
213
+ "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz",
214
+ "integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=",
215
+ "dev": true,
216
+ "requires": {
217
+ "glob": ">= 3.1.4"
218
+ }
219
+ },
220
+ "coffee-script": {
221
+ "version": "1.3.3",
222
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz",
223
+ "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=",
224
+ "dev": true
225
+ },
226
+ "collection-visit": {
227
+ "version": "1.0.0",
228
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
229
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
230
+ "requires": {
231
+ "map-visit": "^1.0.0",
232
+ "object-visit": "^1.0.0"
233
+ }
234
+ },
235
+ "colors": {
236
+ "version": "0.6.2",
237
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
238
+ "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
239
+ "dev": true
240
+ },
241
+ "commander": {
242
+ "version": "2.0.0",
243
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz",
244
+ "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=",
245
+ "dev": true
246
+ },
247
+ "component-emitter": {
248
+ "version": "1.3.0",
249
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
250
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
251
+ },
252
+ "console-browserify": {
253
+ "version": "0.1.6",
254
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz",
255
+ "integrity": "sha1-0SijwLuINQ61YmxufHGm8P1ImDw=",
256
+ "dev": true
257
+ },
258
+ "copy-descriptor": {
259
+ "version": "0.1.1",
260
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
261
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
262
+ },
263
+ "dateformat": {
264
+ "version": "1.0.2-1.2.3",
265
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz",
266
+ "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=",
267
+ "dev": true
268
+ },
269
+ "debug": {
270
+ "version": "2.6.9",
271
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
272
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
273
+ "requires": {
274
+ "ms": "2.0.0"
275
+ }
276
+ },
277
+ "decamelize": {
278
+ "version": "1.2.0",
279
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
280
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
281
+ "dev": true
282
+ },
283
+ "decode-uri-component": {
284
+ "version": "0.2.0",
285
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
286
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
287
+ },
288
+ "define-property": {
289
+ "version": "2.0.2",
290
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
291
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
292
+ "requires": {
293
+ "is-descriptor": "^1.0.2",
294
+ "isobject": "^3.0.1"
295
+ },
296
+ "dependencies": {
297
+ "is-accessor-descriptor": {
298
+ "version": "1.0.0",
299
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
300
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
301
+ "requires": {
302
+ "kind-of": "^6.0.0"
303
+ }
304
+ },
305
+ "is-data-descriptor": {
306
+ "version": "1.0.0",
307
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
308
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
309
+ "requires": {
310
+ "kind-of": "^6.0.0"
311
+ }
312
+ },
313
+ "is-descriptor": {
314
+ "version": "1.0.2",
315
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
316
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
317
+ "requires": {
318
+ "is-accessor-descriptor": "^1.0.0",
319
+ "is-data-descriptor": "^1.0.0",
320
+ "kind-of": "^6.0.2"
321
+ }
322
+ }
323
+ }
324
+ },
325
+ "detect-file": {
326
+ "version": "1.0.0",
327
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
328
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
329
+ },
330
+ "esprima": {
331
+ "version": "1.0.4",
332
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
333
+ "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=",
334
+ "dev": true
335
+ },
336
+ "eventemitter2": {
337
+ "version": "0.4.14",
338
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
339
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
340
+ "dev": true
341
+ },
342
+ "exit": {
343
+ "version": "0.1.2",
344
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
345
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
346
+ "dev": true
347
+ },
348
+ "expand-brackets": {
349
+ "version": "2.1.4",
350
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
351
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
352
+ "requires": {
353
+ "debug": "^2.3.3",
354
+ "define-property": "^0.2.5",
355
+ "extend-shallow": "^2.0.1",
356
+ "posix-character-classes": "^0.1.0",
357
+ "regex-not": "^1.0.0",
358
+ "snapdragon": "^0.8.1",
359
+ "to-regex": "^3.0.1"
360
+ },
361
+ "dependencies": {
362
+ "define-property": {
363
+ "version": "0.2.5",
364
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
365
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
366
+ "requires": {
367
+ "is-descriptor": "^0.1.0"
368
+ }
369
+ },
370
+ "extend-shallow": {
371
+ "version": "2.0.1",
372
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
373
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
374
+ "requires": {
375
+ "is-extendable": "^0.1.0"
376
+ }
377
+ }
378
+ }
379
+ },
380
+ "expand-tilde": {
381
+ "version": "2.0.2",
382
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
383
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
384
+ "requires": {
385
+ "homedir-polyfill": "^1.0.1"
386
+ }
387
+ },
388
+ "extend": {
389
+ "version": "3.0.2",
390
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
391
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
392
+ },
393
+ "extend-shallow": {
394
+ "version": "3.0.2",
395
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
396
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
397
+ "requires": {
398
+ "assign-symbols": "^1.0.0",
399
+ "is-extendable": "^1.0.1"
400
+ },
401
+ "dependencies": {
402
+ "is-extendable": {
403
+ "version": "1.0.1",
404
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
405
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
406
+ "requires": {
407
+ "is-plain-object": "^2.0.4"
408
+ }
409
+ }
410
+ }
411
+ },
412
+ "extglob": {
413
+ "version": "2.0.4",
414
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
415
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
416
+ "requires": {
417
+ "array-unique": "^0.3.2",
418
+ "define-property": "^1.0.0",
419
+ "expand-brackets": "^2.1.4",
420
+ "extend-shallow": "^2.0.1",
421
+ "fragment-cache": "^0.2.1",
422
+ "regex-not": "^1.0.0",
423
+ "snapdragon": "^0.8.1",
424
+ "to-regex": "^3.0.1"
425
+ },
426
+ "dependencies": {
427
+ "define-property": {
428
+ "version": "1.0.0",
429
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
430
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
431
+ "requires": {
432
+ "is-descriptor": "^1.0.0"
433
+ }
434
+ },
435
+ "extend-shallow": {
436
+ "version": "2.0.1",
437
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
438
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
439
+ "requires": {
440
+ "is-extendable": "^0.1.0"
441
+ }
442
+ },
443
+ "is-accessor-descriptor": {
444
+ "version": "1.0.0",
445
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
446
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
447
+ "requires": {
448
+ "kind-of": "^6.0.0"
449
+ }
450
+ },
451
+ "is-data-descriptor": {
452
+ "version": "1.0.0",
453
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
454
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
455
+ "requires": {
456
+ "kind-of": "^6.0.0"
457
+ }
458
+ },
459
+ "is-descriptor": {
460
+ "version": "1.0.2",
461
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
462
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
463
+ "requires": {
464
+ "is-accessor-descriptor": "^1.0.0",
465
+ "is-data-descriptor": "^1.0.0",
466
+ "kind-of": "^6.0.2"
467
+ }
468
+ }
469
+ }
470
+ },
471
+ "fill-range": {
472
+ "version": "4.0.0",
473
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
474
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
475
+ "requires": {
476
+ "extend-shallow": "^2.0.1",
477
+ "is-number": "^3.0.0",
478
+ "repeat-string": "^1.6.1",
479
+ "to-regex-range": "^2.1.0"
480
+ },
481
+ "dependencies": {
482
+ "extend-shallow": {
483
+ "version": "2.0.1",
484
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
485
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
486
+ "requires": {
487
+ "is-extendable": "^0.1.0"
488
+ }
489
+ }
490
+ }
491
+ },
492
+ "findup-sync": {
493
+ "version": "0.1.3",
494
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
495
+ "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=",
496
+ "dev": true,
497
+ "requires": {
498
+ "glob": "~3.2.9",
499
+ "lodash": "~2.4.1"
500
+ },
501
+ "dependencies": {
502
+ "glob": {
503
+ "version": "3.2.11",
504
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
505
+ "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=",
506
+ "dev": true,
507
+ "requires": {
508
+ "inherits": "2",
509
+ "minimatch": "0.3"
510
+ }
511
+ },
512
+ "lodash": {
513
+ "version": "2.4.2",
514
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
515
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
516
+ "dev": true
517
+ },
518
+ "minimatch": {
519
+ "version": "0.3.0",
520
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
521
+ "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=",
522
+ "dev": true,
523
+ "requires": {
524
+ "lru-cache": "2",
525
+ "sigmund": "~1.0.0"
526
+ }
527
+ }
528
+ }
529
+ },
530
+ "fined": {
531
+ "version": "1.2.0",
532
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
533
+ "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
534
+ "requires": {
535
+ "expand-tilde": "^2.0.2",
536
+ "is-plain-object": "^2.0.3",
537
+ "object.defaults": "^1.1.0",
538
+ "object.pick": "^1.2.0",
539
+ "parse-filepath": "^1.0.1"
540
+ }
541
+ },
542
+ "flagged-respawn": {
543
+ "version": "1.0.1",
544
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
545
+ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q=="
546
+ },
547
+ "for-in": {
548
+ "version": "1.0.2",
549
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
550
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
551
+ },
552
+ "for-own": {
553
+ "version": "1.0.0",
554
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
555
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
556
+ "requires": {
557
+ "for-in": "^1.0.1"
558
+ }
559
+ },
560
+ "fragment-cache": {
561
+ "version": "0.2.1",
562
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
563
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
564
+ "requires": {
565
+ "map-cache": "^0.2.2"
566
+ }
567
+ },
568
+ "function-bind": {
569
+ "version": "1.1.1",
570
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
571
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
572
+ },
573
+ "get-value": {
574
+ "version": "2.0.6",
575
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
576
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
577
+ },
578
+ "getobject": {
579
+ "version": "0.1.0",
580
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
581
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
582
+ "dev": true
583
+ },
584
+ "glob": {
585
+ "version": "3.1.21",
586
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
587
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
588
+ "dev": true,
589
+ "requires": {
590
+ "graceful-fs": "~1.2.0",
591
+ "inherits": "1",
592
+ "minimatch": "~0.2.11"
593
+ },
594
+ "dependencies": {
595
+ "inherits": {
596
+ "version": "1.0.2",
597
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
598
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
599
+ "dev": true
600
+ }
601
+ }
602
+ },
603
+ "global-modules": {
604
+ "version": "1.0.0",
605
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
606
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
607
+ "requires": {
608
+ "global-prefix": "^1.0.1",
609
+ "is-windows": "^1.0.1",
610
+ "resolve-dir": "^1.0.0"
611
+ }
612
+ },
613
+ "global-prefix": {
614
+ "version": "1.0.2",
615
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
616
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
617
+ "requires": {
618
+ "expand-tilde": "^2.0.2",
619
+ "homedir-polyfill": "^1.0.1",
620
+ "ini": "^1.3.4",
621
+ "is-windows": "^1.0.1",
622
+ "which": "^1.2.14"
623
+ },
624
+ "dependencies": {
625
+ "which": {
626
+ "version": "1.3.1",
627
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
628
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
629
+ "requires": {
630
+ "isexe": "^2.0.0"
631
+ }
632
+ }
633
+ }
634
+ },
635
+ "graceful-fs": {
636
+ "version": "1.2.3",
637
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
638
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
639
+ "dev": true
640
+ },
641
+ "grunt": {
642
+ "version": "0.4.5",
643
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
644
+ "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
645
+ "dev": true,
646
+ "requires": {
647
+ "async": "~0.1.22",
648
+ "coffee-script": "~1.3.3",
649
+ "colors": "~0.6.2",
650
+ "dateformat": "1.0.2-1.2.3",
651
+ "eventemitter2": "~0.4.13",
652
+ "exit": "~0.1.1",
653
+ "findup-sync": "~0.1.2",
654
+ "getobject": "~0.1.0",
655
+ "glob": "~3.1.21",
656
+ "grunt-legacy-log": "~0.1.0",
657
+ "grunt-legacy-util": "~0.2.0",
658
+ "hooker": "~0.2.3",
659
+ "iconv-lite": "~0.2.11",
660
+ "js-yaml": "~2.0.5",
661
+ "lodash": "~0.9.2",
662
+ "minimatch": "~0.2.12",
663
+ "nopt": "~1.0.10",
664
+ "rimraf": "~2.2.8",
665
+ "underscore.string": "~2.2.1",
666
+ "which": "~1.0.5"
667
+ }
668
+ },
669
+ "grunt-cli": {
670
+ "version": "1.3.2",
671
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
672
+ "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
673
+ "requires": {
674
+ "grunt-known-options": "~1.1.0",
675
+ "interpret": "~1.1.0",
676
+ "liftoff": "~2.5.0",
677
+ "nopt": "~4.0.1",
678
+ "v8flags": "~3.1.1"
679
+ },
680
+ "dependencies": {
681
+ "nopt": {
682
+ "version": "4.0.3",
683
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
684
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
685
+ "requires": {
686
+ "abbrev": "1",
687
+ "osenv": "^0.1.4"
688
+ }
689
+ }
690
+ }
691
+ },
692
+ "grunt-contrib-clean": {
693
+ "version": "0.5.0",
694
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz",
695
+ "integrity": "sha1-9T397ghJsce0Dp67umn0jExgecU=",
696
+ "dev": true,
697
+ "requires": {
698
+ "rimraf": "~2.2.1"
699
+ }
700
+ },
701
+ "grunt-contrib-concat": {
702
+ "version": "0.3.0",
703
+ "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.3.0.tgz",
704
+ "integrity": "sha1-SPoNQzbSm2U62CJaa9b4VrRIPjI=",
705
+ "dev": true
706
+ },
707
+ "grunt-contrib-copy": {
708
+ "version": "0.5.0",
709
+ "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.5.0.tgz",
710
+ "integrity": "sha1-QQB1rEWlhWuhkbHMclclRQ1KAhU=",
711
+ "dev": true
712
+ },
713
+ "grunt-contrib-cssmin": {
714
+ "version": "0.7.0",
715
+ "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.7.0.tgz",
716
+ "integrity": "sha1-pXNenx0mMUnkn+A1KU5CnYxnC6s=",
717
+ "dev": true,
718
+ "requires": {
719
+ "clean-css": "~2.0.0",
720
+ "grunt-lib-contrib": "~0.6.0"
721
+ }
722
+ },
723
+ "grunt-contrib-jshint": {
724
+ "version": "0.6.5",
725
+ "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.6.5.tgz",
726
+ "integrity": "sha1-OvtGdnRTZMxKGe7nk0wOBgCLVm4=",
727
+ "dev": true,
728
+ "requires": {
729
+ "jshint": "~2.1.10"
730
+ }
731
+ },
732
+ "grunt-contrib-uglify": {
733
+ "version": "0.2.7",
734
+ "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz",
735
+ "integrity": "sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=",
736
+ "dev": true,
737
+ "requires": {
738
+ "grunt-lib-contrib": "~0.6.1",
739
+ "uglify-js": "~2.4.0"
740
+ }
741
+ },
742
+ "grunt-known-options": {
743
+ "version": "1.1.1",
744
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
745
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ=="
746
+ },
747
+ "grunt-legacy-log": {
748
+ "version": "0.1.3",
749
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz",
750
+ "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=",
751
+ "dev": true,
752
+ "requires": {
753
+ "colors": "~0.6.2",
754
+ "grunt-legacy-log-utils": "~0.1.1",
755
+ "hooker": "~0.2.3",
756
+ "lodash": "~2.4.1",
757
+ "underscore.string": "~2.3.3"
758
+ },
759
+ "dependencies": {
760
+ "lodash": {
761
+ "version": "2.4.2",
762
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
763
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
764
+ "dev": true
765
+ },
766
+ "underscore.string": {
767
+ "version": "2.3.3",
768
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
769
+ "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
770
+ "dev": true
771
+ }
772
+ }
773
+ },
774
+ "grunt-legacy-log-utils": {
775
+ "version": "0.1.1",
776
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz",
777
+ "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=",
778
+ "dev": true,
779
+ "requires": {
780
+ "colors": "~0.6.2",
781
+ "lodash": "~2.4.1",
782
+ "underscore.string": "~2.3.3"
783
+ },
784
+ "dependencies": {
785
+ "lodash": {
786
+ "version": "2.4.2",
787
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
788
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
789
+ "dev": true
790
+ },
791
+ "underscore.string": {
792
+ "version": "2.3.3",
793
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
794
+ "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
795
+ "dev": true
796
+ }
797
+ }
798
+ },
799
+ "grunt-legacy-util": {
800
+ "version": "0.2.0",
801
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
802
+ "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=",
803
+ "dev": true,
804
+ "requires": {
805
+ "async": "~0.1.22",
806
+ "exit": "~0.1.1",
807
+ "getobject": "~0.1.0",
808
+ "hooker": "~0.2.3",
809
+ "lodash": "~0.9.2",
810
+ "underscore.string": "~2.2.1",
811
+ "which": "~1.0.5"
812
+ }
813
+ },
814
+ "grunt-lib-contrib": {
815
+ "version": "0.6.1",
816
+ "resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz",
817
+ "integrity": "sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=",
818
+ "dev": true,
819
+ "requires": {
820
+ "zlib-browserify": "0.0.1"
821
+ }
822
+ },
823
+ "grunt-preprocess": {
824
+ "version": "4.2.0",
825
+ "resolved": "https://registry.npmjs.org/grunt-preprocess/-/grunt-preprocess-4.2.0.tgz",
826
+ "integrity": "sha1-SJUTzet1A1NEmn9lbVAXWvc/FfY=",
827
+ "dev": true,
828
+ "requires": {
829
+ "preprocess": "~2.3.1"
830
+ }
831
+ },
832
+ "has": {
833
+ "version": "1.0.3",
834
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
835
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
836
+ "requires": {
837
+ "function-bind": "^1.1.1"
838
+ }
839
+ },
840
+ "has-value": {
841
+ "version": "1.0.0",
842
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
843
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
844
+ "requires": {
845
+ "get-value": "^2.0.6",
846
+ "has-values": "^1.0.0",
847
+ "isobject": "^3.0.0"
848
+ }
849
+ },
850
+ "has-values": {
851
+ "version": "1.0.0",
852
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
853
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
854
+ "requires": {
855
+ "is-number": "^3.0.0",
856
+ "kind-of": "^4.0.0"
857
+ },
858
+ "dependencies": {
859
+ "kind-of": {
860
+ "version": "4.0.0",
861
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
862
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
863
+ "requires": {
864
+ "is-buffer": "^1.1.5"
865
+ }
866
+ }
867
+ }
868
+ },
869
+ "homedir-polyfill": {
870
+ "version": "1.0.3",
871
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
872
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
873
+ "requires": {
874
+ "parse-passwd": "^1.0.0"
875
+ }
876
+ },
877
+ "hooker": {
878
+ "version": "0.2.3",
879
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
880
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
881
+ "dev": true
882
+ },
883
+ "iconv-lite": {
884
+ "version": "0.2.11",
885
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
886
+ "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
887
+ "dev": true
888
+ },
889
+ "inherits": {
890
+ "version": "2.0.3",
891
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
892
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
893
+ "dev": true
894
+ },
895
+ "ini": {
896
+ "version": "1.3.5",
897
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
898
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
899
+ },
900
+ "interpret": {
901
+ "version": "1.1.0",
902
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
903
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
904
+ },
905
+ "is-absolute": {
906
+ "version": "1.0.0",
907
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
908
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
909
+ "requires": {
910
+ "is-relative": "^1.0.0",
911
+ "is-windows": "^1.0.1"
912
+ }
913
+ },
914
+ "is-accessor-descriptor": {
915
+ "version": "0.1.6",
916
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
917
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
918
+ "requires": {
919
+ "kind-of": "^3.0.2"
920
+ },
921
+ "dependencies": {
922
+ "kind-of": {
923
+ "version": "3.2.2",
924
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
925
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
926
+ "requires": {
927
+ "is-buffer": "^1.1.5"
928
+ }
929
+ }
930
+ }
931
+ },
932
+ "is-buffer": {
933
+ "version": "1.1.6",
934
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
935
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
936
+ },
937
+ "is-core-module": {
938
+ "version": "2.1.0",
939
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
940
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
941
+ "requires": {
942
+ "has": "^1.0.3"
943
+ }
944
+ },
945
+ "is-data-descriptor": {
946
+ "version": "0.1.4",
947
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
948
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
949
+ "requires": {
950
+ "kind-of": "^3.0.2"
951
+ },
952
+ "dependencies": {
953
+ "kind-of": {
954
+ "version": "3.2.2",
955
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
956
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
957
+ "requires": {
958
+ "is-buffer": "^1.1.5"
959
+ }
960
+ }
961
+ }
962
+ },
963
+ "is-descriptor": {
964
+ "version": "0.1.6",
965
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
966
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
967
+ "requires": {
968
+ "is-accessor-descriptor": "^0.1.6",
969
+ "is-data-descriptor": "^0.1.4",
970
+ "kind-of": "^5.0.0"
971
+ },
972
+ "dependencies": {
973
+ "kind-of": {
974
+ "version": "5.1.0",
975
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
976
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
977
+ }
978
+ }
979
+ },
980
+ "is-extendable": {
981
+ "version": "0.1.1",
982
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
983
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
984
+ },
985
+ "is-extglob": {
986
+ "version": "2.1.1",
987
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
988
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
989
+ },
990
+ "is-glob": {
991
+ "version": "3.1.0",
992
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
993
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
994
+ "requires": {
995
+ "is-extglob": "^2.1.0"
996
+ }
997
+ },
998
+ "is-number": {
999
+ "version": "3.0.0",
1000
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
1001
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
1002
+ "requires": {
1003
+ "kind-of": "^3.0.2"
1004
+ },
1005
+ "dependencies": {
1006
+ "kind-of": {
1007
+ "version": "3.2.2",
1008
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1009
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1010
+ "requires": {
1011
+ "is-buffer": "^1.1.5"
1012
+ }
1013
+ }
1014
+ }
1015
+ },
1016
+ "is-plain-object": {
1017
+ "version": "2.0.4",
1018
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
1019
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
1020
+ "requires": {
1021
+ "isobject": "^3.0.1"
1022
+ }
1023
+ },
1024
+ "is-relative": {
1025
+ "version": "1.0.0",
1026
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
1027
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
1028
+ "requires": {
1029
+ "is-unc-path": "^1.0.0"
1030
+ }
1031
+ },
1032
+ "is-unc-path": {
1033
+ "version": "1.0.0",
1034
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
1035
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
1036
+ "requires": {
1037
+ "unc-path-regex": "^0.1.2"
1038
+ }
1039
+ },
1040
+ "is-windows": {
1041
+ "version": "1.0.2",
1042
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
1043
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
1044
+ },
1045
+ "isarray": {
1046
+ "version": "1.0.0",
1047
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1048
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1049
+ },
1050
+ "isexe": {
1051
+ "version": "2.0.0",
1052
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1053
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
1054
+ },
1055
+ "isobject": {
1056
+ "version": "3.0.1",
1057
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
1058
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
1059
+ },
1060
+ "js-yaml": {
1061
+ "version": "2.0.5",
1062
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz",
1063
+ "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=",
1064
+ "dev": true,
1065
+ "requires": {
1066
+ "argparse": "~ 0.1.11",
1067
+ "esprima": "~ 1.0.2"
1068
+ }
1069
+ },
1070
+ "jshint": {
1071
+ "version": "2.1.11",
1072
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz",
1073
+ "integrity": "sha1-61EI/vm6Xd67gwmD9XLSQuSeP5Y=",
1074
+ "dev": true,
1075
+ "requires": {
1076
+ "cli": "0.4.x",
1077
+ "console-browserify": "0.1.x",
1078
+ "minimatch": "0.x.x",
1079
+ "shelljs": "0.1.x",
1080
+ "underscore": "1.4.x"
1081
+ },
1082
+ "dependencies": {
1083
+ "underscore": {
1084
+ "version": "1.4.4",
1085
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
1086
+ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
1087
+ "dev": true
1088
+ }
1089
+ }
1090
+ },
1091
+ "kind-of": {
1092
+ "version": "6.0.3",
1093
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
1094
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
1095
+ },
1096
+ "liftoff": {
1097
+ "version": "2.5.0",
1098
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
1099
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
1100
+ "requires": {
1101
+ "extend": "^3.0.0",
1102
+ "findup-sync": "^2.0.0",
1103
+ "fined": "^1.0.1",
1104
+ "flagged-respawn": "^1.0.0",
1105
+ "is-plain-object": "^2.0.4",
1106
+ "object.map": "^1.0.0",
1107
+ "rechoir": "^0.6.2",
1108
+ "resolve": "^1.1.7"
1109
+ },
1110
+ "dependencies": {
1111
+ "findup-sync": {
1112
+ "version": "2.0.0",
1113
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
1114
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
1115
+ "requires": {
1116
+ "detect-file": "^1.0.0",
1117
+ "is-glob": "^3.1.0",
1118
+ "micromatch": "^3.0.4",
1119
+ "resolve-dir": "^1.0.1"
1120
+ }
1121
+ }
1122
+ }
1123
+ },
1124
+ "lodash": {
1125
+ "version": "0.9.2",
1126
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
1127
+ "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
1128
+ "dev": true
1129
+ },
1130
+ "lru-cache": {
1131
+ "version": "2.7.3",
1132
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
1133
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
1134
+ "dev": true
1135
+ },
1136
+ "make-iterator": {
1137
+ "version": "1.0.1",
1138
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
1139
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
1140
+ "requires": {
1141
+ "kind-of": "^6.0.2"
1142
+ }
1143
+ },
1144
+ "map-cache": {
1145
+ "version": "0.2.2",
1146
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
1147
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
1148
+ },
1149
+ "map-visit": {
1150
+ "version": "1.0.0",
1151
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
1152
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
1153
+ "requires": {
1154
+ "object-visit": "^1.0.0"
1155
+ }
1156
+ },
1157
+ "micromatch": {
1158
+ "version": "3.1.10",
1159
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
1160
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
1161
+ "requires": {
1162
+ "arr-diff": "^4.0.0",
1163
+ "array-unique": "^0.3.2",
1164
+ "braces": "^2.3.1",
1165
+ "define-property": "^2.0.2",
1166
+ "extend-shallow": "^3.0.2",
1167
+ "extglob": "^2.0.4",
1168
+ "fragment-cache": "^0.2.1",
1169
+ "kind-of": "^6.0.2",
1170
+ "nanomatch": "^1.2.9",
1171
+ "object.pick": "^1.3.0",
1172
+ "regex-not": "^1.0.0",
1173
+ "snapdragon": "^0.8.1",
1174
+ "to-regex": "^3.0.2"
1175
+ }
1176
+ },
1177
+ "minimatch": {
1178
+ "version": "0.2.14",
1179
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
1180
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
1181
+ "dev": true,
1182
+ "requires": {
1183
+ "lru-cache": "2",
1184
+ "sigmund": "~1.0.0"
1185
+ }
1186
+ },
1187
+ "mixin-deep": {
1188
+ "version": "1.3.2",
1189
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
1190
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
1191
+ "requires": {
1192
+ "for-in": "^1.0.2",
1193
+ "is-extendable": "^1.0.1"
1194
+ },
1195
+ "dependencies": {
1196
+ "is-extendable": {
1197
+ "version": "1.0.1",
1198
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1199
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1200
+ "requires": {
1201
+ "is-plain-object": "^2.0.4"
1202
+ }
1203
+ }
1204
+ }
1205
+ },
1206
+ "ms": {
1207
+ "version": "2.0.0",
1208
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1209
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1210
+ },
1211
+ "nanomatch": {
1212
+ "version": "1.2.13",
1213
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
1214
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
1215
+ "requires": {
1216
+ "arr-diff": "^4.0.0",
1217
+ "array-unique": "^0.3.2",
1218
+ "define-property": "^2.0.2",
1219
+ "extend-shallow": "^3.0.2",
1220
+ "fragment-cache": "^0.2.1",
1221
+ "is-windows": "^1.0.2",
1222
+ "kind-of": "^6.0.2",
1223
+ "object.pick": "^1.3.0",
1224
+ "regex-not": "^1.0.0",
1225
+ "snapdragon": "^0.8.1",
1226
+ "to-regex": "^3.0.1"
1227
+ }
1228
+ },
1229
+ "nopt": {
1230
+ "version": "1.0.10",
1231
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1232
+ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1233
+ "dev": true,
1234
+ "requires": {
1235
+ "abbrev": "1"
1236
+ }
1237
+ },
1238
+ "object-copy": {
1239
+ "version": "0.1.0",
1240
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
1241
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
1242
+ "requires": {
1243
+ "copy-descriptor": "^0.1.0",
1244
+ "define-property": "^0.2.5",
1245
+ "kind-of": "^3.0.3"
1246
+ },
1247
+ "dependencies": {
1248
+ "define-property": {
1249
+ "version": "0.2.5",
1250
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1251
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1252
+ "requires": {
1253
+ "is-descriptor": "^0.1.0"
1254
+ }
1255
+ },
1256
+ "kind-of": {
1257
+ "version": "3.2.2",
1258
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1259
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1260
+ "requires": {
1261
+ "is-buffer": "^1.1.5"
1262
+ }
1263
+ }
1264
+ }
1265
+ },
1266
+ "object-visit": {
1267
+ "version": "1.0.1",
1268
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
1269
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
1270
+ "requires": {
1271
+ "isobject": "^3.0.0"
1272
+ }
1273
+ },
1274
+ "object.defaults": {
1275
+ "version": "1.1.0",
1276
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
1277
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
1278
+ "requires": {
1279
+ "array-each": "^1.0.1",
1280
+ "array-slice": "^1.0.0",
1281
+ "for-own": "^1.0.0",
1282
+ "isobject": "^3.0.0"
1283
+ }
1284
+ },
1285
+ "object.map": {
1286
+ "version": "1.0.1",
1287
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
1288
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
1289
+ "requires": {
1290
+ "for-own": "^1.0.0",
1291
+ "make-iterator": "^1.0.0"
1292
+ }
1293
+ },
1294
+ "object.pick": {
1295
+ "version": "1.3.0",
1296
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
1297
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
1298
+ "requires": {
1299
+ "isobject": "^3.0.1"
1300
+ }
1301
+ },
1302
+ "os-homedir": {
1303
+ "version": "1.0.2",
1304
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1305
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1306
+ },
1307
+ "os-tmpdir": {
1308
+ "version": "1.0.2",
1309
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1310
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1311
+ },
1312
+ "osenv": {
1313
+ "version": "0.1.5",
1314
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1315
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1316
+ "requires": {
1317
+ "os-homedir": "^1.0.0",
1318
+ "os-tmpdir": "^1.0.0"
1319
+ }
1320
+ },
1321
+ "parse-filepath": {
1322
+ "version": "1.0.2",
1323
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
1324
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
1325
+ "requires": {
1326
+ "is-absolute": "^1.0.0",
1327
+ "map-cache": "^0.2.0",
1328
+ "path-root": "^0.1.1"
1329
+ }
1330
+ },
1331
+ "parse-passwd": {
1332
+ "version": "1.0.0",
1333
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
1334
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
1335
+ },
1336
+ "pascalcase": {
1337
+ "version": "0.1.1",
1338
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
1339
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
1340
+ },
1341
+ "path-parse": {
1342
+ "version": "1.0.6",
1343
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1344
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
1345
+ },
1346
+ "path-root": {
1347
+ "version": "0.1.1",
1348
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
1349
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
1350
+ "requires": {
1351
+ "path-root-regex": "^0.1.0"
1352
+ }
1353
+ },
1354
+ "path-root-regex": {
1355
+ "version": "0.1.2",
1356
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
1357
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
1358
+ },
1359
+ "posix-character-classes": {
1360
+ "version": "0.1.1",
1361
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
1362
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
1363
+ },
1364
+ "preprocess": {
1365
+ "version": "2.3.1",
1366
+ "resolved": "https://registry.npmjs.org/preprocess/-/preprocess-2.3.1.tgz",
1367
+ "integrity": "sha1-vaMCLmI+m1mdTAgoGG2FvZ8SxQA=",
1368
+ "dev": true
1369
+ },
1370
+ "rechoir": {
1371
+ "version": "0.6.2",
1372
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
1373
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
1374
+ "requires": {
1375
+ "resolve": "^1.1.6"
1376
+ }
1377
+ },
1378
+ "regex-not": {
1379
+ "version": "1.0.2",
1380
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
1381
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
1382
+ "requires": {
1383
+ "extend-shallow": "^3.0.2",
1384
+ "safe-regex": "^1.1.0"
1385
+ }
1386
+ },
1387
+ "repeat-element": {
1388
+ "version": "1.1.3",
1389
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
1390
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
1391
+ },
1392
+ "repeat-string": {
1393
+ "version": "1.6.1",
1394
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1395
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
1396
+ },
1397
+ "resolve": {
1398
+ "version": "1.18.1",
1399
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
1400
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
1401
+ "requires": {
1402
+ "is-core-module": "^2.0.0",
1403
+ "path-parse": "^1.0.6"
1404
+ }
1405
+ },
1406
+ "resolve-dir": {
1407
+ "version": "1.0.1",
1408
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
1409
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
1410
+ "requires": {
1411
+ "expand-tilde": "^2.0.0",
1412
+ "global-modules": "^1.0.0"
1413
+ }
1414
+ },
1415
+ "resolve-url": {
1416
+ "version": "0.2.1",
1417
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
1418
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
1419
+ },
1420
+ "ret": {
1421
+ "version": "0.1.15",
1422
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
1423
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
1424
+ },
1425
+ "rimraf": {
1426
+ "version": "2.2.8",
1427
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
1428
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
1429
+ "dev": true
1430
+ },
1431
+ "safe-regex": {
1432
+ "version": "1.1.0",
1433
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
1434
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
1435
+ "requires": {
1436
+ "ret": "~0.1.10"
1437
+ }
1438
+ },
1439
+ "set-value": {
1440
+ "version": "2.0.1",
1441
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
1442
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
1443
+ "requires": {
1444
+ "extend-shallow": "^2.0.1",
1445
+ "is-extendable": "^0.1.1",
1446
+ "is-plain-object": "^2.0.3",
1447
+ "split-string": "^3.0.1"
1448
+ },
1449
+ "dependencies": {
1450
+ "extend-shallow": {
1451
+ "version": "2.0.1",
1452
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1453
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1454
+ "requires": {
1455
+ "is-extendable": "^0.1.0"
1456
+ }
1457
+ }
1458
+ }
1459
+ },
1460
+ "shelljs": {
1461
+ "version": "0.1.4",
1462
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz",
1463
+ "integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=",
1464
+ "dev": true
1465
+ },
1466
+ "sigmund": {
1467
+ "version": "1.0.1",
1468
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
1469
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
1470
+ "dev": true
1471
+ },
1472
+ "snapdragon": {
1473
+ "version": "0.8.2",
1474
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
1475
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
1476
+ "requires": {
1477
+ "base": "^0.11.1",
1478
+ "debug": "^2.2.0",
1479
+ "define-property": "^0.2.5",
1480
+ "extend-shallow": "^2.0.1",
1481
+ "map-cache": "^0.2.2",
1482
+ "source-map": "^0.5.6",
1483
+ "source-map-resolve": "^0.5.0",
1484
+ "use": "^3.1.0"
1485
+ },
1486
+ "dependencies": {
1487
+ "define-property": {
1488
+ "version": "0.2.5",
1489
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1490
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1491
+ "requires": {
1492
+ "is-descriptor": "^0.1.0"
1493
+ }
1494
+ },
1495
+ "extend-shallow": {
1496
+ "version": "2.0.1",
1497
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1498
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1499
+ "requires": {
1500
+ "is-extendable": "^0.1.0"
1501
+ }
1502
+ },
1503
+ "source-map": {
1504
+ "version": "0.5.7",
1505
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1506
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
1507
+ }
1508
+ }
1509
+ },
1510
+ "snapdragon-node": {
1511
+ "version": "2.1.1",
1512
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
1513
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
1514
+ "requires": {
1515
+ "define-property": "^1.0.0",
1516
+ "isobject": "^3.0.0",
1517
+ "snapdragon-util": "^3.0.1"
1518
+ },
1519
+ "dependencies": {
1520
+ "define-property": {
1521
+ "version": "1.0.0",
1522
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1523
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1524
+ "requires": {
1525
+ "is-descriptor": "^1.0.0"
1526
+ }
1527
+ },
1528
+ "is-accessor-descriptor": {
1529
+ "version": "1.0.0",
1530
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1531
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1532
+ "requires": {
1533
+ "kind-of": "^6.0.0"
1534
+ }
1535
+ },
1536
+ "is-data-descriptor": {
1537
+ "version": "1.0.0",
1538
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1539
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1540
+ "requires": {
1541
+ "kind-of": "^6.0.0"
1542
+ }
1543
+ },
1544
+ "is-descriptor": {
1545
+ "version": "1.0.2",
1546
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1547
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1548
+ "requires": {
1549
+ "is-accessor-descriptor": "^1.0.0",
1550
+ "is-data-descriptor": "^1.0.0",
1551
+ "kind-of": "^6.0.2"
1552
+ }
1553
+ }
1554
+ }
1555
+ },
1556
+ "snapdragon-util": {
1557
+ "version": "3.0.1",
1558
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
1559
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
1560
+ "requires": {
1561
+ "kind-of": "^3.2.0"
1562
+ },
1563
+ "dependencies": {
1564
+ "kind-of": {
1565
+ "version": "3.2.2",
1566
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1567
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1568
+ "requires": {
1569
+ "is-buffer": "^1.1.5"
1570
+ }
1571
+ }
1572
+ }
1573
+ },
1574
+ "source-map": {
1575
+ "version": "0.1.34",
1576
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
1577
+ "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
1578
+ "dev": true,
1579
+ "requires": {
1580
+ "amdefine": ">=0.0.4"
1581
+ }
1582
+ },
1583
+ "source-map-resolve": {
1584
+ "version": "0.5.3",
1585
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
1586
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
1587
+ "requires": {
1588
+ "atob": "^2.1.2",
1589
+ "decode-uri-component": "^0.2.0",
1590
+ "resolve-url": "^0.2.1",
1591
+ "source-map-url": "^0.4.0",
1592
+ "urix": "^0.1.0"
1593
+ }
1594
+ },
1595
+ "source-map-url": {
1596
+ "version": "0.4.0",
1597
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
1598
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
1599
+ },
1600
+ "split-string": {
1601
+ "version": "3.1.0",
1602
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
1603
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
1604
+ "requires": {
1605
+ "extend-shallow": "^3.0.0"
1606
+ }
1607
+ },
1608
+ "static-extend": {
1609
+ "version": "0.1.2",
1610
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
1611
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
1612
+ "requires": {
1613
+ "define-property": "^0.2.5",
1614
+ "object-copy": "^0.1.0"
1615
+ },
1616
+ "dependencies": {
1617
+ "define-property": {
1618
+ "version": "0.2.5",
1619
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1620
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1621
+ "requires": {
1622
+ "is-descriptor": "^0.1.0"
1623
+ }
1624
+ }
1625
+ }
1626
+ },
1627
+ "to-object-path": {
1628
+ "version": "0.3.0",
1629
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
1630
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
1631
+ "requires": {
1632
+ "kind-of": "^3.0.2"
1633
+ },
1634
+ "dependencies": {
1635
+ "kind-of": {
1636
+ "version": "3.2.2",
1637
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1638
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1639
+ "requires": {
1640
+ "is-buffer": "^1.1.5"
1641
+ }
1642
+ }
1643
+ }
1644
+ },
1645
+ "to-regex": {
1646
+ "version": "3.0.2",
1647
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
1648
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
1649
+ "requires": {
1650
+ "define-property": "^2.0.2",
1651
+ "extend-shallow": "^3.0.2",
1652
+ "regex-not": "^1.0.2",
1653
+ "safe-regex": "^1.1.0"
1654
+ }
1655
+ },
1656
+ "to-regex-range": {
1657
+ "version": "2.1.1",
1658
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
1659
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
1660
+ "requires": {
1661
+ "is-number": "^3.0.0",
1662
+ "repeat-string": "^1.6.1"
1663
+ }
1664
+ },
1665
+ "uglify-js": {
1666
+ "version": "2.4.24",
1667
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz",
1668
+ "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
1669
+ "dev": true,
1670
+ "requires": {
1671
+ "async": "~0.2.6",
1672
+ "source-map": "0.1.34",
1673
+ "uglify-to-browserify": "~1.0.0",
1674
+ "yargs": "~3.5.4"
1675
+ },
1676
+ "dependencies": {
1677
+ "async": {
1678
+ "version": "0.2.10",
1679
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
1680
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
1681
+ "dev": true
1682
+ }
1683
+ }
1684
+ },
1685
+ "uglify-to-browserify": {
1686
+ "version": "1.0.2",
1687
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
1688
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
1689
+ "dev": true
1690
+ },
1691
+ "unc-path-regex": {
1692
+ "version": "0.1.2",
1693
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
1694
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
1695
+ },
1696
+ "underscore": {
1697
+ "version": "1.7.0",
1698
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
1699
+ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
1700
+ "dev": true
1701
+ },
1702
+ "underscore.string": {
1703
+ "version": "2.2.1",
1704
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
1705
+ "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
1706
+ "dev": true
1707
+ },
1708
+ "union-value": {
1709
+ "version": "1.0.1",
1710
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
1711
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
1712
+ "requires": {
1713
+ "arr-union": "^3.1.0",
1714
+ "get-value": "^2.0.6",
1715
+ "is-extendable": "^0.1.1",
1716
+ "set-value": "^2.0.1"
1717
+ }
1718
+ },
1719
+ "unset-value": {
1720
+ "version": "1.0.0",
1721
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
1722
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
1723
+ "requires": {
1724
+ "has-value": "^0.3.1",
1725
+ "isobject": "^3.0.0"
1726
+ },
1727
+ "dependencies": {
1728
+ "has-value": {
1729
+ "version": "0.3.1",
1730
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
1731
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
1732
+ "requires": {
1733
+ "get-value": "^2.0.3",
1734
+ "has-values": "^0.1.4",
1735
+ "isobject": "^2.0.0"
1736
+ },
1737
+ "dependencies": {
1738
+ "isobject": {
1739
+ "version": "2.1.0",
1740
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1741
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1742
+ "requires": {
1743
+ "isarray": "1.0.0"
1744
+ }
1745
+ }
1746
+ }
1747
+ },
1748
+ "has-values": {
1749
+ "version": "0.1.4",
1750
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
1751
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
1752
+ }
1753
+ }
1754
+ },
1755
+ "urix": {
1756
+ "version": "0.1.0",
1757
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
1758
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
1759
+ },
1760
+ "use": {
1761
+ "version": "3.1.1",
1762
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
1763
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
1764
+ },
1765
+ "v8flags": {
1766
+ "version": "3.1.3",
1767
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
1768
+ "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
1769
+ "requires": {
1770
+ "homedir-polyfill": "^1.0.1"
1771
+ }
1772
+ },
1773
+ "which": {
1774
+ "version": "1.0.9",
1775
+ "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz",
1776
+ "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=",
1777
+ "dev": true
1778
+ },
1779
+ "window-size": {
1780
+ "version": "0.1.0",
1781
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
1782
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
1783
+ "dev": true
1784
+ },
1785
+ "wordwrap": {
1786
+ "version": "0.0.2",
1787
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1788
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
1789
+ "dev": true
1790
+ },
1791
+ "yargs": {
1792
+ "version": "3.5.4",
1793
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz",
1794
+ "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
1795
+ "dev": true,
1796
+ "requires": {
1797
+ "camelcase": "^1.0.2",
1798
+ "decamelize": "^1.0.0",
1799
+ "window-size": "0.1.0",
1800
+ "wordwrap": "0.0.2"
1801
+ }
1802
+ },
1803
+ "zlib-browserify": {
1804
+ "version": "0.0.1",
1805
+ "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz",
1806
+ "integrity": "sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=",
1807
+ "dev": true
1808
+ }
1809
+ }
1810
+ }
libs/factory/clearfy/assets/css/clearfy-base.css DELETED
@@ -1,181 +0,0 @@
1
- /**
2
- * Базовые стили для всех копомпонентов Clearfy
3
-
4
- * @author Webcraftic <wordpress.webraftic@gmail.com>
5
- * @copyright Webcraftic 06.10.2018
6
- * @sicne 2.0.5
7
- */
8
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion {
9
- padding: 30px 80px;
10
- }
11
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion h3 {
12
- margin: 0 0 20px;
13
- }
14
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-inner-contanier {
15
- border: 2px dashed #8bc34a;
16
- background: #fff;
17
- padding: 20px;
18
- }
19
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium {
20
- display: inline-block;
21
- cursor: pointer;
22
- line-height: 16px;
23
- font-size: 13px;
24
- font-weight: 600;
25
- padding: 12px 20px;
26
- text-align: center;
27
- text-decoration: none;
28
- text-transform: uppercase;
29
- border-radius: 2px;
30
- -moz-border-radius: 2px;
31
- -webkit-border-radius: 2px;
32
- color: #353535;
33
- background: #e8e8e8;
34
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
35
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
36
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
37
- }
38
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:active {
39
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
40
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
41
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
42
- }
43
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:focus {
44
- outline: none;
45
- border: 0;
46
- }
47
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium {
48
- display: inline-block;
49
- cursor: pointer;
50
- line-height: 16px;
51
- font-size: 13px;
52
- font-weight: 600;
53
- padding: 12px 20px;
54
- text-align: center;
55
- text-decoration: none;
56
- text-transform: uppercase;
57
- border-radius: 2px;
58
- -moz-border-radius: 2px;
59
- -webkit-border-radius: 2px;
60
- color: #755c0e;
61
- background: #fdd868;
62
- box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
63
- -moz-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
64
- -webkit-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
65
- }
66
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:active {
67
- box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
68
- -moz-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
69
- -webkit-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
70
- }
71
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:focus {
72
- outline: none;
73
- border: 0;
74
- }
75
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
76
- background: #fff;
77
- color: #353535;
78
- font-weight: 600;
79
- border: 2px dashed #8bc34a;
80
- }
81
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
82
- margin: 0 0 20px;
83
- padding: 10px 0;
84
- text-align: center;
85
- border-bottom: 2px solid #e6e6e6;
86
- color: #636363;
87
- font-size: 17px;
88
- font-weight: 600;
89
- vertical-align: middle;
90
- text-transform: uppercase;
91
- }
92
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
93
- position: relative;
94
- margin-bottom: 20px;
95
- }
96
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
97
- font-size: 15px;
98
- padding: 7px;
99
- padding-left: 20px;
100
- }
101
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
102
- content: " ";
103
- display: inline-block;
104
- width: 0.4em;
105
- height: 0.7em;
106
- border: solid #8bc34a;
107
- border-width: 0 0.2em 0.2em 0;
108
- left: 0;
109
- margin-right: 10px;
110
- -webkit-transform: rotate(45deg);
111
- -moz-transform: rotate(45deg);
112
- -o-transform: rotate(45deg);
113
- transform: rotate(45deg);
114
- }
115
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
116
- display: block;
117
- cursor: pointer;
118
- line-height: 16px;
119
- font-size: 13px;
120
- font-weight: 600;
121
- padding: 12px 20px;
122
- text-align: center;
123
- text-decoration: none;
124
- text-transform: uppercase;
125
- border-radius: 2px;
126
- -moz-border-radius: 2px;
127
- -webkit-border-radius: 2px;
128
- color: #353535;
129
- background: #e8e8e8;
130
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
131
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
132
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
133
- }
134
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:active {
135
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
136
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
137
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
138
- }
139
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:focus {
140
- outline: none;
141
- border: 0;
142
- }
143
- @media screen and (max-width: 1550px) {
144
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-pro-suggetion {
145
- padding: 10px 80px;
146
- }
147
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
148
- padding: 10px;
149
- }
150
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
151
- margin: 0 0 20px;
152
- padding: 10px 0;
153
- font-size: 13px;
154
- font-weight: 600;
155
- }
156
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
157
- margin-bottom: 20px;
158
- }
159
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
160
- font-size: 13px;
161
- padding: 2px;
162
- padding-left: 10px;
163
- }
164
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
165
- width: 0.4em;
166
- height: 0.7em;
167
- border-width: 0 0.2em 0.2em 0;
168
- left: 0;
169
- margin-right: 10px;
170
- }
171
- #WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
172
- font-weight: 700;
173
- line-height: 16px;
174
- font-size: 12px;
175
- padding: 8px 12px;
176
- border-radius: 2px;
177
- -moz-border-radius: 2px;
178
- -webkit-border-radius: 2px;
179
- }
180
- }
181
- /*# sourceMappingURL=clearfy-base.css.map */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/assets/js/globals.js DELETED
@@ -1,203 +0,0 @@
1
- /*!
2
- * Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
3
- * и самого Clearfy.
4
- *
5
- * $.wbcr_factory_clearfy_212.app - методы для работы с приложением. Скрыть, показать уведомления.
6
- * $.wbcr_factory_clearfy_212.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
7
- *
8
- * Copyright 2018, Webcraftic, http://webcraftic.com
9
- *
10
- * @since 2.0.5
11
- * @pacakge clearfy
12
- */
13
- (function($) {
14
- 'use strict';
15
-
16
- if( !$.wbcr_factory_clearfy_212 ) {
17
- $.wbcr_factory_clearfy_212 = {};
18
- }
19
-
20
- $.wbcr_factory_clearfy_212.app = $.wbcr_factory_clearfy_212.app || {
21
- /**
22
- * Создает и показывает уведомление внутри интерфейса Clearfy
23
- *
24
- * @param {string} message - сообщение об ошибке или предупреждение
25
- * @param {string} type - тип уведомления (error, warning, success)
26
- */
27
- showNotice: function(message, type) {
28
- var noticeContanier = $('<div></div>'),
29
- noticeInnerWrap = $('<p></p>'),
30
- dashicon = $('<span></span>'),
31
- dashiconClass,
32
- noticeId = this.makeid();
33
-
34
- if( !type ) {
35
- type = 'warning';
36
- }
37
-
38
- noticeContanier.addClass('alert', 'wbcr-factory-warning-notice')
39
- .addClass('alert-' + type).addClass('wbcr-factory-' + type + '-notice');
40
-
41
- noticeContanier.append(noticeInnerWrap);
42
- noticeContanier.attr('id', 'uq-' + noticeId);
43
-
44
- if( type == 'success' ) {
45
- dashiconClass = 'dashicons-plus';
46
- } else if( type == 'error' ) {
47
- dashiconClass = 'dashicons-no';
48
- } else {
49
- dashiconClass = 'dashicons-warning';
50
- }
51
-
52
- dashicon.addClass('dashicons').addClass(dashiconClass);
53
- noticeInnerWrap.prepend(dashicon);
54
- dashicon.after(message);
55
-
56
- $([document.documentElement, document.body]).animate({
57
- scrollTop: $('.wbcr-factory-content').offset().top - 100
58
- }, 300, function() {
59
- noticeContanier.hide();
60
- $('.wbcr-factory-content').prepend(noticeContanier);
61
- noticeContanier.fadeIn();
62
-
63
- /**
64
- * Хук выполняет проивольную функцию, после того как уведомление отображено
65
- * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
66
- * Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
67
- * function(noticeId) {});
68
- * @param {string} noticeId - id уведомления
69
- */
70
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/showed_notice', [noticeId]);
71
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/showed_notice', [noticeId]);
72
- });
73
-
74
- return noticeId;
75
- },
76
-
77
- /**
78
- * Удаляет уведомление из интерфейса Clearfy
79
- *
80
- * @param {string} noticeId - id уведомления
81
- */
82
- hideNotice: function(noticeId) {
83
- var el;
84
- if( !noticeId ) {
85
- el = $('.wbcr-factory-content').find('.alert');
86
- } else {
87
- el = $('#uq-' + noticeId);
88
- }
89
-
90
- el.fadeOut(500, function(e) {
91
- $(e).remove();
92
-
93
- /**
94
- * Хук выполняет проивольную функцию, после того как уведомление скрыто
95
- * Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
96
- * Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
97
- * function(noticeId)
98
- * {});
99
- * @param {string} noticeId - id уведомления
100
- */
101
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/hidded_notice', [noticeId]);
102
- $.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
103
- });
104
- },
105
-
106
- makeid: function() {
107
- var text = "";
108
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
109
-
110
- for( var i = 0; i < 32; i++ ) {
111
- text += possible.charAt(Math.floor(Math.random() * possible.length));
112
- }
113
-
114
- return text;
115
- }
116
-
117
- };
118
-
119
- $.wbcr_factory_clearfy_212.filters = $.wbcr_factory_clearfy_212.filters || {
120
-
121
- /**
122
- * A set of registered filters.
123
- */
124
- _items: {},
125
-
126
- /**
127
- * A set of priorities of registered filters.
128
- */
129
- _priorities: {},
130
-
131
- /**
132
- * Applies filters to a given input value.
133
- */
134
- run: function(filterName, args) {
135
- var input = args && args.length > 0 ? args[0] : null;
136
- if( !this._items[filterName] ) {
137
- return input;
138
- }
139
-
140
- for( var i in this._priorities[filterName] ) {
141
- if( !this._priorities[filterName].hasOwnProperty(i) ) {
142
- continue;
143
- }
144
-
145
- var priority = this._priorities[filterName][i];
146
-
147
- for( var k = 0; k < this._items[filterName][priority].length; k++ ) {
148
- var f = this._items[filterName][priority][k];
149
- input = f.apply(f, args);
150
- }
151
- }
152
-
153
- return input;
154
- },
155
-
156
- /**
157
- * Registers a new filter.
158
- */
159
- add: function(filterName, callback, priority) {
160
-
161
- if( !priority ) {
162
- priority = 10;
163
- }
164
-
165
- if( !this._items[filterName] ) {
166
- this._items[filterName] = {};
167
- }
168
- if( !this._items[filterName][priority] ) {
169
- this._items[filterName][priority] = [];
170
- }
171
- this._items[filterName][priority].push(callback);
172
-
173
- if( !this._priorities[filterName] ) {
174
- this._priorities[filterName] = [];
175
- }
176
- if( $.inArray(priority, this._priorities[filterName]) === -1 ) {
177
- this._priorities[filterName].push(priority);
178
- }
179
-
180
- this._priorities[filterName].sort(function(a, b) {
181
- return a - b;
182
- });
183
- }
184
- };
185
-
186
- $.wbcr_factory_clearfy_212.hooks = $.wbcr_factory_clearfy_212.hooks || {
187
-
188
- /**
189
- * Applies filters to a given input value.
190
- */
191
- run: function(filterName, args) {
192
- $.wbcr_factory_clearfy_212.filters.run(filterName, args);
193
- },
194
-
195
- /**
196
- * Registers a new filter.
197
- */
198
- add: function(filterName, callback, priority) {
199
- $.wbcr_factory_clearfy_212.filters.add(filterName, callback, priority);
200
- }
201
- };
202
-
203
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/boot.php DELETED
@@ -1,49 +0,0 @@
1
- <?php
2
- /**
3
- * Factory clearfy
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
- * @since 1.0.0
7
- * @package clearfy
8
- * @copyright (c) 2018, Webcraftic Ltd
9
- *
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- if ( defined( 'FACTORY_CLEARFY_212_LOADED' ) ) {
18
- return;
19
- }
20
-
21
- define( 'FACTORY_CLEARFY_212_LOADED', true );
22
-
23
- define( 'FACTORY_CLEARFY_212', '2.1.2' );
24
-
25
- define( 'FACTORY_CLEARFY_212_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_CLEARFY_212_URL', plugins_url( null, __FILE__ ) );
27
-
28
- load_plugin_textdomain( 'wbcr_factory_clearfy_212', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
-
30
- require( FACTORY_CLEARFY_212_DIR . '/includes/ajax-handlers.php' );
31
- require( FACTORY_CLEARFY_212_DIR . '/includes/class-helpers.php' );
32
- require( FACTORY_CLEARFY_212_DIR . '/includes/class-configurate.php' );
33
-
34
- // module provides function only for the admin area
35
- if ( is_admin() ) {
36
- /**
37
- * Подключаем скрипты для установки компонентов Clearfy
38
- * на все страницы админпанели.
39
- */
40
- add_action( 'admin_enqueue_scripts', function () {
41
- wp_enqueue_script( 'wbcr-factory-clearfy-212-global', FACTORY_CLEARFY_212_URL . '/assets/js/globals.js', [ 'jquery' ], FACTORY_CLEARFY_212 );
42
- } );
43
-
44
- if ( defined( 'FACTORY_PAGES_420_LOADED' ) ) {
45
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-pages.php' );
46
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-more-features.php' );
47
- require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-license.php' );
48
- }
49
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/includes/ajax-handlers.php DELETED
@@ -1,92 +0,0 @@
1
- <?php
2
- /**
3
- * Ajax handlers
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
- * @copyright (c) 2017 Webraftic Ltd
7
- * @version 1.0
8
- */
9
-
10
- // Exit if accessed directly
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * Обработчик ajax запросов для проверки, активации, деактивации лицензионного ключа
17
- *
18
- * @since 2.0.7
19
- *
20
- * @param Wbcr_Factory420_Plugin $plugin_instance
21
- *
22
- */
23
- function wbcr_factory_clearfy_212_check_license( $plugin_instance ) {
24
- check_admin_referer( 'license' );
25
-
26
- $action = $plugin_instance->request->post( 'license_action', false, true );
27
- $license_key = $plugin_instance->request->post( 'licensekey', null );
28
-
29
- if ( empty( $action ) || ! in_array( $action, [ 'activate', 'deactivate', 'sync', 'unsubscribe' ] ) ) {
30
- wp_send_json_error( [ 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_212' ) ] );
31
- die();
32
- }
33
-
34
- $result = null;
35
- $success_message = '';
36
-
37
- try {
38
- switch ( $action ) {
39
- case 'activate':
40
- if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
41
- wp_send_json_error( [ 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_212' ) ] );
42
- } else {
43
- $plugin_instance->premium->activate( $license_key );
44
- $success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_212' );
45
- }
46
- break;
47
- case 'deactivate':
48
- $plugin_instance->premium->deactivate();
49
- $success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_212' );
50
- break;
51
- case 'sync':
52
- $plugin_instance->premium->sync();
53
- $success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_212' );
54
- break;
55
- case 'unsubscribe':
56
- $plugin_instance->premium->cancel_paid_subscription();
57
- $success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_212' );
58
- break;
59
- }
60
- } catch( Exception $e ) {
61
-
62
- /**
63
- * Экшен выполняетяс, когда проверка лицензии вернула ошибку
64
- *
65
- * @since 2.0.7
66
- *
67
- * @param string $license_key
68
- * @param string $error_message
69
- *
70
- * @param string $action
71
- */
72
- do_action( 'wbcr/clearfy/check_license_error', $action, $license_key, $e->getMessage() );
73
-
74
- wp_send_json_error( [ 'error_message' => $e->getMessage() ] );
75
- die();
76
- }
77
-
78
- /**
79
- * Экшен выполняет, когда проверка лицензии успешно завершена
80
- *
81
- * @since 2.0.7
82
- *
83
- * @param string $license_key
84
- *
85
- * @param string $action
86
- */
87
- do_action( 'wbcr/clearfy/check_license_success', $action, $license_key );
88
-
89
- wp_send_json_success( [ 'message' => $success_message ] );
90
-
91
- die();
92
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/includes/class-configurate.php DELETED
@@ -1,116 +0,0 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- /**
8
- * Configurate clearfy plugins
9
- *
10
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
11
- * @since 1.0.0
12
- * @package clearfy
13
- * @copyright (c) 2018, Webcraftic Ltd
14
- *
15
- */
16
- abstract class Wbcr_FactoryClearfy212_Configurate {
17
-
18
- /**
19
- * @param Wbcr_Factory420_Plugin $plugin
20
- */
21
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
22
- $this->plugin = $plugin;
23
- $this->registerActionsAndFilters();
24
- }
25
-
26
- /**
27
- * Registers filters and actions
28
- *
29
- * @return mixed
30
- */
31
- abstract protected function registerActionsAndFilters();
32
-
33
- /**
34
- * Get options with namespace
35
- *
36
- * @param $option_name
37
- * @param bool $default
38
- *
39
- * @return mixed|void
40
- */
41
- public function getPopulateOption( $option_name, $default = false ) {
42
- return $this->plugin->getPopulateOption( $option_name, $default );
43
- }
44
-
45
- /**
46
- * Get options with namespace
47
- *
48
- * @param $option_name
49
- * @param bool $default
50
- *
51
- * @return mixed|void
52
- */
53
- public function getOption( $option_name, $default = false ) {
54
- return $this->plugin->getOption( $option_name, $default );
55
- }
56
-
57
- /**
58
- * Get network options with namespace
59
- *
60
- * @param $option_name
61
- * @param bool $default
62
- *
63
- * @return mixed|void
64
- */
65
- public function getNetworkOption( $option_name, $default = false ) {
66
- return $this->plugin->getNetworkOption( $option_name, $default );
67
- }
68
-
69
- /**
70
- * @param $option_name
71
- * @param $value
72
- *
73
- * @return bool
74
- */
75
- public function updatePopulateOption( $option_name, $value ) {
76
- $this->plugin->updatePopulateOption( $option_name, $value );
77
- }
78
-
79
- /**
80
- * @param $option_name
81
- * @param $value
82
- *
83
- * @return bool
84
- */
85
- public function updateNetworkOption( $option_name, $value ) {
86
- $this->plugin->updateNetworkOption( $option_name, $value );
87
- }
88
-
89
- /**
90
- * @param $option_name
91
- * @param $value
92
- *
93
- * @return bool
94
- */
95
- public function updateOption( $option_name, $value ) {
96
- $this->plugin->updateOption( $option_name, $value );
97
- }
98
-
99
- /**
100
- * @param $option_name
101
- *
102
- * @return bool
103
- */
104
- public function deletePopulateOption( $option_name ) {
105
- $this->plugin->deletePopulateOption( $option_name );
106
- }
107
-
108
- /**
109
- * @param $option_name
110
- *
111
- * @return bool
112
- */
113
- public function deleteOption( $option_name ) {
114
- $this->plugin->deleteOption( $option_name );
115
- }
116
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/includes/class-helpers.php DELETED
@@ -1,362 +0,0 @@
1
- <?php
2
- // Exit if accessed directly
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
-
8
- /**
9
- * Helpers functions
10
- *
11
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
12
- * @since 1.0.0
13
- * @package clearfy
14
- * @copyright (c) 2018, Webcraftic Ltd
15
- *
16
- */
17
- class WbcrFactoryClearfy212_Helpers {
18
-
19
- /**
20
- * Ссылка по умолчанию (анг)
21
- */
22
- const WEBCRAFTIC_SITE_URL = 'https://clearfy.pro';
23
-
24
- /**
25
- * Русская локализация сайта
26
- */
27
- const WEBCRAFTIC_RU_SITE_URL = 'https://ru.clearfy.pro';
28
- /**
29
- * Украинская локализация сайта
30
- */
31
- const WEBCRAFTIC_UA_SITE_URL = 'https://ua.clearfy.pro';
32
- /**
33
- * Испанская
34
- */
35
- const WEBCRAFTIC_ES_SITE_URL = 'https://es.clearfy.pro';
36
- /**
37
- * Французкая
38
- */
39
- const WEBCRAFTIC_DE_SITE_URL = 'https://de.clearfy.pro';
40
-
41
- /**
42
- * @since 2.0.5
43
- *
44
- * @param int $price
45
- *
46
- * @return int
47
- */
48
- public static function getClearfyBusinessPrice( $price = 19 ) {
49
- return (int) apply_filters( 'wbcr/clearfy/business_price', $price );
50
- }
51
-
52
- /**
53
- * @since 2.0.5
54
- *
55
- * @param int $price
56
- *
57
- * @return int
58
- */
59
- public static function getClearfyBusinessRevPrice( $price = 69 ) {
60
- return (int) apply_filters( 'wbcr/clearfy/business_rev_price', $price );
61
- }
62
-
63
- /**
64
- * Get a link to the official website of the developer
65
- *
66
- * @return string|null
67
- */
68
- public static function getWebcrafticSiteUrl() {
69
- if ( get_locale() == 'ru_RU' ) {
70
- return self::WEBCRAFTIC_RU_SITE_URL;
71
- }
72
-
73
- return self::WEBCRAFTIC_SITE_URL;
74
- }
75
-
76
- /**
77
- * /**
78
- * Get a link to the official website of the developer
79
- *
80
- * @since 2.0.5
81
- *
82
- * @param string $plugin_name
83
- * @param string $page - page address
84
- * @param string $utm_content - from which page or part of the plugin user moved to the site
85
- * @param string $urm_source
86
- *
87
- * @return string
88
- */
89
- public static function getWebcrafticSitePageUrl( $plugin_name, $page, $utm_content = null, $urm_source = 'wordpress.org' ) {
90
- $args = [ 'utm_source' => $urm_source ];
91
-
92
- if ( ! empty( $plugin_name ) ) {
93
- $args['utm_campaign'] = $plugin_name;
94
- }
95
-
96
- if ( ! empty( $utm_content ) ) {
97
- $args['utm_content'] = $utm_content;
98
- }
99
-
100
- $raw_url = add_query_arg( $args, self::getWebcrafticSiteUrl() . '/' . $page . '/' );
101
- $url = esc_url( $raw_url );
102
-
103
- /**
104
- * @param string $url
105
- * @param string $raw_url
106
- * @param string $plugin_name
107
- * @param string $page - page address
108
- * @param string $utm_content - from which page or part of the plugin user moved to the site
109
- * @param string $urm_source
110
- */
111
-
112
- return apply_filters( 'wbcr/clearfy/webcraftic_site_page_url', $url, $raw_url, $plugin_name, $page, $utm_content, $urm_source );
113
- }
114
-
115
- /**
116
- * Recursive sanitation for an array
117
- *
118
- * @since 2.0.5
119
- *
120
- * @param $array
121
- *
122
- * @return mixed
123
- */
124
- public static function recursiveSanitizeArray( $array, $function ) {
125
- foreach ( $array as $key => &$value ) {
126
- if ( is_array( $value ) ) {
127
- $value = self::recursiveSanitizeArray( $value, $function );
128
- } else {
129
- if ( function_exists( $function ) ) {
130
- $value = $function( $value );
131
- }
132
- }
133
- }
134
-
135
- return $array;
136
- }
137
-
138
- /**
139
- * Is permalink enabled?
140
- *
141
- * @since 1.0.0
142
- * @return bool
143
- * @global WP_Rewrite $wp_rewrite
144
- */
145
- public static function isPermalink() {
146
- global $wp_rewrite;
147
-
148
- if ( ! isset( $wp_rewrite ) || ! is_object( $wp_rewrite ) || ! $wp_rewrite->using_permalinks() ) {
149
- return false;
150
- }
151
-
152
- return true;
153
- }
154
-
155
- /**
156
- * Display 404 page to bump bots and bad guys
157
- *
158
- * @param bool $simple If true force displaying basic 404 page
159
- */
160
- public static function setError404() {
161
- global $wp_query;
162
-
163
- if ( function_exists( 'status_header' ) ) {
164
- status_header( '404' );
165
- nocache_headers();
166
- }
167
-
168
- if ( $wp_query && is_object( $wp_query ) ) {
169
- $wp_query->set_404();
170
- get_template_part( 404 );
171
- } else {
172
- global $pagenow;
173
-
174
- $pagenow = 'index.php';
175
-
176
- if ( ! defined( 'WP_USE_THEMES' ) ) {
177
- define( 'WP_USE_THEMES', true );
178
- }
179
-
180
- wp();
181
-
182
- $_SERVER['REQUEST_URI'] = self::userTrailingslashit( '/hmwp_404' );
183
-
184
- require_once( ABSPATH . WPINC . '/template-loader.php' );
185
- }
186
-
187
- exit();
188
- }
189
-
190
- public static function useTrailingSlashes() {
191
- return ( '/' === substr( get_option( 'permalink_structure' ), - 1, 1 ) );
192
- }
193
-
194
- public static function userTrailingslashit( $string ) {
195
- return self::useTrailingSlashes() ? trailingslashit( $string ) : untrailingslashit( $string );
196
- }
197
-
198
- /**
199
- * Returns true if a needle can be found in a haystack
200
- *
201
- * @param string $string
202
- * @param string $find
203
- * @param bool $case_sensitive
204
- *
205
- * @return bool
206
- */
207
- public static function strContains( $string, $find, $case_sensitive = true ) {
208
- if ( empty( $string ) || empty( $find ) ) {
209
- return false;
210
- }
211
-
212
- $pos = $case_sensitive ? strpos( $string, $find ) : stripos( $string, $find );
213
-
214
- return ! ( $pos === false );
215
- }
216
-
217
- /**
218
- * Tests if a text starts with an given string.
219
- *
220
- * @param string $string
221
- * @param string $find
222
- * @param bool $case_sensitive
223
- *
224
- * @return bool
225
- */
226
- public static function strStartsWith( $string, $find, $case_sensitive = true ) {
227
- if ( $case_sensitive ) {
228
- return strpos( $string, $find ) === 0;
229
- }
230
-
231
- return stripos( $string, $find ) === 0;
232
- }
233
-
234
- /**
235
- * Tests if a text ends with an given string.
236
- *
237
- * @param $string
238
- * @param $find
239
- * @param bool $case_sensitive
240
- *
241
- * @return bool
242
- */
243
- public static function strEndsWith( $string, $find, $case_sensitive = true ) {
244
- $expected_position = strlen( $string ) - strlen( $find );
245
-
246
- if ( $case_sensitive ) {
247
- return strrpos( $string, $find, 0 ) === $expected_position;
248
- }
249
-
250
- return strripos( $string, $find, 0 ) === $expected_position;
251
- }
252
-
253
- public static function arrayMergeInsert( array $arr, array $inserted, $position = 'bottom', $key = null ) {
254
- if ( $position == 'top' ) {
255
- return array_merge( $inserted, $arr );
256
- }
257
- $key_position = ( $key === null ) ? false : array_search( $key, array_keys( $arr ) );
258
- if ( $key_position === false OR ( $position != 'before' AND $position != 'after' ) ) {
259
- return array_merge( $arr, $inserted );
260
- }
261
- if ( $position == 'after' ) {
262
- $key_position ++;
263
- }
264
-
265
- return array_merge( array_slice( $arr, 0, $key_position, true ), $inserted, array_slice( $arr, $key_position, null, true ) );
266
- }
267
-
268
- public static function maybeGetPostJson( $name ) {
269
- if ( isset( $_POST[ $name ] ) AND is_string( $_POST[ $name ] ) ) {
270
- $result = json_decode( stripslashes( $_POST[ $name ] ), true );
271
- if ( ! is_array( $result ) ) {
272
- $result = [];
273
- }
274
-
275
- return $result;
276
- } else {
277
- return [];
278
- }
279
- }
280
-
281
- public static function getEscapeJson( array $data ) {
282
- return htmlspecialchars( json_encode( $data ), ENT_QUOTES, 'UTF-8' );
283
- }
284
-
285
- /**
286
- * Replace url for multisite
287
- *
288
- * @param $string
289
- *
290
- * @return string
291
- */
292
- public static function replaceMsUrl( $string ) {
293
- if ( is_multisite() && BLOG_ID_CURRENT_SITE != get_current_blog_id() ) {
294
- return str_replace( get_site_url( BLOG_ID_CURRENT_SITE ), get_site_url( get_current_blog_id() ), $string );
295
- }
296
-
297
- return $string;
298
- }
299
-
300
- /*
301
- * Flushes as many page cache plugin's caches as possible.
302
- *
303
- * @return void
304
- */
305
- public static function flushPageCache() {
306
- if ( function_exists( 'wp_cache_clear_cache' ) ) {
307
- if ( is_multisite() ) {
308
- $blog_id = get_current_blog_id();
309
- wp_cache_clear_cache( $blog_id );
310
- } else {
311
- wp_cache_clear_cache();
312
- }
313
- } else if ( has_action( 'cachify_flush_cache' ) ) {
314
- do_action( 'cachify_flush_cache' );
315
- } else if ( function_exists( 'w3tc_pgcache_flush' ) ) {
316
- w3tc_pgcache_flush();
317
- } else if ( function_exists( 'wp_fast_cache_bulk_delete_all' ) ) {
318
- wp_fast_cache_bulk_delete_all();
319
- } else if ( class_exists( 'WpFastestCache' ) ) {
320
- $wpfc = new WpFastestCache();
321
- $wpfc->deleteCache();
322
- } else if ( class_exists( 'c_ws_plugin__qcache_purging_routines' ) ) {
323
- c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
324
- } else if ( class_exists( 'zencache' ) ) {
325
- zencache::clear();
326
- } else if ( class_exists( 'comet_cache' ) ) {
327
- comet_cache::clear();
328
- } else if ( class_exists( 'WpeCommon' ) ) {
329
- // WPEngine cache purge/flush methods to call by default
330
- $wpe_methods = [
331
- 'purge_varnish_cache',
332
- ];
333
-
334
- // More agressive clear/flush/purge behind a filter
335
- if ( apply_filters( 'wbcr/factory/flush_wpengine_aggressive', false ) ) {
336
- $wpe_methods = array_merge( $wpe_methods, [ 'purge_memcached', 'clear_maxcdn_cache' ] );
337
- }
338
-
339
- // Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
340
- $wpe_methods = apply_filters( 'wbcr/factory/wpengine_methods', $wpe_methods );
341
-
342
- foreach ( $wpe_methods as $wpe_method ) {
343
- if ( method_exists( 'WpeCommon', $wpe_method ) ) {
344
- WpeCommon::$wpe_method();
345
- }
346
- }
347
- } else if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
348
- sg_cachepress_purge_cache();
349
- } else if ( file_exists( WP_CONTENT_DIR . '/wp-cache-config.php' ) && function_exists( 'prune_super_cache' ) ) {
350
- // fallback for WP-Super-Cache
351
- global $cache_path;
352
- if ( is_multisite() ) {
353
- $blog_id = get_current_blog_id();
354
- prune_super_cache( get_supercache_dir( $blog_id ), true );
355
- prune_super_cache( $cache_path . 'blogs/', true );
356
- } else {
357
- prune_super_cache( $cache_path . 'supercache/', true );
358
- prune_super_cache( $cache_path, true );
359
- }
360
- }
361
- }
362
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/pages/class-page-license.php DELETED
@@ -1,365 +0,0 @@
1
- <?php
2
-
3
- // Exit if accessed directly
4
- if ( ! defined( 'ABSPATH' ) ) {
5
- exit;
6
- }
7
-
8
- /**
9
- * Class Wbcr_FactoryLicense000_LicensePage is used as template to display form to active premium functionality.
10
- *
11
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
12
- * @since 2.0.7
13
- */
14
- class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase {
15
-
16
- /**
17
- * {@inheritdoc}
18
- */
19
- public $type = "page";
20
-
21
- /**
22
- * {@inheritdoc}
23
- */
24
- public $page_menu_dashicon = 'dashicons-admin-network';
25
-
26
- /**
27
- * {@inheritdoc}
28
- */
29
- public $show_right_sidebar_in_options = false;
30
-
31
- /**
32
- * {@inheritdoc}
33
- */
34
- public $page_menu_position = 0;
35
-
36
- /**
37
- * {@inheritdoc}
38
- */
39
- public $available_for_multisite = true;
40
-
41
- /**
42
- * @var string Name of the paid plan.
43
- */
44
- public $plan_name;
45
-
46
- // PREMIUM SECTION
47
- // ------------------------------------------------------------------
48
- /**
49
- * @since 2.0.7
50
- * @var bool
51
- */
52
- protected $is_premium;
53
-
54
- /**
55
- * @since 2.0.7
56
- * @var \WBCR\Factory_420\Premium\Provider
57
- */
58
- protected $premium;
59
-
60
- /**
61
- * @since 2.0.7
62
- * @var bool
63
- */
64
- protected $is_premium_active;
65
-
66
- /**
67
- * @since 2.0.7
68
- * @var bool
69
- */
70
- protected $premium_has_subscription;
71
-
72
- /**
73
- * @since 2.0.7
74
- * @var \WBCR\Factory_420\Premium\Interfaces\License
75
- */
76
- protected $premium_license;
77
-
78
- // END PREMIUM SECTION
79
- // ------------------------------------------------------------------
80
-
81
- /**
82
- * {@inheritdoc}
83
- * @param Wbcr_Factory420_Plugin $plugin
84
- */
85
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
86
- $this->plugin = $plugin;
87
-
88
- parent::__construct( $plugin );
89
-
90
- if ( ! $this->id ) {
91
- $this->id = $this->plugin->getPrefix() . 'license';
92
- }
93
- $this->premium = WRIO_Plugin::app()->premium;
94
- $this->is_premium = $this->premium->is_activate();
95
- $this->is_premium_active = $this->premium->is_active();
96
- $this->premium_has_subscription = $this->premium->has_paid_subscription();
97
- $this->premium_license = $this->premium->get_license();
98
-
99
- add_action( 'wp_ajax_wbcr-clearfy-activate-license', [ $this, 'ajax_handler' ] );
100
- }
101
-
102
- /**
103
- * [MAGIC] Magic method that configures assets for a page.
104
- */
105
- public function assets( $scripts, $styles ) {
106
- parent::assets( $scripts, $styles );
107
-
108
- $this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/license-manager.css' );
109
- $this->scripts->add( FACTORY_CLEARFY_212_URL . '/assets/js/license-manager.js' );
110
- }
111
-
112
- /**
113
- * Регистрируем ajax обработчик для текущей страницы
114
- *
115
- * @since 2.0.7
116
- */
117
- public function ajax_handler() {
118
- wbcr_factory_clearfy_212_check_license( $this->plugin );
119
- }
120
-
121
- /**
122
- * {@inheritdoc}
123
- */
124
- public function showPageContent() {
125
- ?>
126
- <?php wp_nonce_field( 'license' ); ?>
127
- <div id="wcl-license-wrapper"
128
- data-loader="<?php echo FACTORY_CLEARFY_212_URL . '/assets/img/loader.gif'; ?>"
129
- data-plugin="<?php echo get_class( $this->plugin ) ?>">
130
- <?php $this->show_license_form(); ?>
131
- </div>
132
- <?php
133
- }
134
-
135
- /**
136
- * Get before content.
137
- *
138
- * @return string Before content.
139
- */
140
- protected function get_plan_description() {
141
- return '';
142
- }
143
-
144
- /**
145
- * @return string
146
- */
147
- protected function get_hidden_license_key() {
148
- if ( ! $this->is_premium ) {
149
- return '';
150
- }
151
-
152
- return $this->premium_license->get_hidden_key();
153
- }
154
-
155
- /**
156
- * @return string
157
- */
158
- protected function get_plan() {
159
- if ( ! $this->is_premium ) {
160
- return 'free';
161
- }
162
-
163
- return $this->premium->get_plan();
164
- }
165
-
166
- /**
167
- * @return mixed
168
- */
169
- protected function get_expiration_days() {
170
- return $this->premium_license->get_expiration_time( 'days' );
171
- }
172
-
173
- /**
174
- * @return string
175
- */
176
- protected function get_billing_cycle_readable() {
177
- if ( ! $this->is_premium ) {
178
- return '';
179
- }
180
-
181
- $billing_cycle = $this->premium->get_billing_cycle();
182
- $billing = 'lifetime';
183
-
184
- if ( 1 == $billing_cycle ) {
185
- $billing = 'month';
186
- } else if ( 12 == $billing_cycle ) {
187
- $billing = 'year';
188
- }
189
-
190
- return $billing;
191
- }
192
-
193
- /**
194
- * Тип лицензии, цветовое оформление для формы лицензирования
195
- * free - бесплатная
196
- * gift - пожизненная лицензия, лицензия на особых условиях
197
- * trial - красный цвет, применяется для триалов, если лиценизия истекла или заблокирована
198
- * paid - обычная оплаченная лицензия, в данный момент активна.
199
- *
200
- * @return string
201
- */
202
- protected function get_license_type() {
203
- if ( ! $this->is_premium ) {
204
- return 'free';
205
- }
206
-
207
- $license = $this->premium_license;
208
-
209
- if ( $license->is_lifetime() ) {
210
- return 'gift';
211
- } else if ( $license->get_expiration_time( 'days' ) < 1 ) {
212
- return 'trial';
213
- }
214
-
215
- return 'paid';
216
- }
217
-
218
- /**
219
- * @param bool|WP_Error $notice
220
- */
221
- public function show_license_form( $notice = false ) {
222
- ?>
223
- <div class="factory-bootstrap-421 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content"
224
- id="license-manager">
225
- <div>
226
- <h3><?php printf( __( 'Activate %s', 'wbcr_factory_clearfy_212' ), $this->plan_name ) ?></h3>
227
- <?php echo $this->get_plan_description() ?>
228
- </div>
229
- <br>
230
- <?php if ( is_wp_error( $notice ) ) : ?>
231
- <div class="license-message <?= $this->get_license_type() ?>-license-message">
232
- <div class="alert <?php echo esc_attr( $notice->get_error_code() ); ?>">
233
- <h4 class="alert-heading"><?php _e( $notice->get_error_message(), 'wbcr_factory_clearfy_212' ) ?></h4>
234
- </div>
235
- </div>
236
- <?php endif; ?>
237
- <div class="onp-container">
238
- <div class="license-details">
239
- <?php if ( $this->get_license_type() == 'free' ): ?>
240
- <a href="<?php echo $this->plugin->get_support()->get_pricing_url( true, 'license_page' ); ?>"
241
- class="purchase-premium" target="_blank" rel="noopener">
242
- <span class="btn btn-gold btn-inner-wrap">
243
- <?php printf( __( 'Upgrade to Premium for $%s', 'wbcr_factory_clearfy_212' ), $this->premium->get_price() ) ?>
244
- </span>
245
- </a>
246
- <p><?php printf( __( 'Your current license for %1$s:', 'wbcr_factory_clearfy_212' ), $this->plugin->getPluginTitle() ) ?></p>
247
- <?php endif; ?>
248
- <div class="license-details-block <?= $this->get_license_type() ?>-details-block">
249
- <?php if ( $this->is_premium ): ?>
250
- <a data-action="deactivate" href="#"
251
- class="btn btn-default btn-small license-delete-button wcl-control-btn">
252
- <?php _e( 'Delete Key', 'wbcr_factory_clearfy_212' ) ?>
253
- </a>
254
- <a data-action="sync" href="#"
255
- class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
256
- <?php _e( 'Synchronization', 'wbcr_factory_clearfy_212' ) ?>
257
- </a>
258
- <?php endif; ?>
259
- <h3>
260
- <?php echo ucfirst( $this->get_plan() ); ?>
261
-
262
- <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
263
- <span style="font-size: 15px;">
264
- (<?php printf( __( 'Automatic renewal, every %s', '' ), esc_attr( $this->get_billing_cycle_readable() ) ); ?>)
265
- </span>
266
- <?php endif; ?>
267
- </h3>
268
- <?php if ( $this->is_premium ): ?>
269
- <div class="license-key-identity">
270
- <code><?= esc_attr( $this->get_hidden_license_key() ) ?></code>
271
- </div>
272
- <?php endif; ?>
273
- <div class="license-key-description">
274
- <p><?php _e( 'Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free. Please keep in mind this license covers only free edition of the plugin. Premium versions are distributed with other type of a license.', 'wbcr_factory_clearfy_212' ) ?>
275
- </p>
276
- <?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
277
- <p class="activate-trial-hint">
278
- <?php _e( 'You use a paid subscription for the plugin updates. In case you don’t want to receive paid updates, please, click <a data-action="unsubscribe" class="wcl-control-btn" href="#">cancel subscription</a>', 'wbcr_factory_clearfy_212' ) ?>
279
- </p>
280
- <?php endif; ?>
281
-
282
- <?php if ( $this->get_license_type() == 'trial' ): ?>
283
- <p class="activate-error-hint">
284
- <?php printf( __( 'Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_212' ), '' ) ?>
285
- </p>
286
- <?php endif; ?>
287
- </div>
288
- <table class="license-params" colspacing="0" colpadding="0">
289
- <tr>
290
- <!--<td class="license-param license-param-domain">
291
- <span class="license-value"><?php echo esc_attr( $_SERVER['SERVER_NAME'] ); ?></span>
292
- <span class="license-value-name"><?php _e( 'domain', 'wbcr_factory_clearfy_212' ) ?></span>
293
- </td>-->
294
- <td class="license-param license-param-days">
295
- <span class="license-value"><?= $this->get_plan() ?></span>
296
- <span class="license-value-name"><?php _e( 'plan', 'wbcr_factory_clearfy_212' ) ?></span>
297
- </td>
298
- <?php if ( $this->is_premium ) : ?>
299
- <td class="license-param license-param-sites">
300
- <span class="license-value">
301
- <?php echo esc_attr( $this->premium_license->get_count_active_sites() ); ?>
302
- <?php _e( 'of', 'wbcr_factory_clearfy_212' ) ?>
303
- <?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
304
- <span class="license-value-name"><?php _e( 'active sites', 'wbcr_factory_clearfy_212' ) ?></span>
305
- </td>
306
- <?php endif; ?>
307
- <td class="license-param license-param-version">
308
- <span class="license-value"><?= $this->plugin->getPluginVersion() ?></span>
309
- <span class="license-value-name"><span>version</span></span>
310
- </td>
311
- <?php if ( $this->is_premium ): ?>
312
- <td class="license-param license-param-days">
313
- <?php if ( $this->get_license_type() == 'trial' ): ?>
314
- <span class="license-value"><?php _e( 'EXPIRED!', 'wbcr_factory_clearfy_212' ) ?></span>
315
- <span class="license-value-name"><?php _e( 'please update the key', 'wbcr_factory_clearfy_212' ) ?></span>
316
- <?php else: ?>
317
- <span class="license-value">
318
- <?php
319
- if ( $this->premium_license->is_lifetime() ) {
320
- echo 'infiniate';
321
- } else {
322
- echo $this->get_expiration_days();
323
- }
324
- ?>
325
- <small> <?php _e( 'day(s)', 'wbcr_factory_clearfy_212' ) ?></small>
326
- </span>
327
- <span class="license-value-name"><?php _e( 'remained', 'wbcr_factory_clearfy_212' ) ?></span>
328
- <?php endif; ?>
329
- </td>
330
- <?php endif; ?>
331
- </tr>
332
- </table>
333
- </div>
334
- </div>
335
- <div class="license-input">
336
- <form action="" method="post">
337
- <?php if ( $this->is_premium ): ?>
338
- <p><?php _e( 'Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_212' ) ?><p>
339
- <?php else: ?>
340
- <p><?php _e( 'Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_212' ) ?>
341
- <p>
342
- <?php endif; ?>
343
- <button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
344
- id="license-submit">
345
- <?php _e( 'Submit Key', 'wbcr_factory_clearfy_212' ) ?>
346
- </button>
347
- <div class="license-key-wrap">
348
- <input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
349
- </div>
350
- <?php if ( $this->is_premium ): ?>
351
- <p style="margin-top: 10px;">
352
- <?php printf( __( '<a href="%s" target="_blank" rel="noopener">Lean more</a> about the premium version and get the license key to activate it now!', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_pricing_url( true, 'license_page' ) ); ?>
353
- </p>
354
- <?php else: ?>
355
- <p style="margin-top: 10px;">
356
- <?php printf( __( 'Can’t find your key? Go to <a href="%s" target="_blank" rel="noopener">this page</a> and login using the e-mail address associated with your purchase.', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_contacts_url( true, 'license_page' ) ) ?>
357
- </p>
358
- <?php endif; ?>
359
- </form>
360
- </div>
361
- </div>
362
- </div>
363
- <?php
364
- }
365
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/pages/class-page-more-features.php DELETED
@@ -1,170 +0,0 @@
1
- <?php
2
- /**
3
- * The page Settings.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
6
- * @since 1.0.1
7
- * @package clearfy
8
- * @copyright (c) 2018, Webcraftic Ltd
9
- *
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
-
18
- class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_ImpressiveThemplate {
19
-
20
- /**
21
- * {@inheritDoc}
22
- *
23
- * @var string
24
- */
25
- public $id = "more_features";
26
-
27
- /**
28
- * {@inheritDoc}
29
- *
30
- * @var string
31
- */
32
- public $page_menu_dashicon = 'dashicons-star-filled wbcr-factory-orange-color';
33
-
34
- /**
35
- * {@inheritDoc}
36
- *
37
- * @var string
38
- */
39
- public $page_menu_position = 5;
40
-
41
- /**
42
- * {@inheritDoc}
43
- *
44
- * @var string
45
- */
46
- public $type = 'page';
47
-
48
- /**
49
- * {@inheritDoc}
50
- *
51
- * @var bool
52
- */
53
- public $available_for_multisite = true;
54
-
55
- /**
56
- * {@inheritDoc}
57
- *
58
- * @since 2.0.6 - добавлен
59
- * @var bool
60
- */
61
- public $internal = true;
62
-
63
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
64
- $this->menu_title = __( 'More features (<b>free</b>)', 'wbcr_factory_clearfy_212' );
65
-
66
- parent::__construct( $plugin );
67
-
68
- $this->plugin = $plugin;
69
- }
70
-
71
- /**
72
- * {@inheritDoc}
73
- *
74
- * @return string
75
- */
76
- public function getPageTitle() {
77
- return __( 'More features', 'wbcr_factory_clearfy_212' );
78
- }
79
-
80
- /**
81
- * {@inheritDoc}
82
- *
83
- * @return void
84
- */
85
- public function showPageContent() {
86
- ?>
87
- <div class="row">
88
- <div class="col-sm-4">
89
- <div class="wbcr-factory-feature-box">
90
- <span class="dashicons dashicons-yes"></span>
91
- <h3><?php _e( 'Code cleaning', 'wbcr_factory_clearfy_212' ) ?></h3>
92
- <p><?php _e( 'Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_212' ) ?></p>
93
- </div>
94
- </div>
95
- <div class="col-sm-4">
96
- <div class="wbcr-factory-feature-box">
97
- <span class="dashicons dashicons-chart-bar"></span>
98
- <h3><?php _e( 'Improve SEO', 'wbcr_factory_clearfy_212' ) ?></h3>
99
- <p><?php _e( 'Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_212' ) ?></p>
100
- </div>
101
- </div>
102
- <div class="col-sm-4">
103
- <div class="wbcr-factory-feature-box">
104
- <span class="dashicons dashicons-shield-alt"></span>
105
- <h3><?php _e( 'Site protection', 'wbcr_factory_clearfy_212' ) ?></h3>
106
- <p><?php _e( 'Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_212' ) ?></p>
107
- </div>
108
- </div>
109
- <div class="col-sm-4">
110
- <div class="wbcr-factory-feature-box">
111
- <span class="dashicons dashicons-welcome-comments"></span>
112
- <h3><?php _e( 'Disable comments', 'wbcr_factory_clearfy_212' ) ?></h3>
113
- <p><?php _e( 'Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_212' ) ?></p>
114
- </div>
115
- </div>
116
- <div class="col-sm-4">
117
- <div class="wbcr-factory-feature-box">
118
- <span class="dashicons dashicons-update"></span>
119
- <h3><?php _e( 'Manage updates', 'wbcr_factory_clearfy_212' ) ?></h3>
120
- <p><?php _e( 'Enables or disables automatically updates for plugins, themes and core. It is also possible
121
- to disable all updates.', 'wbcr_factory_clearfy_212' ) ?></p>
122
- </div>
123
- </div>
124
- <div class="col-sm-4">
125
- <div class="wbcr-factory-feature-box">
126
- <span class="dashicons dashicons-admin-plugins"></span>
127
- <h3><?php _e( 'Manage widgets', 'wbcr_factory_clearfy_212' ) ?></h3>
128
- <p><?php _e( 'Allows you to remove unused widgets.', 'wbcr_factory_clearfy_212' ) ?></p>
129
- </div>
130
- </div>
131
- <div class="col-sm-4">
132
- <div class="wbcr-factory-feature-box">
133
- <span class="dashicons dashicons-dashboard"></span>
134
- <h3><?php _e( 'Speed Optimization', 'wbcr_factory_clearfy_212' ) ?></h3>
135
- <p><?php _e( 'Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_212' ) ?></p>
136
- </div>
137
- </div>
138
- <div class="col-sm-4">
139
- <div class="wbcr-factory-feature-box">
140
- <span class="dashicons dashicons-visibility"></span>
141
- <h3><?php _e( 'Site privacy', 'wbcr_factory_clearfy_212' ) ?></h3>
142
- <p><?php _e( 'Allows you to hide the version of the site and plugins. Allows you to hide your
143
- WordPress.', 'wbcr_factory_clearfy_212' ) ?></p>
144
- </div>
145
- </div>
146
- <div class="col-sm-4">
147
- <div class="wbcr-factory-feature-box">
148
- <span class="dashicons dashicons-admin-settings"></span>
149
- <h3><?php _e( 'Easy setup', 'wbcr_factory_clearfy_212' ) ?></h3>
150
- <p><?php _e( 'In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_212' ) ?></p>
151
- </div>
152
- </div>
153
- </div>
154
- <div class="wbcr-factory-buttons-wrap">
155
- <?php
156
- $url = 'https://clearfy.pro';
157
-
158
- if ( get_locale() == 'ru_RU' ) {
159
- $url = 'https://ru.clearfy.pro';
160
- }
161
- $url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
162
- ?>
163
- <a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
164
- <?php _e( 'Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_212' ) ?>
165
- </a>
166
- </div>
167
- <?php
168
- }
169
- }
170
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/clearfy/pages/class-pages.php DELETED
@@ -1,440 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Общий класс прослойка для страниц Clearfy и его компоннетов.
5
- * В этом классе добавляются общие ресурсы и элементы, необходимые для всех связанных плагинов.
6
- *
7
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
8
- * @since 2.0.5
9
- */
10
-
11
- // Exit if accessed directly
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
-
16
- /**
17
- * Class Wbcr_FactoryPages420_ImpressiveThemplate
18
- *
19
- * @method string getInfoWidget() - get widget content information
20
- * @method string getRatingWidget( array $args = [] ) - get widget content rating
21
- * @method string getDonateWidget() - get widget content donate
22
- * @method string getBusinessSuggetionWidget()
23
- * @method string getSupportWidget
24
- */
25
- class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThemplate {
26
-
27
- /**
28
- * {@inheritDoc}
29
- *
30
- * @since 2.0.5 - добавлен
31
- * @var bool
32
- */
33
- public $show_right_sidebar_in_options = true;
34
-
35
- /**
36
- * {@inheritDoc}
37
- *
38
- * @since 2.0.5 - добавлен
39
- * @var bool
40
- */
41
- public $available_for_multisite = true;
42
-
43
- /**
44
- * {@inheritDoc}
45
- *
46
- * @since 2.0.6 - добавлен
47
- * @var bool
48
- */
49
- public $internal = true;
50
-
51
- /**
52
- * @param Wbcr_Factory420_Plugin $plugin
53
- */
54
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
55
- parent::__construct( $plugin );
56
- }
57
-
58
- /**
59
- * @param $name
60
- * @param $arguments
61
- *
62
- * @return null|string
63
- */
64
- public function __call( $name, $arguments ) {
65
- if ( substr( $name, 0, 3 ) == 'get' ) {
66
- $called_method_name = 'show' . substr( $name, 3 );
67
- if ( method_exists( $this, $called_method_name ) ) {
68
- ob_start();
69
-
70
- $this->$called_method_name( $arguments );
71
- $content = ob_get_contents();
72
- ob_end_clean();
73
-
74
- return $content;
75
- }
76
- }
77
-
78
- return null;
79
- }
80
-
81
- /**
82
- * Requests assets (js and css) for the page.
83
- *
84
- * @param Wbcr_Factory420_ScriptList $scripts
85
- * @param Wbcr_Factory420_StyleList $styles
86
- *
87
- * @return void
88
- * @see Wbcr_FactoryPages420_AdminPage
89
- *
90
- */
91
- public function assets( $scripts, $styles ) {
92
- parent::assets( $scripts, $styles );
93
-
94
- $this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/clearfy-base.css' );
95
-
96
- // todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
97
- if ( defined( 'WCL_PLUGIN_URL' ) ) {
98
- $this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
99
- }
100
-
101
- wbcr_factory_420_do_action_deprecated( 'wbcr_clearfy_page_enqueue_scripts', [
102
- $this->getResultId(),
103
- $scripts,
104
- $styles
105
- ], '1.4.0', 'wbcr/clearfy/page_assets' );
106
-
107
- /**
108
- * Allows you to enqueue scripts to the internal pages of the plugin.
109
- * $this->getResultId() - page id + plugin name = quick_start-wbcr_clearfy
110
- *
111
- * @since 2.0.5
112
- */
113
- do_action( 'wbcr/clearfy/page_assets', $this->getResultId(), $scripts, $styles );
114
- }
115
-
116
- /**
117
- * @return Wbcr_Factory420_Request
118
- */
119
- public function request() {
120
- return $this->plugin->request;
121
- }
122
-
123
- /**
124
- * @since 2.0.5
125
- *
126
- * @param $option_name
127
- * @param bool $default *
128
- *
129
- * @return mixed|void
130
- */
131
- public function getPopulateOption( $option_name, $default = false ) {
132
- return $this->plugin->getPopulateOption( $option_name, $default );
133
- }
134
-
135
- /**
136
- * @param $option_name
137
- * @param bool $default
138
- *
139
- * @return mixed|void
140
- */
141
- public function getOption( $option_name, $default = false ) {
142
- return $this->plugin->getOption( $option_name, $default );
143
- }
144
-
145
- /**
146
- * @param $option_name
147
- * @param $value
148
- *
149
- * @return void
150
- */
151
- public function updatePopulateOption( $option_name, $value ) {
152
- $this->plugin->updatePopulateOption( $option_name, $value );
153
- }
154
-
155
- /**
156
- * @param $option_name
157
- * @param $value
158
- *
159
- * @return void
160
- */
161
- public function updateOption( $option_name, $value ) {
162
- $this->plugin->updateOption( $option_name, $value );
163
- }
164
-
165
- /**
166
- * @param $option_name
167
- *
168
- * @return void
169
- */
170
- public function deletePopulateOption( $option_name ) {
171
- $this->plugin->deletePopulateOption( $option_name );
172
- }
173
-
174
- /**
175
- * @param $option_name
176
- *
177
- * @return void
178
- */
179
- public function deleteOption( $option_name ) {
180
- $this->plugin->deleteOption( $option_name );
181
- }
182
-
183
-
184
- /**
185
- * Действие выполняется для всех страниц Clearfy и его компонентах.
186
- * Это простое предложение перейти на PRO версию.
187
- */
188
- public function multisiteProAction() {
189
- if ( is_multisite() && $this->plugin->isNetworkActive() ) {
190
-
191
- $license_page_url = $this->getBaseUrl( 'license' );
192
- $upgrade_url = WbcrFactoryClearfy212_Helpers::getWebcrafticSitePageUrl( $this->plugin->getPluginName(), 'pricing', 'multisite_save_settings' );
193
- $upgrade_price = WbcrFactoryClearfy212_Helpers::getClearfyBusinessPrice();
194
-
195
- $html = '<div class="wbcr-factory-clearfy-212-multisite-suggetion">';
196
- $html .= '<div class="wbcr-factory-inner-contanier">';
197
- $html .= '<h3>' . __( 'Upgrade to Clearfy Business', 'wbcr_factory_clearfy_212' ) . '</h3>';
198
- $html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_212' ) . '</p>';
199
- $html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_212' ) . '</p>';
200
- $html .= '<p>' . __( 'You can activate the plugin on each website and use it with zero limitations. But you can’t save the plugin’s settings under the Super Administrator role!', 'wbcr_factory_clearfy_212' ) . '</p>';
201
- $html .= '<p style="margin-top:20px">';
202
- $html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', 'wbcr_factory_clearfy_212' ) . '</a> ';
203
- $html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_212' ), $upgrade_price ) . '</a>';
204
- $html .= '</p>';
205
- $html .= '</div>';
206
- $html .= '</div>';
207
-
208
- $this->showPage( $html );
209
-
210
- return;
211
- }
212
-
213
- $this->redirectToAction( 'index' );
214
- }
215
-
216
- /**
217
- * @param string $position
218
- *
219
- * @return mixed|void
220
- */
221
- protected function getPageWidgets( $position = 'bottom' ) {
222
- $widgets = [];
223
-
224
- if ( $position == 'bottom' ) {
225
- $widgets['info_widget'] = $this->getInfoWidget();
226
- $widgets['rating_widget'] = $this->getRatingWidget();
227
- $widgets['support_widget'] = $this->getSupportWidget();
228
- //$widgets['donate_widget'] = $this->getDonateWidget();
229
- } else if ( $position == 'right' ) {
230
- $widgets['business_suggetion'] = $this->getBusinessSuggetionWidget();
231
- $widgets['info_widget'] = $this->getInfoWidget();
232
- $widgets['rating_widget'] = $this->getRatingWidget();
233
- }
234
-
235
- /**
236
- * @since 4.0.9 - является устаревшим
237
- */
238
- $widgets = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_pages_420_imppage_get_widgets', [
239
- $widgets,
240
- $position,
241
- $this->plugin,
242
- $this
243
- ], '4.0.9', 'wbcr/factory/pages/impressive/widgets' );
244
-
245
- /**
246
- * @since 4.0.1 - добавлен
247
- * @since 4.0.9 - изменено имя
248
- */
249
- $widgets = apply_filters( 'wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this );
250
-
251
- return $widgets;
252
- }
253
-
254
- /**
255
- * Создает Html разметку виджета для рекламы премиум версии
256
- *
257
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
258
- * @since 2.0.2
259
- */
260
- public function showBusinessSuggetionWidget() {
261
- $plugin_name = $this->plugin->getPluginName();
262
- $upgrade_price = $this->plugin->has_premium() ? $this->plugin->premium->get_price() : 0;
263
- $purchase_url = $this->plugin->get_support()->get_pricing_url( true, 'right_sidebar_ads' );
264
-
265
- $default_features = [
266
- '4_premium' => __( '4 premium components now;', 'wbcr_factory_clearfy_212' ),
267
- '40_premium' => __( '40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_212' ),
268
- 'multisite_support' => __( 'Multisite support;', 'wbcr_factory_clearfy_212' ),
269
- 'advance_settings' => __( 'Advanced settings;', 'wbcr_factory_clearfy_212' ),
270
- 'no_ads' => __( 'No ads;', 'wbcr_factory_clearfy_212' ),
271
- 'perfect_support' => __( 'Perfect support.', 'wbcr_factory_clearfy_212' )
272
- ];
273
-
274
- /**
275
- * @since 2.0.8 - added
276
- */
277
- $suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_212' );
278
- $suggetion_title = apply_filters( 'wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id );
279
-
280
- /**
281
- * @since 2.0.8 - deprecated
282
- */
283
- $suggetion_features = wbcr_factory_420_apply_filters_deprecated( 'wbcr/clearfy/page_bussines_suggetion_features', [
284
- $default_features,
285
- $this->plugin->getPluginName(),
286
- $this->id
287
- ], '2.0.8', 'wbcr/clearfy/pages/suggetion_features' );
288
-
289
- /**
290
- * @since 2.0.8 - renamed
291
- * @since 2.0.6
292
- */
293
- $suggetion_features = apply_filters( 'wbcr/clearfy/pages/suggetion_features', $suggetion_features, $plugin_name, $this->id );
294
-
295
- if ( empty( $suggetion_features ) ) {
296
- $suggetion_features = $default_features;
297
- }
298
- ?>
299
- <div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-212-pro-suggettion">
300
- <h3><?php echo $suggetion_title; ?></h3>
301
- <ul>
302
- <?php if ( ! empty( $suggetion_features ) ): ?>
303
- <?php foreach ( $suggetion_features as $feature ): ?>
304
- <li><?= $feature ?></li>
305
- <?php endforeach; ?>
306
- <?php endif; ?>
307
- </ul>
308
- <a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
309
- <?php printf( __( 'Upgrade for $%s', 'wbcr_factory_clearfy_212' ), $upgrade_price ) ?>
310
- </a>
311
- </div>
312
- <?php
313
- }
314
-
315
- /**
316
- * Создает html разметку виджета с информационными маркерами
317
- *
318
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
319
- * @since 2.0.0
320
- */
321
- public function showInfoWidget() {
322
- ?>
323
- <div class="wbcr-factory-sidebar-widget">
324
- <ul>
325
- <li>
326
- <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
327
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
328
- </span>
329
- - <?php _e( 'A neutral setting that can not harm your site, but you must be sure that you need to use it.', 'wbcr_factory_clearfy_212' ); ?>
330
- </li>
331
- <li>
332
- <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
333
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
334
- </span>
335
- - <?php _e( 'When set this option, you must be careful. Plugins and themes may depend on this function. You must be sure that you can disable this feature for the site.', 'wbcr_factory_clearfy_212' ); ?>
336
- </li>
337
- <li>
338
- <span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
339
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
340
- </span>
341
- - <?php _e( 'Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_212' ); ?>
342
- </li>
343
- </ul>
344
- ----------<br>
345
- <p><?php _e( 'Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_212' ); ?></p>
346
- </div>
347
- <?php
348
- }
349
-
350
- /**
351
- * Создает html разметку виджета рейтинга
352
- *
353
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
354
- * @since 2.0.0
355
- *
356
- * @param array $args
357
- */
358
- public function showRatingWidget( array $args ) {
359
- if ( ! isset( $args[0] ) || empty( $args[0] ) ) {
360
- $page_url = "https://goo.gl/tETE2X";
361
- } else {
362
- $page_url = $args[0];
363
- }
364
-
365
- $page_url = apply_filters( 'wbcr_factory_pages_420_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId() );
366
-
367
- ?>
368
- <div class="wbcr-factory-sidebar-widget">
369
- <p>
370
- <strong><?php _e( 'Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_212' ); ?></strong>
371
- </p>
372
- <p><?php _e( 'Help the author, leave a review on wordpress.org. Thanks to feedback, I will know that the plugin is really useful to you and is needed.', 'wbcr_factory_clearfy_212' ); ?></p>
373
- <p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_212' ); ?></p>
374
- <p>
375
- <i class="wbcr-factory-icon-5stars"></i>
376
- <a href="<?= $page_url ?>" title="Go rate us" target="_blank">
377
- <strong><?php _e( 'Go rate us and push ideas', 'wbcr_factory_clearfy_212' ); ?></strong>
378
- </a>
379
- </p>
380
- </div>
381
- <?php
382
- }
383
-
384
- /**
385
- * Создает html размету виджета доната
386
- *
387
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
388
- * @since 2.0.0
389
- */
390
- public function showDonateWidget() {
391
- ?>
392
- <div class="wbcr-factory-sidebar-widget">
393
- <p>
394
- <strong><?php _e( 'Donation for plugin development', 'wbcr_factory_clearfy_212' ); ?></strong>
395
- </p>
396
- <?php if ( get_locale() !== 'ru_RU' ): ?>
397
- <form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
398
- <input type="hidden" name="cmd" value="_s-xclick">
399
- <input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
400
- <div class="wbcr-factory-donation-price">5$</div>
401
- <input type="image" src="<?= FACTORY_PAGES_420_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
402
- </form>
403
- <?php else: ?>
404
- <iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/donate.xml?account=410011242846510&quickpay=donate&payment-type-choice=on&mobile-payment-type-choice=on&default-sum=300&targets=%D0%9D%D0%B0+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D1%83+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0+%D0%B8+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D1%83+%D0%BD%D0%BE%D0%B2%D1%8B%D1%85+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9.+&target-visibility=on&project-name=Webcraftic&project-site=&button-text=05&comment=on&hint=%D0%9A%D0%B0%D0%BA%D1%83%D1%8E+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E+%D0%BD%D1%83%D0%B6%D0%BD%D0%BE+%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%B2+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%3F&mail=on&successURL=" width="508" height="187"></iframe>
405
- <?php endif; ?>
406
- </div>
407
- <?php
408
- }
409
-
410
- /**
411
- * Создает html разметку виджета поддержки
412
- *
413
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
414
- * @since 2.0.8
415
- */
416
- public function showSupportWidget() {
417
- $free_support_url = $this->plugin->get_support()->get_contacts_url();
418
- $hot_support_url = 'https://webcraftic.com/other-questions-support/';
419
- ?>
420
- <div id="wbcr-clr-support-widget" class="wbcr-factory-sidebar-widget">
421
- <p><strong><?php _e( 'Having Issues?', 'clearfy' ); ?></strong></p>
422
- <div class="wbcr-clr-support-widget-body">
423
- <p>
424
- <?php _e( 'We provide free support for this plugin. If you are pushed with a problem, just create a new ticket. We will definitely help you!', 'clearfy' ); ?>
425
- </p>
426
- <ul>
427
- <li><span class="dashicons dashicons-sos"></span>
428
- <a href="<?= $free_support_url ?>" target="_blank" rel="noopener"><?php _e( 'Get starting free support', 'clearfy' ); ?></a>
429
- </li>
430
- <li style="margin-top: 15px;background: #fff4f1;padding: 10px;color: #a58074;">
431
- <span class="dashicons dashicons-warning"></span>
432
- <?php printf( __( 'If you find a php error or a vulnerability in plugin, you can <a href="%s" target="_blank" rel="noopener">create ticket</a> in hot support that we responded instantly.', 'clearfy' ), $hot_support_url ); ?>
433
- </li>
434
- </ul>
435
- </div>
436
- </div>
437
- <?php
438
- }
439
- }
440
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
libs/factory/core/README.md CHANGED
@@ -1,3 +1,3 @@
1
- # Core Factory Framework
2
-
3
- It performs the connection of system modules of the framework, is responsible for migrations, plugin updates, admin notifications, initialization of the plugin.
1
+ # Core Factory Framework
2
+
3
+ It performs the connection of system modules of the framework, is responsible for migrations, plugin updates, admin notifications, initialization of the plugin.
libs/factory/core/ajax/install-addons.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Ajax plugin configuration
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
6
+ * @copyright (c) 2017 Webraftic Ltd
7
+ * @version 1.0
8
+ */
9
+
10
+ // Exit if accessed directly
11
+ if( !defined('ABSPATH') ) {
12
+ exit;
13
+ }
14
+
15
+ /**
16
+ * This action allows you to process Ajax requests to activate external components Clearfy
17
+ */
18
+ function wfactory_446_install_components($plugin_instance)
19
+ {
20
+ check_ajax_referer('updates');
21
+
22
+ $slug = $plugin_instance->request->post('plugin', null, true);
23
+ $action = $plugin_instance->request->post('plugin_action', null, true);
24
+ $storage = $plugin_instance->request->post('storage', null, true);
25
+
26
+ if( !current_user_can('update_plugins') ) {
27
+ wp_die(__('You don\'t have enough capability to edit this information.', 'wbcr_factory_446'), __('Something went wrong.'), 403);
28
+ }
29
+
30
+ if( empty($slug) || empty($action) ) {
31
+ wp_send_json_error(['error_message' => __('Required attributes are not passed or empty.', 'wbcr_factory_446')]);
32
+ }
33
+ $success = false;
34
+ $send_data = [];
35
+
36
+ if( $storage == 'internal' ) {
37
+ if( $action == 'activate' ) {
38
+ if( $plugin_instance->activateComponent($slug) ) {
39
+ $success = true;
40
+ }
41
+ } else if( $action == 'deactivate' ) {
42
+
43
+ if( $plugin_instance->deactivateComponent($slug) ) {
44
+ $success = true;
45
+ }
46
+ } else {
47
+ wp_send_json_error(['error_message' => __('You are trying to perform an invalid action.', 'wbcr_factory_446')]);
48
+ }
49
+ } else if( $storage == 'wordpress' || $storage == 'creativemotion' ) {
50
+ if( !empty($slug) ) {
51
+ $network_wide = $plugin_instance->isNetworkActive();
52
+
53
+ if( $action == 'activate' ) {
54
+ $result = activate_plugin($slug, '', $network_wide);
55
+
56
+ if( is_wp_error($result) ) {
57
+ wp_send_json_error(['error_message' => $result->get_error_message()]);
58
+ }
59
+ } else if( $action == 'deactivate' ) {
60
+ deactivate_plugins($slug, false, $network_wide);
61
+ }
62
+
63
+ $success = true;
64
+ }
65
+ }
66
+
67
+ if( $action == 'install' || $action == 'deactivate' ) {
68
+ try {
69
+ // Delete button
70
+ $delete_button = $plugin_instance->get_delete_component_button($storage, $slug);
71
+ $send_data['delete_button'] = $delete_button->get_button();
72
+ } catch( Exception $e ) {
73
+ wp_send_json_error(['error_message' => $e->getMessage()]);
74
+ }
75
+ }
76
+
77
+ // Если требуется обновить постоянные ссылки, даем сигнал, что пользователю, нужно показать
78
+ // всплывающее уведомление.
79
+ // todo: сделать более красивое решение с передачей текстовых сообщений
80
+ /*if ( $action == 'deactivate' ) {
81
+ $is_need_rewrite_rules = $plugin_instance->getPopulateOption( 'need_rewrite_rules' );
82
+ if ( $is_need_rewrite_rules ) {
83
+ $send_data['need_rewrite_rules'] = sprintf( '<span class="wbcr-clr-need-rewrite-rules-message">' . __( 'When you deactivate some components, permanent links may work incorrectly. If this happens, please, <a href="%s">update the permalinks</a>, so you could complete the deactivation.', 'wbcr_factory_446' ), admin_url( 'options-permalink.php' ) . '</span>' );
84
+ }
85
+ }*/
86
+
87
+ if( $success ) {
88
+ // todo: для совместимости с плагином Clearfy
89
+ if( "wbcr_clearfy" === $plugin_instance->getPluginName() ) {
90
+ do_action('wbcr_clearfy_update_component', $slug, $action, $storage);
91
+ }
92
+ do_action("wfactory/updated_{$plugin_instance->getPluginName()}_component", $slug, $action, $storage);
93
+
94
+ wp_send_json_success($send_data);
95
+ }
96
+
97
+ wp_send_json_error(['error_message' => __('An unknown error occurred during the activation of the component.', 'wbcr_factory_446')]);
98
+ }
99
+
100
+ /**
101
+ * Ajax event that calls the wbcr/clearfy/activated_component action,
102
+ * to get the component to work. Usually this is a call to the installation functions,
103
+ * but in some cases, overwriting permanent references or compatibility checks.
104
+ */
105
+ function wfactory_446_prepare_component($plugin_instance)
106
+ {
107
+ check_ajax_referer('updates');
108
+
109
+ $component_name = $plugin_instance->request->post('plugin', null, true);
110
+
111
+ if( !current_user_can('update_plugins') ) {
112
+ wp_send_json_error(['error_message' => __('You don\'t have enough capability to edit this information.', 'wbcr_factory_446')], 403);
113
+ }
114
+
115
+ if( empty($component_name) ) {
116
+ wp_send_json_error(['error_message' => __('Required attribute [component_name] is empty.', 'wbcr_factory_446')]);
117
+ }
118
+ // todo: для совместимости с плагином Clearfy
119
+ if( "wbcr_clearfy" === $plugin_instance->getPluginName() ) {
120
+ do_action('wbcr/clearfy/activated_component', $component_name);
121
+ }
122
+ do_action("wfactory/activated_{$plugin_instance->getPluginName()}_component", $component_name);
123
+
124
+ wp_send_json_success();
125
+ }
126
+
127
+ /**
128
+ * Ajax handler for installing a plugin.
129
+ *
130
+ * @since 4.6.0
131
+ *
132
+ * @see Plugin_Upgrader
133
+ *
134
+ * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
135
+ */
136
+ function wfactory_446_creativemotion_install_plugin($plugin_instance)
137
+ {
138
+ check_ajax_referer('updates');
139
+
140
+ if( empty($_POST['slug']) ) {
141
+ wp_send_json_error(array(
142
+ 'slug' => '',
143
+ 'errorCode' => 'no_plugin_specified',
144
+ 'errorMessage' => __('No plugin specified.'),
145
+ ));
146
+ }
147
+
148
+ $status = array(
149
+ 'install' => 'plugin',
150
+ 'slug' => sanitize_key(wp_unslash($_POST['slug'])),
151
+ );
152
+
153
+ if( !current_user_can('install_plugins') ) {
154
+ $status['errorMessage'] = __('Sorry, you are not allowed to install plugins on this site.');
155
+ wp_send_json_error($status);
156
+ }
157
+
158
+ require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
159
+ include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
160
+
161
+ $api = plugins_api('plugin_information', array(
162
+ 'slug' => sanitize_key(wp_unslash($_POST['slug'])),
163
+ 'fields' => array(
164
+ 'sections' => false,
165
+ ),
166
+ ));
167
+
168
+ if( is_wp_error($api) ) {
169
+ $status['errorMessage'] = $api->get_error_message();
170
+ wp_send_json_error($status);
171
+ }
172
+
173
+ $status['pluginName'] = $api->name;
174
+
175
+ $skin = new WP_Ajax_Upgrader_Skin();
176
+ $upgrader = new Plugin_Upgrader($skin);
177
+ //$result = $upgrader->install($api->download_link);
178
+ $result = $upgrader->install('https://clearfy.pro/components/download.php');
179
+
180
+ if( defined('WP_DEBUG') && WP_DEBUG ) {
181
+ $status['debug'] = $skin->get_upgrade_messages();
182
+ }
183
+
184
+ if( is_wp_error($result) ) {
185
+ $status['errorCode'] = $result->get_error_code();
186
+ $status['errorMessage'] = $result->get_error_message();
187
+ wp_send_json_error($status);
188
+ } elseif( is_wp_error($skin->result) ) {
189
+ $status['errorCode'] = $skin->result->get_error_code();
190
+ $status['errorMessage'] = $skin->result->get_error_message();
191
+ wp_send_json_error($status);
192
+ } elseif( $skin->get_errors()->has_errors() ) {
193
+ $status['errorMessage'] = $skin->get_error_messages();
194
+ wp_send_json_error($status);
195
+ } elseif( is_null($result) ) {
196
+ global $wp_filesystem;
197
+
198
+ $status['errorCode'] = 'unable_to_connect_to_filesystem';
199
+ $status['errorMessage'] = __('Unable to connect to the filesystem. Please confirm your credentials.');
200
+
201
+ // Pass through the error from WP_Filesystem if one was raised.
202
+ if( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->has_errors() ) {
203
+ $status['errorMessage'] = esc_html($wp_filesystem->errors->get_error_message());
204
+ }
205
+
206
+ wp_send_json_error($status);
207
+ }
208
+
209
+ $install_status = install_plugin_install_status($api);
210
+ $pagenow = isset($_POST['pagenow']) ? sanitize_key($_POST['pagenow']) : '';
211
+
212
+ // If installation request is coming from import page, do not return network activation link.
213
+ $plugins_url = ('import' === $pagenow) ? admin_url('plugins.php') : network_admin_url('plugins.php');
214
+
215
+ if( current_user_can('activate_plugin', $install_status['file']) && is_plugin_inactive($install_status['file']) ) {
216
+ $status['activateUrl'] = add_query_arg(array(
217
+ '_wpnonce' => wp_create_nonce('activate-plugin_' . $install_status['file']),
218
+ 'action' => 'activate',
219
+ 'plugin' => $install_status['file'],
220
+ ), $plugins_url);
221
+ }
222
+
223
+ if( is_multisite() && current_user_can('manage_network_plugins') && 'import' !== $pagenow ) {
224
+ $status['activateUrl'] = add_query_arg(array('networkwide' => 1), $status['activateUrl']);
225
+ }
226
+
227
+ wp_send_json_success($status);
228
+ }
libs/factory/core/assets/js/core-components.js ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This code provides tools for downloading, installing external add-ons for the Clearfy plugin
3
+ *
4
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>
5
+ * @copyright (c) 10.09.2017, Webcraftic
6
+ * @version 1.0
7
+ */
8
+
9
+ (function($) {
10
+ 'use strict';
11
+
12
+ var externalAddon = {
13
+ init: function() {
14
+ this.events();
15
+ },
16
+ events: function() {
17
+ var self = this;
18
+
19
+ /**
20
+ * This event is intended for installation, removal, activation, deactivation of external add-ons
21
+ */
22
+
23
+ $(document).on('click', '.wfactory-446-process-button', function() {
24
+ var $this = $(this),
25
+ button_i18n = $(this).data('i18n'),
26
+ plugin_slug = $(this).data('slug'),
27
+ plugin_action = $(this).data('plugin-action'),
28
+ plugin = $(this).data('plugin'),
29
+ storage = $(this).data('storage'),
30
+ wpnonce = $(this).data('wpnonce');
31
+
32
+ var action = ('creativemotion' === storage)
33
+ ? 'wfactory-446-creativemotion-install-plugin'
34
+ : 'install-plugin';
35
+
36
+ if( storage === 'freemius' || ((storage === 'wordpress' || storage === 'creativemotion' || storage === 'internal') && (plugin_action === 'activate' || plugin_action === 'deactivate')) ) {
37
+ action = 'wfactory-446-intall-component';
38
+ } else if( storage === 'wordpress' && plugin_action === 'delete' ) {
39
+ action = 'delete-plugin';
40
+ }
41
+
42
+ var data = {
43
+ action: action,
44
+ slug: plugin_slug,
45
+ storage: storage,
46
+ plugin: plugin,
47
+ plugin_action: plugin_action,
48
+ _wpnonce: wpnonce
49
+ };
50
+
51
+ if( plugin_action === 'install' ) {
52
+ $this.addClass('updating-message');
53
+ }
54
+
55
+ $this.addClass('disabled').text(button_i18n.loading);
56
+
57
+ $.wfactory_446.hooks.run('core/components/pre_update', [$this, data]);
58
+
59
+ self.sendRequest(data, function(response) {
60
+ if( !response || !response.success ) {
61
+ $.wfactory_446.hooks.run('core/components/update_error', [
62
+ $this,
63
+ data,
64
+ response
65
+ ]);
66
+
67
+ return;
68
+ }
69
+
70
+ if( response.success ) {
71
+ $this.removeClass('disabled').removeClass('updating-message');
72
+
73
+ if( plugin_action === 'install' ) {
74
+
75
+ plugin_action = 'activate';
76
+ $this.data('plugin-action', 'activate');
77
+ $this.attr('data-plugin-action', 'activate');
78
+
79
+ if( $this.hasClass('button') ) {
80
+ $this.removeClass('button-default').addClass('button-primary');
81
+ }
82
+
83
+ $.wfactory_446.hooks.run('core/components/installed', [
84
+ $this,
85
+ data,
86
+ response
87
+ ]);
88
+
89
+ } else if( plugin_action === 'activate' ) {
90
+
91
+ plugin_action = 'deactivate';
92
+ $this.data('plugin-action', 'deactivate');
93
+ $this.attr('data-plugin-action', 'deactivate');
94
+
95
+ if( $this.hasClass('button') ) {
96
+ $this.removeClass('button-primary').addClass('button-default');
97
+ }
98
+
99
+ $.wfactory_446.hooks.run('core/components/pre_activate', [
100
+ $this,
101
+ data,
102
+ response
103
+ ]);
104
+
105
+ /**
106
+ * Send an additional request for activation of the component, during activation
107
+ * perform the action wbcr/clearfy/activated_component.
108
+ *
109
+ * Basically, this is necessary to prepare the plugin to work, write the necessary rows and
110
+ * tables in the database, rewriting permalinks, checking conflicts, etc.
111
+ */
112
+ if( storage === 'freemius' || storage === 'internal' ) {
113
+ self.sendRequestToComponentActivationPrepare($this, data, button_i18n);
114
+ return;
115
+ }
116
+
117
+ } else if( plugin_action === 'deactivate' ) {
118
+
119
+ plugin_action = 'activate';
120
+ $this.data('plugin-action', 'activate');
121
+ $this.attr('data-plugin-action', 'activate');
122
+
123
+ if( $this.hasClass('button') ) {
124
+ $this.removeClass('button-default').addClass('button-primary');
125
+ }
126
+
127
+ $.wfactory_446.hooks.run('core/components/deactivated', [
128
+ $this,
129
+ data,
130
+ response
131
+ ]);
132
+
133
+ } else if( plugin_action === 'delete' ) {
134
+
135
+ plugin_action = 'install';
136
+
137
+ $.wfactory_446.hooks.run('core/components/deleted', [$this, data, response]);
138
+ }
139
+ } else {
140
+ if( plugin_action === 'install' ) {
141
+ $this.removeClass('updating-message');
142
+ }
143
+ }
144
+
145
+ $this.text(button_i18n[plugin_action]);
146
+
147
+ $.wfactory_446.hooks.run('core/components/updated', [$this, data, response]);
148
+ });
149
+
150
+ return false;
151
+ });
152
+ },
153
+
154
+ /**
155
+ * Отправляет дополнительный запрос на активацию компонента, во время активации
156
+ * выполняет хук wbcr/clearfy/activated_component.
157
+ *
158
+ * В принципе, это необходимо для подготовки плагина к работе, записи необходимых строк и таблиц в
159
+ * базу данных, перепись постоянных ссылок, проверка конфликтов и т.д.
160
+ *
161
+ * @param {object} componentButton
162
+ * @param {object} sendData
163
+ * @param {object} button_i18n
164
+ */
165
+ sendRequestToComponentActivationPrepare: function(componentButton, sendData, button_i18n) {
166
+ var self = this;
167
+
168
+ componentButton.addClass('button-primary')
169
+ .addClass('disabled')
170
+ .text(button_i18n.preparation);
171
+
172
+ sendData.action = 'wfactory-446-prepare-component';
173
+
174
+ this.sendRequest(sendData, function(response) {
175
+ componentButton.removeClass('disabled');
176
+
177
+ if( !response || !response.success ) {
178
+ componentButton.text(button_i18n['activate']);
179
+
180
+ $.wfactory_446.hooks.run('core/components/activation_error', [
181
+ componentButton,
182
+ sendData,
183
+ response
184
+ ]);
185
+ return;
186
+ }
187
+
188
+ componentButton.removeClass('button-primary').text(button_i18n['deactivate']);
189
+
190
+ $.wfactory_446.hooks.run('core/components/activated', [
191
+ componentButton,
192
+ sendData,
193
+ response
194
+ ]);
195
+ });
196
+ },
197
+
198
+ sendRequest: function(data, callback) {
199
+ var self = this;
200
+
201
+ $.ajax(ajaxurl, {
202
+ type: 'post',
203
+ dataType: 'json',
204
+ data: data,
205
+ success: function(data, textStatus, jqXHR) {
206
+ callback && callback(data);
207
+ },
208
+ error: function(xhr, ajaxOptions, thrownError) {
209
+ console.log(xhr.status);
210
+ console.log(xhr.responseText);
211
+ console.log(thrownError);
212
+
213
+ $.wfactory_446.hooks.run('core/components/ajax_error', [
214
+ xhr,
215
+ ajaxOptions,
216
+ thrownError
217
+ ]);
218
+ }
219
+ });
220
+ }
221
+ };
222
+
223
+ $(document).ready(function() {
224
+ externalAddon.init();
225
+ });
226
+
227
+ })(jQuery);
libs/factory/core/assets/js/core-general.js ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * @author Webcraftic <wordpress.webraftic@gmail.com>
4
+ * @copyright (c) 02.09.2020, Webcraftic
5
+ * @version 1.0
6
+ */
7
+
8
+ (function($) {
9
+ 'use strict';
10
+
11
+ if( !$.wfactory_446 ) {
12
+ $.wfactory_446 = {};
13
+ }
14
+
15
+ $.wfactory_446.filters = $.wfactory_446.filters || {
16
+
17
+ /**
18
+ * A set of registered filters.
19
+ */
20
+ _items: {},
21
+
22
+ /**
23
+ * A set of priorities of registered filters.
24
+ */
25
+ _priorities: {},
26
+
27
+ /**
28
+ * Applies filters to a given input value.
29
+ */
30
+ run: function(filterName, args) {
31
+ var input = args && args.length > 0 ? args[0] : null;
32
+ if( !this._items[filterName] ) {
33
+ return input;
34
+ }
35
+
36
+ for( var i in this._priorities[filterName] ) {
37
+ if( !this._priorities[filterName].hasOwnProperty(i) ) {
38
+ continue;
39
+ }
40
+
41
+ var priority = this._priorities[filterName][i];
42
+
43
+ for( var k = 0; k < this._items[filterName][priority].length; k++ ) {
44
+ var f = this._items[filterName][priority][k];
45
+ input = f.apply(f, args);
46
+ }
47
+ }
48
+
49
+ return input;
50
+ },
51
+
52
+ /**
53
+ * Registers a new filter.
54
+ */
55
+ add: function(filterName, callback, priority) {
56
+
57
+ if( !priority ) {
58
+ priority = 10;
59
+ }
60
+
61
+ if( !this._items[filterName] ) {
62
+ this._items[filterName] = {};
63
+ }
64
+ if( !this._items[filterName][priority] ) {
65
+ this._items[filterName][priority] = [];
66
+ }
67
+ this._items[filterName][priority].push(callback);
68
+
69
+ if( !this._priorities[filterName] ) {
70
+ this._priorities[filterName] = [];
71
+ }
72
+ if( $.inArray(priority, this._priorities[filterName]) === -1 ) {
73
+ this._priorities[filterName].push(priority);
74
+ }
75
+
76
+ this._priorities[filterName].sort(function(a, b) {
77
+ return a - b;
78
+ });
79
+ }
80
+ };
81
+
82
+ $.wfactory_446.hooks = $.wfactory_446.hooks || {
83
+
84
+ /**
85
+ * Applies filters to a given input value.
86
+ */
87
+ run: function(filterName, args) {
88
+ $.wfactory_446.filters.run(filterName, args);
89
+ },
90
+
91
+ /**
92
+ * Registers a new filter.
93
+ */
94
+ add: function(filterName, callback, priority) {
95
+ $.wfactory_446.filters.add(filterName, callback, priority);
96
+ }
97
+ };
98
+
99
+ })(jQuery);
libs/factory/core/boot.php CHANGED
@@ -1,62 +1,73 @@
1
- <?php
2
- /**
3
- * Factory Plugin
4
- *
5
- * @author @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @since 1.0.0
7
- * @package core
8
- * @copyright (c) 2018, Webcraftic Ltd
9
- *
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- if ( defined( 'FACTORY_420_LOADED' ) ) {
18
- return;
19
- }
20
-
21
- define( 'FACTORY_420_LOADED', true );
22
-
23
- define( 'FACTORY_420_VERSION', '4.2.0' );
24
-
25
- define( 'FACTORY_420_DIR', dirname( __FILE__ ) );
26
- define( 'FACTORY_420_URL', plugins_url( null, __FILE__ ) );
27
-
28
- load_plugin_textdomain( 'wbcr_factory_420', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
29
-
30
- #comp merge
31
- require_once( FACTORY_420_DIR . '/includes/functions.php' );
32
-
33
- require_once( FACTORY_420_DIR . '/includes/entities/class-factory-paths.php' );
34
- require_once( FACTORY_420_DIR . '/includes/entities/class-factory-support.php' );
35
-
36
- require_once( FACTORY_420_DIR . '/includes/class-factory-requests.php' );
37
- require_once( FACTORY_420_DIR . '/includes/class-factory-options.php' );
38
- require_once( FACTORY_420_DIR . '/includes/class-factory-plugin-base.php' );
39
- require_once( FACTORY_420_DIR . '/includes/class-factory-migrations.php' );
40
- require_once( FACTORY_420_DIR . '/includes/class-factory-notices.php' );
41
-
42
- // ASSETS
43
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-assets-list.php' );
44
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-script-list.php' );
45
- require_once( FACTORY_420_DIR . '/includes/assets-managment/class-factory-style-list.php' );
46
-
47
- // PREMIUM
48
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-license-interface.php' );
49
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-provider-abstract.php' );
50
- require_once( FACTORY_420_DIR . '/includes/premium/class-factory-manager.php' );
51
-
52
- // UPDATES
53
- require_once( FACTORY_420_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php' );
54
- require_once( FACTORY_420_DIR . '/includes/updates/repositories/class-factory-wordpress.php' );
55
- require_once( FACTORY_420_DIR . '/includes/updates/class-factory-upgrader.php' );
56
- require_once( FACTORY_420_DIR . '/includes/updates/class-factory-premium-upgrader.php' );
57
-
58
- require_once( FACTORY_420_DIR . '/includes/class-factory-plugin-abstract.php' );
59
-
60
- require_once( FACTORY_420_DIR . '/includes/activation/class-factory-activator.php' );
61
- require_once( FACTORY_420_DIR . '/includes/activation/class-factory-update.php' );
62
- #endcomp
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Factory Plugin
4
+ *
5
+ * @author @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @since 1.0.0
7
+ * @package core
8
+ * @copyright (c) 2018, Webcraftic Ltd
9
+ *
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if( !defined('ABSPATH') ) {
14
+ exit;
15
+ }
16
+
17
+ if( defined('FACTORY_446_LOADED') ) {
18
+ return;
19
+ }
20
+
21
+ define('FACTORY_446_LOADED', true);
22
+
23
+ define('FACTORY_446_VERSION', '4.4.6');
24
+
25
+ define('FACTORY_446_DIR', dirname(__FILE__));
26
+ define('FACTORY_446_URL', plugins_url(null, __FILE__));
27
+
28
+ load_plugin_textdomain('wbcr_factory_446', false, dirname(plugin_basename(__FILE__)) . '/langs');
29
+
30
+ #comp merge
31
+ require_once(FACTORY_446_DIR . '/includes/functions.php');
32
+
33
+ require_once(FACTORY_446_DIR . '/includes/entities/class-factory-paths.php');
34
+ require_once(FACTORY_446_DIR . '/includes/entities/class-factory-support.php');
35
+
36
+ require_once(FACTORY_446_DIR . '/includes/class-factory-requests.php');
37
+ require_once(FACTORY_446_DIR . '/includes/class-factory-options.php');
38
+ require_once(FACTORY_446_DIR . '/includes/class-factory-plugin-base.php');
39
+ require_once(FACTORY_446_DIR . '/includes/class-factory-migrations.php');
40
+ require_once(FACTORY_446_DIR . '/includes/class-factory-notices.php');
41
+
42
+ // ASSETS
43
+ require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-assets-list.php');
44
+ require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-script-list.php');
45
+ require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-style-list.php');
46
+
47
+ // PREMIUM
48
+ require_once(FACTORY_446_DIR . '/includes/premium/class-factory-license-interface.php');
49
+ require_once(FACTORY_446_DIR . '/includes/premium/class-factory-provider-abstract.php');
50
+ require_once(FACTORY_446_DIR . '/includes/premium/class-factory-manager.php');
51
+
52
+ // UPDATES
53
+ require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php');
54
+ require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-wordpress.php');
55
+ require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-github.php');
56
+ require_once(FACTORY_446_DIR . '/includes/updates/class-factory-upgrader.php');
57
+ require_once(FACTORY_446_DIR . '/includes/updates/class-factory-premium-upgrader.php');
58
+
59
+ require_once(FACTORY_446_DIR . '/includes/class-factory-plugin-abstract.php');
60
+
61
+ require_once(FACTORY_446_DIR . '/includes/activation/class-factory-activator.php');
62
+ require_once(FACTORY_446_DIR . '/includes/activation/class-factory-update.php');
63
+ #endcomp
64
+
65
+ add_action('admin_enqueue_scripts', function () {
66
+ wp_enqueue_script('wfactory-446-core-general', FACTORY_446_URL . '/assets/js/core-general.js', [
67
+ 'jquery'
68
+ ], FACTORY_446_VERSION);
69
+ wp_enqueue_script('wfactory-446-core-components', FACTORY_446_URL . '/assets/js/core-components.js', [
70
+ 'jquery',
71
+ 'wfactory-446-core-general'
72
+ ], FACTORY_446_VERSION);
73
+ });
libs/factory/core/includes/activation/class-factory-activator.php CHANGED
@@ -1,43 +1,43 @@
1
- <?php
2
- /**
3
- * The file contains a base class for plugin activators.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
- *
8
- * @package factory-core
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
-
16
-
17
- /**
18
- * Plugin Activator
19
- *
20
- * @since 1.0.0
21
- */
22
- abstract class Wbcr_Factory420_Activator {
23
-
24
- /**
25
- * Curent plugin.
26
- *
27
- * @var Wbcr_Factory420_Plugin
28
- */
29
- public $plugin;
30
-
31
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
32
- $this->plugin = $plugin;
33
- }
34
-
35
- public function activate() {
36
- }
37
-
38
- public function deactivate() {
39
- }
40
-
41
- public function update() {
42
- }
43
- }
1
+ <?php
2
+ /**
3
+ * The file contains a base class for plugin activators.
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
+ *
8
+ * @package factory-core
9
+ * @since 1.0.0
10
+ */
11
+ // Exit if accessed directly
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+
17
+ /**
18
+ * Plugin Activator
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+ abstract class Wbcr_Factory446_Activator {
23
+
24
+ /**
25
+ * Curent plugin.
26
+ *
27
+ * @var Wbcr_Factory446_Plugin
28
+ */
29
+ public $plugin;
30
+
31
+ public function __construct( Wbcr_Factory446_Plugin $plugin ) {
32
+ $this->plugin = $plugin;
33
+ }
34
+
35
+ public function activate() {
36
+ }
37
+
38
+ public function deactivate() {
39
+ }
40
+
41
+ public function update() {
42
+ }
43
+ }
libs/factory/core/includes/activation/class-factory-update.php CHANGED
@@ -1,39 +1,39 @@
1
- <?php
2
- /**
3
- * The file contains a base class for update items of plugins.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
- *
8
- * @package factory-core
9
- * @since 1.0.0
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
-
18
- /**
19
- * Plugin Activator
20
- *
21
- * @since 1.0.0
22
- */
23
- abstract class Wbcr_Factory420_Update {
24
-
25
- /**
26
- * Current plugin
27
- *
28
- * @var Wbcr_Factory420_Plugin
29
- */
30
- var $plugin;
31
-
32
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
33
- $this->plugin = $plugin;
34
- }
35
-
36
- abstract function install();
37
-
38
- //abstract function rollback();
39
- }
1
+ <?php
2
+ /**
3
+ * The file contains a base class for update items of plugins.
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
+ *
8
+ * @package factory-core
9
+ * @since 1.0.0
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+
18
+ /**
19
+ * Plugin Activator
20
+ *
21
+ * @since 1.0.0
22
+ */
23
+ abstract class Wbcr_Factory446_Update {
24
+
25
+ /**
26
+ * Current plugin
27
+ *
28
+ * @var Wbcr_Factory446_Plugin
29
+ */
30
+ var $plugin;
31
+
32
+ public function __construct( Wbcr_Factory446_Plugin $plugin ) {
33
+ $this->plugin = $plugin;
34
+ }
35
+
36
+ abstract function install();
37
+
38
+ //abstract function rollback();
39
+ }
libs/factory/core/includes/activation/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  // Silence is golden.
1
+ <?php
2
  // Silence is golden.
libs/factory/core/includes/assets-managment/class-factory-assets-list.php CHANGED
@@ -1,126 +1,126 @@
1
- <?php
2
- /**
3
- * The class contains a base class for all lists of assets.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
- *
8
- * @package factory-core
9
- * @since 1.0.0
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
- /**
18
- * Assets List
19
- *
20
- * @since 1.0.0
21
- */
22
- class Wbcr_Factory420_AssetsList {
23
-
24
- protected $all = [];
25
- public $header_place = [];
26
- public $footer_place = [];
27
- public $required = [];
28
-
29
- protected $default_place;
30
-
31
- /**
32
- * @var Wbcr_Factory420_Plugin
33
- */
34
- protected $plugin;
35
-
36
- /**
37
- * @param Wbcr_Factory420_Plugin $plugin
38
- * @param bool $defaultIsFooter
39
- */
40
- public function __construct( Wbcr_Factory420_Plugin $plugin, $defaultIsFooter = true ) {
41
- $this->plugin = $plugin;
42
-
43
- if ( $defaultIsFooter ) {
44
- $this->default_place = &$this->footer_place;
45
- }
46
- if ( ! $defaultIsFooter ) {
47
- $this->default_place = &$this->header_place;
48
- }
49
- }
50
-
51
- /**
52
- * Remove items from the collection
53
- *
54
- * @return $this
55
- */
56
- public function deregister() {
57
- foreach ( func_get_args() as $item ) {
58
-
59
- if ( ! is_string( $item ) ) {
60
- return $this;
61
- }
62
-
63
- $key_in_all = array_search( $item, $this->all );
64
- $key_in_default_place = array_search( $item, $this->default_place );
65
- $key_in_header_place = array_search( $item, $this->header_place );
66
- $key_inFooterPlace = array_search( $item, $this->footer_place );
67
-
68
- if ( $key_in_all ) {
69
- unset( $this->all[ $key_in_all ] );
70
- }
71
- if ( $key_in_default_place ) {
72
- unset( $this->default_place[ $key_in_default_place ] );
73
- }
74
- if ( $key_in_header_place ) {
75
- unset( $this->header_place[ $key_in_header_place ] );
76
- }
77
- if ( $key_inFooterPlace ) {
78
- unset( $this->footer_place[ $key_inFooterPlace ] );
79
- }
80
- }
81
-
82
- return $this;
83
- }
84
-
85
- /**
86
- * Checks whether the collection is empty.
87
- *
88
- * @param string $source if the 'bootstrap' specified, checks only whether the bootstrap assets were required.
89
- *
90
- * @return boolean
91
- */
92
- public function isEmpty( $source = 'wordpress' ) {
93
- if ( 'bootstrap' === $source ) {
94
- return empty( $this->required[ $source ] );
95
- }
96
-
97
- return empty( $this->all ) && empty( $this->required );
98
- }
99
-
100
- public function IsHeaderEmpty() {
101
- return empty( $this->header_place );
102
- }
103
-
104
- public function IsFooterEmpty() {
105
- return empty( $this->footer_place );
106
- }
107
-
108
- /**
109
- * Adds new items to the requried collection.
110
- *
111
- * @param mixed
112
- */
113
- public function request( $items, $source = 'wordpress' ) {
114
-
115
- if ( is_array( $items ) ) {
116
- foreach ( $items as $item ) {
117
- $this->required[ $source ][] = $item;
118
- }
119
- } else {
120
- $this->required[ $source ][] = $items;
121
- }
122
-
123
- return $this;
124
- }
125
- }
126
-
1
+ <?php
2
+ /**
3
+ * The class contains a base class for all lists of assets.
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
+ *
8
+ * @package factory-core
9
+ * @since 1.0.0
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+ /**
18
+ * Assets List
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+ class Wbcr_Factory446_AssetsList {
23
+
24
+ protected $all = [];
25
+ public $header_place = [];
26
+ public $footer_place = [];
27
+ public $required = [];
28
+
29
+ protected $default_place;
30
+
31
+ /**
32
+ * @var Wbcr_Factory446_Plugin
33
+ */
34
+ protected $plugin;
35
+
36
+ /**
37
+ * @param Wbcr_Factory446_Plugin $plugin
38
+ * @param bool $defaultIsFooter
39
+ */
40
+ public function __construct( Wbcr_Factory446_Plugin $plugin, $defaultIsFooter = true ) {
41
+ $this->plugin = $plugin;
42
+
43
+ if ( $defaultIsFooter ) {
44
+ $this->default_place = &$this->footer_place;
45
+ }
46
+ if ( ! $defaultIsFooter ) {
47
+ $this->default_place = &$this->header_place;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Remove items from the collection
53
+ *
54
+ * @return $this
55
+ */
56
+ public function deregister() {
57
+ foreach ( func_get_args() as $item ) {
58
+
59
+ if ( ! is_string( $item ) ) {
60
+ return $this;
61
+ }
62
+
63
+ $key_in_all = array_search( $item, $this->all );
64
+ $key_in_default_place = array_search( $item, $this->default_place );
65
+ $key_in_header_place = array_search( $item, $this->header_place );
66
+ $key_inFooterPlace = array_search( $item, $this->footer_place );
67
+
68
+ if ( $key_in_all ) {
69
+ unset( $this->all[ $key_in_all ] );
70
+ }
71
+ if ( $key_in_default_place ) {
72
+ unset( $this->default_place[ $key_in_default_place ] );
73
+ }
74
+ if ( $key_in_header_place ) {
75
+ unset( $this->header_place[ $key_in_header_place ] );
76
+ }
77
+ if ( $key_inFooterPlace ) {
78
+ unset( $this->footer_place[ $key_inFooterPlace ] );
79
+ }
80
+ }
81
+
82
+ return $this;
83
+ }
84
+
85
+ /**
86
+ * Checks whether the collection is empty.
87
+ *
88
+ * @param string $source if the 'bootstrap' specified, checks only whether the bootstrap assets were required.
89
+ *
90
+ * @return boolean
91
+ */
92
+ public function isEmpty( $source = 'wordpress' ) {
93
+ if ( 'bootstrap' === $source ) {
94
+ return empty( $this->required[ $source ] );
95
+ }
96
+
97
+ return empty( $this->all ) && empty( $this->required );
98
+ }
99
+
100
+ public function IsHeaderEmpty() {
101
+ return empty( $this->header_place );
102
+ }
103
+
104
+ public function IsFooterEmpty() {
105
+ return empty( $this->footer_place );
106
+ }
107
+
108
+ /**
109
+ * Adds new items to the requried collection.
110
+ *
111
+ * @param mixed
112
+ */
113
+ public function request( $items, $source = 'wordpress' ) {
114
+
115
+ if ( is_array( $items ) ) {
116
+ foreach ( $items as $item ) {
117
+ $this->required[ $source ][] = $item;
118
+ }
119
+ } else {
120
+ $this->required[ $source ][] = $items;
121
+ }
122
+
123
+ return $this;
124
+ }
125
+ }
126
+
libs/factory/core/includes/assets-managment/class-factory-script-list.php CHANGED
@@ -1,166 +1,167 @@
1
- <?php
2
- /**
3
- * The file contains a class to manage script assets.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
- *
8
- * @package factory-core
9
- * @since 1.0.0
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
-
18
- /**
19
- * Script List
20
- *
21
- * @since 1.0.0
22
- */
23
- class Wbcr_Factory420_ScriptList extends Wbcr_Factory420_AssetsList {
24
-
25
- public $localize_data = [];
26
- public $use_ajax = false;
27
-
28
- /**
29
- * Adds new items to the collection (default place).
30
- *
31
- * @param mixed
32
- *
33
- * @version 2.0
34
- */
35
- public function add( $file_url, $deps = [ 'jquery' ], $handle = null, $version = false, $place = 'default' ) {
36
-
37
- if ( empty( $file_url ) ) {
38
- return $this;
39
- }
40
-
41
- $resource = [];
42
- $resource['file_url'] = $file_url;
43
- $resource['deps'] = $deps;
44
- $resource['handle'] = $handle;
45
- $resource['version'] = $version;
46
-
47
- $this->all[] = $resource;
48
-
49
- switch ( $place ) {
50
- case 'header':
51
- $this->header_place[] = $resource;
52
- break;
53
- case 'footer':
54
- $this->footer_place[] = $resource;
55
- break;
56
- default:
57
- $this->default_place[] = $resource;
58
- break;
59
- }
60
-
61
- return $this;
62
- }
63
-
64
- /**
65
- * Adds new items to the collection (header).
66
- *
67
- * @param mixed
68
- */
69
- public function addToHeader( $file_url, $deps = [ 'jquery' ], $handle = null ) {
70
- return $this->add( $file_url, $deps, $handle, 'header' );
71
- }
72
-
73
- /**
74
- * Adds new items to the collection (footer).
75
- *
76
- * @param mixed
77
- */
78
- public function addToFooter( $file_url, $deps = [ 'jquery' ], $handle = null ) {
79
- return $this->add( $file_url, $deps, $handle, 'footer' );
80
- }
81
-
82
- /**
83
- * Осуществляет подключение всех зарегистрированных скриптов
84
- *
85
- * @param string $source
86
- */
87
- public function connect( $source = 'wordpress' ) {
88
-
89
- // register all global required scripts
90
- if ( ! empty( $this->required[ $source ] ) ) {
91
- foreach ( $this->required[ $source ] as $script ) {
92
- if ( 'wordpress' === $source ) {
93
- wp_enqueue_script( $script );
94
- } else if ( 'bootstrap' === $source ) {
95
- $this->plugin->bootstrap->enqueueScript( $script );
96
- }
97
- }
98
- }
99
-
100
- if ( $source == 'bootstrap' ) {
101
- return;
102
- }
103
-
104
- $is_first_script = true;
105
- $is_footer = false;
106
-
107
- // register all other scripts
108
- foreach ( [ $this->header_place, $this->footer_place ] as $script_place ) {
109
- foreach ( $script_place as $script ) {
110
-
111
- if ( empty( $script['file_url'] ) ) {
112
- continue;
113
- }
114
-
115
- $handle = ! empty( $script['handle'] ) ? $script['handle'] : $script['file_url'];
116
- $deps = ! is_array( $script['deps'] ) ? [] : $script['deps'];
117
- $version = ! empty( $script['version'] ) ? $script['version'] : $this->plugin->getPluginVersion();
118
-
119
- wp_register_script( $handle, $script['file_url'], $deps, $version, $is_footer );
120
-
121
- if ( $is_first_script && $this->use_ajax ) {
122
- wp_localize_script( $handle, 'factory', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ) ] );
123
- }
124
-
125
- if ( ! empty( $this->localize_data[ $handle ] ) ) {
126
- wp_localize_script( $handle, $this->localize_data[ $handle ][0], $this->localize_data[ $handle ][1] );
127
- }
128
-
129
- wp_enqueue_script( $handle );
130
-
131
- $is_first_script = false;
132
- }
133
-
134
- $is_footer = true;
135
- }
136
- }
137
-
138
- /**
139
- * Если вызвать этот метод, на странице будет обязательно добавлена
140
- * глобальная JS переменная с ссылкой на ajax обработчик
141
- */
142
- public function useAjax() {
143
- $this->use_ajax = true;
144
- }
145
-
146
- /**
147
- * Регистрирует глобальную JS переменную с пользовательскими данными
148
- *
149
- * @param string $varname
150
- * @param string $data
151
- *
152
- * @return Wbcr_Factory420_ScriptList $this
153
- */
154
- public function localize( $varname, $data ) {
155
- $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
156
-
157
- if ( ! $bindTo ) {
158
- return $this;
159
- }
160
-
161
- $this->localize_data[ $bindTo ] = [ $varname, $data ];
162
-
163
- return $this;
164
- }
165
- }
166
-
 
1
+ <?php
2
+ /**
3
+ * The file contains a class to manage script assets.
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
+ *
8
+ * @package factory-core
9
+ * @since 1.0.0
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+
18
+ /**
19
+ * Script List
20
+ *
21
+ * @since 1.0.0
22
+ */
23
+ class Wbcr_Factory446_ScriptList extends Wbcr_Factory446_AssetsList {
24
+
25
+ public $localize_data = [];
26
+ public $use_ajax = false;
27
+
28
+ /**
29
+ * Adds new items to the collection (default place).
30
+ *
31
+ * @param mixed
32
+ *
33
+ * @version 2.0
34
+ */
35
+ public function add( $file_url, $deps = [ 'jquery' ], $handle = null, $version = false, $place = 'default' ) {
36
+
37
+ if ( empty( $file_url ) ) {
38
+ return $this;
39
+ }
40
+
41
+ $resource = [];
42
+ $resource['file_url'] = $file_url;
43
+ $resource['deps'] = $deps;
44
+ $resource['handle'] = $handle;
45
+ $resource['version'] = $version;
46
+
47
+ $this->all[] = $resource;
48
+
49
+ switch ( $place ) {
50
+ case 'header':
51
+ $this->header_place[] = $resource;
52
+ break;
53
+ case 'footer':
54
+ $this->footer_place[] = $resource;
55
+ break;
56
+ default:
57
+ $this->default_place[] = $resource;
58
+ break;
59
+ }
60
+
61
+ return $this;
62
+ }
63
+
64
+ /**
65
+ * Adds new items to the collection (header).
66
+ *
67
+ * @param mixed
68
+ */
69
+ public function addToHeader( $file_url, $deps = [ 'jquery' ], $handle = null ) {
70
+ return $this->add( $file_url, $deps, $handle, 'header' );
71
+ }
72
+
73
+ /**
74
+ * Adds new items to the collection (footer).
75
+ *
76
+ * @param mixed
77
+ */
78
+ public function addToFooter( $file_url, $deps = [ 'jquery' ], $handle = null ) {
79
+ return $this->add( $file_url, $deps, $handle, 'footer' );
80
+ }
81
+
82
+ /**
83
+ * Осуществляет подключение всех зарегистрированных скриптов
84
+ *
85
+ * @param string $source
86
+ */
87
+ public function connect( $source = 'wordpress' ) {
88
+
89
+ // register all global required scripts
90
+ if ( ! empty( $this->required[ $source ] ) ) {
91
+ foreach ( $this->required[ $source ] as $script ) {
92
+ if ( 'wordpress' === $source ) {
93
+ wp_enqueue_script( $script );
94
+ } else if ( 'bootstrap' === $source ) {
95
+ $this->plugin->bootstrap->enqueueScript( $script );
96
+ }
97
+ }
98
+ }
99
+
100
+ if ( $source == 'bootstrap' ) {
101
+ return;
102
+ }
103
+
104
+ $is_first_script = true;
105
+ $is_footer = false;
106
+
107
+ // register all other scripts
108
+ foreach ( [ $this->header_place, $this->footer_place ] as $script_place ) {
109
+ foreach ( $script_place as $script ) {
110
+
111
+ if ( empty( $script['file_url'] ) ) {
112
+ continue;
113
+ }
114
+
115
+ $handle = ! empty( $script['handle'] ) ? $script['handle'] : $script['file_url'];
116
+ $deps = ! is_array( $script['deps'] ) ? [] : $script['deps'];
117
+ $version = ! empty( $script['version'] ) ? $script['version'] : $this->plugin->getPluginVersion();
118
+
119
+ wp_register_script( $handle, $script['file_url'], $deps, $version, $is_footer );
120
+
121
+ if ( $is_first_script && $this->use_ajax ) {
122
+ wp_localize_script( $handle, 'factory', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ) ] );
123
+ }
124
+
125
+ if ( ! empty( $this->localize_data[ $handle ] ) ) {
126
+ wp_localize_script( $handle, $this->localize_data[ $handle ][0], $this->localize_data[ $handle ][1] );
127
+ }
128
+
129
+ wp_enqueue_script( $handle );
130
+
131
+ $is_first_script = false;
132
+ }
133
+
134
+ $is_footer = true;
135
+ }
136
+ }
137
+
138
+ /**
139
+ * Если вызвать этот метод, на странице будет обязательно добавлена
140
+ * глобальная JS переменная с ссылкой на ajax обработчик
141
+ */
142
+ public function useAjax() {
143
+ $this->use_ajax = true;
144
+ }
145
+
146
+ /**
147
+ * Регистрирует глобальную JS переменную с пользовательскими данными
148
+ *
149
+ * @param string $varname
150
+ * @param array $data
151
+ *
152
+ * @return Wbcr_Factory446_ScriptList $this
153
+ */
154
+ public function localize( $varname, $data ) {
155
+ $bindTo = count( $this->all ) == 0 ? null : end( $this->all );
156
+
157
+ if ( ! $bindTo ) {
158
+ return $this;
159
+ }
160
+
161
+ $handle = ! empty( $bindTo['handle'] ) ? $bindTo['handle'] : $bindTo['file_url'];
162
+ $this->localize_data[ $handle ] = [ $varname, $data ];
163
+
164
+ return $this;
165
+ }
166
+ }
167
+
libs/factory/core/includes/assets-managment/class-factory-style-list.php CHANGED
@@ -1,86 +1,86 @@
1
- <?php
2
- /**
3
- * The file contains a class to manage style assets.
4
- *
5
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
- *
8
- * @package factory-core
9
- * @since 1.0.0
10
- */
11
-
12
- // Exit if accessed directly
13
- if ( ! defined( 'ABSPATH' ) ) {
14
- exit;
15
- }
16
-
17
-
18
- /**
19
- * Style List
20
- *
21
- * @since 1.0.0
22
- */
23
- class Wbcr_Factory420_StyleList extends Wbcr_Factory420_AssetsList {
24
-
25
- /**
26
- * Adds new items to the collection (default place).
27
- *
28
- * @param mixed
29
- *
30
- * @version 2.0
31
- */
32
- public function add( $file_url, $deps = [], $handle = null, $version = false, $media = 'all' ) {
33
-
34
- if ( empty( $file_url ) ) {
35
- return $this;
36
- }
37
-
38
- $resource = [];
39
- $resource['file_url'] = $file_url;
40
- $resource['deps'] = $deps;
41
- $resource['handle'] = $handle;
42
- $resource['version'] = $version;
43
- $resource['media'] = $media;
44
-
45
- $this->all[] = $resource;
46
-
47
- return $this;
48
- }
49
-
50
- public function connect( $source = 'wordpress' ) {
51
- // register all global required scripts
52
- if ( ! empty( $this->required[ $source ] ) ) {
53
-
54
- foreach ( $this->required[ $source ] as $style ) {
55
- if ( 'wordpress' === $source ) {
56
- wp_enqueue_style( $style );
57
- } else if ( 'bootstrap' === $source ) {
58
- $this->plugin->bootstrap->enqueueStyle( $style );
59
- }
60
- }
61
- }
62
-
63
- if ( $source == 'bootstrap' ) {
64
- return;
65
- }
66
-
67
- if ( empty( $this->all ) ) {
68
- return;
69
- }
70
-
71
- // register all other styles
72
- foreach ( $this->all as $style ) {
73
-
74
- if ( empty( $style['file_url'] ) ) {
75
- continue;
76
- }
77
-
78
- $handle = ! empty( $style['handle'] ) ? $style['handle'] : md5( $style['file_url'] );
79
- $deps = ! is_array( $style['deps'] ) ? [] : $style['deps'];
80
- $version = ! empty( $style['version'] ) ? $style['version'] : $this->plugin->getPluginVersion();
81
-
82
- wp_enqueue_style( $handle, $style['file_url'], $deps, $version );
83
- }
84
- }
85
- }
86
-
1
+ <?php
2
+ /**
3
+ * The file contains a class to manage style assets.
4
+ *
5
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
6
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
7
+ *
8
+ * @package factory-core
9
+ * @since 1.0.0
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
+
17
+
18
+ /**
19
+ * Style List
20
+ *
21
+ * @since 1.0.0
22
+ */
23
+ class Wbcr_Factory446_StyleList extends Wbcr_Factory446_AssetsList {
24
+
25
+ /**
26
+ * Adds new items to the collection (default place).
27
+ *
28
+ * @param mixed
29
+ *
30
+ * @version 2.0
31
+ */
32
+ public function add( $file_url, $deps = [], $handle = null, $version = false, $media = 'all' ) {
33
+
34
+ if ( empty( $file_url ) ) {
35
+ return $this;
36
+ }
37
+
38
+ $resource = [];
39
+ $resource['file_url'] = $file_url;
40
+ $resource['deps'] = $deps;
41
+ $resource['handle'] = $handle;
42
+ $resource['version'] = $version;
43
+ $resource['media'] = $media;
44
+
45
+ $this->all[] = $resource;
46
+
47
+ return $this;
48
+ }
49
+
50
+ public function connect( $source = 'wordpress' ) {
51
+ // register all global required scripts
52
+ if ( ! empty( $this->required[ $source ] ) ) {
53
+
54
+ foreach ( $this->required[ $source ] as $style ) {
55
+ if ( 'wordpress' === $source ) {
56
+ wp_enqueue_style( $style );
57
+ } else if ( 'bootstrap' === $source ) {
58
+ $this->plugin->bootstrap->enqueueStyle( $style );
59
+ }
60
+ }
61
+ }
62
+
63
+ if ( $source == 'bootstrap' ) {
64
+ return;
65
+ }
66
+
67
+ if ( empty( $this->all ) ) {
68
+ return;
69
+ }
70
+
71
+ // register all other styles
72
+ foreach ( $this->all as $style ) {
73
+
74
+ if ( empty( $style['file_url'] ) ) {
75
+ continue;
76
+ }
77
+
78
+ $handle = ! empty( $style['handle'] ) ? $style['handle'] : md5( $style['file_url'] );
79
+ $deps = ! is_array( $style['deps'] ) ? [] : $style['deps'];
80
+ $version = ! empty( $style['version'] ) ? $style['version'] : $this->plugin->getPluginVersion();
81
+
82
+ wp_enqueue_style( $handle, $style['file_url'], $deps, $version );
83
+ }
84
+ }
85
+ }
86
+
libs/factory/core/includes/assets-managment/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  // Silence is golden.
1
+ <?php
2
  // Silence is golden.
libs/factory/core/includes/class-check-compatibility.php CHANGED
@@ -1,122 +1,122 @@
1
- <?php
2
-
3
- /**
4
- * Проверяет совместимость с плагинами Webcraftic, с версиями php, с версиями Wordpress
5
- *
6
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
7
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
8
- *
9
- * @version 1.0.0
10
- * @since 4.0.8
11
- */
12
-
13
- if ( ! class_exists( 'Wbcr_Factory_Compatibility' ) ) {
14
- class Wbcr_Factory_Compatibility {
15
-
16
- protected $plugin_prefix;
17
- protected $plugin_class_prefix;
18
- protected $plugin_name;
19
- protected $plugin_title = "(no title)";
20
- protected $required_php_version = '5.3';
21
- protected $required_wp_version = '4.2.0';
22
-
23
- function __construct( array $plugin_info ) {
24
- foreach ( (array) $plugin_info as $property => $value ) {
25
- $this->$property = $value;
26
- }
27
-
28
- add_action( 'admin_init', [ $this, 'registerNotices' ] );
29
- }
30
-
31
- /**
32
- * Метод проверяет совместимость плагина с php и wordpress версией
33
- *
34
- * @return bool
35
- */
36
- public function check() {
37
- if ( ! $this->isPhpCompatibility() ) {
38
- return false;
39
- }
40
-
41
- if ( ! $this->isWpCompatibility() ) {
42
- return false;
43
- }
44
-
45
- return true;
46
- }
47
-
48
- /**
49
- * Метод проверяет совместимость плагина с php версией сервера
50
- *
51
- * @return mixed
52
- */
53
- public function isPhpCompatibility() {
54
- return version_compare( PHP_VERSION, $this->required_php_version, '>=' );
55
- }
56
-
57
- /**
58
- * Метод проверяет совместимость плагина с Wordpress версией сайта
59
- *
60
- * @return mixed
61
- */
62
- public function isWpCompatibility() {
63
- // Get the WP Version global.
64
- global $wp_version;
65
-
66
- return version_compare( $wp_version, $this->required_wp_version, '>=' );
67
- }
68
-
69
- /**
70
- * Метод возвращает текст уведомления
71
- *
72
- * @return string
73
- */
74
- public function getNoticeText() {
75
- $notice_text = $notice_default_text = '';
76
- $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
77
-
78
- $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_212' ), $this->plugin_title ) . ' ';
79
- $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
80
-
81
- $has_one = false;
82
-
83
- if ( ! $this->isPhpCompatibility() ) {
84
- $has_one = true;
85
- $notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_420' ), $this->required_php_version ) . '<br>';
86
- }
87
-
88
- if ( ! $this->isWpCompatibility() ) {
89
- $has_one = true;
90
- $notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_420' ), $this->required_wp_version ) . '<br>';
91
- }
92
-
93
- if ( $has_one ) {
94
- $notice_text = $notice_default_text . $notice_text;
95
- }
96
-
97
- return $notice_text;
98
- }
99
-
100
- public function registerNotices() {
101
- if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
102
- if ( is_multisite() ) {
103
- add_action( 'network_admin_notices', [ $this, 'showNotice' ] );
104
- }
105
-
106
- add_action( 'admin_notices', [ $this, 'showNotice' ] );
107
- }
108
- }
109
-
110
- public function showNotice() {
111
- $notice_text = $this->getNoticeText();
112
-
113
- if ( empty( $notice_text ) ) {
114
- return;
115
- }
116
-
117
- $notice_text = '<p>' . $this->getNoticeText() . '</p>';
118
-
119
- echo '<div class="notice notice-error">' . apply_filters( 'wbcr/factory/check_compatibility/notice_text', $notice_text, $this->plugin_name ) . '</div>';
120
- }
121
- }
122
  }
1
+ <?php
2
+
3
+ /**
4
+ * Проверяет совместимость с плагинами Webcraftic, с версиями php, с версиями Wordpress
5
+ *
6
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
7
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
8
+ *
9
+ * @version 1.0.0
10
+ * @since 4.0.8
11
+ */
12
+
13
+ if ( ! class_exists( 'Wbcr_Factory_Compatibility' ) ) {
14
+ class Wbcr_Factory_Compatibility {
15
+
16
+ protected $plugin_prefix;
17
+ protected $plugin_class_prefix;
18
+ protected $plugin_name;
19
+ protected $plugin_title = "(no title)";
20
+ protected $required_php_version = '5.3';
21
+ protected $required_wp_version = '4.2.0';
22
+
23
+ function __construct( array $plugin_info ) {
24
+ foreach ( (array) $plugin_info as $property => $value ) {
25
+ $this->$property = $value;
26
+ }
27
+
28
+ add_action( 'admin_init', [ $this, 'registerNotices' ] );
29
+ }
30
+
31
+ /**
32
+ * Метод проверяет совместимость плагина с php и wordpress версией
33
+ *
34
+ * @return bool
35
+ */
36
+ public function check() {
37
+ if ( ! $this->isPhpCompatibility() ) {
38
+ return false;
39
+ }
40
+
41
+ if ( ! $this->isWpCompatibility() ) {
42
+ return false;
43
+ }
44
+
45
+ return true;
46
+ }
47
+
48
+ /**
49
+ * Метод проверяет совместимость плагина с php версией сервера
50
+ *
51
+ * @return mixed
52
+ */
53
+ public function isPhpCompatibility() {
54
+ return version_compare( PHP_VERSION, $this->required_php_version, '>=' );
55
+ }
56
+
57
+ /**
58
+ * Метод проверяет совместимость плагина с Wordpress версией сайта
59
+ *
60
+ * @return mixed
61
+ */
62
+ public function isWpCompatibility() {
63
+ // Get the WP Version global.
64
+ global $wp_version;
65
+
66
+ return version_compare( $wp_version, $this->required_wp_version, '>=' );
67
+ }
68
+
69
+ /**
70
+ * Метод возвращает текст уведомления
71
+ *
72
+ * @return string
73
+ */
74
+ public function getNoticeText() {
75
+ $notice_text = $notice_default_text = '';
76
+ $notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
77
+
78
+ $notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_000' ), $this->plugin_title ) . ' ';
79
+ $notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
80
+
81
+ $has_one = false;
82
+
83
+ if ( ! $this->isPhpCompatibility() ) {
84
+ $has_one = true;
85
+ $notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_446' ), $this->required_php_version ) . '<br>';
86
+ }
87
+
88
+ if ( ! $this->isWpCompatibility() ) {
89
+ $has_one = true;
90
+ $notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_446' ), $this->required_wp_version ) . '<br>';
91
+ }
92
+
93
+ if ( $has_one ) {
94
+ $notice_text = $notice_default_text . $notice_text;
95
+ }
96
+
97
+ return $notice_text;
98
+ }
99
+
100
+ public function registerNotices() {
101
+ if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
102
+ if ( is_multisite() ) {
103
+ add_action( 'network_admin_notices', [ $this, 'showNotice' ] );
104
+ }
105
+
106
+ add_action( 'admin_notices', [ $this, 'showNotice' ] );
107
+ }
108
+ }
109
+
110
+ public function showNotice() {
111
+ $notice_text = $this->getNoticeText();
112
+
113
+ if ( empty( $notice_text ) ) {
114
+ return;
115
+ }
116
+
117
+ $notice_text = '<p>' . $this->getNoticeText() . '</p>';
118
+
119
+ echo '<div class="notice notice-error">' . apply_filters( 'wbcr/factory/check_compatibility/notice_text', $notice_text, $this->plugin_name ) . '</div>';
120
+ }
121
+ }
122
  }
libs/factory/core/includes/class-factory-migrations.php CHANGED
@@ -1,541 +1,541 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_420;
4
-
5
- use Exception;
6
- use Wbcr_Factory420_Plugin;
7
-
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- /**
13
- * Often when updating plugins, you need to make some changes to the database.
14
- * This class automatically checks for plugin migrations and executes them when
15
- * updating.
16
- *
17
- * The class has a debug mode, to enable the debug mode add constants to your plugin:
18
- * define ('FACTORY_MIGRATIONS_DEBUG', true) - enables/disables debugging mode
19
- * define ('FACTORY_MIGRATIONS_FORCE_OLD_VERSION', '1.1.9') - sets previous version
20
- * for the plugin, if constant isn't set, then the previous version is taken from
21
- * the database.
22
- *
23
- * todo: get_option and get_site_option are used because some caching plugins caching options, which causes problems
24
- *
25
- *
26
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
27
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
28
- *
29
- * @since 4.1.1
30
- */
31
- class Migrations {
32
-
33
- protected $plugin;
34
-
35
- /**
36
- * Migrations constructor.
37
- *
38
- * @param Wbcr_Factory420_Plugin $plugin
39
- *
40
- * @throws Exception
41
- */
42
- public function __construct( Wbcr_Factory420_Plugin $plugin ) {
43
-
44
- $this->plugin = $plugin;
45
- $plugin_name = $plugin->getPluginName();
46
-
47
- if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
48
- throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
49
- }
50
-
51
- if ( is_admin() ) {
52
- add_action( "admin_init", [ $this, "check_migrations" ] );
53
-
54
- add_action( "wbcr/factory/plugin_{$plugin_name}_activated", [ $this, 'activation_hook' ] );
55
- add_action( "wbcr/factory/admin_notices", [ $this, "debug_bar_notice" ], 10, 2 );
56
- add_action( "wbcr/factory/admin_notices", [ $this, "migration_error_notice" ], 10, 2 );
57
- }
58
- }
59
-
60
- /**
61
- * @author Alexander Kovalev <alex.kovalevv@gmail.com>
62
- * @since 4.1.1
63
- * @return mixed|void
64
- */
65
- public function get_plugin_activated_time() {
66
- if ( $this->plugin->isNetworkActive() ) {
67
- return get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
68
- }
69
-
70
- return get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
71
- }
72
-
73
- /**
74
- * Check if migration is necessary for plugin and if there are errors from previous migrations.
75
- * In debug mode, migrations are not performed automatically.
76
- */
77
- public function check_migrations() {
78
- if ( $this->is_migration_error() && isset( $_GET['wbcr_factory_fix_migration_error'] ) ) {
79
- $this->fix_migration_error();
80
- wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
81
- die();
82
- }
83
-
84
- if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
85
- $this->make_migration();
86
- wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
87
- die();
88
- }
89
-
90
- if ( $this->need_migration() && ! $this->is_debug() ) {
91
- $this->make_migration();
92
- }
93
- }
94
-
95
- /**
96
- * Notification displays the errors of outstanding migrations to fix errors
97
- * you need to follow the instructions in the notification and click
98
- * "I fixed, confirm migration".
99
- *
100
- * What is it for. Migrations are performed in background and on some sites,
101
- * due to php errors or for some other reason, migration may be
102
- * interrupted, because of what plugin will work incorrectly, you may lose settings.
103
- *
104
- * When creating new migrations, developer will add error handlers,
105
- * and framework will intercept them safely for user and display them
106
- * in this notice.
107
- *
108
- * @param array $notices
109
- * @param static $plugin_name
110
- *
111
- * @return array
112
- */
113
- public function migration_error_notice( $notices, $plugin_name ) {
114
-
115
- if ( $this->plugin->getPluginName() !== $plugin_name ) {
116
- return $notices;
117
- }
118
-
119
- if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
120
- return $notices;
121
- }
122
-
123
- if ( $this->plugin->isNetworkActive() ) {
124
- $migration_error_text = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
125
- } else {
126
- $migration_error_text = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
127
- }
128
-
129
- $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
130
-
131
- $notice_text = $migration_error_text;
132
- $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_420' ) . "</a>";
133
-
134
- $notices[] = [
135
- 'id' => 'migration_debug_bar',
136
- 'type' => 'error',
137
- 'dismissible' => false,
138
- 'dismiss_expires' => 0,
139
- 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_420' ) . '</b><br>' . $notice_text . '</p>'
140
- ];
141
-
142
- return $notices;
143
- }
144
-
145
- /**
146
- * Debug panel, display some information from the database. Also allows
147
- * perform manual migrations to test new migrations.
148
- *
149
- * @param array $notices
150
- * @param string $plugin_name
151
- *
152
- * @return array
153
- */
154
- public function debug_bar_notice( $notices, $plugin_name ) {
155
-
156
- if ( $this->plugin->getPluginName() !== $plugin_name ) {
157
- return $notices;
158
- }
159
- if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
160
- return $notices;
161
- }
162
-
163
- $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
164
-
165
- $notice_text = __( "Plugin activated:", "wbcr_factory_420" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
166
-
167
- $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_420" ) . ' ' . $this->get_old_plugin_version() . "<br>";
168
- $notice_text .= __( "Current plugin version:", "wbcr_factory_420" ) . ' ' . $this->get_current_plugin_version() . "<br>";
169
- $notice_text .= __( "Need migration:", "wbcr_factory_420" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
170
- $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_420" ) . "</a><br>";
171
-
172
- $notices[] = [
173
- 'id' => 'migration_debug_bar',
174
- 'type' => 'warning',
175
- 'dismissible' => false,
176
- 'dismiss_expires' => 0,
177
- 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_420' ) . '</b><br>' . $notice_text . '</p>'
178
- ];
179
-
180
- return $notices;
181
- }
182
-
183
- /**
184
- * Runs when plugin is activated. Checks if you need to migrate
185
- * and if necessary it does it. Also adds a option when the plugin
186
- * was activated for the first time.
187
- */
188
- public function activation_hook() {
189
- /*if ( $this->need_migration() && ! $this->is_debug() ) {
190
- $this->make_migration();
191
- }*/
192
-
193
- // just time to know when the plugin was activated the first time
194
- $activated = $this->get_plugin_activated_time();
195
-
196
- if ( ! $activated ) {
197
- if ( $this->plugin->isNetworkActive() ) {
198
- update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
199
- update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
200
- } else {
201
- update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
202
- update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
203
- }
204
- }
205
- }
206
-
207
- /**
208
- * Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
209
- *
210
- * @return bool
211
- */
212
- protected function is_debug() {
213
- return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
214
- }
215
-
216
- /**
217
- * Gets previous version of plugin that plugin had before updating to the new version.
218
- *
219
- * @return string|null
220
- */
221
- protected function get_old_plugin_version() {
222
-
223
- if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
224
- return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
225
- }
226
-
227
- if ( $this->plugin->isNetworkActive() ) {
228
- $plugin_version = get_site_option( $this->plugin->getOptionName( 'plugin_version' ), null );
229
- } else {
230
- $plugin_version = get_option( $this->plugin->getOptionName( 'plugin_version' ), null );
231
- }
232
-
233
- if ( ! empty( $plugin_version ) ) {
234
- return $plugin_version;
235
- }
236
-
237
- # TODO: Remove after few releases
238
- # This block for compatibility code with old version of framework < 4.1.1
239
- #-------------------------------------------
240
- if ( $this->plugin->isNetworkActive() ) {
241
- $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
242
- } else {
243
- $plugin_versions = get_option( 'factory_plugin_versions', [] );
244
- }
245
-
246
- $plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
247
-
248
- if ( ! empty( $plugin_version ) ) {
249
- $plugin_version = str_replace( [ 'free-', 'premium-', 'offline-' ], '', $plugin_version );
250
- }
251
-
252
- #-------------------------------------------
253
-
254
- return $plugin_version;
255
- }
256
-
257
- /**
258
- * Gets the current version of plugin.
259
- *
260
- * @return string
261
- */
262
- protected function get_current_plugin_version() {
263
- return $this->plugin->getPluginVersion();
264
- }
265
-
266
- /**
267
- * Do I need migration for plugin? If previous migration was with a error, then
268
- * method will always return false to prevent looping.
269
- *
270
- * @return mixed
271
- */
272
- protected function need_migration() {
273
- if ( $this->is_migration_error() ) {
274
- return false;
275
- }
276
-
277
- return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
278
- }
279
-
280
- /**
281
- * Are there errors from previous migrations?
282
- *
283
- * @return bool
284
- */
285
- protected function is_migration_error() {
286
- if ( $this->plugin->isNetworkActive() ) {
287
- $error = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
288
- } else {
289
- $error = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
290
- }
291
-
292
- return $error !== false;
293
- }
294
-
295
- /**
296
- * Remove an option in database, thereby fix errors of the previous migration.
297
- */
298
- protected function fix_migration_error() {
299
- if ( $this->plugin->isNetworkActive() ) {
300
- delete_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
301
-
302
- return;
303
- }
304
-
305
- delete_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
306
- }
307
-
308
- /**
309
- * Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
310
- * migrations to the plugin's root directory and executes them. Default files
311
- * migrations are stored in wp-content/plugins/plugin-name/migrations and have names
312
- * 0x0x0x.php, which corresponds to the version x.x.x. Method executes those migration files
313
- * versions of which are between the previous version of plugin and current one.
314
- *
315
- */
316
- protected function make_migration() {
317
-
318
- if ( ! current_user_can( 'update_plugins' ) ) {
319
- return;
320
- }
321
-
322
- $old_plugin_version = $this->get_old_plugin_version();
323
- $new_plugin_version = $this->get_current_plugin_version();
324
-
325
- if ( empty( $old_plugin_version ) ) {
326
- $this->update_plugin_version_in_db();
327
- }
328
-
329
- // converts versions like 0.0.0 to 000000
330
- $old_number = $this->get_version_number( $old_plugin_version );
331
- $new_number = $this->get_version_number( $new_plugin_version );
332
-
333
- try {
334
-
335
- $update_files = $this->plugin->get_paths()->migrations;
336
- $files = $this->find_files( $update_files );
337
-
338
- if ( empty( $files ) ) {
339
- $this->update_plugin_version_in_db();
340
-
341
- return;
342
- }
343
-
344
- // finds updates that has intermediate version
345
- foreach ( (array) $files as $item ) {
346
- if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
347
- continue;
348
- }
349
-
350
- $item_number = intval( $item['name'] );
351
-
352
- if ( $item_number > $old_number && $item_number <= $new_number ) {
353
- $classes = $this->get_classes( $item['path'] );
354
-
355
- if ( count( $classes ) == 0 ) {
356
- continue;
357
- }
358
-
359
- foreach ( $classes as $path => $class_data ) {
360
- include_once( $path );
361
- $update_class = $class_data['name'];
362
-
363
- $update = new $update_class( $this->plugin );
364
- $update->install();
365
- }
366
- }
367
- }
368
-
369
- $this->update_plugin_version_in_db();
370
- } catch( Exception $e ) {
371
- if ( $this->plugin->isNetworkActive() ) {
372
- update_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
373
-
374
- return;
375
- }
376
- update_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
377
- }
378
- }
379
-
380
- /**
381
- * Updates version of plugin in database. So that we can track which
382
- * previous version of plugin was at the user, before he updated
383
- * plugin.
384
- */
385
- protected function update_plugin_version_in_db() {
386
-
387
- # TODO: Delete after few releases
388
- # This block for compatibility code with the old version of framework.
389
- # Cleans up old data, after the transition to new version of framework.
390
- #-------------------------------------------
391
- if ( $this->plugin->isNetworkActive() ) {
392
- $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
393
- } else {
394
- $plugin_versions = get_option( 'factory_plugin_versions', [] );
395
- }
396
-
397
- if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
398
- unset( $plugin_versions[ $this->plugin->getPluginName() ] );
399
- }
400
-
401
- if ( $this->plugin->isNetworkActive() ) {
402
- if ( empty( $plugin_versions ) ) {
403
- delete_site_option( 'factory_plugin_versions' );
404
- }
405
- update_site_option( 'factory_plugin_versions', $plugin_versions );
406
- update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
407
-
408
- return;
409
- }
410
-
411
- if ( empty( $plugin_versions ) ) {
412
- delete_option( 'factory_plugin_versions' );
413
- }
414
-
415
- update_option( 'factory_plugin_versions', $plugin_versions );
416
- update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
417
- }
418
-
419
- /**
420
- * Converts string representation of the version to the numeric.
421
- *
422
- * @since 1.0.0
423
- *
424
- * @param string $version A string version to convert.
425
- *
426
- * @return integer
427
- */
428
- protected function get_version_number( $version ) {
429
- preg_match( '/(\d+)\.(\d+)\.(\d+)/', $version, $matches );
430
- if ( count( $matches ) == 0 ) {
431
- return false;
432
- }
433
-
434
- $number = '';
435
- $number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
436
- $number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
437
- $number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
438
-
439
- return intval( $number );
440
- }
441
-
442
- /**
443
- * Returns a list of files at a given path.
444
- *
445
- * @param string $path path for search
446
- */
447
- private function find_files( $path ) {
448
- return $this->find_file_or_folders( $path, true );
449
- }
450
-
451
- /**
452
- * Returns a list of folders at a given path.
453
- *
454
- * @param string $path path for search
455
- */
456
- /*private function find_folders( $path ) {
457
- return $this->find_file_or_folders( $path, false );
458
- }*/
459
-
460
- /**
461
- * Returns a list of files or folders at a given path.
462
- *
463
- * @param string $path path for search
464
- * @param bool $files files or folders?
465
- */
466
- private function find_file_or_folders( $path, $areFiles = true ) {
467
- if ( ! is_dir( $path ) ) {
468
- return [];
469
- }
470
-
471
- $entries = scandir( $path );
472
- if ( empty( $entries ) ) {
473
- return [];
474
- }
475
-
476
- $files = [];
477
- foreach ( $entries as $entryName ) {
478
- if ( $entryName == '.' || $entryName == '..' ) {
479
- continue;
480
- }
481
-
482
- $filename = $path . '/' . $entryName;
483
- if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
484
- $files[] = [
485
- 'path' => str_replace( "\\", "/", $filename ),
486
- 'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
487
- ];
488
- }
489
- }
490
-
491
- return $files;
492
- }
493
-
494
- /**
495
- * Gets php classes defined in a specified file.
496
- *
497
- * @param string $path
498
- *
499
- * @throws Exception
500
- */
501
- private function get_classes( $path ) {
502
-
503
- $phpCode = file_get_contents( $path );
504
-
505
- $classes = [];
506
-
507
- if ( ! function_exists( 'token_get_all' ) ) {
508
- throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_420' ) );
509
- }
510
-
511
- $tokens = token_get_all( $phpCode );
512
-
513
- $count = count( $tokens );
514
- for ( $i = 2; $i < $count; $i ++ ) {
515
- if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
516
-
517
- $extends = null;
518
- if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
519
- $extends = $tokens[ $i + 4 ][1];
520
- }
521
-
522
- $class_name = $tokens[ $i ][1];
523
- $classes[ $path ] = [
524
- 'name' => $class_name,
525
- 'extends' => $extends
526
- ];
527
- }
528
- }
529
-
530
- /**
531
- * result example:
532
- *
533
- * $classes['/plugin/items/filename.php'] = array(
534
- * 'name' => 'PluginNameItem',
535
- * 'extendes' => 'PluginNameItemBase'
536
- * )
537
- */
538
-
539
- return $classes;
540
- }
541
- }
1
+ <?php
2
+
3
+ namespace WBCR\Factory_446;
4
+
5
+ use Exception;
6
+ use Wbcr_Factory446_Plugin;
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) {
9
+ exit;
10
+ }
11
+
12
+ /**
13
+ * Often when updating plugins, you need to make some changes to the database.
14
+ * This class automatically checks for plugin migrations and executes them when
15
+ * updating.
16
+ *
17
+ * The class has a debug mode, to enable the debug mode add constants to your plugin:
18
+ * define ('FACTORY_MIGRATIONS_DEBUG', true) - enables/disables debugging mode
19
+ * define ('FACTORY_MIGRATIONS_FORCE_OLD_VERSION', '1.1.9') - sets previous version
20
+ * for the plugin, if constant isn't set, then the previous version is taken from
21
+ * the database.
22
+ *
23
+ * todo: get_option and get_site_option are used because some caching plugins caching options, which causes problems
24
+ *
25
+ *
26
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
27
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
28
+ *
29
+ * @since 4.1.1
30
+ */
31
+ class Migrations {
32
+
33
+ protected $plugin;
34
+
35
+ /**
36
+ * Migrations constructor.
37
+ *
38
+ * @param Wbcr_Factory446_Plugin $plugin
39
+ *
40
+ * @throws Exception
41
+ */
42
+ public function __construct( Wbcr_Factory446_Plugin $plugin ) {
43
+
44
+ $this->plugin = $plugin;
45
+ $plugin_name = $plugin->getPluginName();
46
+
47
+ if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
48
+ throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
49
+ }
50
+
51
+ if ( is_admin() ) {
52
+ add_action( "admin_init", [ $this, "check_migrations" ] );
53
+
54
+ add_action( "wbcr/factory/plugin_{$plugin_name}_activated", [ $this, 'activation_hook' ] );
55
+ add_action( "wbcr/factory/admin_notices", [ $this, "debug_bar_notice" ], 10, 2 );
56
+ add_action( "wbcr/factory/admin_notices", [ $this, "migration_error_notice" ], 10, 2 );
57
+ }
58
+ }
59
+
60
+ /**
61
+ * @author Alexander Kovalev <alex.kovalevv@gmail.com>
62
+ * @since 4.1.1
63
+ * @return mixed|void
64
+ */
65
+ public function get_plugin_activated_time() {
66
+ if ( $this->plugin->isNetworkActive() ) {
67
+ return get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
68
+ }
69
+
70
+ return get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
71
+ }
72
+
73
+ /**
74
+ * Check if migration is necessary for plugin and if there are errors from previous migrations.
75
+ * In debug mode, migrations are not performed automatically.
76
+ */
77
+ public function check_migrations() {
78
+ if ( $this->is_migration_error() && isset( $_GET['wbcr_factory_fix_migration_error'] ) ) {
79
+ $this->fix_migration_error();
80
+ wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
81
+ die();
82
+ }
83
+
84
+ if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
85
+ $this->make_migration();
86
+ wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
87
+ die();
88
+ }
89
+
90
+ if ( $this->need_migration() && ! $this->is_debug() ) {
91
+ $this->make_migration();
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Notification displays the errors of outstanding migrations to fix errors
97
+ * you need to follow the instructions in the notification and click
98
+ * "I fixed, confirm migration".
99
+ *
100
+ * What is it for. Migrations are performed in background and on some sites,
101
+ * due to php errors or for some other reason, migration may be
102
+ * interrupted, because of what plugin will work incorrectly, you may lose settings.
103
+ *
104
+ * When creating new migrations, developer will add error handlers,
105
+ * and framework will intercept them safely for user and display them
106
+ * in this notice.
107
+ *
108
+ * @param array $notices
109
+ * @param static $plugin_name
110
+ *
111
+ * @return array
112
+ */
113
+ public function migration_error_notice( $notices, $plugin_name ) {
114
+
115
+ if ( $this->plugin->getPluginName() !== $plugin_name ) {
116
+ return $notices;
117
+ }
118
+
119
+ if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
120
+ return $notices;
121
+ }
122
+
123
+ if ( $this->plugin->isNetworkActive() ) {
124
+ $migration_error_text = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
125
+ } else {
126
+ $migration_error_text = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
127
+ }
128
+
129
+ $fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
130
+
131
+ $notice_text = $migration_error_text;
132
+ $notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_446' ) . "</a>";
133
+
134
+ $notices[] = [
135
+ 'id' => 'migration_debug_bar',
136
+ 'type' => 'error',
137
+ 'dismissible' => false,
138
+ 'dismiss_expires' => 0,
139
+ 'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_446' ) . '</b><br>' . $notice_text . '</p>'
140
+ ];
141
+
142
+ return $notices;
143
+ }
144
+
145
+ /**
146
+ * Debug panel, display some information from the database. Also allows
147
+ * perform manual migrations to test new migrations.
148
+ *
149
+ * @param array $notices
150
+ * @param string $plugin_name
151
+ *
152
+ * @return array
153
+ */
154
+ public function debug_bar_notice( $notices, $plugin_name ) {
155
+
156
+ if ( $this->plugin->getPluginName() !== $plugin_name ) {
157
+ return $notices;
158
+ }
159
+ if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
160
+ return $notices;
161
+ }
162
+
163
+ $migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
164
+
165
+ $notice_text = __( "Plugin activated:", "wbcr_factory_446" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
166
+
167
+ $notice_text .= __( "Old plugin version (debug):", "wbcr_factory_446" ) . ' ' . $this->get_old_plugin_version() . "<br>";
168
+ $notice_text .= __( "Current plugin version:", "wbcr_factory_446" ) . ' ' . $this->get_current_plugin_version() . "<br>";
169
+ $notice_text .= __( "Need migration:", "wbcr_factory_446" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
170
+ $notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_446" ) . "</a><br>";
171
+
172
+ $notices[] = [
173
+ 'id' => 'migration_debug_bar',
174
+ 'type' => 'warning',
175
+ 'dismissible' => false,
176
+ 'dismiss_expires' => 0,
177
+ 'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_446' ) . '</b><br>' . $notice_text . '</p>'
178
+ ];
179
+
180
+ return $notices;
181
+ }
182
+
183
+ /**
184
+ * Runs when plugin is activated. Checks if you need to migrate
185
+ * and if necessary it does it. Also adds a option when the plugin
186
+ * was activated for the first time.
187
+ */
188
+ public function activation_hook() {
189
+ /*if ( $this->need_migration() && ! $this->is_debug() ) {
190
+ $this->make_migration();
191
+ }*/
192
+
193
+ // just time to know when the plugin was activated the first time
194
+ $activated = $this->get_plugin_activated_time();
195
+
196
+ if ( ! $activated ) {
197
+ if ( $this->plugin->isNetworkActive() ) {
198
+ update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
199
+ update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
200
+ } else {
201
+ update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
202
+ update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
203
+ }
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
209
+ *
210
+ * @return bool
211
+ */
212
+ protected function is_debug() {
213
+ return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
214
+ }
215
+
216
+ /**
217
+ * Gets previous version of plugin that plugin had before updating to the new version.
218
+ *
219
+ * @return string|null
220
+ */
221
+ protected function get_old_plugin_version() {
222
+
223
+ if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
224
+ return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
225
+ }
226
+
227
+ if ( $this->plugin->isNetworkActive() ) {
228
+ $plugin_version = get_site_option( $this->plugin->getOptionName( 'plugin_version' ), null );
229
+ } else {
230
+ $plugin_version = get_option( $this->plugin->getOptionName( 'plugin_version' ), null );
231
+ }
232
+
233
+ if ( ! empty( $plugin_version ) ) {
234
+ return $plugin_version;
235
+ }
236
+
237
+ # TODO: Remove after few releases
238
+ # This block for compatibility code with old version of framework < 4.1.1
239
+ #-------------------------------------------
240
+ if ( $this->plugin->isNetworkActive() ) {
241
+ $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
242
+ } else {
243
+ $plugin_versions = get_option( 'factory_plugin_versions', [] );
244
+ }
245
+
246
+ $plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
247
+
248
+ if ( ! empty( $plugin_version ) ) {
249
+ $plugin_version = str_replace( [ 'free-', 'premium-', 'offline-' ], '', $plugin_version );
250
+ }
251
+
252
+ #-------------------------------------------
253
+
254
+ return $plugin_version;
255
+ }
256
+
257
+ /**
258
+ * Gets the current version of plugin.
259
+ *
260
+ * @return string
261
+ */
262
+ protected function get_current_plugin_version() {
263
+ return $this->plugin->getPluginVersion();
264
+ }
265
+
266
+ /**
267
+ * Do I need migration for plugin? If previous migration was with a error, then
268
+ * method will always return false to prevent looping.
269
+ *
270
+ * @return mixed
271
+ */
272
+ protected function need_migration() {
273
+ if ( $this->is_migration_error() ) {
274
+ return false;
275
+ }
276
+
277
+ return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
278
+ }
279
+
280
+ /**
281
+ * Are there errors from previous migrations?
282
+ *
283
+ * @return bool
284
+ */
285
+ protected function is_migration_error() {
286
+ if ( $this->plugin->isNetworkActive() ) {
287
+ $error = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
288
+ } else {
289
+ $error = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
290
+ }
291
+
292
+ return $error !== false;
293
+ }
294
+
295
+ /**
296
+ * Remove an option in database, thereby fix errors of the previous migration.
297
+ */
298
+ protected function fix_migration_error() {
299
+ if ( $this->plugin->isNetworkActive() ) {
300
+ delete_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
301
+
302
+ return;
303
+ }
304
+
305
+ delete_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
306
+ }
307
+
308
+ /**
309
+ * Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
310
+ * migrations to the plugin's root directory and executes them. Default files
311
+ * migrations are stored in wp-content/plugins/plugin-name/migrations and have names
312
+ * 0x0x0x.php, which corresponds to the version x.x.x. Method executes those migration files
313
+ * versions of which are between the previous version of plugin and current one.
314
+ *
315
+ */
316
+ protected function make_migration() {
317
+
318
+ if ( ! current_user_can( 'update_plugins' ) ) {
319
+ return;
320
+ }
321
+
322
+ $old_plugin_version = $this->get_old_plugin_version();
323
+ $new_plugin_version = $this->get_current_plugin_version();
324
+
325
+ if ( empty( $old_plugin_version ) ) {
326
+ $this->update_plugin_version_in_db();
327
+ }
328
+
329
+ // converts versions like 0.0.0 to 000000
330
+ $old_number = $this->get_version_number( $old_plugin_version );
331
+ $new_number = $this->get_version_number( $new_plugin_version );
332
+
333
+ try {
334
+
335
+ $update_files = $this->plugin->get_paths()->migrations;
336
+ $files = $this->find_files( $update_files );
337
+
338
+ if ( empty( $files ) ) {
339
+ $this->update_plugin_version_in_db();
340
+
341
+ return;
342
+ }
343
+
344
+ // finds updates that has intermediate version
345
+ foreach ( (array) $files as $item ) {
346
+ if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
347
+ continue;
348
+ }
349
+
350
+ $item_number = intval( $item['name'] );
351
+
352
+ if ( $item_number > $old_number && $item_number <= $new_number ) {
353
+ $classes = $this->get_classes( $item['path'] );
354
+
355
+ if ( count( $classes ) == 0 ) {
356
+ continue;
357
+ }
358
+
359
+ foreach ( $classes as $path => $class_data ) {
360
+ include_once( $path );
361
+ $update_class = $class_data['name'];
362
+
363
+ $update = new $update_class( $this->plugin );
364
+ $update->install();
365
+ }
366
+ }
367
+ }
368
+
369
+ $this->update_plugin_version_in_db();
370
+ } catch( Exception $e ) {
371
+ if ( $this->plugin->isNetworkActive() ) {
372
+ update_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
373
+
374
+ return;
375
+ }
376
+ update_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
377
+ }
378
+ }
379
+
380
+ /**
381
+ * Updates version of plugin in database. So that we can track which
382
+ * previous version of plugin was at the user, before he updated
383
+ * plugin.
384
+ */
385
+ protected function update_plugin_version_in_db() {
386
+
387
+ # TODO: Delete after few releases
388
+ # This block for compatibility code with the old version of framework.
389
+ # Cleans up old data, after the transition to new version of framework.
390
+ #-------------------------------------------
391
+ if ( $this->plugin->isNetworkActive() ) {
392
+ $plugin_versions = get_site_option( 'factory_plugin_versions', [] );
393
+ } else {
394
+ $plugin_versions = get_option( 'factory_plugin_versions', [] );
395
+ }
396
+
397
+ if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
398
+ unset( $plugin_versions[ $this->plugin->getPluginName() ] );
399
+ }
400
+
401
+ if ( $this->plugin->isNetworkActive() ) {
402
+ if ( empty( $plugin_versions ) ) {
403
+ delete_site_option( 'factory_plugin_versions' );
404
+ }
405
+ update_site_option( 'factory_plugin_versions', $plugin_versions );
406
+ update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
407
+
408
+ return;
409
+ }
410
+
411
+ if ( empty( $plugin_versions ) ) {
412
+ delete_option( 'factory_plugin_versions' );
413
+ }
414
+
415
+ update_option( 'factory_plugin_versions', $plugin_versions );
416
+ update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
417
+ }
418
+
419
+ /**
420
+ * Converts string representation of the version to the numeric.
421
+ *
422
+ * @since 1.0.0
423
+ *
424
+ * @param string $version A string version to convert.
425
+ *
426
+ * @return integer
427
+ */
428
+ protected function get_version_number( $version ) {
429
+ preg_match( '/(\d+)\.(\d+)\.(\d+)/', $version, $matches );
430
+ if ( count( $matches ) == 0 ) {
431
+ return false;
432
+ }
433
+
434
+ $number = '';
435
+ $number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
436
+ $number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
437
+ $number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
438
+
439
+ return intval( $number );
440
+ }
441
+
442
+ /**
443
+ * Returns a list of files at a given path.
444
+ *
445
+ * @param string $path path for search
446
+ */
447
+ private function find_files( $path ) {
448
+ return $this->find_file_or_folders( $path, true );
449
+ }
450
+
451
+ /**
452
+ * Returns a list of folders at a given path.
453
+ *
454
+ * @param string $path path for search
455
+ */
456
+ /*private function find_folders( $path ) {
457
+ return $this->find_file_or_folders( $path, false );
458
+ }*/
459
+
460
+ /**
461
+ * Returns a list of files or folders at a given path.
462
+ *
463
+ * @param string $path path for search
464
+ * @param bool $files files or folders?
465
+ */
466
+ private function find_file_or_folders( $path, $areFiles = true ) {
467
+ if ( ! is_dir( $path ) ) {
468
+ return [];
469
+ }
470
+
471
+ $entries = scandir( $path );
472
+ if ( empty( $entries ) ) {
473
+ return [];
474
+ }
475
+
476
+ $files = [];
477
+ foreach ( $entries as $entryName ) {
478
+ if ( $entryName == '.' || $entryName == '..' ) {
479
+ continue;
480
+ }
481
+
482
+ $filename = $path . '/' . $entryName;
483
+ if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
484
+ $files[] = [
485
+ 'path' => str_replace( "\\", "/", $filename ),
486
+ 'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
487
+ ];
488
+ }
489
+ }
490
+
491
+ return $files;
492
+ }
493
+
494
+ /**
495
+ * Gets php classes defined in a specified file.
496
+ *
497
+ * @param string $path
498
+ *
499
+ * @throws Exception
500
+ */
501
+ private function get_classes( $path ) {
502
+
503
+ $phpCode = file_get_contents( $path );
504
+
505
+ $classes = [];
506
+
507
+ if ( ! function_exists( 'token_get_all' ) ) {
508
+ throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_446' ) );
509
+ }
510
+
511
+ $tokens = token_get_all( $phpCode );
512
+
513
+ $count = count( $tokens );
514
+ for ( $i = 2; $i < $count; $i ++ ) {
515
+ if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
516
+
517
+ $extends = null;
518
+ if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
519
+ $extends = $tokens[ $i + 4 ][1];
520
+ }
521
+
522
+ $class_name = $tokens[ $i ][1];
523
+ $classes[ $path ] = [
524
+ 'name' => $class_name,
525
+ 'extends' => $extends
526
+ ];
527
+ }
528
+ }
529
+
530
+ /**
531
+ * result example:
532
+ *
533
+ * $classes['/plugin/items/filename.php'] = array(
534
+ * 'name' => 'PluginNameItem',
535
+ * 'extendes' => 'PluginNameItemBase'
536
+ * )
537
+ */
538
+
539
+ return $classes;
540
+ }
541
+ }
libs/factory/core/includes/class-factory-notices.php CHANGED
@@ -1,291 +1,296 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_420;
4
-
5
- use Wbcr_Factory420_Plugin;
6
-
7
- // Exit if accessed directly
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- /**
13
- * A class to manage notices.
14
- *
15
- * @since 1.0.0
16
- */
17
-
18
- /**
19
- * A group of classes and methods to create and manage notices.
20
- *
21
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
22
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
23
- *
24
- * @package factory-notices
25
- * @since 1.0.0
26
- */
27
- class Notices {
28
-
29
- /**
30
- * @var Wbcr_Factory420_Plugin
31
- */
32
- protected $plugin;
33
- /**
34
- * @var array
35
- */
36
- protected $notices = [];
37
-
38
- /**
39
- * @var array
40
- */
41
- protected $default_where = [
42
- 'plugins',
43
- 'themes',
44
- 'dashboard',
45
- 'edit',
46
- 'settings',
47
- 'dashboard-network',
48
- 'plugins-network',
49
- 'themes-network',
50
- 'settings-network',
51
- ];
52
-
53
- /**
54
- * @var array
55
- */
56
- private $dissmised_notices;
57
-
58
- /**
59
- * Инициализируем уведомлений сразу после загрузки модуля уведомлений
60
- *
61
- * @param Wbcr_Factory420_Plugin $plugin
62
- */
63
- public function __construct( $plugin ) {
64
- //default notices
65
- //---
66
-
67
- $this->plugin = $plugin;
68
- $this->dissmised_notices = $this->plugin->getPopulateOption( 'factory_dismissed_notices', [] );
69
-
70
- add_action( 'current_screen', [ $this, 'currentScreenAction' ] );
71
-
72
- if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
73
- add_action( 'wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
74
- $this,
75
- 'dismiss_notice'
76
- ] );
77
- }
78
- }
79
-
80
- /**
81
- * Регистрирует экшены для работы с уведомлениями на текущем экране странице.
82
- * Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
83
- * хотя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
84
- */
85
- public function currentScreenAction() {
86
- /**
87
- * @since 2.1.2 - является устаревшим
88
- */
89
- $this->notices = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_notices_000_list', [
90
- $this->notices,
91
- $this->plugin->getPluginName(),
92
- ], '2.1.2', 'wbcr/factory/admin_notices' );
93
-
94
- /**
95
- * @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому хуке мы заменили префикс на factory_420
96
- */
97
- $this->notices = apply_filters( 'wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName() );
98
-
99
- if ( count( $this->notices ) == 0 ) {
100
- return;
101
- }
102
-
103
- $screen = get_current_screen();
104
-
105
- $has_notices = false;
106
- foreach ( (array) $this->notices as $notice ) {
107
- if ( ! isset( $notice['id'] ) ) {
108
- continue;
109
- }
110
-
111
- $where = ! isset( $notice['where'] ) || empty( $notice['where'] ) ? $this->default_where : $notice['where'];
112
-
113
- if ( in_array( $screen->base, $where ) && ! $this->is_dissmissed( $notice['id'] ) ) {
114
- $has_notices = true;
115
- break;
116
- };
117
- }
118
-
119
- if ( $has_notices ) {
120
- add_action( 'admin_footer', [ $this, 'print_js_code' ] );
121
-
122
- if ( $this->plugin->isNetworkActive() ) {
123
- if ( current_user_can( 'manage_network' ) ) {
124
- add_action( 'network_admin_notices', [ $this, 'show_notices' ] );
125
- add_action( 'admin_notices', [ $this, 'show_notices' ] );
126
- }
127
- } else {
128
- add_action( 'admin_notices', [ $this, 'show_notices' ] );
129
- }
130
- }
131
- }
132
-
133
- /**
134
- * Показывает все зарегистрированные уведомления для текущего плагина.
135
- * Уведомления показываются только на определенных страницах через параметр $notice['where'],
136
- * если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
137
- */
138
- public function show_notices() {
139
- if ( count( $this->notices ) == 0 ) {
140
- return;
141
- }
142
-
143
- if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'edit_plugins' ) || ! current_user_can( 'install_plugins' ) ) {
144
- return;
145
- }
146
-
147
- $screen = get_current_screen();
148
-
149
- foreach ( $this->notices as $notice ) {
150
-
151
- if ( ! isset( $notice['id'] ) ) {
152
- continue;
153
- }
154
-
155
- $where = ! isset( $notice['where'] ) || empty( $notice['where'] ) ? $this->default_where : $notice['where'];
156
-
157
- if ( in_array( $screen->base, $where ) && ! $this->is_dissmissed( $notice['id'] ) ) {
158
- $this->show_notice( $notice );
159
- };
160
- }
161
- }
162
-
163
- /**
164
- * Показывает уведомление, по переданным параметрам
165
- *
166
- * @param array $data - Параметры уведомления
167
- * $data['id'] - Индентификатор уведомления
168
- * $data['type'] - Тип уведомления (error, warning, success)
169
- * $notice['where'] - На каких страницах показывать уведомление ('plugins', 'dashboard', 'edit')
170
- * $data['text'] - Текст уведомления
171
- * $data['dismissible'] - Если true, уведомление будет с кнопкой закрыть
172
- * $data['dismiss_expires'] - Когда снова показать уведомление, нужно указывать время в unix timestamp.
173
- * Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
174
- * $data['classes'] - Произвольный классы для контейнера уведомления.
175
- */
176
- public function show_notice( $data ) {
177
- $settings = wp_parse_args( $data, [
178
- 'id' => null,
179
- 'text' => null,
180
- 'type' => 'error',
181
- 'dismissible' => false,
182
- 'dismiss_expires' => 0,
183
- 'classes' => []
184
- ] );
185
-
186
- if ( empty( $settings['id'] ) || empty( $settings['text'] ) ) {
187
- return;
188
- }
189
-
190
- $plugin_name = str_replace( '_', '-', $this->plugin->getPluginName() );
191
-
192
- $classes = array_merge( [
193
- 'notice',
194
- 'notice-' . $settings['type'],
195
- $plugin_name . '-factory-notice'
196
- ], $settings['classes'] );
197
-
198
- if ( $settings['dismissible'] ) {
199
- $classes[] = 'is-dismissible';
200
- $classes[] = $plugin_name . '-factory-notice-dismiss';
201
- }
202
- ?>
203
- <div data-name="wbcr_factory_notice_<?php echo esc_attr( $data['id'] ) ?>" data-expires="<?= esc_attr( $settings['dismiss_expires'] ) ?>" data-nonce="<?php echo wp_create_nonce( $this->plugin->getPluginName() . '_factory_dismiss_notice' ); ?>" class="<?php echo esc_attr( implode( ' ', $classes ) ) ?>">
204
- <?= $data['text'] ?>
205
- </div>
206
- <?php
207
- }
208
-
209
- /**
210
- * Когда пользователь нажимает кнопку закрыть уведомление,
211
- * отправляется ajax запрос с вызовом текущего метода
212
- */
213
- public function dismiss_notice() {
214
- if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'edit_plugins' ) || ! current_user_can( 'install_plugins' ) ) {
215
- wp_die( - 1, 403 );
216
- }
217
-
218
- check_admin_referer( $this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce' );
219
-
220
- // Имя уведомления (идентификатор)
221
- $name = $this->plugin->request->post( 'name', null, true );
222
-
223
- // Время в Unix timestamp, по истечению, которого уведомление снова будет показано
224
- // Если передан 0, то уведомление будет скрыто навсегда
225
- $expires = $this->plugin->request->post( 'expires', 0, 'intval' );
226
-
227
- if ( empty( $name ) ) {
228
- wp_send_json_error( [ 'error_message' => 'You must pass the notification "Name"! Action was rejected.' ] );
229
- }
230
-
231
- $notices = $this->plugin->getPopulateOption( "factory_dismissed_notices", [] );
232
-
233
- if ( ! empty( $notices ) ) {
234
- foreach ( (array) $notices as $notice_id => $notice_expires ) {
235
- if ( $notice_expires !== 0 && $notice_expires < time() ) {
236
- unset( $notices[ $notice_id ] );
237
- }
238
- }
239
- }
240
-
241
- $notices[ $name ] = $expires;
242
-
243
- $this->plugin->updatePopulateOption( 'factory_dismissed_notices', $notices );
244
-
245
- wp_send_json_success();
246
- }
247
-
248
- /**
249
- * Javascript code
250
- * Печает в подвале страницы код, для взаимодействия с сервером через ajax,
251
- * код используется при нажатии на кнопку закрыть уведомление. *
252
- */
253
- public function print_js_code() {
254
- $plugin_name = str_replace( '_', '-', $this->plugin->getPluginName() );
255
-
256
- ?>
257
- <script type="text/javascript">
258
- jQuery(function($) {
259
-
260
- $(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
261
- $.post(ajaxurl, {
262
- 'action': '<?php echo $this->plugin->getPluginName(); ?>_dismiss_notice',
263
- 'name': $(this).parent().data('name'),
264
- 'expires': $(this).parent().data('expires'),
265
- 'nonce': $(this).parent().attr('data-nonce')
266
- });
267
- });
268
-
269
- });
270
- </script>
271
- <?php
272
- }
273
-
274
-
275
- /**
276
- * Проверяет скрыто уведоление или нет
277
- *
278
- * @param string $notice_id - имя уведомления
279
- *
280
- * @return bool
281
- */
282
- protected function is_dissmissed( $notice_id ) {
283
- if ( ! empty( $this->dissmised_notices ) && isset( $this->dissmised_notices[ 'wbcr_factory_notice_' . $notice_id ] ) ) {
284
- $expires = (int) $this->dissmised_notices[ 'wbcr_factory_notice_' . $notice_id ];
285
-
286
- return $expires === 0 || $expires > time();
287
- }
288
-
289
- return false;
290
- }
291
- }
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WBCR\Factory_446;
4
+
5
+ use Wbcr_Factory446_Plugin;
6
+
7
+ // Exit if accessed directly
8
+ if( !defined('ABSPATH') ) {
9
+ exit;
10
+ }
11
+
12
+ /**
13
+ * A class to manage notices.
14
+ *
15
+ * @since 1.0.0
16
+ */
17
+
18
+ /**
19
+ * A group of classes and methods to create and manage notices.
20
+ *
21
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
22
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
23
+ *
24
+ * @package factory-notices
25
+ * @since 1.0.0
26
+ */
27
+ class Notices {
28
+
29
+ /**
30
+ * @var Wbcr_Factory446_Plugin
31
+ */
32
+ protected $plugin;
33
+ /**
34
+ * @var array
35
+ */
36
+ protected $notices = [];
37
+
38
+ /**
39
+ * @var array
40
+ */
41
+ protected $default_where = [
42
+ 'plugins',
43
+ 'themes',
44
+ 'dashboard',
45
+ 'edit',
46
+ 'settings',
47
+ 'dashboard-network',
48
+ 'plugins-network',
49
+ 'themes-network',
50
+ 'settings-network',
51
+ ];
52
+
53
+ /**
54
+ * @var array
55
+ */
56
+ private $dissmised_notices;
57
+
58
+ /**
59
+ * Инициализируем уведомлений сразу после загрузки модуля уведомлений
60
+ *
61
+ * @param Wbcr_Factory446_Plugin $plugin
62
+ */
63
+ public function __construct($plugin)
64
+ {
65
+ //default notices
66
+ //---
67
+
68
+ $this->plugin = $plugin;
69
+ $this->dissmised_notices = $this->plugin->getPopulateOption('factory_dismissed_notices', []);
70
+
71
+ add_action('current_screen', [$this, 'currentScreenAction']);
72
+
73
+ if( defined('DOING_AJAX') && DOING_AJAX ) {
74
+ add_action('wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
75
+ $this,
76
+ 'dismiss_notice'
77
+ ]);
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Регистрирует экшены для работы с уведомлениями на текущем экране странице.
83
+ * Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
84
+ * хотя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
85
+ */
86
+ public function currentScreenAction()
87
+ {
88
+ /**
89
+ * @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому хуке мы заменили префикс на factory_446
90
+ */
91
+ $this->notices = apply_filters('wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName());
92
+
93
+ if( count($this->notices) == 0 ) {
94
+ return;
95
+ }
96
+
97
+ $screen = get_current_screen();
98
+
99
+ $has_notices = false;
100
+ foreach((array)$this->notices as $notice) {
101
+ if( !isset($notice['id']) ) {
102
+ continue;
103
+ }
104
+
105
+ $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
106
+
107
+ if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
108
+ $has_notices = true;
109
+ break;
110
+ };
111
+ }
112
+
113
+ if( $has_notices ) {
114
+ add_action('admin_footer', [$this, 'print_js_code']);
115
+
116
+ $this->show_notices();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Показывает все зарегистрированные уведомления для текущего плагина.
122
+ * Уведомления показываются только на определенных страницах через параметр $notice['where'],
123
+ * если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
124
+ */
125
+ public function show_notices()
126
+ {
127
+ if( count($this->notices) == 0 ) {
128
+ return;
129
+ }
130
+
131
+ if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
132
+ return;
133
+ }
134
+
135
+ $screen = get_current_screen();
136
+
137
+ foreach($this->notices as $notice) {
138
+
139
+ if( !isset($notice['id']) ) {
140
+ continue;
141
+ }
142
+
143
+ $where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
144
+
145
+ if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
146
+ if( $this->plugin->isNetworkActive() ) {
147
+ if( current_user_can('manage_network') ) {
148
+ add_action('network_admin_notices', function () use ($notice) {
149
+ $this->show_notice($notice);
150
+ });
151
+ add_action('admin_notices', function () use ($notice) {
152
+ $this->show_notice($notice);
153
+ });
154
+ }
155
+ } else {
156
+ add_action('admin_notices', function () use ($notice) {
157
+ $this->show_notice($notice);
158
+ });
159
+ }
160
+ };
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Показывает уведомление, по переданным параметрам
166
+ *
167
+ * @param array $data - Параметры уведомления
168
+ * $data['id'] - Индентификатор уведомления
169
+ * $data['type'] - Тип уведомления (error, warning, success)
170
+ * $notice['where'] - На каких страницах показывать уведомление ('plugins', 'dashboard', 'edit')
171
+ * $data['text'] - Текст уведомления
172
+ * $data['dismissible'] - Если true, уведомление будет с кнопкой закрыть
173
+ * $data['dismiss_expires'] - Когда снова показать уведомление, нужно указывать время в unix timestamp.
174
+ * Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
175
+ * $data['classes'] - Произвольный классы для контейнера уведомления.
176
+ */
177
+ public function show_notice($data)
178
+ {
179
+ $settings = wp_parse_args($data, [
180
+ 'id' => null,
181
+ 'text' => null,
182
+ 'type' => 'error',
183
+ 'dismissible' => false,
184
+ 'dismiss_expires' => 0,
185
+ 'classes' => []
186
+ ]);
187
+
188
+ if( empty($settings['id']) || empty($settings['text']) ) {
189
+ return;
190
+ }
191
+
192
+ $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
193
+
194
+ $classes = array_merge([
195
+ 'notice',
196
+ 'notice-' . $settings['type'],
197
+ $plugin_name . '-factory-notice'
198
+ ], $settings['classes']);
199
+
200
+ if( $settings['dismissible'] ) {
201
+ $classes[] = 'is-dismissible';
202
+ $classes[] = $plugin_name . '-factory-notice-dismiss';
203
+ }
204
+ ?>
205
+ <div data-name="wbcr_factory_notice_<?php echo esc_attr($data['id']) ?>" data-expires="<?= esc_attr($settings['dismiss_expires']) ?>" data-nonce="<?php echo wp_create_nonce($this->plugin->getPluginName() . '_factory_dismiss_notice'); ?>" class="<?php echo esc_attr(implode(' ', $classes)) ?>">
206
+ <?= $data['text'] ?>
207
+ </div>
208
+ <?php
209
+ }
210
+
211
+ /**
212
+ * Когда пользователь нажимает кнопку закрыть уведомление,
213
+ * отправляется ajax запрос с вызовом текущего метода
214
+ */
215
+ public function dismiss_notice()
216
+ {
217
+ if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
218
+ wp_die(-1, 403);
219
+ }
220
+
221
+ check_admin_referer($this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce');
222
+
223
+ // Имя уведомления (идентификатор)
224
+ $name = $this->plugin->request->post('name', null, true);
225
+
226
+ // Время в Unix timestamp, по истечению, которого уведомление снова будет показано
227
+ // Если передан 0, то уведомление будет скрыто навсегда
228
+ $expires = $this->plugin->request->post('expires', 0, 'intval');
229
+
230
+ if( empty($name) ) {
231
+ wp_send_json_error(['error_message' => 'You must pass the notification "Name"! Action was rejected.']);
232
+ }
233
+
234
+ $notices = $this->plugin->getPopulateOption("factory_dismissed_notices", []);
235
+
236
+ if( !empty($notices) ) {
237
+ foreach((array)$notices as $notice_id => $notice_expires) {
238
+ if( $notice_expires !== 0 && $notice_expires < time() ) {
239
+ unset($notices[$notice_id]);
240
+ }
241
+ }
242
+ }
243
+
244
+ $notices[$name] = $expires;
245
+
246
+ $this->plugin->updatePopulateOption('factory_dismissed_notices', $notices);
247
+
248
+ wp_send_json_success();
249
+ }
250
+
251
+ /**
252
+ * Javascript code
253
+ * Печает в подвале страницы код, для взаимодействия с сервером через ajax,
254
+ * код используется при нажатии на кнопку закрыть уведомление. *
255
+ */
256
+ public function print_js_code()
257
+ {
258
+ $plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
259
+
260
+ ?>
261
+ <script type="text/javascript">
262
+ jQuery(function($) {
263
+
264
+ $(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
265
+ $.post(ajaxurl, {
266
+ 'action': '<?php echo $this->plugin->getPluginName(); ?>_dismiss_notice',
267
+ 'name': $(this).parent().data('name'),
268
+ 'expires': $(this).parent().data('expires'),
269
+ 'nonce': $(this).parent().attr('data-nonce')
270
+ });
271
+ });
272
+
273
+ });
274
+ </script>
275
+ <?php
276
+ }
277
+
278
+
279
+ /**
280
+ * Проверяет скрыто уведоление или нет
281
+ *
282
+ * @param string $notice_id - имя уведомления
283
+ *
284
+ * @return bool
285
+ */
286
+ protected function is_dissmissed($notice_id)
287
+ {
288
+ if( !empty($this->dissmised_notices) && isset($this->dissmised_notices['wbcr_factory_notice_' . $notice_id]) ) {
289
+ $expires = (int)$this->dissmised_notices['wbcr_factory_notice_' . $notice_id];
290
+
291
+ return $expires === 0 || $expires > time();
292
+ }
293
+
294
+ return false;
295
+ }
296
+ }
libs/factory/core/includes/class-factory-options.php CHANGED
@@ -1,432 +1,432 @@
1
- <?php
2
-
3
- namespace WBCR\Factory_420;
4
-
5
- // Exit if accessed directly
6
- use Exception;
7
-
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- /**
13
- * Трейт используется для расширения базового класса плагина Wbcr_Factory420_Base, позволяя работать с опциями плагина.
14
- *
15
- * Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
16
- * delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
17
- * чтобы класс выполнял эту работу за программиста. В дополнение, трейт содержит методы для полной выгрузки всех опций
18
- * плагина, что позволяет при инициализации плагина автоматически выгрузить все существующие опции плагина в объектный
19
- * кеш. Все опции, с которыми работает плагин, могут быть отфильтрованы.
20
- *
21
- * Документация по трейту: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393805831/
22
- * Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
23
- * Репозиторий: https://github.com/alexkovalevv
24
- *
25
- * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
26
- * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
27
- *
28
- * @since 4.0.8 - Добавлен
29
- * @package factory-core
30
- */
31
- trait Options {
32
-
33
- /**
34
- * Абстрактный метод, должен быть реализован в классе использующем этот трейт. Метод позволяет получить префикс
35
- * плагина для формирования имен опций в базе данных Wordpress. У опций должно быть свое пространство имен,
36
- * иначе может быть конфликт с другими плагинами или с сами ядром Wordpress.
37
- *
38
- * @since 4.0.8 - Добавлен
39
- * @return string Возвращает префикс плагина. Пример: wbcr_clearfy_
40
- */
41
- abstract public function getPrefix();
42
-
43
- /**
44
- * Выгружает все опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе данных.
45
- * Метод ускоряет работу плагина, если опций очень много.
46
- *
47
- * Используется только один раз при инициализации плагина.
48
- *
49
- * @since 4.0.8 - Добавлен
50
- */
51
- public function loadAllOptions() {
52
- global $wpdb;
53
-
54
- $is_option_loaded = wp_cache_get( $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'options' );
55
-
56
- if ( false === $is_option_loaded ) {
57
- $result = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->getPrefix()}%'" );
58
-
59
- $options = [];
60
-
61
- if ( ! empty( $result ) ) {
62
- wp_cache_add( $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'options' );
63
-
64
- foreach ( $result as $option ) {
65
- $value = maybe_unserialize( $option->option_value );
66
- $value = $this->normalizeValue( $value );
67
-
68
- wp_cache_add( $option->option_name, $value, $this->getPrefix() . 'options' );
69
- $options[ $option->option_name ] = $value;
70
- }
71
-
72
- /**
73
- * Действие, которое будет выполнено, когда все опции плагина будут выгружены.
74
- *
75
- * @since 4.0.9 - Добавлен
76
- *
77
- * @param string $plugin_name Имя плагина
78
- * @param array $options Ассоциативный массив опций плагина
79
- */
80
- do_action( 'wbcr/factory/all_options_loaded', $options, $this->plugin_name );
81
- }
82
- }
83
- }
84
-
85
- /**
86
- * Выгружает все сетевые опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе
87
- * данных. Метод ускоряет работу плагина, если опций очень много.
88
- *
89
- * Используется и работает только в режиме мультисайтов, один раз при инициализации плагина.!
90
- *
91
- * @since 4.0.8 - Добавлен
92
- * @return void
93
- */
94
- public function loadAllNetworkOptions() {
95
- global $wpdb;
96
-
97
- $network_id = (int) get_current_network_id();
98
-
99
- $is_option_loaded = wp_cache_get( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'network_options' );
100
-
101
- if ( false === $is_option_loaded ) {
102
- wp_cache_add_global_groups( [ $this->getPrefix() . 'network_options' ] );
103
-
104
- $result = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->getPrefix()}%'" );
105
-
106
- $options = [];
107
- if ( ! empty( $result ) ) {
108
- wp_cache_add( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'network_options' );
109
-
110
- foreach ( $result as $option ) {
111
- $value = maybe_unserialize( $option->meta_value );
112
- $value = $this->normalizeValue( $value );
113
-
114
- $cache_key = $network_id . ":" . $option->meta_key;
115
- wp_cache_add( $cache_key, $value, $this->getPrefix() . 'network_options' );
116
- $options[ $option->meta_key ] = $value;
117
- }
118
-
119
- /**
120
- *
121
- * Действие, которое будет выполнено, когда все сетевые опции плагина будут выгружены.
122
- *
123
- * @since 4.0.9 - Добавлен
124
- *
125
- * @param array $options Ассоциативный массив опций плагина
126
- * @param string $plugin_name Имя плагина
127
- */
128
- do_action( 'wbcr/factory/all_network_options_loaded', $options, $this->plugin_name );
129
- }
130
- }
131
- }
132
-
133
- /**
134
- * Позволяет получить популярную опцию. В случае если плагин установлен для сети (в режиме мультисайтов),
135
- * то метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта. Работает
136
- * на основе self::getOption и self::getNetworkOption, смотрите полную реализацию в этих методах.
137
- *
138
- * @since 4.0.8 - Добавлен
139
- *
140
- * @param string $option_name Имя опции без префикса.
141
- * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
142
- *
143
- * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
144
- */
145
- public function getPopulateOption( $option_name, $default = false ) {
146
- if ( $this->isNetworkActive() ) {
147
- $option_value = $this->getNetworkOption( $option_name, $default );
148
- } else {
149
- $option_value = $this->getOption( $option_name, $default );
150
- }
151
-
152
- /**
153
- * Фильтр позволяет отфильтровать возвращаемое значение популярной опции.
154
- *
155
- * @since 4.0.9 - Добавлен
156
- *
157
- * @param mixed $option_value Значение опции
158
- * @param string $option_name Имя опции
159
- * @param mixed $default Значение опции по умолчанию
160
- */
161
- return apply_filters( "wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default );
162
- }
163
-
164
- /**
165
- * Позволяет получить сетевые опции. Если плагин установлен для сети (в режиме мультисайтов), то
166
- * метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта.
167
- *
168
- * Опция вытаскивается из объектного кеша, после выполнения метода self:loadAllNetworkOptions,
169
- * а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
170
- * может быть странное поведение в работе плагина.
171
- *
172
- * @since 4.0.8 - Добавлен
173
- *
174
- * @param string $option_name Имя опции без префикса.
175
- * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
176
- *
177
- * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
178
- */
179
- public function getNetworkOption( $option_name, $default = false ) {
180
- if ( empty( $option_name ) || ! is_string( $option_name ) ) {
181
- throw new Exception( 'Option name must be a string and must not be empty.' );
182
- }
183
-
184
- if ( ! is_multisite() ) {
185
- return $this->getOption( $option_name, $default );
186
- }
187
-
188
- $this->loadAllNetworkOptions();
189
-
190
- $network_id = (int) get_current_network_id();
191
- $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
192
- $option_value = wp_cache_get( $cache_key, $this->getPrefix() . 'network_options' );
193
-
194
- if ( false === $option_value ) {
195
- $option_value = $default;
196
- }
197
-
198
- /**
199
- * Фильтр позволяет отфильтровать возвращаемое значение сетевой опции.
200
- *
201
- * @since 4.0.9 - Добавлен
202
- *
203
- * @param mixed $option_value Значение опции
204
- * @param string $option_name Имя опции
205
- * @param mixed $default Значение опции по умолчанию
206
- * @param int $network_id ID сети
207
- */
208
-
209
- return apply_filters( "wbcr/factory/network_option_{$option_name}", $option_value, $option_name, $default, $network_id );
210
- }
211
-
212
- /**
213
- * Метод позволяет получить опцию для текущего сайта. Опция вытаскивается из объектного кеша, после выполнения метода
214
- * self:loadAllOptions, а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
215
- * может быть странное поведение в работе плагина.
216
- *
217
- * @since 4.0.0 - Добавлен
218
- * @since 4.0.8 - Полностью переделан
219
- *
220
- * @param string $option_name Имя опции без префикса.
221
- * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
222
- *
223
- * @return mixed
224
- */
225
- public function getOption( $option_name, $default = false ) {
226
- if ( empty( $option_name ) || ! is_string( $option_name ) ) {
227
- throw new Exception( 'Option name must be a string and must not be empty.' );
228
- }
229
-
230
- $this->loadAllOptions();
231
-
232
- $option_value = wp_cache_get( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
233
-
234
- if ( false === $option_value ) {
235
- $option_value = $default;
236
- }
237
-
238
- /**
239
- * Фильтр позволяет отфильтровать возвращаемое значение опции сайта.
240
- *
241
- * @since 4.0.9 - Добавлен
242
- *
243
- * @param mixed $option_value Значение опции
244
- * @param string $option_name Имя опции
245
- * @param mixed $default Значение опции по умолчанию
246
- */
247
-
248
- return apply_filters( "wbcr/factory/option_{$option_name}", $option_value, $option_name, $default );
249
- }
250
-
251
- /**
252
- * Позволяет обновить популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод обновляет опцию
253
- * только в таблице sitemeta, иначе в таблице options для текущего сайта.
254
- *
255
- * @param string $option_name Имя опции без префикса.
256
- * @param mixed $option_value Значение опции. Может принимать массив или объект.
257
- */
258
- public function updatePopulateOption( $option_name, $option_value ) {
259
- if ( $this->isNetworkActive() ) {
260
- $this->updateNetworkOption( $option_name, $option_value );
261
- } else {
262
- $this->updateOption( $option_name, $option_value );
263
- }
264
- }
265
-
266
- /**
267
- * Обновляет сетевую опцию в БД таблица sitemeta. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
268
- * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
269
- *
270
- * @since 4.0.8 - Добавлен
271
- *
272
- * @param string $option_name Имя опции без префикса.
273
- * @param mixed $option_value Значение опции. Может принимать массив или объект.
274
- */
275
- public function updateNetworkOption( $option_name, $option_value ) {
276
- $network_id = (int) get_current_network_id();
277
- $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
278
- wp_cache_set( $cache_key, $option_value, $this->getPrefix() . 'network_options' );
279
-
280
- update_site_option( $this->getPrefix() . $option_name, $option_value );
281
-
282
- /**
283
- * Действие будет выполнено, когда сетевая опция будет обновлена.
284
- *
285
- * @since 4.0.8 - Добавлен
286
- *
287
- * @param string $option_name Имя опции без префикса.
288
- * @param mixed $option_value Значение опции. Может принимать массив или объект.
289
- */
290
- do_action( "wbcr/factory/update_network_option", $option_name, $option_value );
291
- }
292
-
293
- /**
294
- * Обновляет опцию сайта в БД таблица options. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
295
- * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
296
- *
297
- * @since 4.0.0 - Добавлен
298
- * @since 4.0.8 - Полностью переделан
299
- *
300
- * @param string $option_name Имя опции без префикса.
301
- * @param mixed $option_value Значение опции. Может принимать массив или объект.
302
- *
303
- * @return bool
304
- */
305
- public function updateOption( $option_name, $option_value ) {
306
- wp_cache_set( $this->getPrefix() . $option_name, $option_value, $this->getPrefix() . 'options' );
307
- $result = update_option( $this->getPrefix() . $option_name, $option_value );
308
-
309
- /**
310
- * @since 4.0.8
311
- *
312
- * @param string $option_name
313
- *
314
- * @param mixed $option_value
315
- */
316
- do_action( "wbcr/factory/update_option", $option_name, $option_value );
317
-
318
- return $result;
319
- }
320
-
321
- /**
322
- * Позволяет удалять популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод удаляет опцию
323
- * только в таблице sitemeta, иначе в таблице options для текущего сайта.
324
- *
325
- * @since 4.0.0 - Добавлен
326
- *
327
- * @param string $option_name Имя опции без префикса.
328
- */
329
- public function deletePopulateOption( $option_name ) {
330
- if ( $this->isNetworkActive() ) {
331
- $this->deleteNetworkOption( $option_name );
332
- } else {
333
- $this->deleteOption( $option_name );
334
- }
335
- }
336
-
337
- /**
338
- * Удаляет сетевую.опцию в БД таблица sitemeta, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
339
- *
340
- * @since 4.0.0 - Добавлен
341
- *
342
- * @param string $option_name Имя опции без префикса.
343
- *
344
- * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
345
- */
346
- public function deleteNetworkOption( $option_name ) {
347
- $network_id = (int) get_current_network_id();
348
- $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
349
- $delete_cache = wp_cache_delete( $cache_key, $this->getPrefix() . 'network_options' );
350
-
351
- $delete_opt1 = delete_site_option( $this->getPrefix() . $option_name );
352
-
353
- return $delete_cache && $delete_opt1;
354
- }
355
-
356
- /**
357
- * Удаляет опцию сайта в БД таблица options, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
358
- *
359
- * @since 4.0.0 - Добавлен
360
- *
361
- * @param string $option_name Имя опции без префикса.
362
- *
363
- * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
364
- */
365
- public function deleteOption( $option_name ) {
366
- $delete_cache = wp_cache_delete( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
367
-
368
- // todo: удалить, когда большая часть пользователей обновятся до современных релизов
369
- $delete_opt1 = delete_option( $this->getPrefix() . $option_name . '_is_active' );
370
- $delete_opt2 = delete_option( $this->getPrefix() . $option_name );
371
-
372
- return $delete_cache && $delete_opt1 && $delete_opt2;
373
- }
374
-
375
- /**
376
- * Сбрасывает объектный кеш. Может использоваться для перезагрузки опций плагина и Wordpress в целом.
377
- *
378
- * @since 4.0.0 - Добавлен
379
- * @return bool Возвращает true, если кеш сброшен успешно, false в случае ошибки.
380
- */
381
- public function flushOptionsCache() {
382
- return wp_cache_flush();
383
- }
384
-
385
- /**
386
- * Позволяет получить полное имя опции с префиксом. Может быть использовано в тех случаях, где нужно получить
387
- * полное имя опции.
388
- *
389
- * @since 4.0.0 - Добавлен
390
- *
391
- * @param string $option_name Имя опции без префикса.
392
- *
393
- * @return null|string Возвращает имя опции с префиксом. Например wbcr_clearfy_{options_name}
394
- */
395
- public function getOptionName( $option_name ) {
396
- $option_name = trim( rtrim( $option_name ) );
397
- if ( empty( $option_name ) || ! is_string( $option_name ) ) {
398
- return null;
399
- }
400
-
401
- return $this->getPrefix() . $option_name;
402
- }
403
-
404
- /**
405
- * Позволяет нормализовать данные. В некоторых методах этого трейта, ожидаются данные определенного типа, чтобы
406
- * выполнить различные логические операции. Как раз в этом случае этот метод можно использовать, чтобы привести
407
- * все сырые данные в строгий тип. Такое решение позволит избежать ошибок в работе программиста.
408
- *
409
- * @since 4.0.0 - Добавлен
410
- *
411
- * @param mixed $data Данные, которые нужно нормализовать.
412
- *
413
- * @return mixed Возвращает нормализованное значение.
414
- * - Если передана строка "true" или "false" вернет булево значение.
415
- * - Если передана строка "1" или "0" вернет число.
416
- */
417
- public function normalizeValue( $data ) {
418
- if ( is_string( $data ) ) {
419
- $check_string = rtrim( trim( $data ) );
420
-
421
- if ( $check_string == "1" || $check_string == "0" ) {
422
- return intval( $data );
423
- } else if ( $check_string === 'false' ) {
424
- return false;
425
- } else if ( $check_string === 'true' ) {
426
- return true;
427
- }
428
- }
429
-
430
- return $data;
431
- }
432
- }
1
+ <?php
2
+
3
+ namespace WBCR\Factory_446;
4
+
5
+ // Exit if accessed directly
6
+ use Exception;
7
+
8
+ if ( ! defined( 'ABSPATH' ) ) {
9
+ exit;
10
+ }
11
+
12
+ /**
13
+ * Трейт используется для расширения базового класса плагина Wbcr_Factory446_Base, позволяя работать с опциями плагина.
14
+ *
15
+ * Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
16
+ * delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
17
+ * чтобы класс выполнял эту работу за программиста. В дополнение, трейт содержит методы для полной выгрузки всех опций
18
+ * плагина, что позволяет при инициализации плагина автоматически выгрузить все существующие опции плагина в объектный
19
+ * кеш. Все опции, с которыми работает плагин, могут быть отфильтрованы.
20
+ *
21
+ * Документация по трейту: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393805831/
22
+ * Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
23
+ * Репозиторий: https://github.com/alexkovalevv
24
+ *
25
+ * @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
26
+ * @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
27
+ *
28
+ * @since 4.0.8 - Добавлен
29
+ * @package factory-core
30
+ */
31
+ trait Options {
32
+
33
+ /**
34
+ * Абстрактный метод, должен быть реализован в классе использующем этот трейт. Метод позволяет получить префикс
35
+ * плагина для формирования имен опций в базе данных Wordpress. У опций должно быть свое пространство имен,
36
+ * иначе может быть конфликт с другими плагинами или с сами ядром Wordpress.
37
+ *
38
+ * @since 4.0.8 - Добавлен
39
+ * @return string Возвращает префикс плагина. Пример: wbcr_clearfy_
40
+ */
41
+ abstract public function getPrefix();
42
+
43
+ /**
44
+ * Выгружает все опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе данных.
45
+ * Метод ускоряет работу плагина, если опций очень много.
46
+ *
47
+ * Используется только один раз при инициализации плагина.
48
+ *
49
+ * @since 4.0.8 - Добавлен
50
+ */
51
+ public function loadAllOptions() {
52
+ global $wpdb;
53
+
54
+ $is_option_loaded = wp_cache_get( $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'options' );
55
+
56
+ if ( false === $is_option_loaded ) {
57
+ $result = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->getPrefix()}%'" );
58
+
59
+ $options = [];
60
+
61
+ if ( ! empty( $result ) ) {
62
+ wp_cache_add( $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'options' );
63
+
64
+ foreach ( $result as $option ) {
65
+ $value = maybe_unserialize( $option->option_value );
66
+ $value = $this->normalizeValue( $value );
67
+
68
+ wp_cache_add( $option->option_name, $value, $this->getPrefix() . 'options' );
69
+ $options[ $option->option_name ] = $value;
70
+ }
71
+
72
+ /**
73
+ * Действие, которое будет выполнено, когда все опции плагина будут выгружены.
74
+ *
75
+ * @since 4.0.9 - Добавлен
76
+ *
77
+ * @param string $plugin_name Имя плагина
78
+ * @param array $options Ассоциативный массив опций плагина
79
+ */
80
+ do_action( 'wbcr/factory/all_options_loaded', $options, $this->plugin_name );
81
+ }
82
+ }
83
+ }
84
+
85
+ /**
86
+ * Выгружает все сетевые опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе
87
+ * данных. Метод ускоряет работу плагина, если опций очень много.
88
+ *
89
+ * Используется и работает только в режиме мультисайтов, один раз при инициализации плагина.!
90
+ *
91
+ * @since 4.0.8 - Добавлен
92
+ * @return void
93
+ */
94
+ public function loadAllNetworkOptions() {
95
+ global $wpdb;
96
+
97
+ $network_id = (int) get_current_network_id();
98
+
99
+ $is_option_loaded = wp_cache_get( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'network_options' );
100
+
101
+ if ( false === $is_option_loaded ) {
102
+ wp_cache_add_global_groups( [ $this->getPrefix() . 'network_options' ] );
103
+
104
+ $result = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->getPrefix()}%'" );
105
+
106
+ $options = [];
107
+ if ( ! empty( $result ) ) {
108
+ wp_cache_add( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'network_options' );
109
+
110
+ foreach ( $result as $option ) {
111
+ $value = maybe_unserialize( $option->meta_value );
112
+ $value = $this->normalizeValue( $value );
113
+
114
+ $cache_key = $network_id . ":" . $option->meta_key;
115
+ wp_cache_add( $cache_key, $value, $this->getPrefix() . 'network_options' );
116
+ $options[ $option->meta_key ] = $value;
117
+ }
118
+
119
+ /**
120
+ *
121
+ * Действие, которое будет выполнено, когда все сетевые опции плагина будут выгружены.
122
+ *
123
+ * @since 4.0.9 - Добавлен
124
+ *
125
+ * @param array $options Ассоциативный массив опций плагина
126
+ * @param string $plugin_name Имя плагина
127
+ */
128
+ do_action( 'wbcr/factory/all_network_options_loaded', $options, $this->plugin_name );
129
+ }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Позволяет получить популярную опцию. В случае если плагин установлен для сети (в режиме мультисайтов),
135
+ * то метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта. Работает
136
+ * на основе self::getOption и self::getNetworkOption, смотрите полную реализацию в этих методах.
137
+ *
138
+ * @since 4.0.8 - Добавлен
139
+ *
140
+ * @param string $option_name Имя опции без префикса.
141
+ * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
142
+ *
143
+ * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
144
+ */
145
+ public function getPopulateOption( $option_name, $default = false ) {
146
+ if ( $this->isNetworkActive() ) {
147
+ $option_value = $this->getNetworkOption( $option_name, $default );
148
+ } else {
149
+ $option_value = $this->getOption( $option_name, $default );
150
+ }
151
+
152
+ /**
153
+ * Фильтр позволяет отфильтровать возвращаемое значение популярной опции.
154
+ *
155
+ * @since 4.0.9 - Добавлен
156
+ *
157
+ * @param mixed $option_value Значение опции
158
+ * @param string $option_name Имя опции
159
+ * @param mixed $default Значение опции по умолчанию
160
+ */
161
+ return apply_filters( "wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default );
162
+ }
163
+
164
+ /**
165
+ * Позволяет получить сетевые опции. Если плагин установлен для сети (в режиме мультисайтов), то
166
+ * метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта.
167
+ *
168
+ * Опция вытаскивается из объектного кеша, после выполнения метода self:loadAllNetworkOptions,
169
+ * а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
170
+ * может быть странное поведение в работе плагина.
171
+ *
172
+ * @since 4.0.8 - Добавлен
173
+ *
174
+ * @param string $option_name Имя опции без префикса.
175
+ * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
176
+ *
177
+ * @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
178
+ */
179
+ public function getNetworkOption( $option_name, $default = false ) {
180
+ if ( empty( $option_name ) || ! is_string( $option_name ) ) {
181
+ throw new Exception( 'Option name must be a string and must not be empty.' );
182
+ }
183
+
184
+ if ( ! is_multisite() ) {
185
+ return $this->getOption( $option_name, $default );
186
+ }
187
+
188
+ $this->loadAllNetworkOptions();
189
+
190
+ $network_id = (int) get_current_network_id();
191
+ $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
192
+ $option_value = wp_cache_get( $cache_key, $this->getPrefix() . 'network_options' );
193
+
194
+ if ( false === $option_value ) {
195
+ $option_value = $default;
196
+ }
197
+
198
+ /**
199
+ * Фильтр позволяет отфильтровать возвращаемое значение сетевой опции.
200
+ *
201
+ * @since 4.0.9 - Добавлен
202
+ *
203
+ * @param mixed $option_value Значение опции
204
+ * @param string $option_name Имя опции
205
+ * @param mixed $default Значение опции по умолчанию
206
+ * @param int $network_id ID сети
207
+ */
208
+
209
+ return apply_filters( "wbcr/factory/network_option_{$option_name}", $option_value, $option_name, $default, $network_id );
210
+ }
211
+
212
+ /**
213
+ * Метод позволяет получить опцию для текущего сайта. Опция вытаскивается из объектного кеша, после выполнения метода
214
+ * self:loadAllOptions, а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
215
+ * может быть странное поведение в работе плагина.
216
+ *
217
+ * @since 4.0.0 - Добавлен
218
+ * @since 4.0.8 - Полностью переделан
219
+ *
220
+ * @param string $option_name Имя опции без префикса.
221
+ * @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
222
+ *
223
+ * @return mixed
224
+ */
225
+ public function getOption( $option_name, $default = false ) {
226
+ if ( empty( $option_name ) || ! is_string( $option_name ) ) {
227
+ throw new Exception( 'Option name must be a string and must not be empty.' );
228
+ }
229
+
230
+ $this->loadAllOptions();
231
+
232
+ $option_value = wp_cache_get( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
233
+
234
+ if ( false === $option_value ) {
235
+ $option_value = $default;
236
+ }
237
+
238
+ /**
239
+ * Фильтр позволяет отфильтровать возвращаемое значение опции сайта.
240
+ *
241
+ * @since 4.0.9 - Добавлен
242
+ *
243
+ * @param mixed $option_value Значение опции
244
+ * @param string $option_name Имя опции
245
+ * @param mixed $default Значение опции по умолчанию
246
+ */
247
+
248
+ return apply_filters( "wbcr/factory/option_{$option_name}", $option_value, $option_name, $default );
249
+ }
250
+
251
+ /**
252
+ * Позволяет обновить популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод обновляет опцию
253
+ * только в таблице sitemeta, иначе в таблице options для текущего сайта.
254
+ *
255
+ * @param string $option_name Имя опции без префикса.
256
+ * @param mixed $option_value Значение опции. Может принимать массив или объект.
257
+ */
258
+ public function updatePopulateOption( $option_name, $option_value ) {
259
+ if ( $this->isNetworkActive() ) {
260
+ $this->updateNetworkOption( $option_name, $option_value );
261
+ } else {
262
+ $this->updateOption( $option_name, $option_value );
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Обновляет сетевую опцию в БД таблица sitemeta. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
268
+ * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
269
+ *
270
+ * @since 4.0.8 - Добавлен
271
+ *
272
+ * @param string $option_name Имя опции без префикса.
273
+ * @param mixed $option_value Значение опции. Может принимать массив или объект.
274
+ */
275
+ public function updateNetworkOption( $option_name, $option_value ) {
276
+ $network_id = (int) get_current_network_id();
277
+ $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
278
+ wp_cache_set( $cache_key, $option_value, $this->getPrefix() . 'network_options' );
279
+
280
+ update_site_option( $this->getPrefix() . $option_name, $option_value );
281
+
282
+ /**
283
+ * Действие будет выполнено, когда сетевая опция будет обновлена.
284
+ *
285
+ * @since 4.0.8 - Добавлен
286
+ *
287
+ * @param string $option_name Имя опции без префикса.
288
+ * @param mixed $option_value Значение опции. Может принимать массив или объект.
289
+ */
290
+ do_action( "wbcr/factory/update_network_option", $option_name, $option_value );
291
+ }
292
+
293
+ /**
294
+ * Обновляет опцию сайта в БД таблица options. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
295
+ * чтобы плагин мог приступить к работе с этой опцией незамедлительно.
296
+ *
297
+ * @since 4.0.0 - Добавлен
298
+ * @since 4.0.8 - Полностью переделан
299
+ *
300
+ * @param string $option_name Имя опции без префикса.
301
+ * @param mixed $option_value Значение опции. Может принимать массив или объект.
302
+ *
303
+ * @return bool
304
+ */
305
+ public function updateOption( $option_name, $option_value ) {
306
+ wp_cache_set( $this->getPrefix() . $option_name, $option_value, $this->getPrefix() . 'options' );
307
+ $result = update_option( $this->getPrefix() . $option_name, $option_value );
308
+
309
+ /**
310
+ * @since 4.0.8
311
+ *
312
+ * @param string $option_name
313
+ *
314
+ * @param mixed $option_value
315
+ */
316
+ do_action( "wbcr/factory/update_option", $option_name, $option_value );
317
+
318
+ return $result;
319
+ }
320
+
321
+ /**
322
+ * Позволяет удалять популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод удаляет опцию
323
+ * только в таблице sitemeta, иначе в таблице options для текущего сайта.
324
+ *
325
+ * @since 4.0.0 - Добавлен
326
+ *
327
+ * @param string $option_name Имя опции без префикса.
328
+ */
329
+ public function deletePopulateOption( $option_name ) {
330
+ if ( $this->isNetworkActive() ) {
331
+ $this->deleteNetworkOption( $option_name );
332
+ } else {
333
+ $this->deleteOption( $option_name );
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Удаляет сетевую.опцию в БД таблица sitemeta, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
339
+ *
340
+ * @since 4.0.0 - Добавлен
341
+ *
342
+ * @param string $option_name Имя опции без префикса.
343
+ *
344
+ * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
345
+ */
346
+ public function deleteNetworkOption( $option_name ) {
347
+ $network_id = (int) get_current_network_id();
348
+ $cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
349
+ $delete_cache = wp_cache_delete( $cache_key, $this->getPrefix() . 'network_options' );
350
+
351
+ $delete_opt1 = delete_site_option( $this->getPrefix() . $option_name );
352
+
353
+ return $delete_cache && $delete_opt1;
354
+ }
355
+
356
+ /**
357
+ * Удаляет опцию сайта в БД таблица options, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
358
+ *
359
+ * @since 4.0.0 - Добавлен
360
+ *
361
+ * @param string $option_name Имя опции без префикса.
362
+ *
363
+ * @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
364
+ */
365
+ public function deleteOption( $option_name ) {
366
+ $delete_cache = wp_cache_delete( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
367
+
368
+ // todo: удалить, когда большая часть пользователей обновятся до современных релизов
369
+ $delete_opt1 = delete_option( $this->getPrefix() . $option_name . '_is_active' );
370
+ $delete_opt2 = delete_option( $this->getPrefix() . $option_name );
371
+
372
+ return $delete_ca