Smart Slider 3 - Version 3.5.1.9

Version Description

  • 18. August 2022 =
  • Feature: Improved notice when the Autoplay is used on a single slide to avoid confusion.
  • Feature: u tag is now allowed in text layer.
  • Fix: PHP 8.1. compatibility fixes.
  • Fix: Allow data protocol when Jetpack is active to avoid it removing the arrows and other base64 images.
  • Fix: Major overhaul of the way the plugin deals with options. This should fix a some bugs and provide improved security.
  • Other: Spanish translation updated. Thanks, Rodrigo!
  • Other: Dutch translation updated. Thanks, Frank!
  • Other: PHP related conflicts were renamed at the Debug Information to more accurately reflect the cause of the conflict.
Download this release

Release Info

Developer nextendweb
Plugin Icon 128x128 Smart Slider 3
Version 3.5.1.9
Comparing to
See all releases

Code changes from version 3.5.1.7 to 3.5.1.9

Files changed (191) hide show
  1. Nextend/Framework/Api.php +15 -89
  2. Nextend/Framework/Asset/AssetManager.php +10 -0
  3. Nextend/Framework/Asset/Css/Less/LessCompiler.php +1 -1
  4. Nextend/Framework/Browse/BulletProof/BulletProof.php +14 -11
  5. Nextend/Framework/Browse/ControllerAjaxBrowse.php +4 -3
  6. Nextend/Framework/Data/Data.php +4 -2
  7. Nextend/Framework/Filesystem/AbstractPlatformFilesystem.php +2 -2
  8. Nextend/Framework/Filesystem/WordPress/WordPressFilesystem.php +1 -1
  9. Nextend/Framework/Form/AbstractField.php +3 -4
  10. Nextend/Framework/Form/Container/ContainerRowGroup.php +3 -3
  11. Nextend/Framework/Form/Container/ContainerSubform.php +1 -1
  12. Nextend/Framework/Form/Container/ContainerTab.php +2 -2
  13. Nextend/Framework/Form/Container/ContainerTable.php +4 -4
  14. Nextend/Framework/Form/Container/LayerWindow/ContainerAnimation.php +2 -2
  15. Nextend/Framework/Form/Container/LayerWindow/ContainerAnimationTab.php +1 -1
  16. Nextend/Framework/Form/Container/LayerWindow/ContainerDesign.php +4 -3
  17. Nextend/Framework/Form/Container/LayerWindow/ContainerSettings.php +1 -1
  18. Nextend/Framework/Form/Element/Message.php +1 -1
  19. Nextend/Framework/Form/Element/Message/Warning.php +1 -1
  20. Nextend/Framework/Form/Element/Text.php +1 -2
  21. Nextend/Framework/Form/Element/Text/FieldImage.php +1 -1
  22. Nextend/Framework/Form/Element/Text/Number.php +1 -2
  23. Nextend/Framework/Form/Element/Textarea.php +1 -10
  24. Nextend/Framework/Form/Fieldset/FieldsetHidden.php +2 -1
  25. Nextend/Framework/Form/Fieldset/FieldsetRow.php +6 -5
  26. Nextend/Framework/Form/Fieldset/FieldsetRowPlain.php +3 -2
  27. Nextend/Framework/Form/Fieldset/FieldsetTableLabel.php +5 -6
  28. Nextend/Framework/Form/Fieldset/FieldsetVisualSet.php +6 -5
  29. Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetDesign.php +1 -1
  30. Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetInsideLabel.php +3 -2
  31. Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetLayerWindow.php +7 -6
  32. Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetLayerWindowLabelFields.php +1 -1
  33. Nextend/Framework/Form/Form.php +1 -1
  34. Nextend/Framework/Image/ImageEdit.php +8 -8
  35. Nextend/Framework/Localization/Functions.php +9 -5
  36. Nextend/Framework/Misc/HttpClient.php +9 -118
  37. Nextend/Framework/Misc/OAuth/HTTP.php +0 -1603
  38. Nextend/Framework/Misc/OAuth/OAuth.php +0 -2538
  39. Nextend/Framework/Misc/OAuth/oauth_configuration.json +0 -330
  40. Nextend/Framework/Misc/Zip/Creator.php +5 -2
  41. Nextend/Framework/Notification/Notification.php +13 -25
  42. Nextend/Framework/Platform/WordPress/PlatformWordPress.php +9 -1
  43. Nextend/Framework/Request/Parser/WordPressRequestParser.php +13 -3
  44. Nextend/Framework/Request/Request.php +18 -0
  45. Nextend/Framework/Request/Storage.php +12 -6
  46. Nextend/Framework/Sanitize.php +115 -1
  47. Nextend/Framework/Session/AbstractStorage.php +6 -4
  48. Nextend/Framework/Url/UrlHelper.php +3 -2
  49. Nextend/Framework/Url/WordPress/WordPressUrl.php +3 -2
  50. Nextend/Framework/View/AbstractLayout.php +7 -4
  51. Nextend/Framework/View/AbstractView.php +5 -0
  52. Nextend/Framework/WordPress/AssetInjector.php +1 -1
  53. Nextend/Languages/es.mo +0 -0
  54. Nextend/Languages/es.po +86 -67
  55. Nextend/Languages/nl_BE.mo +0 -0
  56. Nextend/Languages/nl_BE.po +112 -180
  57. Nextend/Languages/nl_NL.mo +0 -0
  58. Nextend/Languages/nl_NL.po +113 -181
  59. Nextend/Languages/smartslider3.pot +52 -33
  60. Nextend/Security/Kses.php +355 -0
  61. Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderAutoplay.php +2 -1
  62. Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderControls.php +3 -1
  63. Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderDeveloper.php +1 -2
  64. Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderSize.php +2 -2
  65. Nextend/SmartSlider3/Application/Admin/Generator/ControllerGenerator.php +1 -1
  66. Nextend/SmartSlider3/Application/Admin/Generator/Template/CreateStep2Configure.php +3 -3
  67. Nextend/SmartSlider3/Application/Admin/Generator/Template/CreateStep4Settings.php +6 -6
  68. Nextend/SmartSlider3/Application/Admin/Generator/Template/Edit.php +4 -4
  69. Nextend/SmartSlider3/Application/Admin/Generator/ViewGeneratorCreateStep4Settings.php +1 -2
  70. Nextend/SmartSlider3/Application/Admin/Generator/ViewGeneratorEdit.php +1 -1
  71. Nextend/SmartSlider3/Application/Admin/GoPro/BlockAlreadyPurchased/AlreadyPurchased.php +2 -2
  72. Nextend/SmartSlider3/Application/Admin/Help/ControllerHelp.php +1 -1
  73. Nextend/SmartSlider3/Application/Admin/Help/Template/Index.php +12 -10
  74. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Admin/Admin.php +4 -3
  75. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Admin/BlockAdmin.php +4 -3
  76. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminEditor/BlockAdminEditor.php +3 -2
  77. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminEmpty/BlockAdminEmpty.php +3 -2
  78. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminError/AdminError.php +3 -3
  79. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminIframe/AdminIframe.php +1 -1
  80. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminIframe/BlockAdminIframe.php +3 -2
  81. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Banner/Banner.php +9 -9
  82. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/ContentSidebar/ContentSidebar.php +5 -2
  83. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/FreeNeedMore/FreeNeedMore.php +2 -2
  84. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Header/Header.php +5 -3
  85. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Header/MenuItem.php +2 -1
  86. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/NavBar/NavBar.php +4 -2
  87. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarGroup/TopBarGroup.php +1 -1
  88. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarMain/TopBarMain.php +2 -2
  89. Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarMain/TopBarMainEditor/TopBarMainEditor.php +6 -4
  90. Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardInfo/DashboardInfo.php +2 -2
  91. Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardNewsletter.php +2 -2
  92. Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardReview.php +5 -5
  93. Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardUpgradePro.php +7 -7
  94. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/Button/AbstractButton.php +2 -1
  95. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/Button/BlockButtonSpacer.php +1 -1
  96. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenu.php +3 -2
  97. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenuItem.php +2 -1
  98. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenuItemSeparator.php +2 -2
  99. Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/FloatingMenu.php +1 -1
  100. Nextend/SmartSlider3/Application/Admin/Layout/Block/Generator/GeneratorBox/GeneratorBox.php +5 -5
  101. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/AddLayer/AddLayer.php +9 -8
  102. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/EditorOverlay/BlockEditorOverlay.php +2 -1
  103. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/LayerWindow/LayerWindow.php +4 -4
  104. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideBox/BlockSlideBox.php +2 -7
  105. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideBox/SlideBox.php +12 -14
  106. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideManager/AddSlide/AddSlide.php +1 -1
  107. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideManager/SlideManager.php +32 -9
  108. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderBox/SliderBox.php +14 -14
  109. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/ActionBar/ActionBar.php +1 -1
  110. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/Paginator/BlockPaginator.php +2 -3
  111. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/SliderManager.php +3 -3
  112. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderPublish/WordPress.php +4 -4
  113. Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderTrash/SliderTrashBox.php +8 -8
  114. Nextend/SmartSlider3/Application/Admin/Layout/Helper/Breadcrumb.php +4 -2
  115. Nextend/SmartSlider3/Application/Admin/Layout/Helper/MenuItem.php +3 -1
  116. Nextend/SmartSlider3/Application/Admin/Layout/LayoutDefaultSidebar.php +2 -1
  117. Nextend/SmartSlider3/Application/Admin/Preview/Template/Full.php +5 -5
  118. Nextend/SmartSlider3/Application/Admin/Preview/Template/Index.php +5 -6
  119. Nextend/SmartSlider3/Application/Admin/Preview/ViewPreviewFull.php +3 -0
  120. Nextend/SmartSlider3/Application/Admin/Settings/Template/ClearCache.php +1 -1
  121. Nextend/SmartSlider3/Application/Admin/Settings/Template/Fonts.php +1 -1
  122. Nextend/SmartSlider3/Application/Admin/Settings/Template/Framework.php +1 -1
  123. Nextend/SmartSlider3/Application/Admin/Settings/Template/General.php +1 -1
  124. Nextend/SmartSlider3/Application/Admin/Settings/Template/GeneratorConfigure.php +3 -3
  125. Nextend/SmartSlider3/Application/Admin/Settings/Template/ItemDefaults.php +1 -1
  126. Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsClearCache.php +2 -2
  127. Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsFramework.php +0 -8
  128. Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsGeneral.php +2 -1
  129. Nextend/SmartSlider3/Application/Admin/Slider/ControllerAjaxSlider.php +6 -0
  130. Nextend/SmartSlider3/Application/Admin/Slider/Template/SimpleEdit.php +3 -3
  131. Nextend/SmartSlider3/Application/Admin/Slider/Template/SimpleEditAddSlide.php +2 -2
  132. Nextend/SmartSlider3/Application/Admin/Sliders/ControllerAjaxSliders.php +20 -8
  133. Nextend/SmartSlider3/Application/Admin/Sliders/ControllerSliders.php +4 -3
  134. Nextend/SmartSlider3/Application/Admin/Sliders/Template/GettingStarted.php +2 -2
  135. Nextend/SmartSlider3/Application/Admin/Sliders/Template/Import.php +1 -1
  136. Nextend/SmartSlider3/Application/Admin/Sliders/ViewSlidersImport.php +1 -1
  137. Nextend/SmartSlider3/Application/Admin/Slides/ControllerAjaxSlides.php +3 -2
  138. Nextend/SmartSlider3/Application/Admin/Slides/Template/Edit.php +10 -9
  139. Nextend/SmartSlider3/Application/Admin/Slides/ViewSlidesEdit.php +1 -1
  140. Nextend/SmartSlider3/Application/Frontend/Slider/ControllerPreRenderSlider.php +2 -1
  141. Nextend/SmartSlider3/Application/Frontend/Slider/Template/Iframe.php +14 -7
  142. Nextend/SmartSlider3/Application/Frontend/Slider/ViewDisplay.php +3 -1
  143. Nextend/SmartSlider3/Application/Frontend/Slider/ViewIframe.php +4 -2
  144. Nextend/SmartSlider3/Application/Model/ModelGenerator.php +17 -3
  145. Nextend/SmartSlider3/BackgroundAnimation/ModelBackgroundAnimation.php +1 -1
  146. Nextend/SmartSlider3/BackupSlider/ExportSlider.php +4 -2
  147. Nextend/SmartSlider3/Conflict/Conflict.php +3 -3
  148. Nextend/SmartSlider3/Conflict/WordPress/WordPressConflict.php +38 -0
  149. Nextend/SmartSlider3/Platform/WordPress/Admin/AdminHelper.php +2 -3
  150. Nextend/SmartSlider3/Platform/WordPress/Admin/free/notice.php +1 -1
  151. Nextend/SmartSlider3/Platform/WordPress/Compatibility.php +5 -4
  152. Nextend/SmartSlider3/Platform/WordPress/HelperInstall.php +2 -1
  153. Nextend/SmartSlider3/Platform/WordPress/HelperTinyMCE.php +2 -1
  154. Nextend/SmartSlider3/Platform/WordPress/Integration/ACF/AcfFieldSmartSlider3.php +5 -5
  155. Nextend/SmartSlider3/Platform/WordPress/Integration/BeaverBuilder/BeaverBuilder.php +6 -6
  156. Nextend/SmartSlider3/Platform/WordPress/Integration/BeaverBuilder/includes/frontend.php +2 -2
  157. Nextend/SmartSlider3/Platform/WordPress/Integration/BoldGrid/BoldGrid.php +2 -1
  158. Nextend/SmartSlider3/Platform/WordPress/Integration/Brizy/Brizy.php +2 -1
  159. Nextend/SmartSlider3/Platform/WordPress/Integration/Divi/V31ge/includes/modules/SmartSlider3/SmartSlider3.php +3 -1
  160. Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider.php +6 -2
  161. Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider290.php +6 -2
  162. Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider350.php +6 -2
  163. Nextend/SmartSlider3/Platform/WordPress/Integration/Jetpack/Jetpack.php +11 -0
  164. Nextend/SmartSlider3/Platform/WordPress/Integration/OxygenBuilder/OxygenBuilder.php +3 -6
  165. Nextend/SmartSlider3/Platform/WordPress/Integration/TatsuBuilder/TatsuBuilder.php +3 -2
  166. Nextend/SmartSlider3/Platform/WordPress/Integration/VisualComposer2/VisualComposer2.php +2 -1
  167. Nextend/SmartSlider3/Platform/WordPress/Shortcode/Shortcode.php +9 -3
  168. Nextend/SmartSlider3/Platform/WordPress/SmartSlider3PlatformWordPress.php +8 -5
  169. Nextend/SmartSlider3/Platform/WordPress/Widget/WidgetHelper.php +1 -1
  170. Nextend/SmartSlider3/Platform/WordPress/Widget/WidgetSmartSlider3.php +16 -14
  171. Nextend/SmartSlider3/Platform/WordPress/WordPressFrontend.php +5 -5
  172. Nextend/SmartSlider3/Platform/WordPress/WordPressUpdate.php +0 -145
  173. Nextend/SmartSlider3/Renderable/Component/ComponentSlide.php +0 -1
  174. Nextend/SmartSlider3/Renderable/Item/ItemFactory.php +2 -2
  175. Nextend/SmartSlider3/SlideBuilder/BuilderComponentSlide.php +0 -1
  176. Nextend/SmartSlider3/Slider/Cache/CacheSlider.php +2 -2
  177. Nextend/SmartSlider3/Slider/Feature/TranslateUrl.php +1 -1
  178. Nextend/SmartSlider3/Slider/ResponsiveType/ResponsiveTypeFactory.php +2 -2
  179. Nextend/SmartSlider3/Slider/Slide.php +10 -2
  180. Nextend/SmartSlider3/Slider/Slider.php +3 -0
  181. Nextend/SmartSlider3/Slider/SliderType/AbstractSliderTypeFrontend.php +5 -3
  182. Nextend/SmartSlider3/Slider/SliderType/Block/SliderTypeBlockFrontend.php +16 -10
  183. Nextend/SmartSlider3/Slider/SliderType/Simple/SliderTypeSimpleFrontend.php +20 -13
  184. Nextend/SmartSlider3/Slider/SliderType/SliderTypeFactory.php +2 -2
  185. Nextend/SmartSlider3/Slider/Slides.php +5 -5
  186. Nextend/SmartSlider3/SliderManager/SliderManager.php +5 -0
  187. Nextend/SmartSlider3/SmartSlider3Info.php +9 -8
  188. Nextend/SmartSlider3/Widget/SliderWidget.php +5 -0
  189. Nextend/WordPress/Fail.php +7 -5
  190. Public/SmartSlider3/Application/Admin/Assets/dist/smartslider-admin.min.css +1 -1
  191. Public/SmartSlider3/Application/Admin/Assets/dist/smartslider-backend.min.js +0 -1
Nextend/Framework/Api.php CHANGED
@@ -10,10 +10,10 @@ use Nextend\Framework\Misc\Base64;
10
  use Nextend\Framework\Misc\HttpClient;
11
  use Nextend\Framework\Notification\Notification;
12
  use Nextend\Framework\Platform\Platform;
 
13
  use Nextend\Framework\Url\Url;
14
  use Nextend\Framework\View\Html;
15
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
16
- use WP_HTTP_Proxy;
17
 
18
  class Api {
19
 
@@ -37,96 +37,22 @@ class Api {
37
  if ($returnUrl) {
38
  return $api . '?' . http_build_query($posts, '', '&');
39
  }
40
-
41
- if (!isset($data)) {
42
- if (function_exists('curl_init') && function_exists('curl_exec') && Settings::get('curl', 1)) {
43
- $ch = curl_init();
44
- curl_setopt($ch, CURLOPT_URL, $api);
45
-
46
- curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($posts, '', '&'));
47
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
48
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
49
- curl_setopt($ch, CURLOPT_TIMEOUT, 30);
50
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
51
- curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
52
- $proxy = new WP_HTTP_Proxy();
53
-
54
- if ($proxy->is_enabled() && $proxy->send_through_proxy($api)) {
55
-
56
- curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
57
-
58
- curl_setopt($ch, CURLOPT_PROXY, $proxy->host());
59
-
60
- curl_setopt($ch, CURLOPT_PROXYPORT, $proxy->port());
61
-
62
-
63
- if ($proxy->use_authentication()) {
64
-
65
- curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
66
-
67
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy->authentication());
68
- }
69
- }
70
-
71
-
72
- if (Settings::get('curl-clean-proxy', 0)) {
73
- curl_setopt($ch, CURLOPT_PROXY, '');
74
- }
75
- $data = curl_exec($ch);
76
- $errorNumber = curl_errno($ch);
77
- if ($errorNumber == 60 || $errorNumber == 77) {
78
- curl_setopt($ch, CURLOPT_CAINFO, HttpClient::getCacertPath());
79
- $data = curl_exec($ch);
80
- }
81
- $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
82
- $error = curl_error($ch);
83
- $curlErrorNumber = curl_errno($ch);
84
- curl_close($ch);
85
-
86
- if ($curlErrorNumber) {
87
- $href = ApplicationSmartSlider3::getInstance()
88
- ->getApplicationTypeAdmin()
89
- ->getUrlHelpCurl();
90
- Notification::error(Html::tag('a', array(
91
- 'href' => $href . '#support-form'
92
- ), n2_('Debug error')));
93
-
94
- Notification::error($curlErrorNumber . $error);
95
-
96
- return array(
97
- 'status' => 'ERROR_HANDLED'
98
- );
99
- }
100
- } else {
101
- $opts = array(
102
- 'http' => array(
103
- 'method' => 'POST',
104
- 'header' => 'Content-type: application/x-www-form-urlencoded',
105
- 'content' => http_build_query($posts, '', '&')
106
- )
107
- );
108
- $context = stream_context_create($opts);
109
- $data = file_get_contents($api, false, $context);
110
- if ($data === false) {
111
- Notification::error(n2_('CURL disabled in your php.ini configuration. Please enable it!'));
112
-
113
- return array(
114
- 'status' => 'ERROR_HANDLED'
115
- );
116
- }
117
- $headers = self::parseHeaders($http_response_header);
118
- if ($headers['status'] != '200') {
119
- Notification::error(n2_('Unable to contact with the licensing server, please try again later!'));
120
-
121
- return array(
122
- 'status' => 'ERROR_HANDLED'
123
- );
124
- }
125
- if (isset($headers['content-type'])) {
126
- $contentType = $headers['content-type'];
127
- }
128
  }
 
 
 
 
 
 
129
  }
 
130
 
131
  switch ($contentType) {
132
  case 'text/html; charset=UTF-8':
10
  use Nextend\Framework\Misc\HttpClient;
11
  use Nextend\Framework\Notification\Notification;
12
  use Nextend\Framework\Platform\Platform;
13
+ use Nextend\Framework\Request\Request;
14
  use Nextend\Framework\Url\Url;
15
  use Nextend\Framework\View\Html;
16
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
 
17
 
18
  class Api {
19
 
37
  if ($returnUrl) {
38
  return $api . '?' . http_build_query($posts, '', '&');
39
  }
40
+ $request = wp_remote_post($api, array(
41
+ 'timeout' => 20,
42
+ 'body' => $posts
43
+ ));
44
+ if (is_wp_error($request)) {
45
+ foreach ($request->get_error_messages() as $errorMessage) {
46
+ Notification::error($errorMessage);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
+
49
+ return null;
50
+ } else {
51
+ $data = wp_remote_retrieve_body($request);
52
+ $headers = wp_remote_retrieve_headers($request);
53
+ $contentType = $headers['content-type'];
54
  }
55
+
56
 
57
  switch ($contentType) {
58
  case 'text/html; charset=UTF-8':
Nextend/Framework/Asset/AssetManager.php CHANGED
@@ -155,6 +155,11 @@ class AssetManager {
155
  self::$image->unSerialize($array['image']);
156
  }
157
 
 
 
 
 
 
158
  public static function getCSS($path = false) {
159
  if (self::$css) {
160
  if ($path) {
@@ -167,6 +172,11 @@ class AssetManager {
167
  return '';
168
  }
169
 
 
 
 
 
 
170
  public static function getJs($path = false) {
171
  if (self::$js) {
172
  if ($path) {
155
  self::$image->unSerialize($array['image']);
156
  }
157
 
158
+ /**
159
+ * @param $path
160
+ *
161
+ * @return array|string contains already escaped data
162
+ */
163
  public static function getCSS($path = false) {
164
  if (self::$css) {
165
  if ($path) {
172
  return '';
173
  }
174
 
175
+ /**
176
+ * @param $path
177
+ *
178
+ * @return array|string contains already escaped data
179
+ */
180
  public static function getJs($path = false) {
181
  if (self::$js) {
182
  if ($path) {
Nextend/Framework/Asset/Css/Less/LessCompiler.php CHANGED
@@ -1482,7 +1482,7 @@ class LessCompiler {
1482
  $width = strlen($colorStr) == 3 ? 16 : 256;
1483
 
1484
  for ($i = 3; $i > 0; $i--) { // 3 2 1
1485
- $t = $num % $width;
1486
  $num /= $width;
1487
 
1488
  $c[$i] = $t * (256 / $width) + $t * floor(16 / $width);
1482
  $width = strlen($colorStr) == 3 ? 16 : 256;
1483
 
1484
  for ($i = 3; $i > 0; $i--) { // 3 2 1
1485
+ $t = fmod($num, $width);
1486
  $num /= $width;
1487
 
1488
  $c[$i] = $t * (256 / $width) + $t * floor(16 / $width);
Nextend/Framework/Browse/BulletProof/BulletProof.php CHANGED
@@ -4,6 +4,7 @@ namespace Nextend\Framework\Browse\BulletProof;
4
 
5
  use Nextend\Framework\Filesystem\Filesystem;
6
  use Nextend\Framework\Image\ImageEdit;
 
7
 
8
  /**
9
  * BULLETPROOF,
@@ -272,17 +273,19 @@ class BulletProof {
272
  if (function_exists("mime_content_type")) {
273
  $rawMime = mime_content_type($fileToUpload["tmp_name"]);
274
  } else {
275
- $path_parts = pathinfo($_FILES["image"]["name"]);
276
- switch ($path_parts['extension']) {
277
- case 'mp4':
278
- $rawMime = 'video/mp4';
279
- break;
280
- case 'mp3':
281
- $rawMime = 'audio/mpeg';
282
- break;
283
- default:
284
- $rawMime = '';
285
- break;
 
 
286
  }
287
  }
288
 
4
 
5
  use Nextend\Framework\Filesystem\Filesystem;
6
  use Nextend\Framework\Image\ImageEdit;
7
+ use Nextend\Framework\Request\Request;
8
 
9
  /**
10
  * BULLETPROOF,
273
  if (function_exists("mime_content_type")) {
274
  $rawMime = mime_content_type($fileToUpload["tmp_name"]);
275
  } else {
276
+ if (!empty($fileToUpload['name'])) {
277
+ $path_parts = pathinfo($fileToUpload['name']);
278
+ switch ($path_parts['extension']) {
279
+ case 'mp4':
280
+ $rawMime = 'video/mp4';
281
+ break;
282
+ case 'mp3':
283
+ $rawMime = 'audio/mpeg';
284
+ break;
285
+ default:
286
+ $rawMime = '';
287
+ break;
288
+ }
289
  }
290
  }
291
 
Nextend/Framework/Browse/ControllerAjaxBrowse.php CHANGED
@@ -110,8 +110,9 @@ class ControllerAjaxBrowse extends AdminAjaxController {
110
  'path' => $relativePath
111
  );
112
  try {
113
- if (isset($_FILES) && isset($_FILES['image']) && isset($_FILES['image']['name'])) {
114
- $info = pathinfo($_FILES['image']['name']);
 
115
  $fileName = preg_replace('/[^a-zA-Z0-9_-]/', '', $info['filename']);
116
  if (strlen($fileName) == 0) {
117
  $fileName = '';
@@ -119,7 +120,7 @@ class ControllerAjaxBrowse extends AdminAjaxController {
119
 
120
  $upload = new BulletProof();
121
  $file = $upload->uploadDir($path)
122
- ->upload($_FILES['image'], $fileName);
123
  $response['name'] = basename($file);
124
  $response['url'] = ResourceTranslator::urlToResource(Filesystem::pathToAbsoluteURL($file));
125
 
110
  'path' => $relativePath
111
  );
112
  try {
113
+ $image = Request::$FILES->getVar('image');
114
+ if ($image['name'] !== null) {
115
+ $info = pathinfo($image['name']);
116
  $fileName = preg_replace('/[^a-zA-Z0-9_-]/', '', $info['filename']);
117
  if (strlen($fileName) == 0) {
118
  $fileName = '';
120
 
121
  $upload = new BulletProof();
122
  $file = $upload->uploadDir($path)
123
+ ->upload($image, $fileName);
124
  $response['name'] = basename($file);
125
  $response['url'] = ResourceTranslator::urlToResource(Filesystem::pathToAbsoluteURL($file));
126
 
Nextend/Framework/Data/Data.php CHANGED
@@ -25,8 +25,10 @@ class Data {
25
  * @param $json
26
  */
27
  public function loadJSON($json) {
28
- $array = json_decode($json, true);
29
- if (is_array($array)) $this->_data = array_merge($this->_data, $array);
 
 
30
  }
31
 
32
  /**
25
  * @param $json
26
  */
27
  public function loadJSON($json) {
28
+ if ($json !== null) {
29
+ $array = json_decode($json, true);
30
+ if (is_array($array)) $this->_data = array_merge($this->_data, $array);
31
+ }
32
  }
33
 
34
  /**
Nextend/Framework/Filesystem/AbstractPlatformFilesystem.php CHANGED
@@ -48,10 +48,10 @@ abstract class AbstractPlatformFilesystem {
48
  if ($this->is_writable($base)) {
49
  $this->createFolder($cacheFolder);
50
  } else {
51
- die('<div style="position:fixed;background:#fff;width:100%;height:100%;top:0;left:0;z-index:100000;">' . sprintf('<h2><b>%s</b> is not writable.</h2>', $base) . '</div>');
52
  }
53
  } else if (!$this->is_writable($cacheFolder)) {
54
- die('<div style="position:fixed;background:#fff;width:100%;height:100%;top:0;left:0;z-index:100000;">' . sprintf('<h2><b>%s</b> is not writable.</h2>', $cacheFolder) . '</div>');
55
  }
56
  $checked[$base . '/' . $folder] = true;
57
  }
48
  if ($this->is_writable($base)) {
49
  $this->createFolder($cacheFolder);
50
  } else {
51
+ die('<div style="position:fixed;background:#fff;width:100%;height:100%;top:0;left:0;z-index:100000;">' . sprintf('<h2><b>%s</b> is not writable.</h2>', esc_html($base)) . '</div>');
52
  }
53
  } else if (!$this->is_writable($cacheFolder)) {
54
+ die('<div style="position:fixed;background:#fff;width:100%;height:100%;top:0;left:0;z-index:100000;">' . sprintf('<h2><b>%s</b> is not writable.</h2>', esc_html($cacheFolder)) . '</div>');
55
  }
56
  $checked[$base . '/' . $folder] = true;
57
  }
Nextend/Framework/Filesystem/WordPress/WordPressFilesystem.php CHANGED
@@ -31,7 +31,7 @@ class WordPressFilesystem extends AbstractPlatformFilesystem {
31
  } else {
32
  $uploadPath = rtrim(realpath($wp_upload_dir['basedir']), "/\\");
33
  if (empty($uploadPath)) {
34
- echo 'Error: Your upload path is not valid or does not exist: ' . $wp_upload_dir['basedir'];
35
  $uploadPath = rtrim($wp_upload_dir['basedir'], "/\\");
36
  } else {
37
  $this->measurePermission($uploadPath);
31
  } else {
32
  $uploadPath = rtrim(realpath($wp_upload_dir['basedir']), "/\\");
33
  if (empty($uploadPath)) {
34
+ echo 'Error: Your upload path is not valid or does not exist: ' . esc_html($wp_upload_dir['basedir']);
35
  $uploadPath = rtrim($wp_upload_dir['basedir'], "/\\");
36
  } else {
37
  $this->measurePermission($uploadPath);
Nextend/Framework/Form/AbstractField.php CHANGED
@@ -6,6 +6,7 @@ namespace Nextend\Framework\Form;
6
 
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Form\Insert\AbstractInsert;
 
9
  use Nextend\Framework\View\Html;
10
 
11
  abstract class AbstractField implements ContainedInterface {
@@ -201,13 +202,11 @@ abstract class AbstractField implements ContainedInterface {
201
  }
202
 
203
  public function displayLabel() {
204
-
205
- echo $this->fetchTooltip();
206
  }
207
 
208
  public function displayElement() {
209
-
210
- echo $this->fetchElement();
211
  }
212
 
213
  protected function fetchTooltip() {
6
 
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Form\Insert\AbstractInsert;
9
+ use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\View\Html;
11
 
12
  abstract class AbstractField implements ContainedInterface {
202
  }
203
 
204
  public function displayLabel() {
205
+ echo wp_kses($this->fetchTooltip(), Sanitize::$adminFormTags);
 
206
  }
207
 
208
  public function displayElement() {
209
+ echo wp_kses($this->fetchElement(), Sanitize::$adminFormTags);
 
210
  }
211
 
212
  protected function fetchTooltip() {
Nextend/Framework/Form/Container/ContainerRowGroup.php CHANGED
@@ -10,14 +10,14 @@ use Nextend\Framework\Form\Fieldset\FieldsetRow;
10
  class ContainerRowGroup extends ContainerGeneral {
11
 
12
  public function renderContainer() {
13
- echo '<div class="n2_form__table_row_group" data-field="table-row-group-' . $this->name . '">';
14
  if ($this->label !== false) {
15
  echo '<div class="n2_form__table_row_group_label">';
16
- echo $this->label;
17
  echo '</div>';
18
  }
19
 
20
- echo '<div class="n2_form__table_row_group_rows" data-field="table-row-group-rows-' . $this->name . '">';
21
  parent::renderContainer();
22
  echo '</div>';
23
  echo '</div>';
10
  class ContainerRowGroup extends ContainerGeneral {
11
 
12
  public function renderContainer() {
13
+ echo '<div class="n2_form__table_row_group" data-field="table-row-group-' . esc_attr($this->name) . '">';
14
  if ($this->label !== false) {
15
  echo '<div class="n2_form__table_row_group_label">';
16
+ echo esc_html($this->label);
17
  echo '</div>';
18
  }
19
 
20
+ echo '<div class="n2_form__table_row_group_rows" data-field="table-row-group-rows-' . esc_attr($this->name) . '">';
21
  parent::renderContainer();
22
  echo '</div>';
23
  echo '</div>';
Nextend/Framework/Form/Container/ContainerSubform.php CHANGED
@@ -9,7 +9,7 @@ use Nextend\Framework\Form\ContainerGeneral;
9
  class ContainerSubform extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
- echo '<div id="' . $this->getId() . '" class="n2_form__subform">';
13
  parent::renderContainer();
14
  echo '</div>';
15
  }
9
  class ContainerSubform extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
+ echo '<div id="' . esc_attr($this->getId()) . '" class="n2_form__subform">';
13
  parent::renderContainer();
14
  echo '</div>';
15
  }
Nextend/Framework/Form/Container/ContainerTab.php CHANGED
@@ -9,8 +9,8 @@ use Nextend\Framework\Form\ContainerGeneral;
9
  class ContainerTab extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
- echo '<div class="n2_form__tab" data-related-form="' . $this->getForm()
13
- ->getId() . '" data-tab="' . $this->getId() . '">';
14
  parent::renderContainer();
15
  echo '</div>';
16
  }
9
  class ContainerTab extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
+ echo '<div class="n2_form__tab" data-related-form="' . esc_attr($this->getForm()
13
+ ->getId()) . '" data-tab="' . esc_attr($this->getId()) . '">';
14
  parent::renderContainer();
15
  echo '</div>';
16
  }
Nextend/Framework/Form/Container/ContainerTable.php CHANGED
@@ -24,20 +24,20 @@ class ContainerTable extends ContainerGeneral {
24
  }
25
 
26
  public function renderContainer() {
27
- echo '<div class="n2_form__table" data-field="table-' . $this->name . '">';
28
  echo '<div class="n2_form__table_label">';
29
  echo '<div class="n2_form__table_label_title">';
30
- echo $this->label;
31
  echo '</div>';
32
  if ($this->fieldsetLabel->hasFields()) {
33
- echo '<div class="n2_form__table_label_fields n2_form__table_label_fields--' . $this->fieldsetLabelPosition . '">';
34
  $this->fieldsetLabel->renderContainer();
35
  echo '</div>';
36
  }
37
  echo '</div>';
38
 
39
  if ($this->first) {
40
- echo '<div class="n2_form__table_rows" data-field="table-rows-' . $this->name . '">';
41
  parent::renderContainer();
42
  echo '</div>';
43
  }
24
  }
25
 
26
  public function renderContainer() {
27
+ echo '<div class="n2_form__table" data-field="table-' . esc_attr($this->name) . '">';
28
  echo '<div class="n2_form__table_label">';
29
  echo '<div class="n2_form__table_label_title">';
30
+ echo esc_html($this->label);
31
  echo '</div>';
32
  if ($this->fieldsetLabel->hasFields()) {
33
+ echo '<div class="n2_form__table_label_fields n2_form__table_label_fields--' . esc_attr($this->fieldsetLabelPosition) . '">';
34
  $this->fieldsetLabel->renderContainer();
35
  echo '</div>';
36
  }
37
  echo '</div>';
38
 
39
  if ($this->first) {
40
+ echo '<div class="n2_form__table_rows" data-field="table-rows-' . esc_attr($this->name) . '">';
41
  parent::renderContainer();
42
  echo '</div>';
43
  }
Nextend/Framework/Form/Container/LayerWindow/ContainerAnimation.php CHANGED
@@ -19,14 +19,14 @@ class ContainerAnimation extends ContainerGeneral {
19
  }
20
 
21
  public function renderContainer() {
22
- echo '<div class="n2_container_animation" data-field="animation-' . $this->name . '">';
23
  echo '<div class="n2_container_animation__buttons">';
24
 
25
  $element = $this->first;
26
  while ($element) {
27
 
28
  if ($element instanceof ContainerAnimationTab) {
29
- echo '<div class="n2_container_animation__button" data-related-tab="' . $element->getName() . '">' . $element->getLabel() . '</div>';
30
  }
31
 
32
  $element = $element->getNext();
19
  }
20
 
21
  public function renderContainer() {
22
+ echo '<div class="n2_container_animation" data-field="animation-' . esc_attr($this->name) . '">';
23
  echo '<div class="n2_container_animation__buttons">';
24
 
25
  $element = $this->first;
26
  while ($element) {
27
 
28
  if ($element instanceof ContainerAnimationTab) {
29
+ echo '<div class="n2_container_animation__button" data-related-tab="' . esc_attr($element->getName()) . '">' . esc_html($element->getLabel()) . '</div>';
30
  }
31
 
32
  $element = $element->getNext();
Nextend/Framework/Form/Container/LayerWindow/ContainerAnimationTab.php CHANGED
@@ -9,7 +9,7 @@ use Nextend\Framework\Form\ContainerGeneral;
9
  class ContainerAnimationTab extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
- echo '<div class="n2_container_animation__tab" data-tab="' . $this->name . '">';
13
  parent::renderContainer();
14
  echo '</div>';
15
  }
9
  class ContainerAnimationTab extends ContainerGeneral {
10
 
11
  public function renderContainer() {
12
+ echo '<div class="n2_container_animation__tab" data-tab="' . esc_attr($this->name) . '">';
13
  parent::renderContainer();
14
  echo '</div>';
15
  }
Nextend/Framework/Form/Container/LayerWindow/ContainerDesign.php CHANGED
@@ -7,6 +7,7 @@ namespace Nextend\Framework\Form\Container\LayerWindow;
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Form\ContainerGeneral;
9
  use Nextend\Framework\Form\ContainerInterface;
 
10
  use Nextend\Framework\View\Html;
11
 
12
  class ContainerDesign extends ContainerGeneral {
@@ -19,10 +20,10 @@ class ContainerDesign extends ContainerGeneral {
19
 
20
  $id = 'n2_css_' . $this->name;
21
 
22
- echo Html::openTag('div', array(
23
  'id' => $id,
24
  'class' => 'n2_ss_design_' . $this->name
25
- ));
26
 
27
  $element = $this->first;
28
  while ($element) {
@@ -30,7 +31,7 @@ class ContainerDesign extends ContainerGeneral {
30
  $element = $element->getNext();
31
  }
32
 
33
- echo Html::closeTag('div');
34
 
35
  $options = array(
36
  'ajaxUrl' => $this->getForm()
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Form\ContainerGeneral;
9
  use Nextend\Framework\Form\ContainerInterface;
10
+ use Nextend\Framework\Sanitize;
11
  use Nextend\Framework\View\Html;
12
 
13
  class ContainerDesign extends ContainerGeneral {
20
 
21
  $id = 'n2_css_' . $this->name;
22
 
23
+ echo wp_kses(Html::openTag('div', array(
24
  'id' => $id,
25
  'class' => 'n2_ss_design_' . $this->name
26
+ )), Sanitize::$adminFormTags);
27
 
28
  $element = $this->first;
29
  while ($element) {
31
  $element = $element->getNext();
32
  }
33
 
34
+ echo wp_kses(Html::closeTag('div'), Sanitize::$basicTags);
35
 
36
  $options = array(
37
  'ajaxUrl' => $this->getForm()
Nextend/Framework/Form/Container/LayerWindow/ContainerSettings.php CHANGED
@@ -14,7 +14,7 @@ class ContainerSettings extends ContainerGeneral {
14
  }
15
 
16
  public function renderContainer() {
17
- echo '<div class="n2_ss_layer_window__tab_panel" data-panel="' . $this->name . '">';
18
  parent::renderContainer();
19
  echo '</div>';
20
  }
14
  }
15
 
16
  public function renderContainer() {
17
+ echo '<div class="n2_ss_layer_window__tab_panel" data-panel="' . esc_attr($this->name) . '">';
18
  parent::renderContainer();
19
  echo '</div>';
20
  }
Nextend/Framework/Form/Element/Message.php CHANGED
@@ -18,6 +18,6 @@ abstract class Message extends AbstractField {
18
  }
19
 
20
  protected function fetchElement() {
21
- echo '<div class="' . implode(' ', $this->classes) . '">' . $this->description . '</div>';
22
  }
23
  }
18
  }
19
 
20
  protected function fetchElement() {
21
+ return '<div class="' . implode(' ', $this->classes) . '">' . $this->description . '</div>';
22
  }
23
  }
Nextend/Framework/Form/Element/Message/Warning.php CHANGED
@@ -15,6 +15,6 @@ class Warning extends Message {
15
  }
16
 
17
  protected function fetchElement() {
18
- echo '<div class="' . implode(' ', $this->classes) . '">' . $this->description . '</div>';
19
  }
20
  }
15
  }
16
 
17
  protected function fetchElement() {
18
+ return '<div class="' . implode(' ', $this->classes) . '">' . $this->description . '</div>';
19
  }
20
  }
Nextend/Framework/Form/Element/Text.php CHANGED
@@ -33,8 +33,7 @@ class Text extends AbstractField implements ContainerInterface {
33
  }
34
 
35
  $html = Html::openTag('div', array(
36
- 'class' => 'n2_field_text ' . $this->getClass(),
37
- 'style' => ($this->fieldType == 'hidden' ? 'display: none;' : '')
38
  ));
39
 
40
  $html .= $this->pre();
33
  }
34
 
35
  $html = Html::openTag('div', array(
36
+ 'class' => 'n2_field_text ' . $this->getClass()
 
37
  ));
38
 
39
  $html .= $this->pre();
Nextend/Framework/Form/Element/Text/FieldImage.php CHANGED
@@ -51,7 +51,7 @@ class FieldImage extends AbstractChooserText {
51
  return '';
52
  }
53
 
54
- return 'background-image:URL(' . Sanitize::esc_attr(ResourceTranslator::toUrl($image)) . ');';
55
  }
56
 
57
  /**
51
  return '';
52
  }
53
 
54
+ return 'background-image: url(' . esc_url(ResourceTranslator::toUrl($image)) . ');';
55
  }
56
 
57
  /**
Nextend/Framework/Form/Element/Text/Number.php CHANGED
@@ -31,8 +31,7 @@ class Number extends Text {
31
  $this->renderRelatedFields();
32
 
33
  $html = Html::openTag('div', array(
34
- 'class' => 'n2_field_text ' . $this->getClass(),
35
- 'style' => ($this->fieldType == 'hidden' ? 'display: none;' : '')
36
  ));
37
 
38
  if (!empty($this->sublabel)) {
31
  $this->renderRelatedFields();
32
 
33
  $html = Html::openTag('div', array(
34
+ 'class' => 'n2_field_text ' . $this->getClass()
 
35
  ));
36
 
37
  if (!empty($this->sublabel)) {
Nextend/Framework/Form/Element/Textarea.php CHANGED
@@ -17,8 +17,6 @@ class Textarea extends AbstractField {
17
 
18
  protected $minHeight = 44;
19
 
20
- protected $resize = 'vertical';
21
-
22
  protected $classes = array(
23
  'n2_field_textarea'
24
  );
@@ -34,7 +32,7 @@ class Textarea extends AbstractField {
34
  'id' => $this->fieldID,
35
  'name' => $this->getFieldName(),
36
  'autocomplete' => 'off',
37
- 'style' => 'width:' . $this->width . 'px;height:' . $this->height . 'px;min-height:' . $this->minHeight . 'px;resize:' . $this->resize . ';'
38
  ), Sanitize::esc_textarea($this->getValue())));
39
  }
40
 
@@ -62,13 +60,6 @@ class Textarea extends AbstractField {
62
  $this->minHeight = $minHeight;
63
  }
64
 
65
- /**
66
- * @param string $resize
67
- */
68
- public function setResize($resize) {
69
- $this->resize = $resize;
70
- }
71
-
72
  public function setFieldStyle($style) {
73
 
74
  }
17
 
18
  protected $minHeight = 44;
19
 
 
 
20
  protected $classes = array(
21
  'n2_field_textarea'
22
  );
32
  'id' => $this->fieldID,
33
  'name' => $this->getFieldName(),
34
  'autocomplete' => 'off',
35
+ 'style' => 'width:' . $this->width . 'px;height:' . $this->height . 'px;min-height:' . $this->minHeight . 'px;'
36
  ), Sanitize::esc_textarea($this->getValue())));
37
  }
38
 
60
  $this->minHeight = $minHeight;
61
  }
62
 
 
 
 
 
 
 
 
63
  public function setFieldStyle($style) {
64
 
65
  }
Nextend/Framework/Form/Fieldset/FieldsetHidden.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\Framework\Form\Fieldset;
5
 
6
  use Nextend\Framework\Form\AbstractFieldset;
 
7
 
8
  class FieldsetHidden extends AbstractFieldset {
9
 
@@ -19,7 +20,7 @@ class FieldsetHidden extends AbstractFieldset {
19
 
20
  $element = $this->first;
21
  while ($element) {
22
- echo $this->decorateElement($element);
23
 
24
  $element = $element->getNext();
25
  }
4
  namespace Nextend\Framework\Form\Fieldset;
5
 
6
  use Nextend\Framework\Form\AbstractFieldset;
7
+ use Nextend\Framework\Sanitize;
8
 
9
  class FieldsetHidden extends AbstractFieldset {
10
 
20
 
21
  $element = $this->first;
22
  while ($element) {
23
+ echo wp_kses($this->decorateElement($element), Sanitize::$adminFormTags);
24
 
25
  $element = $element->getNext();
26
  }
Nextend/Framework/Form/Fieldset/FieldsetRow.php CHANGED
@@ -6,6 +6,7 @@ namespace Nextend\Framework\Form\Fieldset;
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
 
9
  use Nextend\Framework\View\Html;
10
 
11
  class FieldsetRow extends AbstractFieldset {
@@ -21,14 +22,14 @@ class FieldsetRow extends AbstractFieldset {
21
  $classes[] = 'n2_form__table_row--hidden';
22
  }
23
 
24
- echo Html::openTag('div', array(
25
  'class' => implode(' ', $classes),
26
  'data-field' => 'table-row-' . $this->name
27
- ));
28
 
29
  $element = $this->first;
30
  while ($element) {
31
- echo $this->decorateElement($element);
32
 
33
  $element = $element->getNext();
34
  }
@@ -52,10 +53,10 @@ class FieldsetRow extends AbstractFieldset {
52
  $element->getRowClass()
53
  );
54
 
55
- echo Html::openTag('div', array(
56
  'class' => implode(' ', array_filter($classes)),
57
  'data-field' => $element->getID()
58
- ) + $element->getRowAttributes());
59
 
60
  if ($hasLabel) {
61
  echo "<div class='n2_field__label'>";
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
9
+ use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\View\Html;
11
 
12
  class FieldsetRow extends AbstractFieldset {
22
  $classes[] = 'n2_form__table_row--hidden';
23
  }
24
 
25
+ echo wp_kses(Html::openTag('div', array(
26
  'class' => implode(' ', $classes),
27
  'data-field' => 'table-row-' . $this->name
28
+ )), Sanitize::$adminFormTags);
29
 
30
  $element = $this->first;
31
  while ($element) {
32
+ echo wp_kses($this->decorateElement($element), Sanitize::$adminFormTags);
33
 
34
  $element = $element->getNext();
35
  }
53
  $element->getRowClass()
54
  );
55
 
56
+ echo wp_kses(Html::openTag('div', array(
57
  'class' => implode(' ', array_filter($classes)),
58
  'data-field' => $element->getID()
59
+ ) + $element->getRowAttributes()), Sanitize::$adminFormTags);
60
 
61
  if ($hasLabel) {
62
  echo "<div class='n2_field__label'>";
Nextend/Framework/Form/Fieldset/FieldsetRowPlain.php CHANGED
@@ -5,15 +5,16 @@ namespace Nextend\Framework\Form\Fieldset;
5
 
6
 
7
  use Nextend\Framework\Form\AbstractField;
 
8
 
9
  class FieldsetRowPlain extends FieldsetRow {
10
 
11
  public function renderContainer() {
12
- echo '<div class="n2_form__table_row_plain" data-field="table-row-plain-' . $this->name . '">';
13
 
14
  $element = $this->first;
15
  while ($element) {
16
- echo $this->decorateElement($element);
17
 
18
  $element = $element->getNext();
19
  }
5
 
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
+ use Nextend\Framework\Sanitize;
9
 
10
  class FieldsetRowPlain extends FieldsetRow {
11
 
12
  public function renderContainer() {
13
+ echo '<div class="n2_form__table_row_plain" data-field="table-row-plain-' . esc_attr($this->name) . '">';
14
 
15
  $element = $this->first;
16
  while ($element) {
17
+ echo wp_kses($this->decorateElement($element), Sanitize::$adminFormTags);
18
 
19
  $element = $element->getNext();
20
  }
Nextend/Framework/Form/Fieldset/FieldsetTableLabel.php CHANGED
@@ -5,6 +5,7 @@ namespace Nextend\Framework\Form\Fieldset;
5
 
6
 
7
  use Nextend\Framework\Form\AbstractFieldset;
 
8
  use Nextend\Framework\View\Html;
9
 
10
  class FieldsetTableLabel extends AbstractFieldset {
@@ -14,12 +15,10 @@ class FieldsetTableLabel extends AbstractFieldset {
14
  $element = $this->first;
15
  while ($element) {
16
 
17
- echo Html::openTag('div', array(
18
- 'class' => 'n2_form__table_label_field ' . $element->getRowClass(),
19
- 'data-field' => $element->getID()
20
- ) + $element->getRowAttributes());
21
- echo $this->decorateElement($element);
22
- echo "</div>";
23
 
24
  $element = $element->getNext();
25
  }
5
 
6
 
7
  use Nextend\Framework\Form\AbstractFieldset;
8
+ use Nextend\Framework\Sanitize;
9
  use Nextend\Framework\View\Html;
10
 
11
  class FieldsetTableLabel extends AbstractFieldset {
15
  $element = $this->first;
16
  while ($element) {
17
 
18
+ echo wp_kses(Html::openTag('div', array(
19
+ 'class' => 'n2_form__table_label_field ' . $element->getRowClass(),
20
+ 'data-field' => $element->getID()
21
+ ) + $element->getRowAttributes()) . $this->decorateElement($element) . "</div>", Sanitize::$adminFormTags);
 
 
22
 
23
  $element = $element->getNext();
24
  }
Nextend/Framework/Form/Fieldset/FieldsetVisualSet.php CHANGED
@@ -6,18 +6,19 @@ namespace Nextend\Framework\Form\Fieldset;
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
 
9
  use Nextend\Framework\View\Html;
10
 
11
  class FieldsetVisualSet extends AbstractFieldset {
12
 
13
  public function renderContainer() {
14
- echo '<div class="n2_form__visual_set" data-field="visual-set-' . $this->name . '">';
15
 
16
- echo "<div class='n2_form__visual_set_label'>" . $this->label . '</div>';
17
 
18
  $element = $this->first;
19
  while ($element) {
20
- echo $this->decorateElement($element);
21
 
22
  $element = $element->getNext();
23
  }
@@ -38,10 +39,10 @@ class FieldsetVisualSet extends AbstractFieldset {
38
  $element->getRowClass()
39
  );
40
 
41
- echo Html::openTag('div', array(
42
  'class' => implode(' ', array_filter($classes)),
43
  'data-field' => $element->getID()
44
- ) + $element->getRowAttributes());
45
 
46
  $element->displayElement();
47
 
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
9
+ use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\View\Html;
11
 
12
  class FieldsetVisualSet extends AbstractFieldset {
13
 
14
  public function renderContainer() {
15
+ echo '<div class="n2_form__visual_set" data-field="visual-set-' . esc_attr($this->name) . '">';
16
 
17
+ echo "<div class='n2_form__visual_set_label'>" . esc_html($this->label) . '</div>';
18
 
19
  $element = $this->first;
20
  while ($element) {
21
+ echo wp_kses($this->decorateElement($element), Sanitize::$adminFormTags);
22
 
23
  $element = $element->getNext();
24
  }
39
  $element->getRowClass()
40
  );
41
 
42
+ echo wp_kses(Html::openTag('div', array(
43
  'class' => implode(' ', array_filter($classes)),
44
  'data-field' => $element->getID()
45
+ ) + $element->getRowAttributes()), Sanitize::$adminFormTags);
46
 
47
  $element->displayElement();
48
 
Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetDesign.php CHANGED
@@ -32,7 +32,7 @@ class FieldsetDesign extends FieldsetLayerWindowLabelFields {
32
 
33
  protected function renderTitle() {
34
 
35
- echo '<div class="n2_fields_layer_window__label">' . $this->label . '</div>';
36
 
37
  if ($this->fieldsetLabel->hasFields()) {
38
  echo '<div class="n2_fields_layer_window__title_fields">';
32
 
33
  protected function renderTitle() {
34
 
35
+ echo '<div class="n2_fields_layer_window__label">' . esc_html($this->label) . '</div>';
36
 
37
  if ($this->fieldsetLabel->hasFields()) {
38
  echo '<div class="n2_fields_layer_window__title_fields">';
Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetInsideLabel.php CHANGED
@@ -5,6 +5,7 @@ namespace Nextend\Framework\Form\Fieldset\LayerWindow;
5
 
6
 
7
  use Nextend\Framework\Form\AbstractFieldset;
 
8
  use Nextend\Framework\View\Html;
9
 
10
  class FieldsetInsideLabel extends AbstractFieldset {
@@ -14,10 +15,10 @@ class FieldsetInsideLabel extends AbstractFieldset {
14
  $element = $this->first;
15
  while ($element) {
16
 
17
- echo Html::openTag('div', array(
18
  'class' => 'n2_form__table_label_field ' . $element->getRowClass(),
19
  'data-field' => $element->getID()
20
- ) + $element->getRowAttributes());
21
  $element->displayElement();
22
  echo "</div>";
23
 
5
 
6
 
7
  use Nextend\Framework\Form\AbstractFieldset;
8
+ use Nextend\Framework\Sanitize;
9
  use Nextend\Framework\View\Html;
10
 
11
  class FieldsetInsideLabel extends AbstractFieldset {
15
  $element = $this->first;
16
  while ($element) {
17
 
18
+ echo wp_kses(Html::openTag('div', array(
19
  'class' => 'n2_form__table_label_field ' . $element->getRowClass(),
20
  'data-field' => $element->getID()
21
+ ) + $element->getRowAttributes()), Sanitize::$adminFormTags);
22
  $element->displayElement();
23
  echo "</div>";
24
 
Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetLayerWindow.php CHANGED
@@ -6,6 +6,7 @@ namespace Nextend\Framework\Form\Fieldset\LayerWindow;
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
 
9
  use Nextend\Framework\View\Html;
10
 
11
  class FieldsetLayerWindow extends AbstractFieldset {
@@ -14,10 +15,10 @@ class FieldsetLayerWindow extends AbstractFieldset {
14
 
15
  public function renderContainer() {
16
 
17
- echo Html::openTag('div', array(
18
  'class' => 'n2_fields_layer_window',
19
  'data-field' => 'fieldset-layer-window-' . $this->name
20
- ) + $this->attributes);
21
 
22
  if (!empty($this->label)) {
23
  echo '<div class="n2_fields_layer_window__title">';
@@ -29,7 +30,7 @@ class FieldsetLayerWindow extends AbstractFieldset {
29
 
30
  $element = $this->first;
31
  while ($element) {
32
- echo $this->decorateElement($element);
33
 
34
  $element = $element->getNext();
35
  }
@@ -40,7 +41,7 @@ class FieldsetLayerWindow extends AbstractFieldset {
40
 
41
  protected function renderTitle() {
42
 
43
- echo '<div class="n2_fields_layer_window__label">' . $this->label . '</div>';
44
  }
45
 
46
  /**
@@ -60,10 +61,10 @@ class FieldsetLayerWindow extends AbstractFieldset {
60
  $element->getRowClass()
61
  );
62
 
63
- echo Html::openTag('div', array(
64
  'class' => implode(' ', array_filter($classes)),
65
  'data-field' => $element->getID()
66
- ) + $element->getRowAttributes());
67
 
68
  if ($hasLabel) {
69
  echo "<div class='n2_field__label'>";
6
 
7
  use Nextend\Framework\Form\AbstractField;
8
  use Nextend\Framework\Form\AbstractFieldset;
9
+ use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\View\Html;
11
 
12
  class FieldsetLayerWindow extends AbstractFieldset {
15
 
16
  public function renderContainer() {
17
 
18
+ echo wp_kses(Html::openTag('div', array(
19
  'class' => 'n2_fields_layer_window',
20
  'data-field' => 'fieldset-layer-window-' . $this->name
21
+ ) + $this->attributes), Sanitize::$adminFormTags);
22
 
23
  if (!empty($this->label)) {
24
  echo '<div class="n2_fields_layer_window__title">';
30
 
31
  $element = $this->first;
32
  while ($element) {
33
+ echo wp_kses($this->decorateElement($element), Sanitize::$adminFormTags);
34
 
35
  $element = $element->getNext();
36
  }
41
 
42
  protected function renderTitle() {
43
 
44
+ echo '<div class="n2_fields_layer_window__label">' . esc_html($this->label) . '</div>';
45
  }
46
 
47
  /**
61
  $element->getRowClass()
62
  );
63
 
64
+ echo wp_kses(Html::openTag('div', array(
65
  'class' => implode(' ', array_filter($classes)),
66
  'data-field' => $element->getID()
67
+ ) + $element->getRowAttributes()), Sanitize::$adminFormTags);
68
 
69
  if ($hasLabel) {
70
  echo "<div class='n2_field__label'>";
Nextend/Framework/Form/Fieldset/LayerWindow/FieldsetLayerWindowLabelFields.php CHANGED
@@ -28,7 +28,7 @@ class FieldsetLayerWindowLabelFields extends FieldsetLayerWindow {
28
  }
29
 
30
  protected function renderTitle() {
31
- echo '<div class="n2_fields_layer_window__label">' . $this->label . '</div>';
32
 
33
  echo '<div class="n2_fields_layer_window__title_fields">';
34
  if ($this->fieldsetLabel->hasFields()) {
28
  }
29
 
30
  protected function renderTitle() {
31
+ echo '<div class="n2_fields_layer_window__label">' . esc_html($this->label) . '</div>';
32
 
33
  echo '<div class="n2_fields_layer_window__title_fields">';
34
  if ($this->fieldsetLabel->hasFields()) {
Nextend/Framework/Form/Form.php CHANGED
@@ -87,7 +87,7 @@ class Form extends Data {
87
  }
88
 
89
  public function render() {
90
- echo '<div class="' . implode(' ', $this->classes) . '">';
91
 
92
  $this->container->renderContainer();
93
 
87
  }
88
 
89
  public function render() {
90
+ echo '<div class="' . esc_attr(implode(' ', $this->classes)) . '">';
91
 
92
  $this->container->renderContainer();
93
 
Nextend/Framework/Image/ImageEdit.php CHANGED
@@ -183,9 +183,9 @@ class ImageEdit {
183
  }
184
 
185
  if ($originalWidth / $targetWidth > $originalHeight / $targetHeight) {
186
- $targetWidth = $originalWidth / ($originalHeight / $targetHeight);
187
  } else {
188
- $targetHeight = $originalHeight / ($originalWidth / $targetWidth);
189
  }
190
  }
191
  if ($rotated || $originalWidth != $targetWidth || $originalHeight != $targetHeight) {
@@ -421,12 +421,12 @@ class ImageEdit {
421
  $verticalRatio = $height / $OriginalHeight;
422
 
423
  if ($horizontalRatio > $verticalRatio) {
424
- $new_h = $horizontalRatio * $OriginalHeight;
425
- $dst_y = ($height - $new_h) / 2 * $y / 50;
426
  $dst_h = $new_h;
427
  } else {
428
- $new_w = $verticalRatio * $originalWidth;
429
- $dst_x = ($width - $new_w) / 2 * $x / 50;
430
  $dst_w = $new_w;
431
  }
432
 
@@ -655,8 +655,8 @@ class ImageEdit {
655
  $originalHeight = imagesy($image);
656
  switch ($options['mode']) {
657
  case 'scale':
658
- $targetWidth = $originalWidth * $options['scale'];
659
- $targetHeight = $originalHeight * $options['scale'];
660
  break;
661
  case 'resize':
662
  $targetWidth = $options['width'];
183
  }
184
 
185
  if ($originalWidth / $targetWidth > $originalHeight / $targetHeight) {
186
+ $targetWidth = round($originalWidth / ($originalHeight / $targetHeight));
187
  } else {
188
+ $targetHeight = round($originalHeight / ($originalWidth / $targetWidth));
189
  }
190
  }
191
  if ($rotated || $originalWidth != $targetWidth || $originalHeight != $targetHeight) {
421
  $verticalRatio = $height / $OriginalHeight;
422
 
423
  if ($horizontalRatio > $verticalRatio) {
424
+ $new_h = round($horizontalRatio * $OriginalHeight);
425
+ $dst_y = round(($height - $new_h) / 2 * $y / 50);
426
  $dst_h = $new_h;
427
  } else {
428
+ $new_w = round($verticalRatio * $originalWidth);
429
+ $dst_x = round(($width - $new_w) / 2 * $x / 50);
430
  $dst_w = $new_w;
431
  }
432
 
655
  $originalHeight = imagesy($image);
656
  switch ($options['mode']) {
657
  case 'scale':
658
+ $targetWidth = round($originalWidth * $options['scale']);
659
+ $targetHeight = round($originalHeight * $options['scale']);
660
  break;
661
  case 'resize':
662
  $targetWidth = $options['width'];
Nextend/Framework/Localization/Functions.php CHANGED
@@ -2,14 +2,18 @@
2
 
3
  use Nextend\Framework\Localization\Localization;
4
 
5
- function n2_($text, $domain = 'nextend') {
6
  $translations = Localization::getTranslationsForDomain($domain);
7
 
8
- return $translations->translate($text);
 
 
 
 
9
  }
10
 
11
  function n2_e($text, $domain = 'nextend') {
12
- echo n2_($text, $domain);
13
  }
14
 
15
  function n2_n($single, $plural, $number, $domain = 'nextend') {
@@ -19,7 +23,7 @@ function n2_n($single, $plural, $number, $domain = 'nextend') {
19
  }
20
 
21
  function n2_en($single, $plural, $number, $domain = 'nextend') {
22
- echo n2_n($single, $plural, $number, $domain);
23
  }
24
 
25
  function n2_x($text, $context, $domain = 'nextend') {
@@ -29,5 +33,5 @@ function n2_x($text, $context, $domain = 'nextend') {
29
  }
30
 
31
  function n2_ex($text, $context, $domain = 'nextend') {
32
- echo n2_x($text, $context, $domain);
33
  }
2
 
3
  use Nextend\Framework\Localization\Localization;
4
 
5
+ function n2_($text, $domain = 'nextend', $escape = true) {
6
  $translations = Localization::getTranslationsForDomain($domain);
7
 
8
+ if ($escape) {
9
+ return esc_html($translations->translate($text));
10
+ } else {
11
+ return $translations->translate($text);
12
+ }
13
  }
14
 
15
  function n2_e($text, $domain = 'nextend') {
16
+ echo esc_html(n2_($text, $domain, false));
17
  }
18
 
19
  function n2_n($single, $plural, $number, $domain = 'nextend') {
23
  }
24
 
25
  function n2_en($single, $plural, $number, $domain = 'nextend') {
26
+ echo esc_html(n2_n($single, $plural, $number, $domain));
27
  }
28
 
29
  function n2_x($text, $context, $domain = 'nextend') {
33
  }
34
 
35
  function n2_ex($text, $context, $domain = 'nextend') {
36
+ echo esc_html(n2_x($text, $context, $domain));
37
  }
Nextend/Framework/Misc/HttpClient.php CHANGED
@@ -3,10 +3,9 @@
3
  namespace Nextend\Framework\Misc;
4
 
5
  use Nextend\Framework\Notification\Notification;
6
- use Nextend\Framework\Settings;
7
  use Nextend\Framework\View\Html;
8
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
9
- use WP_HTTP_Proxy;
10
 
11
  class HttpClient {
12
 
@@ -15,128 +14,20 @@ class HttpClient {
15
  }
16
 
17
  public static function get($url, $options = array()) {
18
-
19
- $options = array_merge(array(
20
- 'referer' => $_SERVER['REQUEST_URI']
21
- ), $options);
22
-
23
- if (function_exists('curl_init') && function_exists('curl_exec') && Settings::get('curl', 1)) {
24
-
25
- $ch = curl_init();
26
- curl_setopt($ch, CURLOPT_URL, $url);
27
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
28
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
29
- curl_setopt($ch, CURLOPT_TIMEOUT, 30);
30
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36');
31
- $proxy = new WP_HTTP_Proxy();
32
-
33
- if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) {
34
-
35
-
36
- curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
37
-
38
- curl_setopt($ch, CURLOPT_PROXY, $proxy->host());
39
-
40
- curl_setopt($ch, CURLOPT_PROXYPORT, $proxy->port());
41
-
42
-
43
- if ($proxy->use_authentication()) {
44
-
45
- curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
46
-
47
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy->authentication());
48
- }
49
- }
50
-
51
-
52
- if (!empty($options['referer'])) {
53
- curl_setopt($ch, CURLOPT_REFERER, $options['referer']);
54
- }
55
-
56
-
57
- if (Settings::get('curl-clean-proxy', 0)) {
58
- curl_setopt($ch, CURLOPT_PROXY, '');
59
  }
60
 
61
- $data = curl_exec($ch);
62
- if (curl_errno($ch) == 60) {
63
- curl_setopt($ch, CURLOPT_CAINFO, self::getCacertPath());
64
- $data = curl_exec($ch);
65
- }
66
- $error = curl_error($ch);
67
- $curlErrorNumber = curl_errno($ch);
68
- curl_close($ch);
69
-
70
- if ($curlErrorNumber) {
71
-
72
-
73
- $href = ApplicationSmartSlider3::getInstance()
74
- ->getApplicationTypeAdmin()
75
- ->getUrlHelpCurl();
76
-
77
- if (!isset($options['error']) || $options['error'] !== false) {
78
- Notification::error(Html::tag('a', array(
79
- 'href' => $href . '#support-form'
80
- ), n2_('Debug error')));
81
-
82
- Notification::error($curlErrorNumber . $error);
83
- }
84
-
85
- return false;
86
- }
87
-
88
- return $data;
89
  } else {
90
-
91
- if (!ini_get('allow_url_fopen')) {
92
- Notification::error(sprintf(n2_('The %1$s is not turned on in your server, which is necessary to read rss feeds. You should contact your server host, and ask them to enable it!'), '<a href="http://php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen" target="_blank">allow_url_fopen</a>'));
93
-
94
- return false;
95
- }
96
-
97
- $opts = array(
98
- 'http' => array(
99
- 'method' => 'GET'
100
- )
101
- );
102
- $context = stream_context_create($opts);
103
- $data = file_get_contents($url, false, $context);
104
- if ($data === false) {
105
- Notification::error(n2_('CURL disabled in your php.ini configuration. Please enable it!'));
106
-
107
- return false;
108
- }
109
- $headers = self::parseHeaders($http_response_header);
110
- if ($headers['status'] != '200') {
111
- Notification::error(n2_('Unable to contact with the licensing server, please try again later!'));
112
-
113
- return false;
114
- }
115
-
116
- return $data;
117
  }
 
 
118
  }
119
 
120
  private static function parseHeaders(array $headers, $header = null) {
121
- $output = array();
122
- if ('HTTP' === substr($headers[0], 0, 4)) {
123
- list(, $output['status'], $output['status_text']) = explode(' ', $headers[0]);
124
- unset($headers[0]);
125
- }
126
- foreach ($headers as $v) {
127
- $h = preg_split('/:\s*/', $v);
128
- if (count($h) >= 2) {
129
- $output[strtolower($h[0])] = $h[1];
130
- }
131
- }
132
- if (null !== $header) {
133
- if (isset($output[strtolower($header)])) {
134
- return $output[strtolower($header)];
135
- }
136
-
137
- return null;
138
- }
139
-
140
- return $output;
141
  }
142
  }
3
  namespace Nextend\Framework\Misc;
4
 
5
  use Nextend\Framework\Notification\Notification;
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\Framework\View\Html;
8
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
 
9
 
10
  class HttpClient {
11
 
14
  }
15
 
16
  public static function get($url, $options = array()) {
17
+ $request = wp_remote_get($url);
18
+ if (is_wp_error($request)) {
19
+ foreach ($request->get_error_messages() as $errorMessage) {
20
+ Notification::error($errorMessage);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  }
22
 
23
+ return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  } else {
25
+ $data = wp_remote_retrieve_body($request);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
27
+
28
+ return $data;
29
  }
30
 
31
  private static function parseHeaders(array $headers, $header = null) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  }
33
  }
Nextend/Framework/Misc/OAuth/HTTP.php DELETED
@@ -1,1603 +0,0 @@
1
- <?php
2
-
3
- namespace Nextend\Framework\Misc\OAuth;
4
-
5
-
6
- use Nextend\Framework\Misc\Base64;
7
- use Nextend\Framework\Misc\HttpClient;
8
-
9
- defined('HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR') || define('HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR', -1);
10
- defined('HTTP_CLIENT_ERROR_NO_ERROR') || define('HTTP_CLIENT_ERROR_NO_ERROR', 0);
11
- defined('HTTP_CLIENT_ERROR_INVALID_SERVER_ADDRESS') || define('HTTP_CLIENT_ERROR_INVALID_SERVER_ADDRESS', 1);
12
- defined('HTTP_CLIENT_ERROR_CANNOT_CONNECT') || define('HTTP_CLIENT_ERROR_CANNOT_CONNECT', 2);
13
- defined('HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE') || define('HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE', 3);
14
- defined('HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE') || define('HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE', 4);
15
- defined('HTTP_CLIENT_ERROR_PROTOCOL_FAILURE') || define('HTTP_CLIENT_ERROR_PROTOCOL_FAILURE', 5);
16
- defined('HTTP_CLIENT_ERROR_INVALID_PARAMETERS') || define('HTTP_CLIENT_ERROR_INVALID_PARAMETERS', 6);
17
-
18
- class HTTP {
19
-
20
- var $host_name = "";
21
- var $host_port = 0;
22
- var $proxy_host_name = "";
23
- var $proxy_host_port = 80;
24
- var $socks_host_name = '';
25
- var $socks_host_port = 1080;
26
- var $socks_version = '5';
27
-
28
- var $protocol = "http";
29
- var $request_method = "GET";
30
- var $user_agent = 'httpclient (http://www.phpclasses.org/httpclient $Revision: 1.92 $)';
31
- var $accept = '';
32
- var $authentication_mechanism = "";
33
- var $user;
34
- var $password;
35
- var $realm;
36
- var $workstation;
37
- var $proxy_authentication_mechanism = "";
38
- var $proxy_user;
39
- var $proxy_password;
40
- var $proxy_realm;
41
- var $proxy_workstation;
42
- var $request_uri = "";
43
- var $request = "";
44
- var $request_headers = array();
45
- var $request_user;
46
- var $request_password;
47
- var $request_realm;
48
- var $request_workstation;
49
- var $proxy_request_user;
50
- var $proxy_request_password;
51
- var $proxy_request_realm;
52
- var $proxy_request_workstation;
53
- var $request_body = "";
54
- var $request_arguments = array();
55
- var $protocol_version = "1.1";
56
- var $timeout = 0;
57
- var $data_timeout = 0;
58
- var $debug = 0;
59
- var $log_debug = 0;
60
- var $debug_response_body = 1;
61
- var $html_debug = 0;
62
- var $support_cookies = 1;
63
- var $cookies = array();
64
- var $error = "";
65
- var $error_code = HTTP_CLIENT_ERROR_NO_ERROR;
66
- var $exclude_address = "";
67
- var $follow_redirect = 0;
68
- var $redirection_limit = 5;
69
- var $response_status = "";
70
- var $response_message = "";
71
- var $file_buffer_length = 8000;
72
- var $force_multipart_form_post = 0;
73
- var $prefer_curl = 1;
74
- var $keep_alive = 1;
75
- var $sasl_authenticate = 1;
76
-
77
- /* private variables - DO NOT ACCESS */
78
-
79
- var $state = "Disconnected";
80
- var $use_curl = 0;
81
- var $connection = 0;
82
- var $content_length = 0;
83
- var $response = "";
84
- var $read_response = 0;
85
- var $read_length = 0;
86
- var $request_host = "";
87
- var $next_token = "";
88
- var $redirection_level = 0;
89
- var $chunked = 0;
90
- var $remaining_chunk = 0;
91
- var $last_chunk_read = 0;
92
- var $months = array(
93
- "Jan" => "01",
94
- "Feb" => "02",
95
- "Mar" => "03",
96
- "Apr" => "04",
97
- "May" => "05",
98
- "Jun" => "06",
99
- "Jul" => "07",
100
- "Aug" => "08",
101
- "Sep" => "09",
102
- "Oct" => "10",
103
- "Nov" => "11",
104
- "Dec" => "12"
105
- );
106
- var $session = '';
107
- var $connection_close = 0;
108
- var $force_close = 0;
109
- var $connected_host = '';
110
- var $connected_port = -1;
111
- var $connected_ssl = 0;
112
-
113
- public static function PHPErrorMessage() {
114
- $lastError = error_get_last();
115
- if ($lastError === null) {
116
- return '';
117
- }
118
-
119
- return $lastError['message'];
120
- }
121
-
122
- /* Private methods - DO NOT CALL */
123
-
124
- function Tokenize($string, $separator = "") {
125
- if (!strcmp($separator, "")) {
126
- $separator = $string;
127
- $string = $this->next_token;
128
- }
129
- for ($character = 0; $character < strlen($separator); $character++) {
130
- $position = strpos($string, $separator[$character]);
131
- if (GetType($position) == "integer") $found = (isset($found) ? min($found, $position) : $position);
132
- }
133
- if (isset($found)) {
134
- $this->next_token = substr($string, $found + 1);
135
-
136
- return (substr($string, 0, $found));
137
- } else {
138
- $this->next_token = "";
139
-
140
- return ($string);
141
- }
142
- }
143
-
144
- function CookieEncode($value, $name) {
145
- return ($name ? str_replace("=", "%25", $value) : str_replace(";", "%3B", $value));
146
- }
147
-
148
- function SetError($error, $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR) {
149
- $this->error_code = $error_code;
150
-
151
- return ($this->error = $error);
152
- }
153
-
154
- function SetPHPError($error, $php_error_message, $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR) {
155
- if (isset($php_error_message) && strlen($php_error_message)) $error .= ": " . $php_error_message;
156
-
157
- return ($this->SetError($error, $error_code));
158
- }
159
-
160
- function SetDataAccessError($error, $check_connection = 0) {
161
- $this->error = $error;
162
- $this->error_code = HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE;
163
- if (!$this->use_curl && function_exists("socket_get_status")) {
164
- $status = socket_get_status($this->connection);
165
- if ($status["timed_out"]) $this->error .= ": data access time out"; elseif ($status["eof"]) {
166
- if ($check_connection) $this->error = ""; else
167
- $this->error .= ": the server disconnected";
168
- }
169
- }
170
- }
171
-
172
- function OutputDebug($message) {
173
- if ($this->log_debug) error_log($message); else {
174
- $message .= "\n";
175
- if ($this->html_debug) $message = str_replace("\n", "<br>\n", HtmlEntities($message));
176
- echo $message;
177
- flush();
178
- }
179
- }
180
-
181
- function GetLine() {
182
- for ($line = ""; ;) {
183
- if ($this->use_curl) {
184
- $eol = strpos($this->response, "\n", $this->read_response);
185
- $data = ($eol ? substr($this->response, $this->read_response, $eol + 1 - $this->read_response) : "");
186
- $this->read_response += strlen($data);
187
- } else {
188
- if (feof($this->connection)) {
189
- $this->SetDataAccessError("reached the end of data while reading from the HTTP server connection");
190
-
191
- return (0);
192
- }
193
- $data = fgets($this->connection, 100);
194
- }
195
- if (GetType($data) != "string" || strlen($data) == 0) {
196
- $this->SetDataAccessError("it was not possible to read line from the HTTP server");
197
-
198
- return (0);
199
- }
200
- $line .= $data;
201
- $length = strlen($line);
202
- if ($length && !strcmp(substr($line, $length - 1, 1), "\n")) {
203
- $length -= (($length >= 2 && !strcmp(substr($line, $length - 2, 1), "\r")) ? 2 : 1);
204
- $line = substr($line, 0, $length);
205
- if ($this->debug) $this->OutputDebug("S $line");
206
-
207
- return ($line);
208
- }
209
- }
210
- }
211
-
212
- function PutLine($line) {
213
- if ($this->debug) $this->OutputDebug("C $line");
214
- if (!fputs($this->connection, $line . "\r\n")) {
215
- $this->SetDataAccessError("it was not possible to send a line to the HTTP server");
216
-
217
- return (0);
218
- }
219
-
220
- return (1);
221
- }
222
-
223
- function PutData($data) {
224
- if (strlen($data)) {
225
- if ($this->debug) $this->OutputDebug('C ' . $data);
226
- if (!fputs($this->connection, $data)) {
227
- $this->SetDataAccessError("it was not possible to send data to the HTTP server");
228
-
229
- return (0);
230
- }
231
- }
232
-
233
- return (1);
234
- }
235
-
236
- function FlushData() {
237
- if (!fflush($this->connection)) {
238
- $this->SetDataAccessError("it was not possible to send data to the HTTP server");
239
-
240
- return (0);
241
- }
242
-
243
- return (1);
244
- }
245
-
246
- function ReadChunkSize() {
247
- if ($this->remaining_chunk == 0) {
248
- $debug = $this->debug;
249
- if (!$this->debug_response_body) $this->debug = 0;
250
- $line = $this->GetLine();
251
- $this->debug = $debug;
252
- if (GetType($line) != "string") return ($this->SetError("could not read chunk start: " . $this->error, $this->error_code));
253
- $this->remaining_chunk = hexdec($line);
254
- if ($this->remaining_chunk == 0) {
255
- if (!$this->debug_response_body) $this->debug = 0;
256
- $line = $this->GetLine();
257
- $this->debug = $debug;
258
- if (GetType($line) != "string") return ($this->SetError("could not read chunk end: " . $this->error, $this->error_code));
259
- }
260
- }
261
-
262
- return ("");
263
- }
264
-
265
- function ReadBytes($length) {
266
- if ($this->use_curl) {
267
- $bytes = substr($this->response, $this->read_response, min($length, strlen($this->response) - $this->read_response));
268
- $this->read_response += strlen($bytes);
269
- if ($this->debug && $this->debug_response_body && strlen($bytes)) $this->OutputDebug("S " . $bytes);
270
- } else {
271
- if ($this->chunked) {
272
- for ($bytes = "", $remaining = $length; $remaining;) {
273
- if (strlen($this->ReadChunkSize())) return ("");
274
- if ($this->remaining_chunk == 0) {
275
- $this->last_chunk_read = 1;
276
- break;
277
- }
278
- $ask = min($this->remaining_chunk, $remaining);
279
- $chunk = @fread($this->connection, $ask);
280
- $read = strlen($chunk);
281
- if ($read == 0) {
282
- $this->SetDataAccessError("it was not possible to read data chunk from the HTTP server");
283
-
284
- return ("");
285
- }
286
- if ($this->debug && $this->debug_response_body) $this->OutputDebug("S " . $chunk);
287
- $bytes .= $chunk;
288
- $this->remaining_chunk -= $read;
289
- $remaining -= $read;
290
- if ($this->remaining_chunk == 0) {
291
- if (feof($this->connection)) return ($this->SetError("reached the end of data while reading the end of data chunk mark from the HTTP server", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
292
- $data = @fread($this->connection, 2);
293
- if (strcmp($data, "\r\n")) {
294
- $this->SetDataAccessError("it was not possible to read end of data chunk from the HTTP server");
295
-
296
- return ("");
297
- }
298
- }
299
- }
300
- } else {
301
- $bytes = @fread($this->connection, $length);
302
- if (strlen($bytes)) {
303
- if ($this->debug && $this->debug_response_body) $this->OutputDebug("S " . $bytes);
304
- } else
305
- $this->SetDataAccessError("it was not possible to read data from the HTTP server", $this->connection_close);
306
- }
307
- }
308
-
309
- return ($bytes);
310
- }
311
-
312
- function EndOfInput() {
313
- if ($this->use_curl) return ($this->read_response >= strlen($this->response));
314
- if ($this->chunked) return ($this->last_chunk_read);
315
- if ($this->content_length_set) return ($this->content_length <= $this->read_length);
316
-
317
- return (feof($this->connection));
318
- }
319
-
320
- function Resolve($domain, &$ip, $server_type) {
321
- if (preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $domain)) $ip = $domain; else {
322
- if ($this->debug) $this->OutputDebug('Resolving ' . $server_type . ' server domain "' . $domain . '"...');
323
- if (!strcmp($ip = @gethostbyname($domain), $domain)) $ip = "";
324
- }
325
- if (strlen($ip) == 0 || (strlen($this->exclude_address) && !strcmp(@gethostbyname($this->exclude_address), $ip))) return ($this->SetError("could not resolve the host domain \"" . $domain . "\"", HTTP_CLIENT_ERROR_INVALID_SERVER_ADDRESS));
326
-
327
- return ('');
328
- }
329
-
330
- function Connect($host_name, $host_port, $ssl, $server_type = 'HTTP') {
331
- $domain = $host_name;
332
- $port = $host_port;
333
- if (strlen($error = $this->Resolve($domain, $ip, $server_type))) return ($error);
334
- if (strlen($this->socks_host_name)) {
335
- switch ($this->socks_version) {
336
- case '4':
337
- $version = 4;
338
- break;
339
- case '5':
340
- $version = 5;
341
- break;
342
- default:
343
- return ('it was not specified a supported SOCKS protocol version');
344
- break;
345
- }
346
- $host_ip = $ip;
347
- $port = $this->socks_host_port;
348
- $host_server_type = $server_type;
349
- $server_type = 'SOCKS';
350
- if (strlen($error = $this->Resolve($this->socks_host_name, $ip, $server_type))) return ($error);
351
- }
352
- if ($this->debug) $this->OutputDebug('Connecting to ' . $server_type . ' server IP ' . $ip . ' port ' . $port . '...');
353
- if ($ssl) $ip = "ssl://" . $host_name;
354
- if (($this->connection = ($this->timeout ? @fsockopen($ip, $port, $errno, $error, $this->timeout) : @fsockopen($ip, $port, $errno))) == 0) {
355
- $error_code = HTTP_CLIENT_ERROR_CANNOT_CONNECT;
356
- switch ($errno) {
357
- case -3:
358
- return ($this->SetError("socket could not be created", $error_code));
359
- case -4:
360
- return ($this->SetError("dns lookup on hostname \"" . $host_name . "\" failed", $error_code));
361
- case -5:
362
- return ($this->SetError("connection refused or timed out", $error_code));
363
- case -6:
364
- return ($this->SetError("fdopen() call failed", $error_code));
365
- case -7:
366
- return ($this->SetError("setvbuf() call failed", $error_code));
367
- default:
368
- return ($this->SetPHPError($errno . " could not connect to the host \"" . $host_name . "\"", self::PHPErrorMessage(), $error_code));
369
- }
370
- } else {
371
- if ($this->data_timeout && function_exists("socket_set_timeout")) socket_set_timeout($this->connection, $this->data_timeout, 0);
372
- if (strlen($this->socks_host_name)) {
373
- if ($this->debug) $this->OutputDebug('Connected to the SOCKS server ' . $this->socks_host_name);
374
- $send_error = 'it was not possible to send data to the SOCKS server';
375
- $receive_error = 'it was not possible to receive data from the SOCKS server';
376
- switch ($version) {
377
- case 4:
378
- $command = 1;
379
- $user = '';
380
- if (!fputs($this->connection, chr($version) . chr($command) . pack('nN', $host_port, ip2long($host_ip)) . $user . Chr(0))) $error = $this->SetDataAccessError($send_error); else {
381
- $response = fgets($this->connection, 9);
382
- if (strlen($response) != 8) $error = $this->SetDataAccessError($receive_error); else {
383
- $socks_errors = array(
384
- "\x5a" => '',
385
- "\x5b" => 'request rejected',
386
- "\x5c" => 'request failed because client is not running identd (or not reachable from the server)',
387
- "\x5d" => 'request failed because client\'s identd could not confirm the user ID string in the request',
388
- );
389
- $error_code = $response[1];
390
- $error = (isset($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown');
391
- if (strlen($error)) $error = 'SOCKS error: ' . $error;
392
- }
393
- }
394
- break;
395
- case 5:
396
- if ($this->debug) $this->OutputDebug('Negotiating the authentication method ...');
397
- $methods = 1;
398
- $method = 0;
399
- if (!fputs($this->connection, chr($version) . chr($methods) . chr($method))) $error = $this->SetDataAccessError($send_error); else {
400
- $response = fgets($this->connection, 3);
401
- if (strlen($response) != 2) $error = $this->SetDataAccessError($receive_error); elseif (Ord($response[1]) != $method) $error = 'the SOCKS server requires an authentication method that is not yet supported';
402
- else {
403
- if ($this->debug) $this->OutputDebug('Connecting to ' . $host_server_type . ' server IP ' . $host_ip . ' port ' . $host_port . '...');
404
- $command = 1;
405
- $address_type = 1;
406
- if (!fputs($this->connection, chr($version) . chr($command) . "\x00" . chr($address_type) . pack('Nn', ip2long($host_ip), $host_port))) $error = $this->SetDataAccessError($send_error); else {
407
- $response = fgets($this->connection, 11);
408
- if (strlen($response) != 10) $error = $this->SetDataAccessError($receive_error); else {
409
- $socks_errors = array(
410
- "\x00" => '',
411
- "\x01" => 'general SOCKS server failure',
412
- "\x02" => 'connection not allowed by ruleset',
413
- "\x03" => 'Network unreachable',
414
- "\x04" => 'Host unreachable',
415
- "\x05" => 'Connection refused',
416
- "\x06" => 'TTL expired',
417
- "\x07" => 'Command not supported',
418
- "\x08" => 'Address type not supported'
419
- );
420
- $error_code = $response[1];
421
- $error = (isset($socks_errors[$error_code]) ? $socks_errors[$error_code] : 'unknown');
422
- if (strlen($error)) $error = 'SOCKS error: ' . $error;
423
- }
424
- }
425
- }
426
- }
427
- break;
428
- default:
429
- $error = 'support for SOCKS protocol version ' . $this->socks_version . ' is not yet implemented';
430
- break;
431
- }
432
- if (strlen($error)) {
433
- fclose($this->connection);
434
-
435
- return ($error);
436
- }
437
- }
438
- if ($this->debug) $this->OutputDebug("Connected to $host_name");
439
- if (strlen($this->proxy_host_name) && !strcmp(strtolower($this->protocol), 'https')) {
440
- if (function_exists('stream_socket_enable_crypto') && in_array('ssl', stream_get_transports())) $this->state = "ConnectedToProxy"; else {
441
- $this->OutputDebug("It is not possible to start SSL after connecting to the proxy server. If the proxy refuses to forward the SSL request, you may need to upgrade to PHP 5.1 or later with OpenSSL support enabled.");
442
- $this->state = "Connected";
443
- }
444
- } else
445
- $this->state = "Connected";
446
-
447
- return ("");
448
- }
449
- }
450
-
451
- function Disconnect() {
452
- if ($this->debug) $this->OutputDebug("Disconnected from " . $this->connected_host);
453
- if ($this->use_curl) {
454
- curl_close($this->connection);
455
- $this->response = "";
456
- } else
457
- fclose($this->connection);
458
- $this->state = "Disconnected";
459
-
460
- return ("");
461
- }
462
-
463
- /* Public methods */
464
-
465
- function GetRequestArguments($url, &$arguments) {
466
- $this->error = '';
467
- $this->error_code = HTTP_CLIENT_ERROR_NO_ERROR;
468
- $arguments = array();
469
- $url = str_replace(' ', '%20', $url);
470
- $parameters = @parse_url($url);
471
- if (!$parameters) return ($this->SetError("it was not specified a valid URL", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
472
- if (!isset($parameters["scheme"])) return ($this->SetError("it was not specified the protocol type argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
473
- switch (strtolower($parameters["scheme"])) {
474
- case "http":
475
- case "https":
476
- $arguments["Protocol"] = $parameters["scheme"];
477
- break;
478
- default:
479
- return ($parameters["scheme"] . " connection scheme is not yet supported");
480
- }
481
- if (!isset($parameters["host"])) return ($this->SetError("it was not specified the connection host argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
482
- $arguments["HostName"] = $parameters["host"];
483
- $arguments["Headers"] = array("Host" => $parameters["host"] . (isset($parameters["port"]) ? ":" . $parameters["port"] : ""));
484
- if (isset($parameters["user"])) {
485
- $arguments["AuthUser"] = UrlDecode($parameters["user"]);
486
- if (!isset($parameters["pass"])) $arguments["AuthPassword"] = "";
487
- }
488
- if (isset($parameters["pass"])) {
489
- if (!isset($parameters["user"])) $arguments["AuthUser"] = "";
490
- $arguments["AuthPassword"] = UrlDecode($parameters["pass"]);
491
- }
492
- if (isset($parameters["port"])) {
493
- if (strcmp($parameters["port"], strval(intval($parameters["port"])))) return ($this->SetError("it was not specified a valid connection host argument", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
494
- $arguments["HostPort"] = intval($parameters["port"]);
495
- } else
496
- $arguments["HostPort"] = 0;
497
- $arguments["RequestURI"] = (isset($parameters["path"]) ? $parameters["path"] : "/") . (isset($parameters["query"]) ? "?" . $parameters["query"] : "");
498
- if (strlen($this->user_agent)) $arguments["Headers"]["User-Agent"] = $this->user_agent;
499
- if (strlen($this->accept)) $arguments["Headers"]["Accept"] = $this->accept;
500
-
501
- return ("");
502
- }
503
-
504
- function Open($arguments) {
505
- if (strlen($this->error)) return ($this->error);
506
- $error_code = HTTP_CLIENT_ERROR_UNSPECIFIED_ERROR;
507
- if (isset($arguments["HostName"])) $this->host_name = $arguments["HostName"];
508
- if (isset($arguments["HostPort"])) $this->host_port = $arguments["HostPort"];
509
- if (isset($arguments["ProxyHostName"])) $this->proxy_host_name = $arguments["ProxyHostName"];
510
- if (isset($arguments["ProxyHostPort"])) $this->proxy_host_port = $arguments["ProxyHostPort"];
511
- if (isset($arguments["SOCKSHostName"])) $this->socks_host_name = $arguments["SOCKSHostName"];
512
- if (isset($arguments["SOCKSHostPort"])) $this->socks_host_port = $arguments["SOCKSHostPort"];
513
- if (isset($arguments["SOCKSVersion"])) $this->socks_version = $arguments["SOCKSVersion"];
514
- if (isset($arguments["Protocol"])) $this->protocol = $arguments["Protocol"];
515
- switch (strtolower($this->protocol)) {
516
- case "http":
517
- $default_port = 80;
518
- break;
519
- case "https":
520
- $default_port = 443;
521
- break;
522
- default:
523
- return ($this->SetError("it was not specified a valid connection protocol", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
524
- }
525
- if (strlen($this->proxy_host_name) == 0) {
526
- if (strlen($this->host_name) == 0) return ($this->SetError("it was not specified a valid hostname", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
527
- $host_name = $this->host_name;
528
- $host_port = ($this->host_port ? $this->host_port : $default_port);
529
- $server_type = 'HTTP';
530
- } else {
531
- $host_name = $this->proxy_host_name;
532
- $host_port = $this->proxy_host_port;
533
- $server_type = 'HTTP proxy';
534
- }
535
- $ssl = (strtolower($this->protocol) == "https" && strlen($this->proxy_host_name) == 0);
536
- if ($ssl && strlen($this->socks_host_name)) return ($this->SetError('establishing SSL connections via a SOCKS server is not yet supported', HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
537
- $this->use_curl = ($ssl && $this->prefer_curl && function_exists("curl_init"));
538
- switch ($this->state) {
539
- case 'Connected':
540
- if (!strcmp($host_name, $this->connected_host) && intval($host_port) == $this->connected_port && intval($ssl) == $this->connected_ssl) {
541
- if ($this->debug) $this->OutputDebug("Reusing connection to " . $this->connected_host);
542
-
543
- return ('');
544
- }
545
- if (strlen($error = $this->Disconnect())) return ($error);
546
- break;
547
- case "Disconnected":
548
- break;
549
- default:
550
- return ("1 already connected");
551
- }
552
- if ($this->debug) $this->OutputDebug("Connecting to " . $this->host_name);
553
- if ($this->use_curl) {
554
- $error = (($this->connection = curl_init($this->protocol . "://" . $this->host_name . ($host_port == $default_port ? "" : ":" . strval($host_port)) . "/")) ? "" : "Could not initialize a CURL session");
555
- if (strlen($error) == 0) {
556
- curl_setopt($this->connection, CURLOPT_CAINFO, HttpClient::getCacertPath());
557
- if (isset($arguments["SSLCertificateFile"])) curl_setopt($this->connection, CURLOPT_SSLCERT, $arguments["SSLCertificateFile"]);
558
- if (isset($arguments["SSLCertificatePassword"])) curl_setopt($this->connection, CURLOPT_SSLCERTPASSWD, $arguments["SSLCertificatePassword"]);
559
- if (isset($arguments["SSLKeyFile"])) curl_setopt($this->connection, CURLOPT_SSLKEY, $arguments["SSLKeyFile"]);
560
- if (isset($arguments["SSLKeyPassword"])) curl_setopt($this->connection, CURLOPT_SSLKEYPASSWD, $arguments["SSLKeyPassword"]);
561
- }
562
- $this->state = "Connected";
563
- } else {
564
- $error = "";
565
- if (strlen($this->proxy_host_name) && (isset($arguments["SSLCertificateFile"]) || isset($arguments["SSLCertificateFile"]))) $error = "establishing SSL connections using certificates or private keys via non-SSL proxies is not supported"; else {
566
- if ($ssl) {
567
- if (isset($arguments["SSLCertificateFile"])) $error = "establishing SSL connections using certificates is only supported when the cURL extension is enabled"; elseif (isset($arguments["SSLKeyFile"])) $error = "establishing SSL connections using a private key is only supported when the cURL extension is enabled";
568
- }
569
- if (strlen($error) == 0) {
570
- $error = $this->Connect($host_name, $host_port, $ssl, $server_type);
571
- $error_code = $this->error_code;
572
- }
573
- }
574
- }
575
- if (strlen($error)) return ($this->SetError($error, $error_code));
576
- $this->session = md5(uniqid(""));
577
- $this->connected_host = $host_name;
578
- $this->connected_port = intval($host_port);
579
- $this->connected_ssl = intval($ssl);
580
-
581
- return ("");
582
- }
583
-
584
- function Close($force = 0) {
585
- if ($this->state == "Disconnected") return ("1 already disconnected");
586
- if (!$this->force_close && $this->keep_alive && !$force && $this->state == 'ResponseReceived') {
587
- if ($this->debug) $this->OutputDebug('Keeping the connection alive to ' . $this->connected_host);
588
- $this->state = 'Connected';
589
-
590
- return ('');
591
- }
592
-
593
- return ($this->Disconnect());
594
- }
595
-
596
- function PickCookies(&$cookies, $secure) {
597
- if (isset($this->cookies[$secure])) {
598
- $now = gmdate("Y-m-d H-i-s");
599
- for ($domain = 0, Reset($this->cookies[$secure]); $domain < count($this->cookies[$secure]); Next($this->cookies[$secure]), $domain++) {
600
- $domain_pattern = Key($this->cookies[$secure]);
601
- $match = strlen($this->request_host) - strlen($domain_pattern);
602
- if ($match >= 0 && !strcmp($domain_pattern, substr($this->request_host, $match)) && ($match == 0 || $domain_pattern[0] == "." || $this->request_host[$match - 1] == ".")) {
603
- for (Reset($this->cookies[$secure][$domain_pattern]), $path_part = 0; $path_part < count($this->cookies[$secure][$domain_pattern]); Next($this->cookies[$secure][$domain_pattern]), $path_part++) {
604
- $path = Key($this->cookies[$secure][$domain_pattern]);
605
- if (strlen($this->request_uri) >= strlen($path) && substr($this->request_uri, 0, strlen($path)) == $path) {
606
- for (Reset($this->cookies[$secure][$domain_pattern][$path]), $cookie = 0; $cookie < count($this->cookies[$secure][$domain_pattern][$path]); Next($this->cookies[$secure][$domain_pattern][$path]), $cookie++) {
607
- $cookie_name = Key($this->cookies[$secure][$domain_pattern][$path]);
608
- $expires = $this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
609
- if ($expires == "" || strcmp($now, $expires) < 0) $cookies[$cookie_name] = $this->cookies[$secure][$domain_pattern][$path][$cookie_name];
610
- }
611
- }
612
- }
613
- }
614
- }
615
- }
616
- }
617
-
618
- function GetFileDefinition($file, &$definition) {
619
- $name = "";
620
- if (isset($file["FileName"])) $name = basename($file["FileName"]);
621
- if (isset($file["Name"])) $name = $file["Name"];
622
- if (strlen($name) == 0) return ("it was not specified the file part name");
623
- if (isset($file["Content-Type"])) {
624
- $content_type = $file["Content-Type"];
625
- $type = $this->Tokenize(strtolower($content_type), "/");
626
- $sub_type = $this->Tokenize("");
627
- switch ($type) {
628
- case "text":
629
- case "image":
630
- case "audio":
631
- case "video":
632
- case "application":
633
- case "message":
634
- break;
635
- case "automatic":
636
- switch ($sub_type) {
637
- case "name":
638
- switch (GetType($dot = strrpos($name, ".")) == "integer" ? strtolower(substr($name, $dot)) : "") {
639
- case ".xls":
640
- $content_type = "application/excel";
641
- break;
642
- case ".hqx":
643
- $content_type = "application/macbinhex40";
644
- break;
645
- case ".doc":
646
- case ".dot":
647
- case ".wrd":
648
- $content_type = "application/msword";
649
- break;
650
- case ".pdf":
651
- $content_type = "application/pdf";
652
- break;
653
- case ".pgp":
654
- $content_type = "application/pgp";
655
- break;
656
- case ".ps":
657
- case ".eps":
658
- case ".ai":
659
- $content_type = "application/postscript";
660
- break;
661
- case ".ppt":
662
- $content_type = "application/powerpoint";
663
- break;
664
- case ".rtf":
665
- $content_type = "application/rtf";
666
- break;
667
- case ".tgz":
668
- case ".gtar":
669
- $content_type = "application/x-gtar";
670
- break;
671
- case ".gz":
672
- $content_type = "application/x-gzip";
673
- break;
674
- case ".php":
675
- case ".php3":
676
- $content_type = "application/x-httpd-php";
677
- break;
678
- case ".js":
679
- $content_type = "application/x-javascript";
680
- break;
681
- case ".ppd":
682
- case ".psd":
683
- $content_type = "application/x-photoshop";
684
- break;
685
- case ".svg":
686
- $content_type = "image/svg+xml";
687
- break;
688
- case ".swf":
689
- case ".swc":
690
- case ".rf":
691
- $content_type = "application/x-shockwave-flash";
692
- break;
693
- case ".tar":
694
- $content_type = "application/x-tar";
695
- break;
696
- case ".zip":
697
- $content_type = "application/zip";
698
- break;
699
- case ".mid":
700
- case ".midi":
701
- case ".kar":
702
- $content_type = "audio/midi";
703
- break;
704
- case ".mp2":
705
- case ".mp3":
706
- case ".mpga":
707
- $content_type = "audio/mpeg";
708
- break;
709
- case ".ra":
710
- $content_type = "audio/x-realaudio";
711
- break;
712
- case ".wav":
713
- $content_type = "audio/wav";
714
- break;
715
- case ".bmp":
716
- $content_type = "image/bitmap";
717
- break;
718
- case ".gif":
719
- $content_type = "image/gif";
720
- break;
721
- case ".iff":
722
- $content_type = "image/iff";
723
- break;
724
- case ".jb2":
725
- $content_type = "image/jb2";
726
- break;
727
- case ".jpg":
728
- case ".jpe":
729
- case ".jpeg":
730
- $content_type = "image/jpeg";
731
- break;
732
- case ".jpx":
733
- $content_type = "image/jpx";
734
- break;
735
- case ".png":
736
- $content_type = "image/png";
737
- break;
738
- case ".tif":
739
- case ".tiff":
740
- $content_type = "image/tiff";
741
- break;
742
- case ".wbmp":
743
- $content_type = "image/vnd.wap.wbmp";
744
- break;
745
- case ".webp":
746
- $content_type = "image/webp";
747
- break;
748
- case ".xbm":
749
- $content_type = "image/xbm";
750
- break;
751
- case ".css":
752
- $content_type = "text/css";
753
- break;
754
- case ".txt":
755
- $content_type = "text/plain";
756
- break;
757
- case ".htm":
758
- case ".html":
759
- $content_type = "text/html";
760
- break;
761
- case ".xml":
762
- $content_type = "text/xml";
763
- break;
764
- case ".mpg":
765
- case ".mpe":
766
- case ".mpeg":
767
- $content_type = "video/mpeg";
768
- break;
769
- case ".qt":
770
- case ".mov":
771
- $content_type = "video/quicktime";
772
- break;
773
- case ".avi":
774
- $content_type = "video/x-ms-video";
775
- break;
776
- case ".eml":
777
- $content_type = "message/rfc822";
778
- break;
779
- default:
780
- $content_type = "application/octet-stream";
781
- break;
782
- }
783
- break;
784
- default:
785
- return ($content_type . " is not a supported automatic content type detection method");
786
- }
787
- break;
788
- default:
789
- return ($content_type . " is not a supported file content type");
790
- }
791
- } else
792
- $content_type = "application/octet-stream";
793
- $definition = array(
794
- "Content-Type" => $content_type,
795
- "NAME" => $name
796
- );
797
- if (isset($file["FileName"])) {
798
- if (GetType($length = @filesize($file["FileName"])) != "integer") {
799
- $error = "it was not possible to determine the length of the file " . $file["FileName"];
800
- $errorMessage = self::PHPErrorMessage();
801
- if (strlen($errorMessage)) $error .= ": " . $errorMessage;
802
- if (!file_exists($file["FileName"])) $error = "it was not possible to access the file " . $file["FileName"];
803
-
804
- return ($error);
805
- }
806
- $definition["FILENAME"] = $file["FileName"];
807
- $definition["Content-Length"] = $length;
808
- } elseif (isset($file["Data"])) $definition["Content-Length"] = strlen($definition["DATA"] = $file["Data"]);
809
- else
810
- return ("it was not specified a valid file name");
811
-
812
- return ("");
813
- }
814
-
815
- function ConnectFromProxy($arguments, &$headers) {
816
- if (!$this->PutLine('CONNECT ' . $this->host_name . ':' . ($this->host_port ? $this->host_port : 443) . ' HTTP/1.0') || (strlen($this->user_agent) && !$this->PutLine('User-Agent: ' . $this->user_agent)) || (strlen($this->accept) && !$this->PutLine('Accept: ' . $this->accept)) || (isset($arguments['Headers']['Proxy-Authorization']) && !$this->PutLine('Proxy-Authorization: ' . $arguments['Headers']['Proxy-Authorization'])) || !$this->PutLine('')) {
817
- $this->Disconnect();
818
-
819
- return ($this->error);
820
- }
821
- $this->state = "ConnectSent";
822
- if (strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($error);
823
- $proxy_authorization = "";
824
- while (!strcmp($this->response_status, "100")) {
825
- $this->state = "ConnectSent";
826
- if (strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($error);
827
- }
828
- switch ($this->response_status) {
829
- case "200":
830
- if (!@stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_SSLv23_CLIENT)) {
831
- $this->SetPHPError('it was not possible to start a SSL encrypted connection via this proxy', self::PHPErrorMessage(), HTTP_CLIENT_ERROR_COMMUNICATION_FAILURE);
832
- $this->Disconnect();
833
-
834
- return ($this->error);
835
- }
836
- $this->state = "Connected";
837
- break;
838
- case "407":
839
- if (strlen($error = $this->Authenticate($headers, -1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) return ($error);
840
- break;
841
- default:
842
- return ($this->SetError("unable to send request via proxy", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
843
- }
844
-
845
- return ("");
846
- }
847
-
848
- function SendRequest($arguments) {
849
- if (strlen($this->error)) return ($this->error);
850
- if (isset($arguments["ProxyUser"])) $this->proxy_request_user = $arguments["ProxyUser"]; elseif (isset($this->proxy_user)) $this->proxy_request_user = $this->proxy_user;
851
- if (isset($arguments["ProxyPassword"])) $this->proxy_request_password = $arguments["ProxyPassword"]; elseif (isset($this->proxy_password)) $this->proxy_request_password = $this->proxy_password;
852
- if (isset($arguments["ProxyRealm"])) $this->proxy_request_realm = $arguments["ProxyRealm"]; elseif (isset($this->proxy_realm)) $this->proxy_request_realm = $this->proxy_realm;
853
- if (isset($arguments["ProxyWorkstation"])) $this->proxy_request_workstation = $arguments["ProxyWorkstation"]; elseif (isset($this->proxy_workstation)) $this->proxy_request_workstation = $this->proxy_workstation;
854
- switch ($this->state) {
855
- case "Disconnected":
856
- return ($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
857
- case "Connected":
858
- $connect = 0;
859
- break;
860
- case "ConnectedToProxy":
861
- if (strlen($error = $this->ConnectFromProxy($arguments, $headers))) return ($error);
862
- $connect = 1;
863
- break;
864
- default:
865
- return ($this->SetError("can not send request in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
866
- }
867
- if (isset($arguments["RequestMethod"])) $this->request_method = $arguments["RequestMethod"];
868
- if (isset($arguments["User-Agent"])) $this->user_agent = $arguments["User-Agent"];
869
- if (!isset($arguments["Headers"]["User-Agent"]) && strlen($this->user_agent)) $arguments["Headers"]["User-Agent"] = $this->user_agent;
870
- if (isset($arguments["KeepAlive"])) $this->keep_alive = intval($arguments["KeepAlive"]);
871
- if (!isset($arguments["Headers"]["Connection"]) && $this->keep_alive) $arguments["Headers"]["Connection"] = 'Keep-Alive';
872
- if (isset($arguments["Accept"])) $this->user_agent = $arguments["Accept"];
873
- if (!isset($arguments["Headers"]["Accept"]) && strlen($this->accept)) $arguments["Headers"]["Accept"] = $this->accept;
874
- if (strlen($this->request_method) == 0) return ($this->SetError("it was not specified a valid request method", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
875
- if (isset($arguments["RequestURI"])) $this->request_uri = $arguments["RequestURI"];
876
- if (strlen($this->request_uri) == 0 || substr($this->request_uri, 0, 1) != "/") return ($this->SetError("it was not specified a valid request URI", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
877
- $this->request_arguments = $arguments;
878
- $this->request_headers = (isset($arguments["Headers"]) ? $arguments["Headers"] : array());
879
- $body_length = 0;
880
- $this->request_body = "";
881
- $get_body = 1;
882
- if ($this->request_method == "POST" || $this->request_method == "PUT") {
883
- if (isset($arguments['StreamRequest'])) {
884
- $get_body = 0;
885
- $this->request_headers["Transfer-Encoding"] = "chunked";
886
- } elseif (isset($arguments["PostFiles"]) || ($this->force_multipart_form_post && isset($arguments["PostValues"]))) {
887
- $boundary = "--" . md5(uniqid(time()));
888
- $this->request_headers["Content-Type"] = "multipart/form-data; boundary=" . $boundary . (isset($arguments["CharSet"]) ? "; charset=" . $arguments["CharSet"] : "");
889
- $post_parts = array();
890
- if (isset($arguments["PostValues"])) {
891
- $values = $arguments["PostValues"];
892
- if (GetType($values) != "array") return ($this->SetError("it was not specified a valid POST method values array", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
893
- for (Reset($values), $value = 0; $value < count($values); Next($values), $value++) {
894
- $input = Key($values);
895
- $headers = "--" . $boundary . "\r\nContent-Disposition: form-data; name=\"" . $input . "\"\r\n\r\n";
896
- $data = $values[$input];
897
- $post_parts[] = array(
898
- "HEADERS" => $headers,
899
- "DATA" => $data
900
- );
901
- $body_length += strlen($headers) + strlen($data) + strlen("\r\n");
902
- }
903
- }
904
- $body_length += strlen("--" . $boundary . "--\r\n");
905
- $files = (isset($arguments["PostFiles"]) ? $arguments["PostFiles"] : array());
906
- Reset($files);
907
- $end = (GetType($input = Key($files)) != "string");
908
- for (; !$end;) {
909
- if (strlen($error = $this->GetFileDefinition($files[$input], $definition))) return ("3 " . $error);
910
- $headers = "--" . $boundary . "\r\nContent-Disposition: form-data; name=\"" . $input . "\"; filename=\"" . $definition["NAME"] . "\"\r\nContent-Type: " . $definition["Content-Type"] . "\r\n\r\n";
911
- $part = count($post_parts);
912
- $post_parts[$part] = array("HEADERS" => $headers);
913
- if (isset($definition["FILENAME"])) {
914
- $post_parts[$part]["FILENAME"] = $definition["FILENAME"];
915
- $data = "";
916
- } else
917
- $data = $definition["DATA"];
918
- $post_parts[$part]["DATA"] = $data;
919
- $body_length += strlen($headers) + $definition["Content-Length"] + strlen("\r\n");
920
- Next($files);
921
- $end = (GetType($input = Key($files)) != "string");
922
- }
923
- $get_body = 0;
924
- } elseif (isset($arguments["PostValues"])) {
925
- $values = $arguments["PostValues"];
926
- if (GetType($values) != "array") return ($this->SetError("it was not specified a valid POST method values array", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
927
- for (Reset($values), $value = 0; $value < count($values); Next($values), $value++) {
928
- $k = Key($values);
929
- if (GetType($values[$k]) == "array") {
930
- for ($v = 0; $v < count($values[$k]); $v++) {
931
- if ($value + $v > 0) $this->request_body .= "&";
932
- $this->request_body .= UrlEncode($k) . "=" . UrlEncode($values[$k][$v]);
933
- }
934
- } else {
935
- if ($value > 0) $this->request_body .= "&";
936
- $this->request_body .= UrlEncode($k) . "=" . UrlEncode($values[$k]);
937
- }
938
- }
939
- $this->request_headers["Content-Type"] = "application/x-www-form-urlencoded" . (isset($arguments["CharSet"]) ? "; charset=" . $arguments["CharSet"] : "");
940
- $get_body = 0;
941
- }
942
- }
943
- if ($get_body && (isset($arguments["Body"]) || isset($arguments["BodyStream"]))) {
944
- if (isset($arguments["Body"])) $this->request_body = $arguments["Body"]; else {
945
- $stream = $arguments["BodyStream"];
946
- $this->request_body = "";
947
- for ($part = 0; $part < count($stream); $part++) {
948
- if (isset($stream[$part]["Data"])) $this->request_body .= $stream[$part]["Data"]; elseif (isset($stream[$part]["File"])) {
949
- if (!($file = @fopen($stream[$part]["File"], "rb"))) return ($this->SetPHPError("could not open upload file " . $stream[$part]["File"], self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE));
950
- while (!feof($file)) {
951
- if (GetType($block = @fread($file, $this->file_buffer_length)) != "string") {
952
- $error = $this->SetPHPError("could not read body stream file " . $stream[$part]["File"], self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
953
- fclose($file);
954
-
955
- return ($error);
956
- }
957
- $this->request_body .= $block;
958
- }
959
- fclose($file);
960
- } else
961
- return ("5 it was not specified a valid file or data body stream element at position " . $part);
962
- }
963
- }
964
- if (!isset($this->request_headers["Content-Type"])) $this->request_headers["Content-Type"] = "application/octet-stream" . (isset($arguments["CharSet"]) ? "; charset=" . $arguments["CharSet"] : "");
965
- }
966
- if (isset($arguments["AuthUser"])) $this->request_user = $arguments["AuthUser"]; elseif (isset($this->user)) $this->request_user = $this->user;
967
- if (isset($arguments["AuthPassword"])) $this->request_password = $arguments["AuthPassword"]; elseif (isset($this->password)) $this->request_password = $this->password;
968
- if (isset($arguments["AuthRealm"])) $this->request_realm = $arguments["AuthRealm"]; elseif (isset($this->realm)) $this->request_realm = $this->realm;
969
- if (isset($arguments["AuthWorkstation"])) $this->request_workstation = $arguments["AuthWorkstation"]; elseif (isset($this->workstation)) $this->request_workstation = $this->workstation;
970
- if (strlen($this->proxy_host_name) == 0 || $connect) $request_uri = $this->request_uri; else {
971
- switch (strtolower($this->protocol)) {
972
- case "http":
973
- $default_port = 80;
974
- break;
975
- case "https":
976
- $default_port = 443;
977
- break;
978
- }
979
- $request_uri = strtolower($this->protocol) . "://" . $this->host_name . (($this->host_port == 0 || $this->host_port == $default_port) ? "" : ":" . $this->host_port) . $this->request_uri;
980
- }
981
- if ($this->use_curl) {
982
- $version = (GetType($v = curl_version()) == "array" ? (isset($v["version"]) ? $v["version"] : "0.0.0") : (preg_match("/^libcurl\\/([0-9]+\\.[0-9]+\\.[0-9]+)/", $v, $m) ? $m[1] : "0.0.0"));
983
- $curl_version = 100000 * intval($this->Tokenize($version, ".")) + 1000 * intval($this->Tokenize(".")) + intval($this->Tokenize(""));
984
- $protocol_version = ($curl_version < 713002 ? "1.0" : $this->protocol_version);
985
- } else
986
- $protocol_version = $this->protocol_version;
987
- $this->request = $this->request_method . " " . $request_uri . " HTTP/" . $protocol_version;
988
- if ($body_length || ($body_length = strlen($this->request_body)) || !strcmp($this->request_method, 'POST')) $this->request_headers["Content-Length"] = $body_length;
989
- for ($headers = array(), $host_set = 0, Reset($this->request_headers), $header = 0; $header < count($this->request_headers); Next($this->request_headers), $header++) {
990
- $header_name = Key($this->request_headers);
991
- $header_value = $this->request_headers[$header_name];
992
- if (GetType($header_value) == "array") {
993
- for (Reset($header_value), $value = 0; $value < count($header_value); Next($header_value), $value++) $headers[] = $header_name . ": " . $header_value[Key($header_value)];
994
- } else
995
- $headers[] = $header_name . ": " . $header_value;
996
- if (strtolower(Key($this->request_headers)) == "host") {
997
- $this->request_host = strtolower($header_value);
998
- $host_set = 1;
999
- }
1000
- }
1001
- if (!$host_set) {
1002
- $headers[] = "Host: " . $this->host_name;
1003
- $this->request_host = strtolower($this->host_name);
1004
- }
1005
- if (count($this->cookies)) {
1006
- $cookies = array();
1007
- $this->PickCookies($cookies, 0);
1008
- if (strtolower($this->protocol) == "https") $this->PickCookies($cookies, 1);
1009
- if (count($cookies)) {
1010
- $h = count($headers);
1011
- $headers[$h] = "Cookie:";
1012
- for (Reset($cookies), $cookie = 0; $cookie < count($cookies); Next($cookies), $cookie++) {
1013
- $cookie_name = Key($cookies);
1014
- $headers[$h] .= " " . $cookie_name . "=" . $cookies[$cookie_name]["value"] . ";";
1015
- }
1016
- }
1017
- }
1018
- $next_state = "RequestSent";
1019
- if ($this->use_curl) {
1020
- if (isset($arguments['StreamRequest'])) return ($this->SetError("Streaming request data is not supported when using Curl", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1021
- if ($body_length && strlen($this->request_body) == 0) {
1022
- for ($request_body = "", $success = 1, $part = 0; $part < count($post_parts); $part++) {
1023
- $request_body .= $post_parts[$part]["HEADERS"] . $post_parts[$part]["DATA"];
1024
- if (isset($post_parts[$part]["FILENAME"])) {
1025
- if (!($file = @fopen($post_parts[$part]["FILENAME"], "rb"))) {
1026
- $this->SetPHPError("could not open upload file " . $post_parts[$part]["FILENAME"], self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1027
- $success = 0;
1028
- break;
1029
- }
1030
- while (!feof($file)) {
1031
- if (GetType($block = @fread($file, $this->file_buffer_length)) != "string") {
1032
- $this->SetPHPError("could not read upload file", self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1033
- $success = 0;
1034
- break;
1035
- }
1036
- $request_body .= $block;
1037
- }
1038
- fclose($file);
1039
- if (!$success) break;
1040
- }
1041
- $request_body .= "\r\n";
1042
- }
1043
- $request_body .= "--" . $boundary . "--\r\n";
1044
- } else
1045
- $request_body = $this->request_body;
1046
- curl_setopt($this->connection, CURLOPT_HEADER, 1);
1047
- curl_setopt($this->connection, CURLOPT_RETURNTRANSFER, 1);
1048
- if ($this->timeout) curl_setopt($this->connection, CURLOPT_TIMEOUT, $this->timeout);
1049
- curl_setopt($this->connection, CURLOPT_SSL_VERIFYPEER, 0);
1050
- curl_setopt($this->connection, CURLOPT_SSL_VERIFYHOST, 0);
1051
- $request = $this->request . "\r\n" . implode("\r\n", $headers) . "\r\n\r\n" . $request_body;
1052
- curl_setopt($this->connection, CURLOPT_CUSTOMREQUEST, $request);
1053
- if ($this->debug) $this->OutputDebug("C " . $request);
1054
- if (!($success = (strlen($this->response = curl_exec($this->connection)) != 0))) {
1055
- $error = curl_error($this->connection);
1056
- $this->SetError("Could not execute the request" . (strlen($error) ? ": " . $error : ""), HTTP_CLIENT_ERROR_PROTOCOL_FAILURE);
1057
- }
1058
- } else {
1059
- if (($success = $this->PutLine($this->request))) {
1060
- for ($header = 0; $header < count($headers); $header++) {
1061
- if (!$success = $this->PutLine($headers[$header])) break;
1062
- }
1063
- if ($success && ($success = $this->PutLine(""))) {
1064
- if (isset($arguments['StreamRequest'])) $next_state = "SendingRequestBody"; elseif ($body_length) {
1065
- if (strlen($this->request_body)) $success = $this->PutData($this->request_body); else {
1066
- for ($part = 0; $part < count($post_parts); $part++) {
1067
- if (!($success = $this->PutData($post_parts[$part]["HEADERS"])) || !($success = $this->PutData($post_parts[$part]["DATA"]))) break;
1068
- if (isset($post_parts[$part]["FILENAME"])) {
1069
- if (!($file = @fopen($post_parts[$part]["FILENAME"], "rb"))) {
1070
- $this->SetPHPError("could not open upload file " . $post_parts[$part]["FILENAME"], self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1071
- $success = 0;
1072
- break;
1073
- }
1074
- while (!feof($file)) {
1075
- if (GetType($block = @fread($file, $this->file_buffer_length)) != "string") {
1076
- $this->SetPHPError("could not read upload file", self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1077
- $success = 0;
1078
- break;
1079
- }
1080
- if (!($success = $this->PutData($block))) break;
1081
- }
1082
- fclose($file);
1083
- if (!$success) break;
1084
- }
1085
- if (!($success = $this->PutLine(""))) break;
1086
- }
1087
- if ($success) $success = $this->PutLine("--" . $boundary . "--");
1088
- }
1089
- if ($success) $sucess = $this->FlushData();
1090
- }
1091
- }
1092
- }
1093
- }
1094
- if (!$success) return ($this->SetError("could not send the HTTP request: " . $this->error, $this->error_code));
1095
- $this->state = $next_state;
1096
-
1097
- return ("");
1098
- }
1099
-
1100
- function SetCookie($name, $value, $expires = "", $path = "/", $domain = "", $secure = 0, $verbatim = 0) {
1101
- if (strlen($this->error)) return ($this->error);
1102
- if (strlen($name) == 0) return ($this->SetError("it was not specified a valid cookie name", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1103
- if (strlen($path) == 0 || strcmp($path[0], "/")) return ($this->SetError($path . " is not a valid path for setting cookie " . $name, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1104
- if ($domain == "" || strpos($domain, ".", $domain[0] == "." ? 1 : 0) === false) return ($this->SetError($domain . " is not a valid domain for setting cookie " . $name, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1105
- $domain = strtolower($domain);
1106
- if (!strcmp($domain[0], ".")) $domain = substr($domain, 1);
1107
- if (!$verbatim) {
1108
- $name = $this->CookieEncode($name, 1);
1109
- $value = $this->CookieEncode($value, 0);
1110
- }
1111
- $secure = intval($secure);
1112
- $this->cookies[$secure][$domain][$path][$name] = array(
1113
- "name" => $name,
1114
- "value" => $value,
1115
- "domain" => $domain,
1116
- "path" => $path,
1117
- "expires" => $expires,
1118
- "secure" => $secure
1119
- );
1120
-
1121
- return ("");
1122
- }
1123
-
1124
- function SendRequestBody($data, $end_of_data) {
1125
- if (strlen($this->error)) return ($this->error);
1126
- switch ($this->state) {
1127
- case "Disconnected":
1128
- return ($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1129
- case "Connected":
1130
- case "ConnectedToProxy":
1131
- return ($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1132
- case "SendingRequestBody":
1133
- break;
1134
- case "RequestSent":
1135
- return ($this->SetError("request body was already sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1136
- default:
1137
- return ($this->SetError("can not send the request body in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1138
- }
1139
- $length = strlen($data);
1140
- if ($length) {
1141
- $size = dechex($length) . "\r\n";
1142
- if (!$this->PutData($size) || !$this->PutData($data)) return ($this->error);
1143
- }
1144
- if ($end_of_data) {
1145
- $size = "0\r\n";
1146
- if (!$this->PutData($size)) return ($this->error);
1147
- $this->state = "RequestSent";
1148
- }
1149
-
1150
- return ("");
1151
- }
1152
-
1153
- function ReadReplyHeadersResponse(&$headers) {
1154
- $headers = array();
1155
- if (strlen($this->error)) return ($this->error);
1156
- switch ($this->state) {
1157
- case "Disconnected":
1158
- return ($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1159
- case "Connected":
1160
- return ($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1161
- case "ConnectedToProxy":
1162
- return ($this->SetError("connection from the remote server from the proxy was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1163
- case "SendingRequestBody":
1164
- return ($this->SetError("request body data was not completely sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1165
- case "ConnectSent":
1166
- $connect = 1;
1167
- break;
1168
- case "RequestSent":
1169
- $connect = 0;
1170
- break;
1171
- default:
1172
- return ($this->SetError("can not get request headers in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1173
- }
1174
- $this->content_length = $this->read_length = $this->read_response = $this->remaining_chunk = 0;
1175
- $this->content_length_set = $this->chunked = $this->last_chunk_read = $chunked = 0;
1176
- $this->force_close = $this->connection_close = 0;
1177
- for ($this->response_status = ""; ;) {
1178
- $line = $this->GetLine();
1179
- if (GetType($line) != "string") return ($this->SetError("could not read request reply: " . $this->error, $this->error_code));
1180
- if (strlen($this->response_status) == 0) {
1181
- if (!preg_match($match = "/^http\\/[0-9]+\\.[0-9]+[ \t]+([0-9]+)[ \t]*(.*)\$/i", $line, $matches)) return ($this->SetError("it was received an unexpected HTTP response status", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1182
- $this->response_status = $matches[1];
1183
- $this->response_message = $matches[2];
1184
- if ($this->response_status == 204) {
1185
- $this->content_length = 0;
1186
- $this->content_length_set = 1;
1187
- }
1188
- }
1189
- if ($line == "") {
1190
- if (strlen($this->response_status) == 0) return ($this->SetError("it was not received HTTP response status", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1191
- $this->state = ($connect ? "GotConnectHeaders" : "GotReplyHeaders");
1192
- break;
1193
- }
1194
- $header_name = strtolower($this->Tokenize($line, ":"));
1195
- $header_value = Trim(Chop($this->Tokenize("\r\n")));
1196
- if (isset($headers[$header_name])) {
1197
- if (GetType($headers[$header_name]) == "string") $headers[$header_name] = array($headers[$header_name]);
1198
- $headers[$header_name][] = $header_value;
1199
- } else
1200
- $headers[$header_name] = $header_value;
1201
- if (!$connect) {
1202
- switch ($header_name) {
1203
- case "content-length":
1204
- $this->content_length = intval($headers[$header_name]);
1205
- $this->content_length_set = 1;
1206
- break;
1207
- case "transfer-encoding":
1208
- $encoding = $this->Tokenize($header_value, "; \t");
1209
- if (!$this->use_curl && !strcmp($encoding, "chunked")) $chunked = 1;
1210
- break;
1211
- case "set-cookie":
1212
- if ($this->support_cookies) {
1213
- if (GetType($headers[$header_name]) == "array") $cookie_headers = $headers[$header_name]; else
1214
- $cookie_headers = array($headers[$header_name]);
1215
- for ($cookie = 0; $cookie < count($cookie_headers); $cookie++) {
1216
- $cookie_name = trim($this->Tokenize($cookie_headers[$cookie], "="));
1217
- $cookie_value = $this->Tokenize(";");
1218
- $domain = $this->request_host;
1219
- $path = "/";
1220
- $expires = "";
1221
- $secure = 0;
1222
- while (($name = strtolower(trim(UrlDecode($this->Tokenize("="))))) != "") {
1223
- $value = UrlDecode($this->Tokenize(";"));
1224
- switch ($name) {
1225
- case "domain":
1226
- $domain = $value;
1227
- break;
1228
- case "path":
1229
- $path = $value;
1230
- break;
1231
- case "expires":
1232
- if (preg_match("/^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT\$/", $value, $matches)) {
1233
- $year = intval($matches[5]);
1234
- if ($year < 1900) $year += ($year < 70 ? 2000 : 1900);
1235
- $expires = "$year-" . $this->months[$matches[4]] . "-" . $matches[3] . " " . $matches[6] . ":" . $matches[7] . ":" . $matches[8];
1236
- }
1237
- break;
1238
- case "secure":
1239
- $secure = 1;
1240
- break;
1241
- }
1242
- }
1243
- if (strlen($this->SetCookie($cookie_name, $cookie_value, $expires, $path, $domain, $secure, 1))) $this->error = "";
1244
- }
1245
- }
1246
- break;
1247
- case "connection":
1248
- $this->force_close = $this->connection_close = !strcmp(strtolower($header_value), "close");
1249
- break;
1250
- }
1251
- }
1252
- }
1253
- $this->chunked = $chunked;
1254
- if ($this->content_length_set) $this->connection_close = 0;
1255
-
1256
- return ("");
1257
- }
1258
-
1259
- function Redirect(&$headers) {
1260
- if ($this->follow_redirect) {
1261
- if (!isset($headers["location"]) || (GetType($headers["location"]) != "array" && strlen($location = $headers["location"]) == 0) || (GetType($headers["location"]) == "array" && strlen($location = $headers["location"][0]) == 0)) return ($this->SetError("it was received a redirect without location URL", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1262
- if (strcmp($location[0], "/")) {
1263
- if (!($location_arguments = @parse_url($location))) return ($this->SetError("the server did not return a valid redirection location URL", HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1264
- if (!isset($location_arguments["scheme"])) $location = ((GetType($end = strrpos($this->request_uri, "/")) == "integer" && $end > 1) ? substr($this->request_uri, 0, $end) : "") . "/" . $location;
1265
- }
1266
- if (!strcmp($location[0], "/")) $location = $this->protocol . "://" . $this->host_name . ($this->host_port ? ":" . $this->host_port : "") . $location;
1267
- $error = $this->GetRequestArguments($location, $arguments);
1268
- if (strlen($error)) return ($this->SetError("could not process redirect url: " . $error, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1269
- $arguments["RequestMethod"] = "GET";
1270
- if (strlen($error = $this->Close()) == 0 && strlen($error = $this->Open($arguments)) == 0 && strlen($error = $this->SendRequest($arguments)) == 0) {
1271
- $this->redirection_level++;
1272
- if ($this->redirection_level > $this->redirection_limit) {
1273
- $error = "it was exceeded the limit of request redirections";
1274
- $this->error_code = HTTP_CLIENT_ERROR_PROTOCOL_FAILURE;
1275
- } else
1276
- $error = $this->ReadReplyHeaders($headers);
1277
- $this->redirection_level--;
1278
- }
1279
- if (strlen($error)) return ($this->SetError($error, $this->error_code));
1280
- }
1281
-
1282
- return ("");
1283
- }
1284
-
1285
- function Authenticate(&$headers, $proxy, &$proxy_authorization, &$user, &$password, &$realm, &$workstation) {
1286
- if ($proxy) {
1287
- $authenticate_header = "proxy-authenticate";
1288
- $authorization_header = "Proxy-Authorization";
1289
- $authenticate_status = "407";
1290
- $authentication_mechanism = $this->proxy_authentication_mechanism;
1291
- } else {
1292
- $authenticate_header = "www-authenticate";
1293
- $authorization_header = "Authorization";
1294
- $authenticate_status = "401";
1295
- $authentication_mechanism = $this->authentication_mechanism;
1296
- }
1297
- if (isset($headers[$authenticate_header]) && $this->sasl_authenticate) {
1298
- if (function_exists("class_exists") && !class_exists("sasl_client_class")) return ($this->SetError("the SASL client class needs to be loaded to be able to authenticate" . ($proxy ? " with the proxy server" : "") . " and access this site", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1299
- if (GetType($headers[$authenticate_header]) == "array") $authenticate = $headers[$authenticate_header]; else
1300
- $authenticate = array($headers[$authenticate_header]);
1301
- for ($response = "", $mechanisms = array(), $m = 0; $m < count($authenticate); $m++) {
1302
- $mechanism = $this->Tokenize($authenticate[$m], " ");
1303
- $response = $this->Tokenize("");
1304
- if (strlen($authentication_mechanism)) {
1305
- if (!strcmp($authentication_mechanism, $mechanism)) {
1306
- $mechanisms[] = $mechanism;
1307
- break;
1308
- }
1309
- } else
1310
- $mechanisms[] = $mechanism;
1311
- }
1312
- $sasl = new sasl_client_class;
1313
- if (isset($user)) $sasl->SetCredential("user", $user);
1314
- if (isset($password)) $sasl->SetCredential("password", $password);
1315
- if (isset($realm)) $sasl->SetCredential("realm", $realm);
1316
- if (isset($workstation)) $sasl->SetCredential("workstation", $workstation);
1317
- $sasl->SetCredential("uri", $this->request_uri);
1318
- $sasl->SetCredential("method", $this->request_method);
1319
- $sasl->SetCredential("session", $this->session);
1320
- do {
1321
- $status = $sasl->Start($mechanisms, $message, $interactions);
1322
- } while ($status == SASL_INTERACT);
1323
- switch ($status) {
1324
- case SASL_CONTINUE:
1325
- break;
1326
- case SASL_NOMECH:
1327
- return ($this->SetError(($proxy ? "proxy " : "") . "authentication error: " . (strlen($authentication_mechanism) ? "authentication mechanism " . $authentication_mechanism . " may not be used: " : "") . $sasl->error, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1328
- default:
1329
- return ($this->SetError("Could not start the SASL " . ($proxy ? "proxy " : "") . "authentication client: " . $sasl->error, HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1330
- }
1331
- if ($proxy >= 0) {
1332
- for (; ;) {
1333
- if (strlen($error = $this->ReadReplyBody($body, $this->file_buffer_length))) return ($error);
1334
- if (strlen($body) == 0) break;
1335
- }
1336
- }
1337
- $authorization_value = $sasl->mechanism . (isset($message) ? " " . ($sasl->encode_response ? Base64::encode($message) : $message) : "");
1338
- $request_arguments = $this->request_arguments;
1339
- $arguments = $request_arguments;
1340
- $arguments["Headers"][$authorization_header] = $authorization_value;
1341
- if (!$proxy && strlen($proxy_authorization)) $arguments["Headers"]["Proxy-Authorization"] = $proxy_authorization;
1342
- if (strlen($error = $this->Close()) || strlen($error = $this->Open($arguments))) return ($this->SetError($error, $this->error_code));
1343
- $authenticated = 0;
1344
- if (isset($message)) {
1345
- if ($proxy < 0) {
1346
- if (strlen($error = $this->ConnectFromProxy($arguments, $headers))) return ($this->SetError($error, $this->error_code));
1347
- } else {
1348
- if (strlen($error = $this->SendRequest($arguments)) || strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($this->SetError($error, $this->error_code));
1349
- }
1350
- if (!isset($headers[$authenticate_header])) $authenticate = array(); elseif (GetType($headers[$authenticate_header]) == "array") $authenticate = $headers[$authenticate_header];
1351
- else
1352
- $authenticate = array($headers[$authenticate_header]);
1353
- for ($mechanism = 0; $mechanism < count($authenticate); $mechanism++) {
1354
- if (!strcmp($this->Tokenize($authenticate[$mechanism], " "), $sasl->mechanism)) {
1355
- $response = $this->Tokenize("");
1356
- break;
1357
- }
1358
- }
1359
- switch ($this->response_status) {
1360
- case $authenticate_status:
1361
- break;
1362
- case "301":
1363
- case "302":
1364
- case "303":
1365
- case "307":
1366
- if ($proxy >= 0) return ($this->Redirect($headers));
1367
- default:
1368
- if (intval($this->response_status / 100) == 2) {
1369
- if ($proxy) $proxy_authorization = $authorization_value;
1370
- $authenticated = 1;
1371
- break;
1372
- }
1373
- if ($proxy && !strcmp($this->response_status, "401")) {
1374
- $proxy_authorization = $authorization_value;
1375
- $authenticated = 1;
1376
- break;
1377
- }
1378
-
1379
- return ($this->SetError(($proxy ? "proxy " : "") . "authentication error: " . $this->response_status . " " . $this->response_message, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1380
- }
1381
- }
1382
- for (; !$authenticated;) {
1383
- do {
1384
- $status = $sasl->Step($response, $message, $interactions);
1385
- } while ($status == SASL_INTERACT);
1386
- switch ($status) {
1387
- case SASL_CONTINUE:
1388
- $authorization_value = $sasl->mechanism . (isset($message) ? " " . ($sasl->encode_response ? Base64::encode($message) : $message) : "");
1389
- $arguments = $request_arguments;
1390
- $arguments["Headers"][$authorization_header] = $authorization_value;
1391
- if (!$proxy && strlen($proxy_authorization)) $arguments["Headers"]["Proxy-Authorization"] = $proxy_authorization;
1392
- if ($proxy < 0) {
1393
- if (strlen($error = $this->ConnectFromProxy($arguments, $headers))) return ($this->SetError($error, $this->error_code));
1394
- } else {
1395
- if (strlen($error = $this->SendRequest($arguments)) || strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($this->SetError($error, $this->error_code));
1396
- }
1397
- switch ($this->response_status) {
1398
- case $authenticate_status:
1399
- if (GetType($headers[$authenticate_header]) == "array") $authenticate = $headers[$authenticate_header]; else
1400
- $authenticate = array($headers[$authenticate_header]);
1401
- for ($response = "", $mechanism = 0; $mechanism < count($authenticate); $mechanism++) {
1402
- if (!strcmp($this->Tokenize($authenticate[$mechanism], " "), $sasl->mechanism)) {
1403
- $response = $this->Tokenize("");
1404
- break;
1405
- }
1406
- }
1407
- if ($proxy >= 0) {
1408
- for (; ;) {
1409
- if (strlen($error = $this->ReadReplyBody($body, $this->file_buffer_length))) return ($error);
1410
- if (strlen($body) == 0) break;
1411
- }
1412
- }
1413
- $this->state = "Connected";
1414
- break;
1415
- case "301":
1416
- case "302":
1417
- case "303":
1418
- case "307":
1419
- if ($proxy >= 0) return ($this->Redirect($headers));
1420
- default:
1421
- if (intval($this->response_status / 100) == 2) {
1422
- if ($proxy) $proxy_authorization = $authorization_value;
1423
- $authenticated = 1;
1424
- break;
1425
- }
1426
- if ($proxy && !strcmp($this->response_status, "401")) {
1427
- $proxy_authorization = $authorization_value;
1428
- $authenticated = 1;
1429
- break;
1430
- }
1431
-
1432
- return ($this->SetError(($proxy ? "proxy " : "") . "authentication error: " . $this->response_status . " " . $this->response_message));
1433
- }
1434
- break;
1435
- default:
1436
- return ($this->SetError("Could not process the SASL " . ($proxy ? "proxy " : "") . "authentication step: " . $sasl->error, HTTP_CLIENT_ERROR_PROTOCOL_FAILURE));
1437
- }
1438
- }
1439
- }
1440
-
1441
- return ("");
1442
- }
1443
-
1444
- function ReadReplyHeaders(&$headers) {
1445
- if (strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($error);
1446
- $proxy_authorization = "";
1447
- while (!strcmp($this->response_status, "100")) {
1448
- $this->state = "RequestSent";
1449
- if (strlen($error = $this->ReadReplyHeadersResponse($headers))) return ($error);
1450
- }
1451
- switch ($this->response_status) {
1452
- case "301":
1453
- case "302":
1454
- case "303":
1455
- case "307":
1456
- if (strlen($error = $this->Redirect($headers))) return ($error);
1457
- break;
1458
- case "407":
1459
- if (strlen($error = $this->Authenticate($headers, 1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) return ($error);
1460
- if (strcmp($this->response_status, "401")) return ("");
1461
- case "401":
1462
- return ($this->Authenticate($headers, 0, $proxy_authorization, $this->request_user, $this->request_password, $this->request_realm, $this->request_workstation));
1463
- }
1464
-
1465
- return ("");
1466
- }
1467
-
1468
- function ReadReplyBody(&$body, $length) {
1469
- $body = "";
1470
- if (strlen($this->error)) return ($this->error);
1471
- switch ($this->state) {
1472
- case "Disconnected":
1473
- return ($this->SetError("connection was not yet established", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1474
- case "Connected":
1475
- case "ConnectedToProxy":
1476
- return ($this->SetError("request was not sent", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1477
- case "RequestSent":
1478
- if (($error = $this->ReadReplyHeaders($headers)) != "") return ($error);
1479
- break;
1480
- case "GotReplyHeaders":
1481
- break;
1482
- case 'ResponseReceived':
1483
- $body = '';
1484
-
1485
- return ('');
1486
- default:
1487
- return ($this->SetError("can not get request headers in the current connection state", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1488
- }
1489
- if ($this->content_length_set) $length = min($this->content_length - $this->read_length, $length);
1490
- $body = '';
1491
- if ($length > 0) {
1492
- if (!$this->EndOfInput() && ($body = $this->ReadBytes($length)) == "") {
1493
- if (strlen($this->error)) return ($this->SetError("could not get the request reply body: " . $this->error, $this->error_code));
1494
- }
1495
- $this->read_length += strlen($body);
1496
- if ($this->EndOfInput()) $this->state = 'ResponseReceived';
1497
- }
1498
-
1499
- return ("");
1500
- }
1501
-
1502
- function ReadWholeReplyBody(&$body) {
1503
- $body = '';
1504
- for (; ;) {
1505
- if (strlen($error = $this->ReadReplyBody($block, $this->file_buffer_length))) return ($error);
1506
- if (strlen($block) == 0) return ('');
1507
- $body .= $block;
1508
- }
1509
- }
1510
-
1511
- function ReadWholeReplyIntoTemporaryFile(&$file) {
1512
- if (!($file = tmpfile())) return $this->SetPHPError('could not create the temporary file to save the response', self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1513
- for (; ;) {
1514
- if (strlen($error = $this->ReadReplyBody($block, $this->file_buffer_length))) {
1515
- fclose($file);
1516
-
1517
- return ($error);
1518
- }
1519
- if (strlen($block) == 0) {
1520
- if (@fseek($file, 0) != 0) {
1521
- $error = $this->SetPHPError('could not seek to the beginning of temporary file with the response', self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1522
- fclose($file);
1523
-
1524
- return $error;
1525
- }
1526
-
1527
- return ('');
1528
- }
1529
- if (!@fwrite($file, $block)) {
1530
- $error = $this->SetPHPError('could not write to the temporary file to save the response', self::PHPErrorMessage(), HTTP_CLIENT_ERROR_CANNOT_ACCESS_LOCAL_FILE);
1531
- fclose($file);
1532
-
1533
- return $error;
1534
- }
1535
- }
1536
- }
1537
-
1538
- function SaveCookies(&$cookies, $domain = '', $secure_only = 0, $persistent_only = 0) {
1539
- $now = gmdate("Y-m-d H-i-s");
1540
- $cookies = array();
1541
- for ($secure_cookies = 0, Reset($this->cookies); $secure_cookies < count($this->cookies); Next($this->cookies), $secure_cookies++) {
1542
- $secure = Key($this->cookies);
1543
- if (!$secure_only || $secure) {
1544
- for ($cookie_domain = 0, Reset($this->cookies[$secure]); $cookie_domain < count($this->cookies[$secure]); Next($this->cookies[$secure]), $cookie_domain++) {
1545
- $domain_pattern = Key($this->cookies[$secure]);
1546
- $match = strlen($domain) - strlen($domain_pattern);
1547
- if (strlen($domain) == 0 || ($match >= 0 && !strcmp($domain_pattern, substr($domain, $match)) && ($match == 0 || $domain_pattern[0] == "." || $domain[$match - 1] == "."))) {
1548
- for (Reset($this->cookies[$secure][$domain_pattern]), $path_part = 0; $path_part < count($this->cookies[$secure][$domain_pattern]); Next($this->cookies[$secure][$domain_pattern]), $path_part++) {
1549
- $path = Key($this->cookies[$secure][$domain_pattern]);
1550
- for (Reset($this->cookies[$secure][$domain_pattern][$path]), $cookie = 0; $cookie < count($this->cookies[$secure][$domain_pattern][$path]); Next($this->cookies[$secure][$domain_pattern][$path]), $cookie++) {
1551
- $cookie_name = Key($this->cookies[$secure][$domain_pattern][$path]);
1552
- $expires = $this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
1553
- if ((!$persistent_only && strlen($expires) == 0) || (strlen($expires) && strcmp($now, $expires) < 0)) $cookies[$secure][$domain_pattern][$path][$cookie_name] = $this->cookies[$secure][$domain_pattern][$path][$cookie_name];
1554
- }
1555
- }
1556
- }
1557
- }
1558
- }
1559
- }
1560
- }
1561
-
1562
- function SavePersistentCookies(&$cookies, $domain = '', $secure_only = 0) {
1563
- $this->SaveCookies($cookies, $domain, $secure_only, 1);
1564
- }
1565
-
1566
- function GetPersistentCookies(&$cookies, $domain = '', $secure_only = 0) {
1567
- $this->SavePersistentCookies($cookies, $domain, $secure_only);
1568
- }
1569
-
1570
- function RestoreCookies($cookies, $clear = 1) {
1571
- $new_cookies = ($clear ? array() : $this->cookies);
1572
- for ($secure_cookies = 0, Reset($cookies); $secure_cookies < count($cookies); Next($cookies), $secure_cookies++) {
1573
- $secure = Key($cookies);
1574
- if (GetType($secure) != "integer") return ($this->SetError("invalid cookie secure value type (" . serialize($secure) . ")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1575
- for ($cookie_domain = 0, Reset($cookies[$secure]); $cookie_domain < count($cookies[$secure]); Next($cookies[$secure]), $cookie_domain++) {
1576
- $domain_pattern = Key($cookies[$secure]);
1577
- if (GetType($domain_pattern) != "string") return ($this->SetError("invalid cookie domain value type (" . serialize($domain_pattern) . ")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1578
- for (Reset($cookies[$secure][$domain_pattern]), $path_part = 0; $path_part < count($cookies[$secure][$domain_pattern]); Next($cookies[$secure][$domain_pattern]), $path_part++) {
1579
- $path = Key($cookies[$secure][$domain_pattern]);
1580
- if (GetType($path) != "string" || strcmp(substr($path, 0, 1), "/")) return ($this->SetError("invalid cookie path value type (" . serialize($path) . ")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1581
- for (Reset($cookies[$secure][$domain_pattern][$path]), $cookie = 0; $cookie < count($cookies[$secure][$domain_pattern][$path]); Next($cookies[$secure][$domain_pattern][$path]), $cookie++) {
1582
- $cookie_name = Key($cookies[$secure][$domain_pattern][$path]);
1583
- $expires = $cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"];
1584
- $value = $cookies[$secure][$domain_pattern][$path][$cookie_name]["value"];
1585
- if (GetType($expires) != "string" || (strlen($expires) && !preg_match("/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\$/", $expires))) return ($this->SetError("invalid cookie expiry value type (" . serialize($expires) . ")", HTTP_CLIENT_ERROR_INVALID_PARAMETERS));
1586
- $new_cookies[$secure][$domain_pattern][$path][$cookie_name] = array(
1587
- "name" => $cookie_name,
1588
- "value" => $value,
1589
- "domain" => $domain_pattern,
1590
- "path" => $path,
1591
- "expires" => $expires,
1592
- "secure" => $secure
1593
- );
1594
- }
1595
- }
1596
- }
1597
- }
1598
- $this->cookies = $new_cookies;
1599
-
1600
- return ("");
1601
- }
1602
- }
1603
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Nextend/Framework/Misc/OAuth/OAuth.php DELETED
@@ -1,2538 +0,0 @@
1
- <?php
2
-
3
- namespace Nextend\Framework\Misc\OAuth;
4
-
5
- /*
6
- {metadocument}<?xml version="1.0" encoding="ISO-8859-1" ?>
7
- <class>
8
-
9
- <package>net.manuellemos.oauth</package>
10
-
11
- <version>@(#) $Id: oauth_client.php,v 1.139 2015/07/23 20:41:37 mlemos Exp $</version>
12
- <copyright>Copyright � (C) Manuel Lemos 2012</copyright>
13
- <title>OAuth client</title>
14
- <author>Manuel Lemos</author>
15
- <authoraddress>mlemos-at-acm.org</authoraddress>
16
-
17
- <documentation>
18
- <idiom>en</idiom>
19
- <purpose>This class serves two main purposes:<paragraphbreak />
20
- 1) Implement the OAuth protocol to retrieve a token from a server to
21
- authorize the access to an API on behalf of the current
22
- user.<paragraphbreak />
23
- 2) Perform calls to a Web services API using a token previously
24
- obtained using this class or a token provided some other way by the
25
- Web services provider.</purpose>
26
- <usage>Regardless of your purposes, you always need to start calling
27
- the class <functionlink>Initialize</functionlink> function after
28
- initializing setup variables. After you are done with the class,
29
- always call the <functionlink>Finalize</functionlink> function at
30
- the end.<paragraphbreak />
31
- This class supports either OAuth protocol versions 1.0, 1.0a and
32
- 2.0. It abstracts the differences between these protocol versions,
33
- so the class usage is the same independently of the OAuth
34
- version of the server.<paragraphbreak />
35
- The class also provides built-in support to several popular OAuth
36
- servers, so you do not have to manually configure all the details to
37
- access those servers. Just set the
38
- <variablelink>server</variablelink> variable to configure the class
39
- to access one of the built-in supported servers.<paragraphbreak />
40
- If you need to access one type of server that is not yet directly
41
- supported by the class, you need to configure it explicitly setting
42
- the variables: <variablelink>oauth_version</variablelink>,
43
- <variablelink>url_parameters</variablelink>,
44
- <variablelink>authorization_header</variablelink>,
45
- <variablelink>request_token_url</variablelink>,
46
- <variablelink>dialog_url</variablelink>,
47
- <variablelink>pin_dialog_url</variablelink>,
48
- <variablelink>offline_dialog_url</variablelink>,
49
- <variablelink>append_state_to_redirect_uri</variablelink> and
50
- <variablelink>access_token_url</variablelink>.<paragraphbreak />
51
- Before proceeding to the actual OAuth authorization process, you
52
- need to have registered your application with the OAuth server. The
53
- registration provides you values to set the variables
54
- <variablelink>client_id</variablelink> and
55
- <variablelink>client_secret</variablelink>. Some servers also
56
- provide an additional value to set the
57
- <variablelink>api_key</variablelink> variable.<paragraphbreak />
58
- You also need to set the variables
59
- <variablelink>redirect_uri</variablelink> and
60
- <variablelink>scope</variablelink> before calling the
61
- <functionlink>Process</functionlink> function to make the class
62
- perform the necessary interactions with the OAuth
63
- server.<paragraphbreak />
64
- The OAuth protocol involves multiple steps that include redirection
65
- to the OAuth server. There it asks permission to the current user to
66
- grant your application access to APIs on his/her behalf. When there
67
- is a redirection, the class will set the
68
- <variablelink>exit</variablelink> variable to
69
- <booleanvalue>1</booleanvalue>. Then your script should exit
70
- immediately without outputting anything.<paragraphbreak />
71
- When the OAuth access token is successfully obtained, the following
72
- variables are set by the class with the obtained values:
73
- <variablelink>access_token</variablelink>,
74
- <variablelink>access_token_secret</variablelink>,
75
- <variablelink>access_token_expiry</variablelink>,
76
- <variablelink>access_token_type</variablelink>. You may want to
77
- store these values to use them later when calling the server
78
- APIs.<paragraphbreak />
79
- If there was a problem during OAuth authorization process, check the
80
- variable <variablelink>authorization_error</variablelink> to
81
- determine the reason.<paragraphbreak />
82
- Once you get the access token, you can call the server APIs using
83
- the <functionlink>CallAPI</functionlink> function. Check the
84
- <variablelink>access_token_error</variablelink> variable to
85
- determine if there was an error when trying to to call the
86
- API.<paragraphbreak />
87
- If for some reason the user has revoked the access to your
88
- application, you need to ask the user to authorize your application
89
- again. First you may need to call the function
90
- <functionlink>ResetAccessToken</functionlink> to reset the value of
91
- the access token that may be cached in session variables.</usage>
92
- </documentation>
93
-
94
- {/metadocument}
95
- */
96
-
97
- use Exception;
98
- use Nextend\Framework\Misc\Base64;
99
- use SimpleXMLElement;
100
-
101
- class OAuth {
102
-
103
- /*
104
- {metadocument}
105
- <variable>
106
- <name>error</name>
107
- <type>STRING</type>
108
- <value></value>
109
- <documentation>
110
- <purpose>Store the message that is returned when an error
111
- occurs.</purpose>
112
- <usage>Check this variable to understand what happened when a call to
113
- any of the class functions has failed.<paragraphbreak />
114
- This class uses cumulative error handling. This means that if one
115
- class functions that may fail is called and this variable was
116
- already set to an error message due to a failure in a previous call
117
- to the same or other function, the function will also fail and does
118
- not do anything.<paragraphbreak />
119
- This allows programs using this class to safely call several
120
- functions that may fail and only check the failure condition after
121
- the last function call.<paragraphbreak />
122
- Just set this variable to an empty string to clear the error
123
- condition.</usage>
124
- </documentation>
125
- </variable>
126
- {/metadocument}
127
- */
128
- var $error = '';
129
-
130
- /*
131
- {metadocument}
132
- <variable>
133
- <name>debug</name>
134
- <type>BOOLEAN</type>
135
- <value>0</value>
136
- <documentation>
137
- <purpose>Control whether debug output is enabled</purpose>
138
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if you
139
- need to check what is going on during calls to the class. When
140
- enabled, the debug output goes either to the variable
141
- <variablelink>debug_output</variablelink> and the PHP error log.</usage>
142
- </documentation>
143
- </variable>
144
- {/metadocument}
145
- */
146
- var $debug = false;
147
-
148
- /*
149
- {metadocument}
150
- <variable>
151
- <name>debug_http</name>
152
- <type>BOOLEAN</type>
153
- <value>0</value>
154
- <documentation>
155
- <purpose>Control whether the dialog with the remote Web server
156
- should also be logged.</purpose>
157
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if you
158
- want to inspect the data exchange with the OAuth server.</usage>
159
- </documentation>
160
- </variable>
161
- {/metadocument}
162
- */
163
- var $debug_http = false;
164
-
165
- /*
166
- {metadocument}
167
- <variable>
168
- <name>exit</name>
169
- <type>BOOLEAN</type>
170
- <value>0</value>
171
- <documentation>
172
- <purpose>Determine if the current script should be exited.</purpose>
173
- <usage>Check this variable after calling the
174
- <functionlink>Process</functionlink> function and exit your script
175
- immediately if the variable is set to
176
- <booleanvalue>1</booleanvalue>.</usage>
177
- </documentation>
178
- </variable>
179
- {/metadocument}
180
- */
181
- var $exit = false;
182
-
183
- /*
184
- {metadocument}
185
- <variable>
186
- <name>debug_output</name>
187
- <type>STRING</type>
188
- <value></value>
189
- <documentation>
190
- <purpose>Capture the debug output generated by the class</purpose>
191
- <usage>Inspect this variable if you need to see what happened during
192
- the class function calls.</usage>
193
- </documentation>
194
- </variable>
195
- {/metadocument}
196
- */
197
- var $debug_output = '';
198
-
199
- /*
200
- {metadocument}
201
- <variable>
202
- <name>debug_prefix</name>
203
- <type>STRING</type>
204
- <value>OAuth client: </value>
205
- <documentation>
206
- <purpose>Mark the lines of the debug output to identify actions
207
- performed by this class.</purpose>
208
- <usage>Change this variable if you prefer the debug output lines to
209
- be prefixed with a different text.</usage>
210
- </documentation>
211
- </variable>
212
- {/metadocument}
213
- */
214
- var $debug_prefix = 'OAuth client: ';
215
-
216
- /*
217
- {metadocument}
218
- <variable>
219
- <name>server</name>
220
- <type>STRING</type>
221
- <value></value>
222
- <documentation>
223
- <purpose>Identify the type of OAuth server to access.</purpose>
224
- <usage>The class provides built-in support to several types of OAuth
225
- servers. This means that the class can automatically initialize
226
- several configuration variables just by setting this server
227
- variable.<paragraphbreak />
228
- Currently it supports the following servers:
229
- <stringvalue>37Signals</stringvalue>,
230
- <stringvalue>Amazon</stringvalue>,
231
- <stringvalue>AOL</stringvalue>,
232
- <stringvalue>Bitbucket</stringvalue>,
233
- <stringvalue>Bitly</stringvalue>,
234
- <stringvalue>Box</stringvalue>,
235
- <stringvalue>Buffer</stringvalue>,
236
- <stringvalue>Copy</stringvalue>,
237
- <stringvalue>Dailymotion</stringvalue>,
238
- <stringvalue>Discogs</stringvalue>,
239
- <stringvalue>Disqus</stringvalue>,
240
- <stringvalue>Dropbox</stringvalue> (Dropbox with OAuth 1.0),
241
- <stringvalue>Dropbox2</stringvalue> (Dropbox with OAuth 2.0),
242
- <stringvalue>Etsy</stringvalue>,
243
- <stringvalue>Eventful</stringvalue>,
244
- <stringvalue>Facebook</stringvalue>,
245
- <stringvalue>Fitbit</stringvalue>,
246
- <stringvalue>Flickr</stringvalue>,
247
- <stringvalue>Foursquare</stringvalue>,
248
- <stringvalue>github</stringvalue>,
249
- <stringvalue>Google</stringvalue>,
250
- <stringvalue>Google1</stringvalue> (Google with OAuth 1.0),
251
- <stringvalue>imgur</stringvalue>,
252
- <stringvalue>Intuit</stringvalue>,
253
- <stringvalue>Instagram</stringvalue>,
254
- <stringvalue>Jawbone</stringvalue>,
255
- <stringvalue>LinkedIn</stringvalue>,
256
- <stringvalue>LinkedIn2</stringvalue> (LinkedIn with OAuth 2.0),
257
- <stringvalue>mail.ru</stringvalue>,
258
- <stringvalue>MailChimp</stringvalue>,
259
- <stringvalue>Mavenlink</stringvalue>,
260
- <stringvalue>Meetup</stringvalue>,
261
- <stringvalue>Microsoft</stringvalue>,
262
- <stringvalue>Misfit</stringvalue>,
263
- <stringvalue>oDesk</stringvalue>,
264
- <stringvalue>Paypal</stringvalue>,
265
- <stringvalue>PaypalApplication</stringvalue>,
266
- <stringvalue>Rdio</stringvalue>,
267
- <stringvalue>Reddit</stringvalue>,
268
- <stringvalue>RunKeeper</stringvalue>,
269
- <stringvalue>Salesforce</stringvalue>,
270
- <stringvalue>Scoop.it</stringvalue>,
271
- <stringvalue>StockTwits</stringvalue>,
272
- <stringvalue>SurveyMonkey</stringvalue>,
273
- <stringvalue>TeamViewer</stringvalue>,
274
- <stringvalue>Tumblr</stringvalue>,
275
- <stringvalue>Twitter</stringvalue>,
276
- <stringvalue>Vimeo</stringvalue>,
277
- <stringvalue>VK</stringvalue>,
278
- <stringvalue>Withings</stringvalue>,
279
- <stringvalue>Wordpress</stringvalue>,
280
- <stringvalue>Xero</stringvalue>,
281
- <stringvalue>XING</stringvalue>,
282
- <stringvalue>Yahoo</stringvalue> and
283
- <stringvalue>Yandex</stringvalue>. Please contact the author if you
284
- would like to ask to add built-in support for other types of OAuth
285
- servers.<paragraphbreak />
286
- If you want to access other types of OAuth servers that are not
287
- yet supported, set this variable to an empty string and configure
288
- other variables with values specific to those servers.</usage>
289
- </documentation>
290
- </variable>
291
- {/metadocument}
292
- */
293
- var $server = '';
294
-
295
- /*
296
- {metadocument}
297
- <variable>
298
- <name>configuration_file</name>
299
- <type>STRING</type>
300
- <value>oauth_configuration.json</value>
301
- <documentation>
302
- <purpose>Specify the path of the configuration file that defines the
303
- properties of additional OAuth server types.</purpose>
304
- <usage>Change the path in this variable if you are accessing a type
305
- of server without support built-in the class and you need to put
306
- the configuration file path in a different directory.</usage>
307
- </documentation>
308
- </variable>
309
- {/metadocument}
310
- */
311
- var $configuration_file = 'oauth_configuration.json';
312
-
313
- /*
314
- {metadocument}
315
- <variable>
316
- <name>request_token_url</name>
317
- <type>STRING</type>
318
- <value></value>
319
- <documentation>
320
- <purpose>URL of the OAuth server to request the initial token for
321
- OAuth 1.0 and 1.0a servers.</purpose>
322
- <usage>Set this variable to the OAuth request token URL when you are
323
- not accessing one of the built-in supported OAuth
324
- servers.<paragraphbreak />
325
- For OAuth 1.0 and 1.0a servers, the request token URL can have
326
- certain marks that will act as template placeholders which will be
327
- replaced with given values before requesting the authorization
328
- token. Currently it supports the following placeholder
329
- marks:<paragraphbreak />
330
- {SCOPE} - scope of the requested permissions to the granted by the
331
- OAuth server with the user permissions</usage>
332
- </documentation>
333
- </variable>
334
- {/metadocument}
335
- */
336
- var $request_token_url = '';
337
-
338
- /*
339
- {metadocument}
340
- <variable>
341
- <name>dialog_url</name>
342
- <type>STRING</type>
343
- <value></value>
344
- <documentation>
345
- <purpose>URL of the OAuth server to redirect the browser so the user
346
- can grant access to your application.</purpose>
347
- <usage>Set this variable to the OAuth request token URL when you are
348
- not accessing one of the built-in supported OAuth servers.<paragraphbreak />
349
- For OAuth 1.0a servers that return the login dialog URL
350
- automatically, set this variable to
351
- <stringvalue>automatic</stringvalue><paragraphbreak />
352
- For certain servers, the dialog URL can have certain marks that
353
- will act as template placeholders which will be replaced with
354
- values defined before redirecting the users browser. Currently it
355
- supports the following placeholder marks:<paragraphbreak />
356
- {REDIRECT_URI} - URL to redirect when returning from the OAuth
357
- server authorization page<paragraphbreak />
358
- {CLIENT_ID} - client application identifier registered at the
359
- server<paragraphbreak />
360
- {SCOPE} - scope of the requested permissions to the granted by the
361
- OAuth server with the user permissions<paragraphbreak />
362
- {STATE} - identifier of the OAuth session state<paragraphbreak />
363
- {API_KEY} - API key to access the server<paragraphbreak />
364
- {REALM} - realm name for OpenID Connect</usage>
365
- </documentation>
366
- </variable>
367
- {/metadocument}
368
- */
369
- var $dialog_url = '';
370
-
371
- /*
372
- {metadocument}
373
- <variable>
374
- <name>pin_dialog_url</name>
375
- <type>STRING</type>
376
- <value></value>
377
- <documentation>
378
- <purpose>URL of the OAuth server to redirect the browser so the user
379
- can grant access to your application.</purpose>
380
- <usage>Set this variable when using the pin based authorization and
381
- the format of the of the authorization dialog page URL is
382
- different than the one set to the
383
- <variablelink>dialog_url</variablelink> variable.</usage>
384
- </documentation>
385
- </variable>
386
- {/metadocument}
387
- */
388
- var $pin_dialog_url = '';
389
-
390
- /*
391
- {metadocument}
392
- <variable>
393
- <name>offline_dialog_url</name>
394
- <type>STRING</type>
395
- <value></value>
396
- <documentation>
397
- <purpose>URL of the OAuth server to redirect the browser so the user
398
- can grant access to your application when offline access is
399
- requested.</purpose>
400
- <usage>Set this variable to the OAuth request token URL when you are
401
- not accessing one of the built-in supported OAuth servers and the
402
- OAuth server supports offline access.<paragraphbreak />
403
- It should have the same format as the
404
- <variablelink>dialog_url</variablelink> variable.</usage>
405
- </documentation>
406
- </variable>
407
- {/metadocument}
408
- */
409
- var $offline_dialog_url = '';
410
-
411
- /*
412
- {metadocument}
413
- <variable>
414
- <name>pin</name>
415
- <type>STRING</type>
416
- <value></value>
417
- <documentation>
418
- <purpose>Value of the pin code for pin based authorization.</purpose>
419
- <usage>Set this value to the pin informed by the user when
420
- implementing the pin based authorization.<paragraphbreak />
421
- Make sure the <variablelink>redirect_uri</variablelink> variable
422
- is set to <stringvalue>oob</stringvalue>.</usage>
423
- </documentation>
424
- </variable>
425
- {/metadocument}
426
- */
427
- var $pin = '';
428
-
429
- /*
430
- {metadocument}
431
- <variable>
432
- <name>append_state_to_redirect_uri</name>
433
- <type>STRING</type>
434
- <value></value>
435
- <documentation>
436
- <purpose>Pass the OAuth session state in a variable with a different
437
- name to work around implementation bugs of certain OAuth
438
- servers</purpose>
439
- <usage>Set this variable when you are not accessing one of the
440
- built-in supported OAuth servers if the OAuth server has a bug
441
- that makes it not pass back the OAuth state identifier in a
442
- request variable named state.</usage>
443
- </documentation>
444
- </variable>
445
- {/metadocument}
446
- */
447
- var $append_state_to_redirect_uri = '';
448
-
449
- /*
450
- {metadocument}
451
- <variable>
452
- <name>access_token_url</name>
453
- <type>STRING</type>
454
- <value></value>
455
- <documentation>
456
- <purpose>OAuth server URL that will return the access token
457
- URL.</purpose>
458
- <usage>Set this variable to the OAuth access token URL when you are
459
- not accessing one of the built-in supported OAuth servers.</usage>
460
- </documentation>
461
- </variable>
462
- {/metadocument}
463
- */
464
- var $access_token_url = '';
465
-
466
-
467
- /*
468
- {metadocument}
469
- <variable>
470
- <name>oauth_version</name>
471
- <type>STRING</type>
472
- <value>2.0</value>
473
- <documentation>
474
- <purpose>Version of the protocol version supported by the OAuth
475
- server.</purpose>
476
- <usage>Set this variable to the OAuth server protocol version when
477
- you are not accessing one of the built-in supported OAuth
478
- servers.</usage>
479
- </documentation>
480
- </variable>
481
- {/metadocument}
482
- */
483
- var $oauth_version = '2.0';
484
-
485
- /*
486
- {metadocument}
487
- <variable>
488
- <name>url_parameters</name>
489
- <type>BOOLEAN</type>
490
- <value>0</value>
491
- <documentation>
492
- <purpose>Determine if the API call parameters should be moved to the
493
- call URL.</purpose>
494
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
495
- API you need to call requires that the call parameters always be
496
- passed via the API URL.</usage>
497
- </documentation>
498
- </variable>
499
- {/metadocument}
500
- */
501
- var $url_parameters = false;
502
-
503
- /*
504
- {metadocument}
505
- <variable>
506
- <name>authorization_header</name>
507
- <type>BOOLEAN</type>
508
- <value>1</value>
509
- <documentation>
510
- <purpose>Determine if the OAuth parameters should be passed via HTTP
511
- Authorization request header.</purpose>
512
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
513
- OAuth server requires that the OAuth parameters be passed using
514
- the HTTP Authorization instead of the request URI parameters.</usage>
515
- </documentation>
516
- </variable>
517
- {/metadocument}
518
- */
519
- var $authorization_header = true;
520
-
521
- /*
522
- {metadocument}
523
- <variable>
524
- <name>token_request_method</name>
525
- <type>STRING</type>
526
- <value>GET</value>
527
- <documentation>
528
- <purpose>Define the HTTP method that should be used to request
529
- tokens from the server.</purpose>
530
- <usage>Set this variable to <stringvalue>POST</stringvalue> if the
531
- OAuth server does not support requesting tokens using the HTTP GET
532
- method.</usage>
533
- </documentation>
534
- </variable>
535
- {/metadocument}
536
- */
537
- var $token_request_method = 'GET';
538
-
539
- /*
540
- {metadocument}
541
- <variable>
542
- <name>signature_method</name>
543
- <type>STRING</type>
544
- <value>HMAC-SHA1</value>
545
- <documentation>
546
- <purpose>Define the method to generate the signature for API request
547
- parameters values.</purpose>
548
- <usage>Currently it supports <stringvalue>PLAINTEXT</stringvalue>
549
- and <stringvalue>HMAC-SHA1</stringvalue>.</usage>
550
- </documentation>
551
- </variable>
552
- {/metadocument}
553
- */
554
- var $signature_method = 'HMAC-SHA1';
555
-
556
- /*
557
- {metadocument}
558
- <variable>
559
- <name>redirect_uri</name>
560
- <type>STRING</type>
561
- <value></value>
562
- <documentation>
563
- <purpose>URL of the current script page that is calling this
564
- class</purpose>
565
- <usage>Set this variable to the current script page URL before
566
- proceeding the the OAuth authorization process.<paragraphbreak />
567
- For pin based authorization, set this variable to
568
- <stringvalue>oob</stringvalue>.</usage>
569
- </documentation>
570
- </variable>
571
- {/metadocument}
572
- */
573
- var $redirect_uri = '';
574
-
575
- /*
576
- {metadocument}
577
- <variable>
578
- <name>client_id</name>
579
- <type>STRING</type>
580
- <value></value>
581
- <documentation>
582
- <purpose>Identifier of your application registered with the OAuth
583
- server</purpose>
584
- <usage>Set this variable to the application identifier that is
585
- provided by the OAuth server when you register the
586
- application.</usage>
587
- </documentation>
588
- </variable>
589
- {/metadocument}
590
- */
591
- var $client_id = '';
592
-
593
- /*
594
- {metadocument}
595
- <variable>
596
- <name>client_secret</name>
597
- <type>STRING</type>
598
- <value></value>
599
- <documentation>
600
- <purpose>Secret value assigned to your application when it is
601
- registered with the OAuth server.</purpose>
602
- <usage>Set this variable to the application secret that is provided
603
- by the OAuth server when you register the application.</usage>
604
- </documentation>
605
- </variable>
606
- {/metadocument}
607
- */
608
- var $client_secret = '';
609
-
610
- /*
611
- {metadocument}
612
- <variable>
613
- <name>api_key</name>
614
- <type>STRING</type>
615
- <value></value>
616
- <documentation>
617
- <purpose>Identifier of your API key provided by the OAuth
618
- server</purpose>
619
- <usage>Set this variable to the API key if the OAuth server requires
620
- one.</usage>
621
- </documentation>
622
- </variable>
623
- {/metadocument}
624
- */
625
- var $api_key = '';
626
-
627
- /*
628
- {metadocument}
629
- <variable>
630
- <name>get_token_with_api_key</name>
631
- <type>BOOLEAN</type>
632
- <value>0</value>
633
- <documentation>
634
- <purpose>Option to determine if the access token should be retrieved
635
- using the API key value instead of the client secret.</purpose>
636
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
637
- OAuth server requires that the client secret be set to the API key
638
- when retrieving the OAuth token.</usage>
639
- </documentation>
640
- </variable>
641
- {/metadocument}
642
- */
643
- var $get_token_with_api_key = false;
644
-
645
- /*
646
- {metadocument}
647
- <variable>
648
- <name>scope</name>
649
- <type>STRING</type>
650
- <value></value>
651
- <documentation>
652
- <purpose>Permissions that your application needs to call the OAuth
653
- server APIs</purpose>
654
- <usage>Check the documentation of the APIs that your application
655
- needs to call to set this variable with the identifiers of the
656
- permissions that the user needs to grant to your application.</usage>
657
- </documentation>
658
- </variable>
659
- {/metadocument}
660
- */
661
- var $scope = '';
662
-
663
- /*
664
- {metadocument}
665
- <variable>
666
- <name>realm</name>
667
- <type>STRING</type>
668
- <value></value>
669
- <documentation>
670
- <purpose>Realm of authorization for OpenID Connect</purpose>
671
- <usage>Set this variable to the realm value when using OpenID
672
- Connect.</usage>
673
- </documentation>
674
- </variable>
675
- {/metadocument}
676
- */
677
- var $realm = '';
678
-
679
- /*
680
- {metadocument}
681
- <variable>
682
- <name>offline</name>
683
- <type>BOOLEAN</type>
684
- <value>0</value>
685
- <documentation>
686
- <purpose>Specify whether it will be necessary to call the API when
687
- the user is not present and the server supports renewing expired
688
- access tokens using refresh tokens.</purpose>
689
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
690
- server supports renewing expired tokens automatically when the
691
- user is not present.</usage>
692
- </documentation>
693
- </variable>
694
- {/metadocument}
695
- */
696
- var $offline = false;
697
-
698
- /*
699
- {metadocument}
700
- <variable>
701
- <name>access_token</name>
702
- <type>STRING</type>
703
- <value></value>
704
- <documentation>
705
- <purpose>Access token obtained from the OAuth server</purpose>
706
- <usage>Check this variable to get the obtained access token upon
707
- successful OAuth authorization.</usage>
708
- </documentation>
709
- </variable>
710
- {/metadocument}
711
- */
712
- var $access_token = '';
713
-
714
- /*
715
- {metadocument}
716
- <variable>
717
- <name>access_token_secret</name>
718
- <type>STRING</type>
719
- <value></value>
720
- <documentation>
721
- <purpose>Access token secret obtained from the OAuth server</purpose>
722
- <usage>If the OAuth protocol version is 1.0 or 1.0a, check this
723
- variable to get the obtained access token secret upon successful
724
- OAuth authorization.</usage>
725
- </documentation>
726
- </variable>
727
- {/metadocument}
728
- */
729
- var $access_token_secret = '';
730
-
731
- /*
732
- {metadocument}
733
- <variable>
734
- <name>access_token_expiry</name>
735
- <type>STRING</type>
736
- <value></value>
737
- <documentation>
738
- <purpose>Timestamp of the expiry of the access token obtained from
739
- the OAuth server.</purpose>
740
- <usage>Check this variable to get the obtained access token expiry
741
- time upon successful OAuth authorization. If this variable is
742
- empty, that means no expiry time was set.</usage>
743
- </documentation>
744
- </variable>
745
- {/metadocument}
746
- */
747
- var $access_token_expiry = '';
748
-
749
- /*
750
- {metadocument}
751
- <variable>
752
- <name>access_token_type</name>
753
- <type>STRING</type>
754
- <value></value>
755
- <documentation>
756
- <purpose>Type of access token obtained from the OAuth server.</purpose>
757
- <usage>Check this variable to get the obtained access token type
758
- upon successful OAuth authorization.</usage>
759
- </documentation>
760
- </variable>
761
- {/metadocument}
762
- */
763
- var $access_token_type = '';
764
-
765
- /*
766
- {metadocument}
767
- <variable>
768
- <name>default_access_token_type</name>
769
- <type>STRING</type>
770
- <value></value>
771
- <documentation>
772
- <purpose>Type of access token to be assumed when the OAuth server
773
- does not specify an access token type.</purpose>
774
- <usage>Set this variable if the server requires a certain type of
775
- access token to be used but it does not specify a token type
776
- when the access token is returned.</usage>
777
- </documentation>
778
- </variable>
779
- {/metadocument}
780
- */
781
- var $default_access_token_type = '';
782
-
783
-
784
- /*
785
- {metadocument}
786
- <variable>
787
- <name>access_token_parameter</name>
788
- <type>STRING</type>
789
- <value></value>
790
- <documentation>
791
- <purpose>Name of the access token parameter to be passed in API call
792
- requests.</purpose>
793
- <usage>Set this variable to a non-empty string to override the
794
- default name for the access token parameter which is
795
- <stringvalue>oauth_token</stringvalue> of OAuth 1 and
796
- <stringvalue>access_token</stringvalue> for OAuth 2.</usage>
797
- </documentation>
798
- </variable>
799
- {/metadocument}
800
- */
801
- var $access_token_parameter = '';
802
-
803
-
804
- /*
805
- {metadocument}
806
- <variable>
807
- <name>access_token_response</name>
808
- <type>ARRAY</type>
809
- <documentation>
810
- <purpose>The original response for the access token request</purpose>
811
- <usage>Check this variable if the OAuth server returns custom
812
- parameters in the request to obtain the access token.</usage>
813
- </documentation>
814
- </variable>
815
- {/metadocument}
816
- */
817
- var $access_token_response;
818
-
819
- /*
820
- {metadocument}
821
- <variable>
822
- <name>store_access_token_response</name>
823
- <type>BOOLEAN</type>
824
- <value>0</value>
825
- <documentation>
826
- <purpose>Option to determine if the original response for the access
827
- token request should be stored in the
828
- <variablelink>access_token_response</variablelink>
829
- variable.</purpose>
830
- <usage>Set this variable to <booleanvalue>1</booleanvalue> if the
831
- OAuth server returns custom parameters in the request to obtain
832
- the access token that may be needed in subsequent API calls.</usage>
833
- </documentation>
834
- </variable>
835
- {/metadocument}
836
- */
837
- var $store_access_token_response = false;
838
-
839
- /*
840
- {metadocument}
841
- <variable>
842
- <name>access_token_authentication</name>
843
- <type>STRING</type>
844
- <value></value>
845
- <documentation>
846
- <purpose>Option to determine if the requests to obtain a new access
847
- token should use authentication to pass the application client ID
848
- and secret.</purpose>
849
- <usage>Set this variable to <stringvalue>basic</stringvalue> if the
850
- OAuth server requires that the the client ID and secret be passed
851
- using HTTP basic authentication headers when retrieving a new
852
- token.</usage>
853
- </documentation>
854
- </variable>
855
- {/metadocument}
856
- */
857
- var $access_token_authentication = '';
858
-
859
- /*
860
- {metadocument}
861
- <variable>
862
- <name>refresh_token</name>
863
- <type>STRING</type>
864
- <value></value>
865
- <documentation>
866
- <purpose>Refresh token obtained from the OAuth server</purpose>
867
- <usage>Check this variable to get the obtained refresh token upon
868
- successful OAuth authorization.</usage>
869
- </documentation>
870
- </variable>
871
- {/metadocument}
872
- */
873
- var $refresh_token = '';
874
-
875
- /*
876
- {metadocument}
877
- <variable>
878
- <name>access_token_error</name>
879
- <type>STRING</type>
880
- <value></value>
881
- <documentation>
882
- <purpose>Error message returned when a call to the API fails.</purpose>
883
- <usage>Check this variable to determine if there was an error while
884
- calling the Web services API when using the
885
- <functionlink>CallAPI</functionlink> function.</usage>
886
- </documentation>
887
- </variable>
888
- {/metadocument}
889
- */
890
- var $access_token_error = '';
891
-
892
- /*
893
- {metadocument}
894
- <variable>
895
- <name>authorization_error</name>
896
- <type>STRING</type>
897
- <value></value>
898
- <documentation>
899
- <purpose>Error message returned when it was not possible to obtain
900
- an OAuth access token</purpose>
901
- <usage>Check this variable to determine if there was an error while
902
- trying to obtain the OAuth access token.</usage>
903
- </documentation>
904
- </variable>
905
- {/metadocument}
906
- */
907
- var $authorization_error = '';
908
-
909
- /*
910
- {metadocument}
911
- <variable>
912
- <name>response_status</name>
913
- <type>INTEGER</type>
914
- <value>0</value>
915
- <documentation>
916
- <purpose>HTTP response status returned by the server when calling an
917
- API</purpose>
918
- <usage>Check this variable after calling the
919
- <functionlink>CallAPI</functionlink> function if the API calls and you
920
- need to process the error depending the response status.
921
- <integervalue>200</integervalue> means no error.
922
- <integervalue>0</integervalue> means the server response was not
923
- retrieved.</usage>
924
- </documentation>
925
- </variable>
926
- {/metadocument}
927
- */
928
- var $response_status = 0;
929
-
930
- /*
931
- {metadocument}
932
- <variable>
933
- <name>oauth_username</name>
934
- <type>STRING</type>
935
- <value></value>
936
- <documentation>
937
- <purpose>Define the user name to obtain authorization using a password.</purpose>
938
- <usage>Set this variable to the user name of the account to
939
- authorize instead of going through the interactive user
940
- authorization process.</usage>
941
- </documentation>
942
- </variable>
943
- {/metadocument}
944
- */
945
- var $oauth_username = '';
946
-
947
- /*
948
- {metadocument}
949
- <variable>
950
- <name>oauth_password</name>
951
- <type>STRING</type>
952
- <value></value>
953
- <documentation>
954
- <purpose>Define the user name to obtain authorization using a password.</purpose>
955
- <usage>Set this variable to the user password of the account to
956
- authorize instead of going through the interactive user
957
- authorization process.</usage>
958
- </documentation>
959
- </variable>
960
- {/metadocument}
961
- */
962
- var $oauth_password = '';
963
-
964
- /*
965
- {metadocument}
966
- <variable>
967
- <name>grant_type</name>
968
- <type>STRING</type>
969
- <value>authorization_code</value>
970
- <documentation>
971
- <purpose>Define the type of grant to obtain the OAuth 2 access
972
- token.</purpose>
973
- <usage>Change this variable to
974
- <stringvalue>client_credentials</stringvalue> to obtain
975
- application only access token.<paragraphbreak />
976
- Change this variable to <stringvalue>password</stringvalue> to
977
- obtain an access token on behalf of an user with a given username
978
- and password specified by the
979
- <variablelink>oauth_username</variablelink> and
980
- <variablelink>oauth_password</variablelink> variables
981
- respectively.<paragraphbreak />In this case the user does not need
982
- to be present, so the class will not redirect the user to the
983
- authorization dialog page.<paragraphbreak />
984
- </usage>
985
- </documentation>
986
- </variable>
987
- {/metadocument}
988
- */
989
- var $grant_type = "authorization_code";
990
-
991
- /*
992
- {metadocument}
993
- <variable>
994
- <name>http_arguments</name>
995
- <type>HASH</type>
996
- <value></value>
997
- <documentation>
998
- <purpose>Define additional arguments to configure the HTTP
999
- requests.</purpose>
1000
- <usage>Set this associative array with argument values that you need
1001
- to set options of the HTTP requests sent to the OAuth server and
1002
- API URLs.<paragraphbreak />
1003
- Check the documentation of the <link>
1004
- <data>HTTP client class</data>
1005
- <url>http://www.phpclasses.org/httpclient</url>
1006
- </link> for more
1007
- information on the available arguments that can be configured
1008
- using this option.</usage>
1009
- </documentation>
1010
- </variable>
1011
- {/metadocument}
1012
- */
1013
- var $http_arguments = array();
1014
- var $oauth_user_agent = 'PHP-OAuth-API (http://www.phpclasses.org/oauth-api $Revision: 1.139 $)';
1015
-
1016
- var $response_time = 0;
1017
-
1018
- function __construct() {
1019
- $this->configuration_file = dirname(__FILE__) . '/oauth_configuration.json';
1020
- }
1021
-
1022
- public static function PHPErrorMessage() {
1023
- $lastError = error_get_last();
1024
- if ($lastError === null) {
1025
- return '';
1026
- }
1027
-
1028
- return $lastError['message'];
1029
- }
1030
-
1031
- function SetError($error) {
1032
- $this->error = $error;
1033
- if ($this->debug) $this->OutputDebug('Error: ' . $error);
1034
-
1035
- return (false);
1036
- }
1037
-
1038
- function SetPHPError($error, $php_error_message) {
1039
- if (isset($php_error_message) && strlen($php_error_message)) $error .= ": " . $php_error_message;
1040
-
1041
- return ($this->SetError($error));
1042
- }
1043
-
1044
- function OutputDebug($message) {
1045
- if ($this->debug) {
1046
- $message = $this->debug_prefix . $message;
1047
- $this->debug_output .= $message . "\n";
1048
- error_log($message);
1049
- }
1050
-
1051
- return (true);
1052
- }
1053
-
1054
- function GetRequestTokenURL(&$request_token_url) {
1055
- $request_token_url = $this->request_token_url;
1056
-
1057
- return (true);
1058
- }
1059
-
1060
- function GetDialogURL(&$url, $redirect_uri = '', $state = '') {
1061
- $url = (($this->offline && strlen($this->offline_dialog_url)) ? $this->offline_dialog_url : (($redirect_uri === 'oob' && strlen($this->pin_dialog_url)) ? $this->pin_dialog_url : $this->dialog_url));
1062
- if (strlen($url) === 0) return $this->SetError('the dialog URL ' . ($this->offline ? 'for offline access ' : '') . 'is not defined for this server');
1063
- $url = str_replace('{REDIRECT_URI}', UrlEncode($redirect_uri), str_replace('{STATE}', UrlEncode($state), str_replace('{CLIENT_ID}', UrlEncode($this->client_id), str_replace('{API_KEY}', UrlEncode($this->api_key), str_replace('{SCOPE}', UrlEncode($this->scope), str_replace('{REALM}', UrlEncode($this->realm), $url))))));
1064
-
1065
- return (true);
1066
- }
1067
-
1068
- function GetAccessTokenURL(&$access_token_url) {
1069
- $access_token_url = str_replace('{API_KEY}', $this->api_key, $this->access_token_url);
1070
-
1071
- return (true);
1072
- }
1073
-
1074
- function GetStoredState(&$state) {
1075
- if (!function_exists('session_start')) return $this->SetError('Session variables are not accessible in this PHP environment');
1076
- if (session_id() === '' && !session_start()) return ($this->SetPHPError('it was not possible to start the PHP session', self::PHPErrorMessage()));
1077
- if (isset($_SESSION['OAUTH_STATE'])) $state = $_SESSION['OAUTH_STATE']; else
1078
- $state = $_SESSION['OAUTH_STATE'] = time() . '-' . substr(md5(rand() . time()), 0, 6);
1079
-
1080
- return (true);
1081
- }
1082
-
1083
- function GetRequestState(&$state) {
1084
- $check = (strlen($this->append_state_to_redirect_uri) ? $this->append_state_to_redirect_uri : 'state');
1085
- $state = (isset($_GET[$check]) ? $_GET[$check] : null);
1086
-
1087
- return (true);
1088
- }
1089
-
1090
- function GetRequestCode(&$code) {
1091
- $code = (isset($_GET['code']) ? $_GET['code'] : null);
1092
-
1093
- return (true);
1094
- }
1095
-
1096
- function GetRequestError(&$error) {
1097
- $error = (isset($_GET['error']) ? $_GET['error'] : null);
1098
-
1099
- return (true);
1100
- }
1101
-
1102
- function GetRequestDenied(&$denied) {
1103
- $denied = (isset($_GET['denied']) ? $_GET['denied'] : null);
1104
-
1105
- return (true);
1106
- }
1107
-
1108
- function GetRequestToken(&$token, &$verifier) {
1109
- $token = (isset($_GET['oauth_token']) ? $_GET['oauth_token'] : null);
1110
- $verifier = (isset($_GET['oauth_verifier']) ? $_GET['oauth_verifier'] : null);
1111
-
1112
- return (true);
1113
- }
1114
-
1115
- function GetRedirectURI(&$redirect_uri) {
1116
- if (strlen($this->redirect_uri)) $redirect_uri = $this->redirect_uri; else
1117
- $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
1118
-
1119
- return true;
1120
- }
1121
-
1122
- /*
1123
- {metadocument}
1124
- <function>
1125
- <name>Redirect</name>
1126
- <type>VOID</type>
1127
- <documentation>
1128
- <purpose>Redirect the user browser to a given page.</purpose>
1129
- <usage>This function is meant to be only be called from inside the
1130
- class. By default it issues HTTP 302 response status and sets the
1131
- redirection location to a given URL. Sub-classes may override this
1132
- function to implement a different way to redirect the user
1133
- browser.</usage>
1134
- </documentation>
1135
- <argument>
1136
- <name>url</name>
1137
- <type>STRING</type>
1138
- <documentation>
1139
- <purpose>String with the full URL of the page to redirect.</purpose>
1140
- </documentation>
1141
- </argument>
1142
- <do>
1143
- {/metadocument}
1144
- */
1145
- function Redirect($url) {
1146
- Header('HTTP/1.0 302 OAuth Redirection');
1147
- Header('Location: ' . $url);
1148
- }
1149
- /*
1150
- {metadocument}
1151
- </do>
1152
- </function>
1153
- {/metadocument}
1154
- */
1155
-
1156
- /*
1157
- {metadocument}
1158
- <function>
1159
- <name>StoreAccessToken</name>
1160
- <type>BOOLEAN</type>
1161
- <documentation>
1162
- <purpose>Store the values of the access token when it is succefully
1163
- retrieved from the OAuth server.</purpose>
1164
- <usage>This function is meant to be only be called from inside the
1165
- class. By default it stores access tokens in a session variable
1166
- named <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1167
- Actual implementations should create a sub-class and override this
1168
- function to make the access token values be stored in other types
1169
- of containers, like for instance databases.</usage>
1170
- <returnvalue>This function should return
1171
- <booleanvalue>1</booleanvalue> if the access token was stored
1172
- successfully.</returnvalue>
1173
- </documentation>
1174
- <argument>
1175
- <name>access_token</name>
1176
- <type>HASH</type>
1177
- <documentation>
1178
- <purpose>Associative array with properties of the access token.
1179
- The array may have set the following
1180
- properties:<paragraphbreak />
1181
- <stringvalue>value</stringvalue>: string value of the access
1182
- token<paragraphbreak />
1183
- <stringvalue>authorized</stringvalue>: boolean value that
1184
- determines if the access token was obtained
1185
- successfully<paragraphbreak />
1186
- <stringvalue>expiry</stringvalue>: (optional) timestamp in ISO
1187
- format relative to UTC time zone of the access token expiry
1188
- time<paragraphbreak />
1189
- <stringvalue>type</stringvalue>: (optional) type of OAuth token
1190
- that may determine how it should be used when sending API call
1191
- requests.<paragraphbreak />
1192
- <stringvalue>refresh</stringvalue>: (optional) token that some
1193
- servers may set to allowing refreshing access tokens when they
1194
- expire.</purpose>
1195
- </documentation>
1196
- </argument>
1197
- <do>
1198
- {/metadocument}
1199
- */
1200
- function StoreAccessToken($access_token) {
1201
- if (!function_exists('session_start')) return $this->SetError('Session variables are not accessible in this PHP environment');
1202
- if (session_id() === '' && !session_start()) return ($this->SetPHPError('it was not possible to start the PHP session', self::PHPErrorMessage()));
1203
- if (!$this->GetAccessTokenURL($access_token_url)) return false;
1204
- $_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url] = $access_token;
1205
-
1206
- return true;
1207
- }
1208
- /*
1209
- {metadocument}
1210
- </do>
1211
- </function>
1212
- {/metadocument}
1213
- */
1214
-
1215
- /*
1216
- {metadocument}
1217
- <function>
1218
- <name>GetAccessToken</name>
1219
- <type>BOOLEAN</type>
1220
- <documentation>
1221
- <purpose>Retrieve the OAuth access token if it was already
1222
- previously stored by the
1223
- <functionlink>StoreAccessToken</functionlink> function.</purpose>
1224
- <usage>This function is meant to be only be called from inside the
1225
- class. By default it retrieves access tokens stored in a session
1226
- variable named
1227
- <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1228
- Actual implementations should create a sub-class and override this
1229
- function to retrieve the access token values from other types of
1230
- containers, like for instance databases.</usage>
1231
- <returnvalue>This function should return
1232
- <booleanvalue>1</booleanvalue> if the access token was retrieved
1233
- successfully.</returnvalue>
1234
- </documentation>
1235
- <argument>
1236
- <name>access_token</name>
1237
- <type>STRING</type>
1238
- <out />
1239
- <documentation>
1240
- <purpose>Return the properties of the access token in an
1241
- associative array. If the access token was not yet stored, it
1242
- returns an empty array. Otherwise, the properties it may return
1243
- are the same that may be passed to the
1244
- <functionlink>StoreAccessToken</functionlink>.</purpose>
1245
- </documentation>
1246
- </argument>
1247
- <do>
1248
- {/metadocument}
1249
- */
1250
- function GetAccessToken(&$access_token) {
1251
- if (!function_exists('session_start')) return $this->SetError('Session variables are not accessible in this PHP environment');
1252
- if (session_id() === '' && !session_start()) return ($this->SetPHPError('it was not possible to start the PHP session', self::PHPErrorMessage()));
1253
- if (!$this->GetAccessTokenURL($access_token_url)) return false;
1254
- if (isset($_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url])) $access_token = $_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url]; else
1255
- $access_token = array();
1256
-
1257
- return true;
1258
- }
1259
- /*
1260
- {metadocument}
1261
- </do>
1262
- </function>
1263
- {/metadocument}
1264
- */
1265
-
1266
- /*
1267
- {metadocument}
1268
- <function>
1269
- <name>ResetAccessToken</name>
1270
- <type>BOOLEAN</type>
1271
- <documentation>
1272
- <purpose>Reset the access token to a state back when the user has
1273
- not yet authorized the access to the OAuth server API.</purpose>
1274
- <usage>Call this function if for some reason the token to access
1275
- the API was revoked and you need to ask the user to authorize
1276
- the access again.<paragraphbreak />
1277
- By default the class stores and retrieves access tokens in a
1278
- session variable named
1279
- <stringvalue>OAUTH_ACCESS_TOKEN</stringvalue>.<paragraphbreak />
1280
- This function must be called when the user is accessing your site
1281
- pages, so it can reset the information stored in session variables
1282
- that cache the state of a previously retrieved access
1283
- token.<paragraphbreak />
1284
- Actual implementations should create a sub-class and override this
1285
- function to reset the access token state when it is stored in
1286
- other types of containers, like for instance databases.</usage>
1287
- <returnvalue>This function should return
1288
- <booleanvalue>1</booleanvalue> if the access token was resetted
1289
- successfully.</returnvalue>
1290
- </documentation>
1291
- <do>
1292
- {/metadocument}
1293
- */
1294
- function ResetAccessToken() {
1295
- if (!$this->GetAccessTokenURL($access_token_url)) return false;
1296
- if ($this->debug) $this->OutputDebug('Resetting the access token status for OAuth server located at ' . $access_token_url);
1297
- if (!function_exists('session_start')) return $this->SetError('Session variables are not accessible in this PHP environment');
1298
- if (session_id() === '' && !session_start()) return ($this->SetPHPError('it was not possible to start the PHP session', self::PHPErrorMessage()));
1299
- unset($_SESSION['OAUTH_ACCESS_TOKEN'][$access_token_url]);
1300
- unset($_SESSION['OAUTH_STATE']);
1301
-
1302
- return true;
1303
- }
1304
-
1305
- /*
1306
- {metadocument}
1307
- </do>
1308
- </function>
1309
- {/metadocument}
1310
- */
1311
-
1312
- function Encode($value) {
1313
- return (is_array($value) ? $this->EncodeArray($value) : str_replace('%7E', '~', str_replace('+', ' ', RawURLEncode($value))));
1314
- }
1315
-
1316
- function EncodeArray($array) {
1317
- foreach ($array as $key => $value) $array[$key] = $this->Encode($value);
1318
-
1319
- return $array;
1320
- }
1321
-
1322
- function HMAC($function, $data, $key) {
1323
- switch ($function) {
1324
- case 'sha1':
1325
- $pack = 'H40';
1326
- break;
1327
- default:
1328
- if ($this->debug) $this->OutputDebug($function . ' is not a supported an HMAC hash type');
1329
-
1330
- return ('');
1331
- }
1332
- if (strlen($key) > 64) $key = pack($pack, $function($key));
1333
- if (strlen($key) < 64) $key = str_pad($key, 64, "\0");
1334
-
1335
- return (pack($pack, $function((str_repeat("\x5c", 64) ^ $key) . pack($pack, $function((str_repeat("\x36", 64) ^ $key) . $data)))));
1336
- }
1337
-
1338
- function Sign(&$url, $method, $parameters, $oauth, $request_content_type, $has_files, $post_values_in_uri, &$authorization, &$post_values) {
1339
- $values = array(
1340
- 'oauth_consumer_key' => $this->client_id,
1341
- 'oauth_nonce' => md5(uniqid(rand(), true)),
1342
- 'oauth_signature_method' => $this->signature_method,
1343
- 'oauth_timestamp' => time(),
1344
- 'oauth_version' => '1.0',
1345
- );
1346
- if ($has_files) $value_parameters = array(); else {
1347
- if (($this->url_parameters || $method !== 'POST') && $request_content_type === 'application/x-www-form-urlencoded' && count($parameters)) {
1348
- $first = (strpos($url, '?') === false);
1349
- foreach ($parameters as $parameter => $value) {
1350
- $url .= ($first ? '?' : '&') . UrlEncode($parameter) . '=' . UrlEncode($value);
1351
- $first = false;
1352
- }
1353
- $parameters = array();
1354
- }
1355
- $value_parameters = (($request_content_type !== 'application/x-www-form-urlencoded') ? array() : $parameters);
1356
- }
1357
- $header_values = ($method === 'GET' ? array_merge($values, $oauth, $value_parameters) : array_merge($values, $oauth));
1358
- $values = array_merge($values, $oauth, $value_parameters);
1359
- $key = $this->Encode($this->client_secret) . '&' . $this->Encode($this->access_token_secret);
1360
- switch ($this->signature_method) {
1361
- case 'PLAINTEXT':
1362
- $values['oauth_signature'] = $key;
1363
- break;
1364
- case 'HMAC-SHA1':
1365
- $uri = strtok($url, '?');
1366
- $sign = $method . '&' . $this->Encode($uri) . '&';
1367
- $first = true;
1368
- $sign_values = $values;
1369
- $u = parse_url($url);
1370
- if (isset($u['query'])) {
1371
- parse_str($u['query'], $q);
1372
- foreach ($q as $parameter => $value) $sign_values[$parameter] = $value;
1373
- }
1374
- KSort($sign_values);
1375
- foreach ($sign_values as $parameter => $value) {
1376
- $sign .= $this->Encode(($first ? '' : '&') . $parameter . '=' . $this->Encode($value));
1377
- $first = false;
1378
- }
1379
- $header_values['oauth_signature'] = $values['oauth_signature'] = Base64::encode($this->HMAC('sha1', $sign, $key));
1380
- break;
1381
- default:
1382
- return $this->SetError($this->signature_method . ' signature method is not yet supported');
1383
- }
1384
- if ($this->authorization_header) {
1385
- $authorization = 'OAuth';
1386
- $first = true;
1387
- foreach ($header_values as $parameter => $value) {
1388
- $authorization .= ($first ? ' ' : ',') . $parameter . '="' . $this->Encode($value) . '"';
1389
- $first = false;
1390
- }
1391
- $post_values = $parameters;
1392
- } else {
1393
- if ($method !== 'POST' || $post_values_in_uri) {
1394
- $first = (strcspn($url, '?') == strlen($url));
1395
- foreach ($values as $parameter => $value) {
1396
- $url .= ($first ? '?' : '&') . $parameter . '=' . $this->Encode($value);
1397
- $first = false;
1398
- }
1399
- $post_values = array();
1400
- } else
1401
- $post_values = $values;
1402
- }
1403
-
1404
- return true;
1405
- }
1406
-
1407
- function SendAPIRequest($url, $method, $parameters, $oauth, $options, &$response) {
1408
- $this->response_status = 0;
1409
- $http = new HTTP();
1410
- $http->debug = ($this->debug && $this->debug_http);
1411
- $http->log_debug = true;
1412
- $http->sasl_authenticate = 0;
1413
- $http->user_agent = $this->oauth_user_agent;
1414
- $http->redirection_limit = (isset($options['FollowRedirection']) ? intval($options['FollowRedirection']) : 0);
1415
- $http->follow_redirect = ($http->redirection_limit != 0);
1416
- if ($this->debug) $this->OutputDebug('Accessing the ' . $options['Resource'] . ' at ' . $url);
1417
- $post_files = array();
1418
- $method = strtoupper($method);
1419
- $authorization = '';
1420
- $request_content_type = (isset($options['RequestContentType']) ? strtolower(trim(strtok($options['RequestContentType'], ';'))) : (($method === 'POST' || isset($oauth)) ? 'application/x-www-form-urlencoded' : ''));
1421
- $files = (isset($options['Files']) ? $options['Files'] : array());
1422
- if (count($files)) {
1423
- foreach ($files as $name => $value) {
1424
- if (!isset($parameters[$name])) return ($this->SetError('it was not specified a file parameter named ' . $name));
1425
- $file = array();
1426
- $value_type = isset($value['Type']) ? $value['Type'] : 'FileName';
1427
- switch ($value_type) {
1428
- case 'FileName':
1429
- $file['FileName'] = $parameters[$name];
1430
- if (isset($value['FileName'])) $file['Name'] = $value['FileName'];
1431
- break;
1432
- case 'Data':
1433
- $file['Data'] = $parameters[$name];
1434
- if (!isset($value['FileName'])) return ($this->SetError('it was not specified the file name for data file parameter ' . $name));
1435
- $file['Name'] = $value['FileName'];
1436
- break;
1437
- default:
1438
- return ($this->SetError($value_type . ' is not a valid type for file ' . $name));
1439
- }
1440
- $file['Content-Type'] = (isset($value['ContentType']) ? $value['ContentType'] : 'automatic/name');
1441
- $post_files[$name] = $file;
1442
- }
1443
- unset($parameters[$name]);
1444
- if ($method !== 'POST') {
1445
- $this->OutputDebug('For uploading files the method should be POST not ' . $method);
1446
- $method = 'POST';
1447
- }
1448
- if ($request_content_type !== 'multipart/form-data') {
1449
- if (isset($options['RequestContentType'])) return ($this->SetError('the request content type for uploading files should be multipart/form-data'));
1450
- $request_content_type = 'multipart/form-data';
1451
- }
1452
- }
1453
- if (isset($oauth)) {
1454
- if (!$this->Sign($url, $method, $parameters, $oauth, $request_content_type, count($files) !== 0, isset($options['PostValuesInURI']) && $options['PostValuesInURI'], $authorization, $post_values)) return false;
1455
- } else {
1456
- $post_values = $parameters;
1457
- if (count($parameters)) {
1458
- switch ($request_content_type) {
1459
- case 'application/x-www-form-urlencoded':
1460
- case 'multipart/form-data':
1461
- case 'application/json':
1462
- case 'application/javascript':
1463
- break;
1464
- default:
1465
- $first = (strpos($url, '?') === false);
1466
- foreach ($parameters as $name => $value) {
1467
- if (GetType($value) === 'array') {
1468
- foreach ($value as $index => $data) {
1469
- $url .= ($first ? '?' : '&') . $name . '=' . UrlEncode($data);
1470
- $first = false;
1471
- }
1472
- } else {
1473
- $url .= ($first ? '?' : '&') . $name . '=' . UrlEncode($value);
1474
- $first = false;
1475
- }
1476
- }
1477
- }
1478
- }
1479
- }
1480
- if (strlen($authorization) === 0 && !strcasecmp($this->access_token_type, 'Bearer')) $authorization = 'Bearer ' . $this->access_token;
1481
- if (strlen($error = $http->GetRequestArguments($url, $arguments))) return ($this->SetError('it was not possible to open the ' . $options['Resource'] . ' URL: ' . $error));
1482
- $arguments = array_merge($this->http_arguments, $arguments);
1483
- if (strlen($error = $http->Open($arguments))) return ($this->SetError('it was not possible to open the ' . $options['Resource'] . ' URL: ' . $error));
1484
- if (count($post_files)) $arguments['PostFiles'] = $post_files;
1485
- $arguments['RequestMethod'] = $method;
1486
- switch ($request_content_type) {
1487
- case 'application/x-www-form-urlencoded':
1488
- case 'multipart/form-data':
1489
- if (isset($options['RequestBody'])) return ($this->SetError('the request body is defined automatically from the parameters'));
1490
- $arguments['PostValues'] = $post_values;
1491
- break;
1492
- case 'application/json':
1493
- case 'application/javascript':
1494
- $arguments['Headers']['Content-Type'] = $options['RequestContentType'];
1495
- $arguments['Body'] = (isset($options['RequestBody']) ? $options['RequestBody'] : json_encode($parameters));
1496
- break;
1497
- default:
1498
- if (!isset($options['RequestBody'])) {
1499
- if (isset($options['RequestContentType'])) return ($this->SetError('it was not specified the body value of the of the API call request'));
1500
- break;
1501
- }
1502
- $arguments['Headers']['Content-Type'] = $options['RequestContentType'];
1503
- $arguments['Body'] = $options['RequestBody'];
1504
- break;
1505
- }
1506
- $arguments['Headers']['Accept'] = (isset($options['Accept']) ? $options['Accept'] : '*/*');
1507
- switch ($authentication = (isset($options['AccessTokenAuthentication']) ? strtolower($options['AccessTokenAuthentication']) : '')) {
1508
- case 'basic':
1509
- $arguments['Headers']['Authorization'] = 'Basic ' . Base64::encode($this->client_id . ':' . ($this->get_token_with_api_key ? $this->api_key : $this->client_secret));
1510
- break;
1511
- case '':
1512
- if (strlen($authorization)) $arguments['Headers']['Authorization'] = $authorization;
1513
- break;
1514
- default:
1515
- return ($this->SetError($authentication . ' is not a supported authentication mechanism to retrieve an access token'));
1516
- }
1517
- if (isset($options['RequestHeaders'])) $arguments['Headers'] = array_merge($arguments['Headers'], $options['RequestHeaders']);
1518
- if (strlen($error = $http->SendRequest($arguments)) || strlen($error = $http->ReadReplyHeaders($headers))) {
1519
- $http->Close();
1520
-
1521
- return ($this->SetError('it was not possible to retrieve the ' . $options['Resource'] . ': ' . $error));
1522
- }
1523
- $error = $http->ReadWholeReplyBody($data);
1524
- $http->Close();
1525
- if (strlen($error)) {
1526
- return ($this->SetError('it was not possible to access the ' . $options['Resource'] . ': ' . $error));
1527
- }
1528
- $this->response_status = intval($http->response_status);
1529
- $content_type = (isset($options['ResponseContentType']) ? $options['ResponseContentType'] : (isset($headers['content-type']) ? strtolower(trim(strtok($headers['content-type'], ';'))) : 'unspecified'));
1530
- $content_type = preg_replace('/^(.+\\/).+\\+(.+)$/', '\\1\\2', $content_type);
1531
- $this->response_time = (isset($headers['date']) ? strtotime(GetType($headers['date']) === 'array' ? $headers['date'][0] : $headers['date']) : time());
1532
- switch ($content_type) {
1533
- case 'text/javascript':
1534
- case 'application/json':
1535
- case 'application/javascript':
1536
- if (!function_exists('json_decode')) return ($this->SetError('the JSON extension is not available in this PHP setup'));
1537
- $object = json_decode($data);
1538
- switch (GetType($object)) {
1539
- case 'object':
1540
- if (!isset($options['ConvertObjects']) || !$options['ConvertObjects']) $response = $object; else {
1541
- $response = array();
1542
- foreach ($object as $property => $value) $response[$property] = $value;
1543
- }
1544
- break;
1545
- case 'array':
1546
- $response = $object;
1547
- break;
1548
- default:
1549
- if (!isset($object)) return ($this->SetError('it was not returned a valid JSON definition of the ' . $options['Resource'] . ' values'));
1550
- $response = $object;
1551
- break;
1552
- }
1553
- break;
1554
- case 'application/x-www-form-urlencoded':
1555
- case 'text/plain':
1556
- case 'text/html':
1557
- parse_str($data, $response);
1558
- break;
1559
- case 'text/xml':
1560
- if (isset($options['DecodeXMLResponse'])) {
1561
- switch (strtolower($options['DecodeXMLResponse'])) {
1562
- case 'simplexml':
1563
- if ($this->debug) $this->OutputDebug('Decoding XML response with simplexml');
1564
- try {
1565
- $response = @new SimpleXMLElement($data);
1566
- } catch (Exception $exception) {
1567
- return $this->SetError('Could not parse XML response: ' . $exception->getMessage());
1568
- }
1569
- break 2;
1570
- default:
1571
- return $this->SetError($options['DecodeXML'] . ' is not a supported method to decode XML responses');
1572
- }
1573
- }
1574
- default:
1575
- $response = $data;
1576
- break;
1577
- }
1578
- if ($this->response_status >= 200 && $this->response_status < 300) $this->access_token_error = ''; else {
1579
- $this->access_token_error = 'it was not possible to access the ' . $options['Resource'] . ': it was returned an unexpected response status ' . $http->response_status . ' Response: ' . $data;
1580
- if ($this->debug) $this->OutputDebug('Could not retrieve the OAuth access token. Error: ' . $this->access_token_error);
1581
- if (isset($options['FailOnAccessError']) && $options['FailOnAccessError']) {
1582
- $this->error = $this->access_token_error;
1583
-
1584
- return false;
1585
- }
1586
- }
1587
-
1588
- return true;
1589
- }
1590
-
1591
- function ProcessToken1($oauth, &$access_token) {
1592
- if (!$this->GetAccessTokenURL($url)) return false;
1593
- $options = array('Resource' => 'OAuth access token');
1594
- $method = strtoupper($this->token_request_method);
1595
- switch ($method) {
1596
- case 'GET':
1597
- break;
1598
- case 'POST':
1599
- $options['PostValuesInURI'] = true;
1600
- break;
1601
- default:
1602
- $this->error = $method . ' is not a supported method to request tokens';
1603
-
1604
- return false;
1605
- }
1606
- if (!$this->SendAPIRequest($url, $method, array(), $oauth, $options, $response)) return false;
1607
- if (strlen($this->access_token_error)) {
1608
- $this->authorization_error = $this->access_token_error;
1609
-
1610
- return true;
1611
- }
1612
- if (!isset($response['oauth_token']) || !isset($response['oauth_token_secret'])) {
1613
- $this->authorization_error = 'it was not returned the access token and secret';
1614
-
1615
- return true;
1616
- }
1617
- $access_token = array(
1618
- 'value' => $response['oauth_token'],
1619
- 'secret' => $response['oauth_token_secret'],
1620
- 'authorized' => true
1621
- );
1622
- if (isset($response['oauth_expires_in']) && $response['oauth_expires_in'] == 0) {
1623
- if ($this->debug) $this->OutputDebug('Ignoring access token expiry set to 0');
1624
- $this->access_token_expiry = '';
1625
- } elseif (isset($response['oauth_expires_in'])) {
1626
- $expires = $response['oauth_expires_in'];
1627
- if (strval($expires) !== strval(intval($expires)) || $expires <= 0) return ($this->SetError('OAuth server did not return a supported type of access token expiry time'));
1628
- $this->access_token_expiry = gmstrftime('%Y-%m-%d %H:%M:%S', $this->response_time + $expires);
1629
- if ($this->debug) $this->OutputDebug('Access token expiry: ' . $this->access_token_expiry . ' UTC');
1630
- $access_token['expiry'] = $this->access_token_expiry;
1631
- } else
1632
- $this->access_token_expiry = '';
1633
- if (isset($response['oauth_session_handle'])) {
1634
- $access_token['refresh'] = $response['oauth_session_handle'];
1635
- if ($this->debug) $this->OutputDebug('Refresh token: ' . $access_token['refresh']);
1636
- }
1637
-
1638
- return $this->StoreAccessToken($access_token);
1639
- }
1640
-
1641
- function ProcessToken2($code, $refresh) {
1642
- if (!$this->GetRedirectURI($redirect_uri)) return false;
1643
- $authentication = $this->access_token_authentication;
1644
- if (strlen($this->oauth_username)) {
1645
- $values = array(
1646
- 'grant_type' => 'password',
1647
- 'username' => $this->oauth_username,
1648
- 'password' => $this->oauth_password,
1649
- 'redirect_uri' => $redirect_uri
1650
- );
1651
- $authentication = 'Basic';
1652
- } elseif ($this->redirect_uri === 'oob' && strlen($this->pin)) {
1653
- $values = array(
1654
- 'grant_type' => 'pin',
1655
- 'pin' => $this->pin,
1656
- 'scope' => $this->scope,
1657
- );
1658
- } elseif ($refresh) {
1659
- $values = array(
1660
- 'refresh_token' => $this->refresh_token,
1661
- 'grant_type' => 'refresh_token',
1662
- 'scope' => $this->scope,
1663
- );
1664
- } else {
1665
- switch ($this->grant_type) {
1666
- case 'password':
1667
- return $this->SetError('it was not specified the username for obtaining a password based OAuth 2 authorization');
1668
- case 'authorization_code':
1669
- $values = array(
1670
- 'code' => $code,
1671
- 'redirect_uri' => $redirect_uri,
1672
- 'grant_type' => 'authorization_code'
1673
- );
1674
- $authentication = $this->access_token_authentication;
1675
- break;
1676
- case 'client_credentials':
1677
- $values = array(
1678
- 'grant_type' => 'client_credentials'
1679
- );
1680
- $authentication = 'Basic';
1681
- break;
1682
- default:
1683
- return $this->SetError($this->grant_type . ' is not yet a supported OAuth 2 grant type');
1684
- }
1685
- }
1686
- $options = array(
1687
- 'Resource' => 'OAuth ' . ($refresh ? 'refresh' : 'access') . ' token',
1688
- 'ConvertObjects' => true
1689
- );
1690
- switch (strtolower($authentication)) {
1691
- case 'basic':
1692
- $options['AccessTokenAuthentication'] = $authentication;
1693
- break;
1694
- case '':
1695
- $values['client_id'] = $this->client_id;
1696
- $values['client_secret'] = ($this->get_token_with_api_key ? $this->api_key : $this->client_secret);
1697
- break;
1698
- default:
1699
- return ($this->SetError($authentication . ' is not a supported authentication mechanism to retrieve an access token'));
1700
- }
1701
- if (!$this->GetAccessTokenURL($access_token_url)) return false;
1702
- if (!$this->SendAPIRequest($access_token_url, 'POST', $values, null, $options, $response)) return false;
1703
- if (strlen($this->access_token_error)) {
1704
- $this->authorization_error = $this->access_token_error;
1705
-
1706
- return true;
1707
- }
1708
- if (!isset($response['access_token'])) {
1709
- if (isset($response['error'])) {
1710
- $this->authorization_error = 'it was not possible to retrieve the access token: it was returned the error: ' . $response['error'];
1711
-
1712
- return true;
1713
- }
1714
-
1715
- return ($this->SetError('OAuth server did not return the access token'));
1716
- }
1717
- $access_token = array(
1718
- 'value' => ($this->access_token = $response['access_token']),
1719
- 'authorized' => true,
1720
- );
1721
- if ($this->store_access_token_response) $access_token['response'] = $this->access_token_response = $response;
1722
- if ($this->debug) $this->OutputDebug('Access token: ' . $this->access_token);
1723
- if (isset($response['expires_in']) && $response['expires_in'] == 0) {
1724
- if ($this->debug) $this->OutputDebug('Ignoring access token expiry set to 0');
1725
- $this->access_token_expiry = '';
1726
- } elseif (isset($response['expires']) || isset($response['expires_in'])) {
1727
- $expires = (isset($response['expires_in']) ? $response['expires_in'] : $response['expires'] - ($response['expires'] > $this->response_time ? $this->response_time : 0));
1728
- if (strval($expires) !== strval(intval($expires)) || $expires <= 0) return ($this->SetError('OAuth server did not return a supported type of access token expiry time'));
1729
- $this->access_token_expiry = gmstrftime('%Y-%m-%d %H:%M:%S', $this->response_time + $expires);
1730
- if ($this->debug) $this->OutputDebug('Access token expiry: ' . $this->access_token_expiry . ' UTC');
1731
- $access_token['expiry'] = $this->access_token_expiry;
1732
- } else
1733
- $this->access_token_expiry = '';
1734
- if (isset($response['token_type'])) {
1735
- $this->access_token_type = $response['token_type'];
1736
- if (strlen($this->access_token_type) && $this->debug) $this->OutputDebug('Access token type: ' . $this->access_token_type);
1737
- $access_token['type'] = $this->access_token_type;
1738
- } else {
1739
- $this->access_token_type = $this->default_access_token_type;
1740
- if (strlen($this->access_token_type) && $this->debug) $this->OutputDebug('Assumed the default for OAuth access token type which is ' . $this->access_token_type);
1741
- }
1742
- if (isset($response['refresh_token'])) {
1743
- $this->refresh_token = $response['refresh_token'];
1744
- if ($this->debug) $this->OutputDebug('Refresh token: ' . $this->refresh_token);
1745
- $access_token['refresh'] = $this->refresh_token;
1746
- } elseif (strlen($this->refresh_token)) {
1747
- if ($this->debug) $this->OutputDebug('Reusing previous refresh token: ' . $this->refresh_token);
1748
- $access_token['refresh'] = $this->refresh_token;
1749
- }
1750
-
1751
- return $this->StoreAccessToken($access_token);
1752
- }
1753
-
1754
- function RetrieveToken(&$valid) {
1755
- $valid = false;
1756
- if (!$this->GetAccessToken($access_token)) return false;
1757
- if (isset($access_token['value'])) {
1758
- $this->access_token_expiry = '';
1759
- $expired = (isset($access_token['expiry']) && strcmp($this->access_token_expiry = $access_token['expiry'], gmstrftime('%Y-%m-%d %H:%M:%S')) < 0);
1760
- if ($expired) {
1761
- if ($this->debug) $this->OutputDebug('The OAuth access token expired on ' . $this->access_token_expiry . ' UTC');
1762
- }
1763
- $this->access_token = $access_token['value'];
1764
- if (!$expired && $this->debug) $this->OutputDebug('The OAuth access token ' . $this->access_token . ' is valid');
1765
- if (isset($access_token['type'])) {
1766
- $this->access_token_type = $access_token['type'];
1767
- if (strlen($this->access_token_type) && !$expired && $this->debug) $this->OutputDebug('The OAuth access token is of type ' . $this->access_token_type);
1768
- } else {
1769
- $this->access_token_type = $this->default_access_token_type;
1770
- if (strlen($this->access_token_type) && !$expired && $this->debug) $this->OutputDebug('Assumed the default for OAuth access token type which is ' . $this->access_token_type);
1771
- }
1772
- if (isset($access_token['secret'])) {
1773
- $this->access_token_secret = $access_token['secret'];
1774
- if ($this->debug && !$expired && strlen($this->access_token_secret)) $this->OutputDebug('The OAuth access token secret is ' . $this->access_token_secret);
1775
- }
1776
- if (isset($access_token['refresh'])) $this->refresh_token = $access_token['refresh']; else
1777
- $this->refresh_token = '';
1778
- $this->access_token_response = (($this->store_access_token_response && isset($access_token['response'])) ? $access_token['response'] : null);
1779
- $valid = true;
1780
- }
1781
-
1782
- return true;
1783
- }
1784
-
1785
- /*
1786
- {metadocument}
1787
- <function>
1788
- <name>CallAPI</name>
1789
- <type>BOOLEAN</type>
1790
- <documentation>
1791
- <purpose>Send a HTTP request to the Web services API using a
1792
- previously obtained authorization token via OAuth.</purpose>
1793
- <usage>This function can be used to call an API after having
1794
- previously obtained an access token through the OAuth protocol
1795
- using the <functionlink>Process</functionlink> function, or by
1796
- directly setting the variables
1797
- <variablelink>access_token</variablelink>, as well as
1798
- <variablelink>access_token_secret</variablelink> in case of using
1799
- OAuth 1.0 or 1.0a services.</usage>
1800
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
1801
- the call was done successfully.</returnvalue>
1802
- </documentation>
1803
- <argument>
1804
- <name>url</name>
1805
- <type>STRING</type>
1806
- <documentation>
1807
- <purpose>URL of the API where the HTTP request will be sent.</purpose>
1808
- </documentation>
1809
- </argument>
1810
- <argument>
1811
- <name>method</name>
1812
- <type>STRING</type>
1813
- <documentation>
1814
- <purpose>HTTP method that will be used to send the request. It can
1815
- be <stringvalue>GET</stringvalue>,
1816
- <stringvalue>POST</stringvalue>,
1817
- <stringvalue>DELETE</stringvalue>, <stringvalue>PUT</stringvalue>,
1818
- etc..</purpose>
1819
- </documentation>
1820
- </argument>
1821
- <argument>
1822
- <name>parameters</name>
1823
- <type>HASH</type>
1824
- <documentation>
1825
- <purpose>Associative array with the names and values of the API
1826
- call request parameters.</purpose>
1827
- </documentation>
1828
- </argument>
1829
- <argument>
1830
- <name>options</name>
1831
- <type>HASH</type>
1832
- <documentation>
1833
- <purpose>Associative array with additional options to configure
1834
- the request. Currently it supports the following
1835
- options:<paragraphbreak />
1836
- <stringvalue>2Legged</stringvalue>: boolean option that
1837
- determines if the API request should be 2 legged. The default
1838
- value is <tt><booleanvalue>0</booleanvalue></tt>.<paragraphbreak />
1839
- <stringvalue>Accept</stringvalue>: content type value of the
1840
- Accept HTTP header to be sent in the API call HTTP request.
1841
- Some APIs require that a certain value be sent to specify
1842
- which version of the API is being called. The default value is
1843
- <stringvalue>*&#47;*</stringvalue>.<paragraphbreak />
1844
- <stringvalue>ConvertObjects</stringvalue>: boolean option that
1845
- determines if objects should be converted into arrays when the
1846
- response is returned in JSON format. The default value is
1847
- <booleanvalue>0</booleanvalue>.<paragraphbreak />
1848
- <stringvalue>DecodeXMLResponse</stringvalue>: name of the method
1849
- to decode XML responses. Currently only
1850
- <stringvalue>simplexml</stringvalue> is supported. It makes a
1851
- XML response be parsed and returned as a SimpleXMLElement
1852
- object.<paragraphbreak />
1853
- <stringvalue>FailOnAccessError</stringvalue>: boolean option
1854
- that determines if this functions should fail when the server
1855
- response status is not between 200 and 299. The default value
1856
- is <booleanvalue>0</booleanvalue>.<paragraphbreak />
1857
- <stringvalue>Files</stringvalue>: associative array with
1858
- details of the parameters that must be passed as file uploads.
1859
- The array indexes must have the same name of the parameters
1860
- to be sent as files. The respective array entry values must
1861
- also be associative arrays with the parameters for each file.
1862
- Currently it supports the following parameters:<paragraphbreak />
1863
- - <tt>Type</tt> - defines how the parameter value should be
1864
- treated. It can be <tt>'FileName'</tt> if the parameter value is
1865
- is the name of a local file to be uploaded. It may also be
1866
- <tt>'Data'</tt> if the parameter value is the actual data of
1867
- the file to be uploaded.<paragraphbreak />
1868
- Default: <tt>'FileName'</tt><paragraphbreak />
1869
- - <tt>FileName</tt> - defines a custom file name for the file
1870
- to be uploaded.<paragraphbreak />
1871
- Default: none<paragraphbreak />
1872
- - <tt>ContentType</tt> - MIME value of the content type of the
1873
- file. It can be <tt>'automatic/name'</tt> if the content type
1874
- should be determine from the file name extension.<paragraphbreak />
1875
- Default: <tt>'automatic/name'</tt><paragraphbreak />
1876
- <stringvalue>PostValuesInURI</stringvalue>: boolean option to
1877
- determine that a POST request should pass the request values
1878
- in the URI. The default value is
1879
- <booleanvalue>0</booleanvalue>.<paragraphbreak />
1880
- <stringvalue>FollowRedirection</stringvalue>: limit number of
1881
- times that HTTP response redirects will be followed. If it is
1882
- set to <integervalue>0</integervalue>, redirection responses
1883
- fail in error. The default value is
1884
- <integervalue>0</integervalue>.<paragraphbreak />
1885
- <stringvalue>RequestBody</stringvalue>: request body data of a
1886
- custom type. The <stringvalue>RequestContentType</stringvalue>
1887
- option must be specified, so the
1888
- <stringvalue>RequestBody</stringvalue> option is considered.<paragraphbreak />
1889
- <stringvalue>RequestContentType</stringvalue>: content type that
1890
- should be used to send the request values. It can be either
1891
- <stringvalue>application/x-www-form-urlencoded</stringvalue>
1892
- for sending values like from Web forms, or
1893
- <stringvalue>application/json</stringvalue> for sending the
1894
- values encoded in JSON format. Other types are accepted if the
1895
- <stringvalue>RequestBody</stringvalue> option is specified.
1896
- The default value is
1897
- <stringvalue>application/x-www-form-urlencoded</stringvalue>.<paragraphbreak />
1898
- <stringvalue>RequestHeaders</stringvalue>: associative array of
1899
- custom headers to be sent with the API call. These headers
1900
- override any values set by the class when sending the API
1901
- call HTTP request.<paragraphbreak />
1902
- <stringvalue>Resource</stringvalue>: string with a label that
1903
- will be used in the error messages and debug log entries to
1904
- identify what operation the request is performing. The default
1905
- value is <stringvalue>API call</stringvalue>.<paragraphbreak />
1906
- <stringvalue>ResponseContentType</stringvalue>: content type
1907
- that should be considered when decoding the API request
1908
- response. This overrides the <tt>Content-Type</tt> header
1909
- returned by the server. If the content type is
1910
- <stringvalue>application/x-www-form-urlencoded</stringvalue>
1911
- the function will parse the data returning an array of
1912
- key-value pairs. If the content type is
1913
- <stringvalue>application/json</stringvalue> the response will
1914
- be decode as a JSON-encoded data type. Other content type
1915
- values will make the function return the original response
1916
- value as it was returned from the server. The default value
1917
- for this option is to use what the server returned in the
1918
- <tt>Content-Type</tt> header.</purpose>
1919
- </documentation>
1920
- </argument>
1921
- <argument>
1922
- <name>response</name>
1923
- <type>STRING</type>
1924
- <out />
1925
- <documentation>
1926
- <purpose>Return the value of the API response. If the value is
1927
- JSON encoded, this function will decode it and return the value
1928
- converted to respective types. If the value is form encoded,
1929
- this function will decode the response and return it as an
1930
- array. Otherwise, the class will return the value as a
1931
- string.</purpose>
1932
- </documentation>
1933
- </argument>
1934
- <do>
1935
- {/metadocument}
1936
- */
1937
- function CallAPI($url, $method, $parameters, $options, &$response) {
1938
- if (!isset($options['Resource'])) $options['Resource'] = 'API call';
1939
- if (!isset($options['ConvertObjects'])) $options['ConvertObjects'] = false;
1940
- $version = intval($this->oauth_version);
1941
- $two_legged = ($version === 1 && isset($options['2Legged']) && $options['2Legged']);
1942
- if (strlen($this->access_token) === 0 && !$two_legged) {
1943
- if (!$this->RetrieveToken($valid)) return false;
1944
- if (!$valid) return $this->SetError('the access token is not set to a valid value');
1945
- }
1946
- switch ($version) {
1947
- case 1:
1948
- if (!$two_legged && strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0) {
1949
- if (strlen($this->refresh_token) === 0) return ($this->SetError('the access token expired and no refresh token is available'));
1950
- if ($this->debug) $this->OutputDebug('Refreshing the OAuth access token expired on ' . $this->access_token_expiry);
1951
- $oauth = array(
1952
- 'oauth_token' => $this->access_token,
1953
- 'oauth_session_handle' => $this->refresh_token
1954
- );
1955
- if (!$this->ProcessToken1($oauth, $access_token)) return false;
1956
- if (isset($options['FailOnAccessError']) && $options['FailOnAccessError'] && strlen($this->authorization_error)) {
1957
- $this->error = $this->authorization_error;
1958
-
1959
- return false;
1960
- }
1961
- if (!isset($access_token['authorized']) || !$access_token['authorized']) return ($this->SetError('failed to obtain a renewed the expired access token'));
1962
- $this->access_token = $access_token['value'];
1963
- $this->access_token_secret = $access_token['secret'];
1964
- if (isset($access_token['refresh'])) $this->refresh_token = $access_token['refresh'];
1965
- }
1966
- $oauth = array();
1967
- if (!$two_legged) $oauth[strlen($this->access_token_parameter) ? $this->access_token_parameter : 'oauth_token'] = $this->access_token;
1968
- break;
1969
-
1970
- case 2:
1971
- if (strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0) {
1972
- if (strlen($this->refresh_token) === 0) return ($this->SetError('the access token expired and no refresh token is available'));
1973
- if ($this->debug) $this->OutputDebug('Refreshing the OAuth access token expired on ' . $this->access_token_expiry);
1974
- if (!$this->ProcessToken2(null, true)) return false;
1975
- if (isset($options['FailOnAccessError']) && $options['FailOnAccessError'] && strlen($this->authorization_error)) {
1976
- $this->error = $this->authorization_error;
1977
-
1978
- return false;
1979
- }
1980
- }
1981
- $oauth = null;
1982
- if (strcasecmp($this->access_token_type, 'Bearer')) $url .= (strcspn($url, '?') < strlen($url) ? '&' : '?') . (strlen($this->access_token_parameter) ? $this->access_token_parameter : 'access_token') . '=' . UrlEncode($this->access_token);
1983
- break;
1984
-
1985
- default:
1986
- return ($this->SetError($this->oauth_version . ' is not a supported version of the OAuth protocol'));
1987
- }
1988
-
1989
- return ($this->SendAPIRequest($url, $method, $parameters, $oauth, $options, $response));
1990
- }
1991
- /*
1992
- {metadocument}
1993
- </do>
1994
- </function>
1995
- {/metadocument}
1996
- */
1997
-
1998
- /*
1999
- {metadocument}
2000
- <function>
2001
- <name>Initialize</name>
2002
- <type>BOOLEAN</type>
2003
- <documentation>
2004
- <purpose>Initialize the class variables and internal state. It must
2005
- be called before calling other class functions.</purpose>
2006
- <usage>Set the <variablelink>server</variablelink> variable before
2007
- calling this function to let it initialize the class variables to
2008
- work with the specified server type. Alternatively, you can set
2009
- other class variables manually to make it work with servers that
2010
- are not yet built-in supported.</usage>
2011
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2012
- it was able to successfully initialize the class for the specified
2013
- server type.</returnvalue>
2014
- </documentation>
2015
- <do>
2016
- {/metadocument}
2017
- */
2018
- function Initialize() {
2019
- if (strlen($this->server) === 0) return true;
2020
- $this->oauth_version = $this->dialog_url = $this->pin_dialog_url = $this->access_token_url = $this->request_token_url = $this->append_state_to_redirect_uri = '';
2021
- $this->authorization_header = true;
2022
- $this->url_parameters = false;
2023
- $this->token_request_method = 'GET';
2024
- $this->signature_method = 'HMAC-SHA1';
2025
- $this->access_token_authentication = '';
2026
- $this->access_token_parameter = '';
2027
- $this->default_access_token_type = '';
2028
- $this->store_access_token_response = false;
2029
- switch ($this->server) {
2030
- case 'Facebook':
2031
- $this->oauth_version = '2.0';
2032
- $this->dialog_url = 'https://www.facebook.com/v2.3/dialog/oauth?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2033
- $this->access_token_url = 'https://graph.facebook.com/oauth/access_token';
2034
- break;
2035
-
2036
- case 'github':
2037
- $this->oauth_version = '2.0';
2038
- $this->dialog_url = 'https://github.com/login/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2039
- $this->access_token_url = 'https://github.com/login/oauth/access_token';
2040
- break;
2041
-
2042
- case 'Google':
2043
- $this->oauth_version = '2.0';
2044
- $this->dialog_url = 'https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}';
2045
- $this->offline_dialog_url = 'https://accounts.google.com/o/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}&access_type=offline&approval_prompt=force';
2046
- $this->access_token_url = 'https://accounts.google.com/o/oauth2/token';
2047
- break;
2048
-
2049
- case 'LinkedIn':
2050
- $this->oauth_version = '1.0a';
2051
- $this->request_token_url = 'https://api.linkedin.com/uas/oauth/requestToken?scope={SCOPE}';
2052
- $this->dialog_url = 'https://api.linkedin.com/uas/oauth/authenticate';
2053
- $this->access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken';
2054
- $this->url_parameters = true;
2055
- break;
2056
-
2057
- case 'Microsoft':
2058
- $this->oauth_version = '2.0';
2059
- $this->dialog_url = 'https://login.live.com/oauth20_authorize.srf?client_id={CLIENT_ID}&scope={SCOPE}&response_type=code&redirect_uri={REDIRECT_URI}&state={STATE}';
2060
- $this->access_token_url = 'https://login.live.com/oauth20_token.srf';
2061
- break;
2062
-
2063
- case 'Twitter':
2064
- $this->oauth_version = '1.0a';
2065
- $this->request_token_url = 'https://api.twitter.com/oauth/request_token';
2066
- $this->dialog_url = 'https://api.twitter.com/oauth/authenticate';
2067
- $this->access_token_url = 'https://api.twitter.com/oauth/access_token';
2068
- $this->url_parameters = false;
2069
- break;
2070
-
2071
- case 'Yahoo':
2072
- $this->oauth_version = '1.0a';
2073
- $this->request_token_url = 'https://api.login.yahoo.com/oauth/v2/get_request_token';
2074
- $this->dialog_url = 'https://api.login.yahoo.com/oauth/v2/request_auth';
2075
- $this->access_token_url = 'https://api.login.yahoo.com/oauth/v2/get_token';
2076
- $this->authorization_header = false;
2077
- break;
2078
-
2079
- default:
2080
- if (!($json = @file_get_contents($this->configuration_file))) {
2081
- if (!file_exists($this->configuration_file)) return $this->SetError('the OAuth server configuration file ' . $this->configuration_file . ' does not exist');
2082
-
2083
- return $this->SetPHPError('could not read the OAuth server configuration file ' . $this->configuration_file, self::PHPErrorMessage());
2084
- }
2085
- $oauth_server = json_decode($json);
2086
- if (!isset($oauth_server)) return $this->SetPHPError('It was not possible to decode the OAuth server configuration file ' . $this->configuration_file . ' eventually due to incorrect format', self::PHPErrorMessage());
2087
- if (GetType($oauth_server) !== 'object') return $this->SetError('It was not possible to decode the OAuth server configuration file ' . $this->configuration_file . ' because it does not correctly define a JSON object');
2088
- if (!isset($oauth_server->servers) || GetType($oauth_server->servers) !== 'object') return $this->SetError('It was not possible to decode the OAuth server configuration file ' . $this->configuration_file . ' because it does not correctly define a JSON object for servers');
2089
- if (!isset($oauth_server->servers->{$this->server})) return ($this->SetError($this->server . ' is not yet a supported type of OAuth server. Please send a request in this class support forum (preferred) http://www.phpclasses.org/oauth-api , or if it is a security or private matter, contact the author Manuel Lemos mlemos@acm.org to request adding built-in support to this type of OAuth server.'));
2090
- $properties = $oauth_server->servers->{$this->server};
2091
- if (GetType($properties) !== 'object') return $this->SetError('The OAuth server configuration file ' . $this->configuration_file . ' for the "' . $this->server . '" server does not correctly define a JSON object');
2092
- $types = array(
2093
- 'oauth_version' => 'string',
2094
- 'request_token_url' => 'string',
2095
- 'dialog_url' => 'string',
2096
- 'pin_dialog_url' => 'string',
2097
- 'offline_dialog_url' => 'string',
2098
- 'access_token_url' => 'string',
2099
- 'append_state_to_redirect_uri' => 'string',
2100
- 'authorization_header' => 'boolean',
2101
- 'url_parameters' => 'boolean',
2102
- 'token_request_method' => 'string',
2103
- 'signature_method' => 'string',
2104
- 'access_token_authentication' => 'string',
2105
- 'access_token_parameter' => 'string',
2106
- 'default_access_token_type' => 'string',
2107
- 'store_access_token_response' => 'boolean'
2108
- );
2109
- $required = array(
2110
- 'oauth_version' => array(),
2111
- 'request_token_url' => array(
2112
- '1.0',
2113
- '1.0a'
2114
- ),
2115
- 'dialog_url' => array(),
2116
- 'access_token_url' => array(),
2117
- );
2118
- foreach ($properties as $property => $value) {
2119
- if (!isset($types[$property])) return $this->SetError($property . ' is not a supported property for the "' . $this->server . '" server in the OAuth server configuration file ' . $this->configuration_file);
2120
- $type = GetType($value);
2121
- $expected = $types[$property];
2122
- if ($type !== $expected) return $this->SetError(' the property "' . $property . '" for the "' . $this->server . '" server is not of type "' . $expected . '", it is of type "' . $type . '", in the OAuth server configuration file ' . $this->configuration_file);
2123
- $this->{$property} = $value;
2124
- unset($required[$property]);
2125
- }
2126
- foreach ($required as $property => $value) {
2127
- if (count($value) && in_array($this->oauth_version, $value)) return $this->SetError('the property "' . $property . '" is not defined for the "' . $this->server . '" server in the OAuth server configuration file ' . $this->configuration_file);
2128
- }
2129
- break;
2130
- }
2131
-
2132
- return (true);
2133
- }
2134
- /*
2135
- {metadocument}
2136
- </do>
2137
- </function>
2138
- {/metadocument}
2139
- */
2140
-
2141
- /*
2142
- {metadocument}
2143
- <function>
2144
- <name>CheckAccessToken</name>
2145
- <type>BOOLEAN</type>
2146
- <documentation>
2147
- <purpose>Check if the access token was retrieved and if it is
2148
- valid.</purpose>
2149
- <usage>Call this function when you need to check of an access token
2150
- is valid without forcing to redirect the user to the OAuth server
2151
- authorization page.<paragraphbreak />
2152
- If a previously retrieved access token has expired, this function
2153
- may renew it automatically.</usage>
2154
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2155
- the OAuth protocol was checked without errors.</returnvalue>
2156
- </documentation>
2157
- <argument>
2158
- <name>redirect_url</name>
2159
- <type>STRING</type>
2160
- <out />
2161
- <documentation>
2162
- <purpose>Return the URL of the OAuth server authorization to
2163
- redirect the user if the access token was not yet retrieved or
2164
- is not valid.</purpose>
2165
- </documentation>
2166
- </argument>
2167
- <do>
2168
- {/metadocument}
2169
- */
2170
- function CheckAccessToken(&$redirect_url) {
2171
- $redirect_url = null;
2172
- if (strlen($this->access_token) || strlen($this->access_token_secret)) {
2173
- if ($this->debug) $this->OutputDebug('The Process function should not be called again if the OAuth token was already set manually');
2174
-
2175
- return $this->SetError('the OAuth token was already set');
2176
- }
2177
- switch (intval($this->oauth_version)) {
2178
- case 1:
2179
- $one_a = ($this->oauth_version === '1.0a');
2180
- if ($this->debug) $this->OutputDebug('Checking the OAuth token authorization state');
2181
- if (!$this->GetAccessToken($access_token)) return false;
2182
- if (isset($access_token['expiry'])) $this->access_token_expiry = $access_token['expiry'];
2183
- if (isset($access_token['authorized']) && isset($access_token['value'])) {
2184
- $expired = (isset($access_token['expiry']) && strcmp($access_token['expiry'], gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0);
2185
- if (!$access_token['authorized'] || $expired) {
2186
- if ($this->debug) {
2187
- if ($expired) $this->OutputDebug('The OAuth token expired on ' . $access_token['expiry'] . 'UTC'); else
2188
- $this->OutputDebug('The OAuth token is not yet authorized');
2189
- }
2190
- if ($one_a && $this->redirect_uri === 'oob' && strlen($this->pin)) {
2191
- if ($this->debug) $this->OutputDebug('Checking the pin');
2192
- $this->access_token_secret = $access_token['secret'];
2193
- $oauth = array(
2194
- 'oauth_token' => $access_token['value'],
2195
- 'oauth_verifier' => $this->pin
2196
- );
2197
- if (!$this->ProcessToken1($oauth, $access_token)) return false;
2198
- if ($this->debug) $this->OutputDebug('The OAuth token was authorized');
2199
- } else {
2200
- if ($this->debug) $this->OutputDebug('Checking the OAuth token and verifier');
2201
- if (!$this->GetRequestToken($token, $verifier)) return false;
2202
- if (!isset($token) || ($one_a && !isset($verifier))) {
2203
- if (!$this->GetRequestDenied($denied)) return false;
2204
- if (isset($denied) && $denied === $access_token['value']) {
2205
- if ($this->debug) $this->OutputDebug('The authorization request was denied');
2206
- $this->authorization_error = 'the request was denied';
2207
-
2208
- return true;
2209
- } else {
2210
- if ($this->debug) $this->OutputDebug('Reset the OAuth token state because token and verifier are not both set');
2211
- $access_token = array();
2212
- }
2213
- } elseif ($token !== $access_token['value']) {
2214
- if ($this->debug) $this->OutputDebug('Reset the OAuth token state because token does not match what as previously retrieved');
2215
- $access_token = array();
2216
- } else {
2217
- $this->access_token_secret = $access_token['secret'];
2218
- $oauth = array(
2219
- 'oauth_token' => $token,
2220
- );
2221
- if ($one_a) $oauth['oauth_verifier'] = $verifier;
2222
- if (!$this->ProcessToken1($oauth, $access_token)) return false;
2223
- if ($this->debug) $this->OutputDebug('The OAuth token was authorized');
2224
- }
2225
- }
2226
- } elseif ($this->debug) $this->OutputDebug('The OAuth token was already authorized');
2227
- if (isset($access_token['authorized']) && $access_token['authorized']) {
2228
- $this->access_token = $access_token['value'];
2229
- $this->access_token_secret = $access_token['secret'];
2230
- if (isset($access_token['refresh'])) $this->refresh_token = $access_token['refresh'];
2231
-
2232
- return true;
2233
- }
2234
- } else {
2235
- if ($this->debug) $this->OutputDebug('The OAuth access token is not set');
2236
- $access_token = array();
2237
- }
2238
- if (!isset($access_token['authorized'])) {
2239
- if ($this->debug) $this->OutputDebug('Requesting the unauthorized OAuth token');
2240
- if (!$this->GetRequestTokenURL($url)) return false;
2241
- $url = str_replace('{SCOPE}', UrlEncode($this->scope), $url);
2242
- if (!$this->GetRedirectURI($redirect_uri)) return false;
2243
- $oauth = array(
2244
- 'oauth_callback' => $redirect_uri,
2245
- );
2246
- $options = array(
2247
- 'Resource' => 'OAuth request token',
2248
- 'FailOnAccessError' => true
2249
- );
2250
- $method = strtoupper($this->token_request_method);
2251
- switch ($method) {
2252
- case 'GET':
2253
- break;
2254
- case 'POST':
2255
- $options['PostValuesInURI'] = true;
2256
- break;
2257
- default:
2258
- $this->error = $method . ' is not a supported method to request tokens';
2259
- break;
2260
- }
2261
- if (!$this->SendAPIRequest($url, $method, array(), $oauth, $options, $response)) return false;
2262
- if (strlen($this->access_token_error)) {
2263
- $this->authorization_error = $this->access_token_error;
2264
-
2265
- return true;
2266
- }
2267
- if (!isset($response['oauth_token']) || !isset($response['oauth_token_secret'])) {
2268
- $this->authorization_error = 'it was not returned the requested token';
2269
-
2270
- return true;
2271
- }
2272
- $access_token = array(
2273
- 'value' => $response['oauth_token'],
2274
- 'secret' => $response['oauth_token_secret'],
2275
- 'authorized' => false
2276
- );
2277
- if (isset($response['login_url'])) $access_token['login_url'] = $response['login_url'];
2278
- if (!$this->StoreAccessToken($access_token)) return false;
2279
- }
2280
- if (!$this->GetDialogURL($url)) return false;
2281
- if ($url === 'automatic') {
2282
- if (!isset($access_token['login_url'])) return ($this->SetError('The request token response did not automatically the login dialog URL as expected'));
2283
- if ($this->debug) $this->OutputDebug('Dialog URL obtained automatically from the request token response: ' . $url);
2284
- $url = $access_token['login_url'];
2285
- } else
2286
- $url .= (strpos($url, '?') === false ? '?' : '&') . 'oauth_token=' . $access_token['value'];
2287
- if (!$one_a) {
2288
- if (!$this->GetRedirectURI($redirect_uri)) return false;
2289
- $url .= '&oauth_callback=' . UrlEncode($redirect_uri);
2290
- }
2291
- if ($this->debug) $this->OutputDebug('Redirecting to OAuth authorize page ' . $url);
2292
- $redirect_url = $url;
2293
-
2294
- return true;
2295
-
2296
- case 2:
2297
- if ($this->debug) {
2298
- if (!$this->GetAccessTokenURL($access_token_url)) return false;
2299
- $this->OutputDebug('Checking if OAuth access token was already retrieved from ' . $access_token_url);
2300
- }
2301
- if (!$this->RetrieveToken($valid)) return false;
2302
- $expired = (strlen($this->access_token_expiry) && strcmp($this->access_token_expiry, gmstrftime('%Y-%m-%d %H:%M:%S')) <= 0 && strlen($this->refresh_token) === 0);
2303
- if ($valid && !$expired) return true;
2304
- if ($this->debug) {
2305
- if (!$valid) $this->OutputDebug('A valid access token is not available'); elseif ($expired) $this->OutputDebug('The access token expired');
2306
- }
2307
- switch ($this->grant_type) {
2308
- case 'authorization_code':
2309
- if ($this->redirect_uri === 'oob' && strlen($this->pin)) {
2310
- if ($this->debug) $this->OutputDebug('Getting the access token using the pin');
2311
- if (!$this->ProcessToken2(null, false)) return false;
2312
- if (strlen($this->authorization_error)) return $this->SetError($this->authorization_error);
2313
-
2314
- return true;
2315
- } elseif (strlen($this->oauth_username) === 0) break;
2316
- case 'password':
2317
- if ($this->debug) $this->OutputDebug('Getting the access token using the username and password');
2318
- if (!$this->ProcessToken2(null, false)) return false;
2319
- if (strlen($this->authorization_error)) return $this->SetError($this->authorization_error);
2320
-
2321
- return true;
2322
- case 'client_credentials':
2323
- if ($this->debug) $this->OutputDebug('Getting the access token using the client credentials');
2324
- if (!$this->ProcessToken2(null, false)) return false;
2325
- if (strlen($this->authorization_error)) return $this->SetError($this->authorization_error);
2326
-
2327
- return true;
2328
- default:
2329
- return $this->SetError($this->grant_type . ' is not yet a supported OAuth 2 grant type');
2330
- }
2331
- if ($this->debug) $this->OutputDebug('Checking the authentication state in URI ' . $_SERVER['REQUEST_URI']);
2332
- if (!$this->GetStoredState($stored_state)) return false;
2333
- if (strlen($stored_state) == 0) return ($this->SetError('it was not set the OAuth state'));
2334
- if (!$this->GetRequestState($state)) return false;
2335
- if ($state === $stored_state) {
2336
- if ($this->debug) $this->OutputDebug('Checking the authentication code');
2337
- if (!$this->GetRequestCode($code)) return false;
2338
- if (strlen($code) == 0) {
2339
- if (!$this->GetRequestError($this->authorization_error)) return false;
2340
- if (isset($this->authorization_error)) {
2341
- if ($this->debug) $this->OutputDebug('Authorization failed with error code ' . $this->authorization_error);
2342
- switch ($this->authorization_error) {
2343
- case 'invalid_request':
2344
- case 'unauthorized_client':
2345
- case 'access_denied':
2346
- case 'unsupported_response_type':
2347
- case 'invalid_scope':
2348
- case 'server_error':
2349
- case 'temporarily_unavailable':
2350
- case 'user_denied':
2351
- return true;
2352
- default:
2353
- return ($this->SetError('it was returned an unknown OAuth error code'));
2354
- }
2355
- }
2356
-
2357
- return ($this->SetError('it was not returned the OAuth dialog code'));
2358
- }
2359
- if (!$this->ProcessToken2($code, false)) return false;
2360
- if (strlen($this->authorization_error)) return $this->SetError($this->authorization_error);
2361
- } else {
2362
- if (!$this->GetRedirectURI($redirect_uri)) return false;
2363
- if (strlen($this->append_state_to_redirect_uri)) $redirect_uri .= (strpos($redirect_uri, '?') === false ? '?' : '&') . $this->append_state_to_redirect_uri . '=' . $stored_state;
2364
- if (!$this->GetDialogURL($url, $redirect_uri, $stored_state)) return false;
2365
- if (strlen($url) == 0) return ($this->SetError('it was not set the OAuth dialog URL'));
2366
- if ($this->debug) $this->OutputDebug('Redirecting to OAuth Dialog ' . $url);
2367
- $redirect_url = $url;
2368
- }
2369
- break;
2370
-
2371
- default:
2372
- return ($this->SetError($this->oauth_version . ' is not a supported version of the OAuth protocol'));
2373
- }
2374
-
2375
- return (true);
2376
- }
2377
- /*
2378
- {metadocument}
2379
- </do>
2380
- </function>
2381
- {/metadocument}
2382
- */
2383
-
2384
- /*
2385
- {metadocument}
2386
- <function>
2387
- <name>Process</name>
2388
- <type>BOOLEAN</type>
2389
- <documentation>
2390
- <purpose>Process the OAuth protocol interaction with the OAuth
2391
- server.</purpose>
2392
- <usage>Call this function when you need to retrieve the OAuth access
2393
- token. Check the <variablelink>access_token</variablelink> to
2394
- determine if the access token was obtained successfully.</usage>
2395
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2396
- the OAuth protocol was processed without errors.</returnvalue>
2397
- </documentation>
2398
- <do>
2399
- {/metadocument}
2400
- */
2401
- function Process() {
2402
- if (!$this->CheckAccessToken($redirect_url)) return false;
2403
- if (isset($redirect_url)) {
2404
- $this->Redirect($redirect_url);
2405
- $this->exit = true;
2406
- }
2407
-
2408
- return true;
2409
- }
2410
-
2411
- /*
2412
- {metadocument}
2413
- </do>
2414
- </function>
2415
- {/metadocument}
2416
- */
2417
-
2418
- /*
2419
- {metadocument}
2420
- <function>
2421
- <name>Finalize</name>
2422
- <type>BOOLEAN</type>
2423
- <documentation>
2424
- <purpose>Cleanup any resources that may have been used during the
2425
- OAuth protocol processing or execution of API calls.</purpose>
2426
- <usage>Always call this function as the last step after calling the
2427
- functions <functionlink>Process</functionlink> or
2428
- <functionlink>CallAPI</functionlink>.</usage>
2429
- <returnvalue>This function returns <booleanvalue>1</booleanvalue> if
2430
- the function cleaned up any resources successfully.</returnvalue>
2431
- </documentation>
2432
- <argument>
2433
- <name>success</name>
2434
- <type>BOOLEAN</type>
2435
- <documentation>
2436
- <purpose>Pass the last success state returned by the class or any
2437
- external code processing the class function results.</purpose>
2438
- </documentation>
2439
- </argument>
2440
- <do>
2441
- {/metadocument}
2442
- */
2443
- function Finalize($success) {
2444
- return ($success);
2445
- }
2446
- /*
2447
- {metadocument}
2448
- </do>
2449
- </function>
2450
- {/metadocument}
2451
- */
2452
-
2453
- /*
2454
- {metadocument}
2455
- <function>
2456
- <name>Output</name>
2457
- <type>VOID</type>
2458
- <documentation>
2459
- <purpose>Display the results of the OAuth protocol processing.</purpose>
2460
- <usage>Only call this function if you are debugging the OAuth
2461
- authorization process and you need to view what was its
2462
- results.</usage>
2463
- </documentation>
2464
- <do>
2465
- {/metadocument}
2466
- */
2467
- function Output() {
2468
- if (strlen($this->authorization_error) || strlen($this->access_token_error) || strlen($this->access_token)) {
2469
- ?>
2470
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2471
- <html>
2472
- <head>
2473
- <title>OAuth client result</title>
2474
- </head>
2475
- <body>
2476
- <h1>OAuth client result</h1>
2477
- <?php
2478
- if (strlen($this->authorization_error)) {
2479
- ?>
2480
- <p>It was not possible to authorize the application.<?php
2481
- if ($this->debug) {
2482
- ?>
2483
- <br>Authorization error: <?php echo HtmlSpecialChars($this->authorization_error);
2484
- }
2485
- ?></p>
2486
- <?php
2487
- } elseif (strlen($this->access_token_error)) {
2488
- ?>
2489
- <p>It was not possible to use the application access token.
2490
- <?php
2491
- if ($this->debug) {
2492
- ?>
2493
- <br>Error: <?php echo HtmlSpecialChars($this->access_token_error);
2494
- }
2495
- ?></p>
2496
- <?php
2497
- } elseif (strlen($this->access_token)) {
2498
- ?>
2499
- <p>The application authorization was obtained successfully.
2500
- <?php
2501
- if ($this->debug) {
2502
- ?>
2503
- <br>Access token: <?php echo HtmlSpecialChars($this->access_token);
2504
- if (isset($this->access_token_secret)) {
2505
- ?>
2506
- <br>Access token secret: <?php echo HtmlSpecialChars($this->access_token_secret);
2507
- }
2508
- }
2509
- ?></p>
2510
- <?php
2511
- if (strlen($this->access_token_expiry)) {
2512
- ?>
2513
- <p>Access token expiry: <?php echo $this->access_token_expiry; ?> UTC</p>
2514
- <?php
2515
- }
2516
- }
2517
- ?>
2518
- </body>
2519
- </html>
2520
- <?php
2521
- }
2522
- }
2523
- /*
2524
- {metadocument}
2525
- </do>
2526
- </function>
2527
- {/metadocument}
2528
- */
2529
-
2530
- }
2531
-
2532
- /*
2533
-
2534
- {metadocument}
2535
- </class>
2536
- {/metadocument}
2537
-
2538
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Nextend/Framework/Misc/OAuth/oauth_configuration.json DELETED
@@ -1,330 +0,0 @@
1
- {
2
- "version": "$Id: oauth_configuration.json,v 1.27 2015/07/23 20:45:00 mlemos Exp $",
3
- "comments": [
4
- "The servers entry should be an object with a list of object",
5
- "entries, one for each server type. The server object entry name is",
6
- "the name of the server type. Each server entry is an object with",
7
- "some mandatory properties: oauth_version, dialog_url,",
8
- "access_token_url and request_token_url (just for Oauth 1.0 and",
9
- "1.0a). Check the OAuth client class for the complete list of server",
10
- "properties."
11
- ],
12
- "servers": {
13
- "500px": {
14
- "oauth_version": "1.0a",
15
- "request_token_url": "https://api.500px.com/v1/oauth/request_token",
16
- "dialog_url": "https://api.500px.com/v1/oauth/authorize",
17
- "access_token_url": "https://api.500px.com/v1/oauth/access_token",
18
- "authorization_header": false
19
- },
20
- "37Signals": {
21
- "oauth_version": "2.0",
22
- "dialog_url": "https://launchpad.37signals.com/authorization/new?type=web_server&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
23
- "access_token_url": "https://launchpad.37signals.com/authorization/token?type=web_server"
24
- },
25
- "Amazon": {
26
- "oauth_version": "2.0",
27
- "dialog_url": "https://www.amazon.com/ap/oa?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
28
- "access_token_url": "https://api.amazon.com/auth/o2/token"
29
- },
30
- "AOL": {
31
- "oauth_version": "2.0",
32
- "dialog_url": "https://api.screenname.aol.com/auth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
33
- "access_token_url": "https://api.screenname.aol.com/auth/access_token"
34
- },
35
- "Bitbucket": {
36
- "oauth_version": "1.0a",
37
- "request_token_url": "https://bitbucket.org/!api/1.0/oauth/request_token",
38
- "dialog_url": "https://bitbucket.org/!api/1.0/oauth/authenticate",
39
- "access_token_url": "https://bitbucket.org/!api/1.0/oauth/access_token",
40
- "url_parameters": false
41
- },
42
- "Bitly": {
43
- "oauth_version": "2.0",
44
- "dialog_url": "https://bitly.com/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
45
- "access_token_url": "https://api-ssl.bitly.com/oauth/access_token"
46
- },
47
- "Box": {
48
- "oauth_version": "2.0",
49
- "dialog_url": "https://www.box.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
50
- "offline_dialog_url": "https://www.box.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&access_type=offline&approval_prompt=force",
51
- "access_token_url": "https://www.box.com/api/oauth2/token"
52
- },
53
- "Buffer": {
54
- "oauth_version": "2.0",
55
- "dialog_url": "https://bufferapp.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
56
- "access_token_url": "https://api.bufferapp.com/1/oauth2/token.json"
57
- },
58
- "Copy": {
59
- "oauth_version": "1.0a",
60
- "request_token_url": "https://api.copy.com/oauth/request",
61
- "dialog_url": "https://www.copy.com/applications/authorize",
62
- "access_token_url": "https://api.copy.com/oauth/access"
63
- },
64
- "Dailymotion": {
65
- "oauth_version": "2.0",
66
- "dialog_url": "https://api.dailymotion.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
67
- "access_token_url": "https://api.dailymotion.com/oauth/token"
68
- },
69
- "Discogs": {
70
- "oauth_version": "1.0a",
71
- "request_token_url": "https://api.discogs.com/oauth/request_token",
72
- "dialog_url": "https://www.discogs.com/oauth/authorize",
73
- "access_token_url": "https://api.discogs.com/oauth/access_token"
74
- },
75
- "Disqus": {
76
- "oauth_version": "2.0",
77
- "dialog_url": "https://disqus.com/api/oauth/2.0/authorize/?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
78
- "access_token_url": "https://disqus.com/api/oauth/2.0/access_token/"
79
- },
80
- "Dribbble": {
81
- "oauth_version": "2.0",
82
- "dialog_url": "https://dribbble.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
83
- "access_token_url": "https://dribbble.com/oauth/token"
84
- },
85
- "Dropbox": {
86
- "oauth_version": "1.0",
87
- "request_token_url": "https://api.dropbox.com/1/oauth/request_token",
88
- "dialog_url": "https://www.dropbox.com/1/oauth/authorize",
89
- "access_token_url": "https://api.dropbox.com/1/oauth/access_token",
90
- "authorization_header": false
91
- },
92
- "Dropbox2": {
93
- "oauth_version": "2.0",
94
- "dialog_url": "https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
95
- "access_token_url": "https://www.dropbox.com/1/oauth2/token"
96
- },
97
- "Etsy": {
98
- "oauth_version": "1.0a",
99
- "request_token_url": "https://openapi.etsy.com/v2/oauth/request_token?scope={SCOPE}",
100
- "dialog_url": "automatic",
101
- "access_token_url": "https://openapi.etsy.com/v2/oauth/access_token"
102
- },
103
- "Eventful": {
104
- "oauth_version": "1.0a",
105
- "request_token_url": "http://eventful.com/oauth/request_token",
106
- "dialog_url": "http://eventful.com/oauth/authorize",
107
- "access_token_url": "http://eventful.com/oauth/access_token",
108
- "authorization_header": false,
109
- "url_parameters": true,
110
- "token_request_method": "POST"
111
- },
112
- "Evernote": {
113
- "oauth_version": "1.0a",
114
- "request_token_url": "https://sandbox.evernote.com/oauth",
115
- "dialog_url": "https://sandbox.evernote.com/OAuth.action",
116
- "access_token_url": "https://sandbox.evernote.com/oauth",
117
- "url_parameters": true,
118
- "authorization_header": false
119
- },
120
- "Fitbit": {
121
- "oauth_version": "1.0a",
122
- "request_token_url": "https://api.fitbit.com/oauth/request_token",
123
- "dialog_url": "https://api.fitbit.com/oauth/authorize",
124
- "access_token_url": "https://api.fitbit.com/oauth/access_token"
125
- },
126
- "Fitbit2": {
127
- "oauth_version": "2.0",
128
- "dialog_url": "https://www.fitbit.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=code&state={STATE}&redirect_uri={REDIRECT_URI}&scope={SCOPE}",
129
- "access_token_url": "https://api.fitbit.com/oauth2/token",
130
- "access_token_authentication": "basic"
131
- },
132
- "Flickr": {
133
- "oauth_version": "1.0a",
134
- "request_token_url": "http://www.flickr.com/services/oauth/request_token",
135
- "dialog_url": "http://www.flickr.com/services/oauth/authorize?perms={SCOPE}",
136
- "access_token_url": "http://www.flickr.com/services/oauth/access_token",
137
- "authorization_header": false
138
- },
139
- "Foursquare": {
140
- "oauth_version": "2.0",
141
- "dialog_url": "https://foursquare.com/oauth2/authorize?client_id={CLIENT_ID}&scope={SCOPE}&response_type=code&redirect_uri={REDIRECT_URI}&state={STATE}",
142
- "access_token_url": "https://foursquare.com/oauth2/access_token",
143
- "access_token_parameter": "oauth_token"
144
- },
145
- "Google1": {
146
- "oauth_version": "1.0a",
147
- "dialog_url": "https://www.google.com/accounts/OAuthAuthorizeToken",
148
- "access_token_url": "https://www.google.com/accounts/OAuthGetAccessToken",
149
- "request_token_url": "https://www.google.com/accounts/OAuthGetRequestToken?scope={SCOPE}"
150
- },
151
- "imgur": {
152
- "oauth_version": "2.0",
153
- "dialog_url": "https://api.imgur.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=code&state={STATE}&redirect_uri={REDIRECT_URI}&scope={SCOPE}",
154
- "pin_dialog_url": "https://api.imgur.com/oauth2/authorize?client_id={CLIENT_ID}&response_type=pin&state={STATE}&scope={SCOPE}",
155
- "access_token_url": "https://api.imgur.com/oauth2/token"
156
- },
157
- "Instagram": {
158
- "oauth_version": "2.0",
159
- "dialog_url": "https://api.instagram.com/oauth/authorize/?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
160
- "access_token_url": "https://api.instagram.com/oauth/access_token"
161
- },
162
- "Intuit": {
163
- "oauth_version": "1.0a",
164
- "request_token_url": "https://oauth.intuit.com/oauth/v1/get_request_token",
165
- "dialog_url": "https://appcenter.intuit.com/Connect/Begin",
166
- "access_token_url": "https://oauth.intuit.com/oauth/v1/get_access_token"
167
- },
168
- "Jawbone": {
169
- "oauth_version": "2.0",
170
- "dialog_url": "https://jawbone.com/auth/oauth2/auth?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
171
- "access_token_url": "https://jawbone.com/auth/oauth2/token"
172
- },
173
- "LinkedIn2": {
174
- "oauth_version": "2.0",
175
- "dialog_url": "https://www.linkedin.com/uas/oauth2/authorization?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
176
- "access_token_url": "https://www.linkedin.com/uas/oauth2/accessToken",
177
- "default_access_token_type": "Bearer"
178
- },
179
- "MailChimp": {
180
- "oauth_version": "2.0",
181
- "dialog_url": "https://login.mailchimp.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
182
- "access_token_url": "https://login.mailchimp.com/oauth2/token"
183
- },
184
- "Mavenlink": {
185
- "oauth_version": "2.0",
186
- "dialog_url": "https://api.mavenlink.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
187
- "access_token_url": "https://api.mavenlink.com/oauth/token"
188
- },
189
- "mail.ru": {
190
- "oauth_version": "2.0",
191
- "dialog_url": "https://connect.mail.ru/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&response_type=code&state={STATE}",
192
- "access_token_url": "https://connect.mail.ru/oauth/token",
193
- "store_access_token_response": true
194
- },
195
- "Meetup": {
196
- "oauth_version": "2.0",
197
- "dialog_url": "https://secure.meetup.com/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
198
- "access_token_url": "https://secure.meetup.com/oauth2/access"
199
- },
200
- "Misfit": {
201
- "oauth_version": "2.0",
202
- "dialog_url": "https://api.misfitwearables.com/auth/dialog/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
203
- "access_token_url": "https://api.misfitwearables.com/auth/tokens/exchange"
204
- },
205
- "oDesk": {
206
- "oauth_version": "1.0a",
207
- "request_token_url": "https://www.odesk.com/api/auth/v1/oauth/token/request",
208
- "dialog_url": "https://www.odesk.com/services/api/auth",
209
- "access_token_url": "https://www.odesk.com/api/auth/v1/oauth/token/access",
210
- "token_request_method": "POST"
211
- },
212
- "Paypal": {
213
- "oauth_version": "2.0",
214
- "dialog_url": "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
215
- "access_token_url": "https://api.paypal.com/v1/oauth2/token",
216
- "access_token_authentication": "basic"
217
- },
218
- "PaypalApplication": {
219
- "oauth_version": "2.0",
220
- "dialog_url": "use Paypal OAuth 2.0 for accessing its API on behalf of a given user",
221
- "access_token_url": "https://api.paypal.com/v1/oauth2/token",
222
- "access_token_authentication": "basic"
223
- },
224
- "Rdio": {
225
- "oauth_version": "1.0a",
226
- "request_token_url": "http://api.rdio.com/oauth/request_token",
227
- "dialog_url": "https://www.rdio.com/oauth/authorize",
228
- "access_token_url": "http://api.rdio.com/oauth/access_token"
229
- },
230
- "Reddit": {
231
- "oauth_version": "2.0",
232
- "dialog_url": "https://ssl.reddit.com/api/v1/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
233
- "offline_dialog_url": "https://ssl.reddit.com/api/v1/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}&duration=permanent",
234
- "access_token_url": "https://ssl.reddit.com/api/v1/access_token",
235
- "access_token_authentication": "basic"
236
- },
237
- "RightSignature": {
238
- "oauth_version": "1.0a",
239
- "request_token_url": "https://rightsignature.com/oauth/request_token",
240
- "dialog_url": "https://rightsignature.com/oauth/authorize",
241
- "access_token_url": "https://rightsignature.com/oauth/access_token",
242
- "authorization_header": false
243
- },
244
- "RunKeeper": {
245
- "oauth_version": "2.0",
246
- "dialog_url": "https://runkeeper.com/apps/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
247
- "access_token_url": "https://runkeeper.com/apps/token"
248
- },
249
- "Salesforce": {
250
- "oauth_version": "2.0",
251
- "dialog_url": "https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
252
- "access_token_url": "https://login.salesforce.com/services/oauth2/token",
253
- "default_access_token_type": "Bearer",
254
- "store_access_token_response": true
255
- },
256
- "Scoop.it": {
257
- "oauth_version": "1.0a",
258
- "request_token_url": "https://www.scoop.it/oauth/request",
259
- "dialog_url": "https://www.scoop.it/oauth/authorize",
260
- "access_token_url": "https://www.scoop.it/oauth/access",
261
- "authorization_header": false
262
- },
263
- "StockTwits": {
264
- "oauth_version": "2.0",
265
- "dialog_url": "https://api.stocktwits.com/api/2/oauth/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
266
- "access_token_url": "https://api.stocktwits.com/api/2/oauth/token"
267
- },
268
- "SurveyMonkey": {
269
- "oauth_version": "2.0",
270
- "dialog_url": "https://api.surveymonkey.net/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&api_key={API_KEY}&scope={SCOPE}",
271
- "access_token_url": "https://api.surveymonkey.net/oauth/token?api_key={API_KEY}"
272
- },
273
- "TeamViewer": {
274
- "oauth_version": "2.0",
275
- "dialog_url": "https://webapi.teamviewer.com/api/v1/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&api_key={API_KEY}&scope={SCOPE}",
276
- "access_token_url": "https://webapi.teamviewer.com/api/v1/oauth2/token"
277
- },
278
- "Tumblr": {
279
- "oauth_version": "1.0a",
280
- "request_token_url": "http://www.tumblr.com/oauth/request_token",
281
- "dialog_url": "http://www.tumblr.com/oauth/authorize",
282
- "access_token_url": "http://www.tumblr.com/oauth/access_token"
283
- },
284
- "Twitter2": {
285
- "oauth_version": "2.0",
286
- "dialog_url": "use Twitter OAuth 1.0a for accessing its API on behalf of a given user",
287
- "access_token_url": "https://api.twitter.com/oauth2/token"
288
- },
289
- "Vimeo": {
290
- "oauth_version": "2.0",
291
- "dialog_url": "https://api.vimeo.com/oauth/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
292
- "access_token_url": "https://api.vimeo.com/oauth/access_token"
293
- },
294
- "VK": {
295
- "oauth_version": "2.0",
296
- "dialog_url": "https://oauth.vk.com/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope={SCOPE}&state={STATE}",
297
- "access_token_url": "https://oauth.vk.com/access_token"
298
- },
299
- "Withings": {
300
- "oauth_version": "1.0",
301
- "request_token_url": "https://oauth.withings.com/account/request_token",
302
- "dialog_url": "https://oauth.withings.com/account/authorize",
303
- "access_token_url": "https://oauth.withings.com/account/access_token",
304
- "authorization_header": false
305
- },
306
- "Wordpress": {
307
- "oauth_version": "2.0",
308
- "dialog_url": "https://public-api.wordpress.com/oauth2/authorize?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&state={STATE}&scope={SCOPE}",
309
- "access_token_url": "https://public-api.wordpress.com/oauth2/token"
310
- },
311
- "Xero": {
312
- "oauth_version": "1.0a",
313
- "request_token_url": "https://api.xero.com/oauth/RequestToken",
314
- "dialog_url": "https://api.xero.com/oauth/Authorize",
315
- "access_token_url": "https://api.xero.com/oauth/AccessToken"
316
- },
317
- "XING": {
318
- "oauth_version": "1.0a",
319
- "request_token_url": "https://api.xing.com/v1/request_token",
320
- "dialog_url": "https://api.xing.com/v1/authorize",
321
- "access_token_url": "https://api.xing.com/v1/access_token",
322
- "authorization_header": false
323
- },
324
- "Yandex": {
325
- "oauth_version": "2.0",
326
- "dialog_url": "https://oauth.yandex.com/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state={STATE}&scope={SCOPE}",
327
- "access_token_url": "https://oauth.yandex.com/token"
328
- }
329
- }
330
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Nextend/Framework/Misc/Zip/Creator.php CHANGED
@@ -132,7 +132,8 @@ class Creator {
132
 
133
  // echo this entry on the fly, ...
134
  if ($this->doWrite) {
135
- echo $fr;
 
136
  } else { // ... OR add this entry to array
137
  $this->datasec[] = $fr;
138
  }
@@ -182,7 +183,9 @@ class Creator {
182
  "\x00\x00"; //.zip file comment length
183
 
184
  if ($this->doWrite) { // Send central directory & end ctrl dir to STDOUT
185
- echo $header;
 
 
186
 
187
  return ""; // Return empty string
188
  } else { // Return entire ZIP archive as string
132
 
133
  // echo this entry on the fly, ...
134
  if ($this->doWrite) {
135
+ // PHPCS - The value contains zip file binary data, so nothing to escape
136
+ echo $fr; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
137
  } else { // ... OR add this entry to array
138
  $this->datasec[] = $fr;
139
  }
183
  "\x00\x00"; //.zip file comment length
184
 
185
  if ($this->doWrite) { // Send central directory & end ctrl dir to STDOUT
186
+
187
+ // PHPCS - The value is zip file binary header, so nothing to escape.
188
+ echo $header; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
189
 
190
  return ""; // Return empty string
191
  } else { // Return entire ZIP archive as string
Nextend/Framework/Notification/Notification.php CHANGED
@@ -10,17 +10,17 @@ use Nextend\Framework\Session\Session;
10
  class Notification {
11
 
12
  /**
13
- * @var bool|array
14
  */
15
- private static $error = false;
16
  /**
17
- * @var bool|array
18
  */
19
- private static $success = false;
20
  /**
21
- * @var bool|array
22
  */
23
- private static $notice = false;
24
 
25
  private static $flushed = false;
26
 
@@ -34,32 +34,20 @@ class Notification {
34
 
35
 
36
  private static function loadSessionError() {
37
- if (self::$error === false) {
38
- if (Platform::isAdmin()) {
39
- self::$error = Session::get('error', array());
40
- } else {
41
- self::$error = array();
42
- }
43
  }
44
  }
45
 
46
  private static function loadSessionSuccess() {
47
- if (self::$success === false) {
48
- if (Platform::isAdmin()) {
49
- self::$success = Session::get('success', array());
50
- } else {
51
- self::$success = array();
52
- }
53
  }
54
  }
55
 
56
  private static function loadSessionNotice() {
57
- if (self::$notice === false) {
58
- if (Platform::isAdmin()) {
59
- self::$notice = Session::get('notice', array());
60
- } else {
61
- self::$notice = array();
62
- }
63
  }
64
  }
65
 
@@ -82,7 +70,7 @@ class Notification {
82
 
83
  if (Platform::isAdmin() && is_array(self::$error) && count(self::$error)) {
84
  foreach (self::$error as $error) {
85
- echo '<div style="border: 1px solid red; margin-bottom: 20px; padding: 10px 20px; max-width: 400px;">' . $error[0] . '</div>';
86
  }
87
  self::$error = array();
88
  }
10
  class Notification {
11
 
12
  /**
13
+ * @var array
14
  */
15
+ private static $error;
16
  /**
17
+ * @var array
18
  */
19
+ private static $success;
20
  /**
21
+ * @var array
22
  */
23
+ private static $notice;
24
 
25
  private static $flushed = false;
26
 
34
 
35
 
36
  private static function loadSessionError() {
37
+ if (self::$error === null && Platform::isAdmin()) {
38
+ self::$error = Session::get('error', array());
 
 
 
 
39
  }
40
  }
41
 
42
  private static function loadSessionSuccess() {
43
+ if (self::$success === null && Platform::isAdmin()) {
44
+ self::$success = Session::get('success', array());
 
 
 
 
45
  }
46
  }
47
 
48
  private static function loadSessionNotice() {
49
+ if (self::$notice === null && Platform::isAdmin()) {
50
+ self::$notice = Session::get('notice', array());
 
 
 
 
51
  }
52
  }
53
 
70
 
71
  if (Platform::isAdmin() && is_array(self::$error) && count(self::$error)) {
72
  foreach (self::$error as $error) {
73
+ echo '<div style="border: 1px solid #e90909; margin-bottom: 20px; padding: 10px 20px; max-width: 400px;">' . esc_html($error[0]) . '</div>';
74
  }
75
  self::$error = array();
76
  }
Nextend/Framework/Platform/WordPress/PlatformWordPress.php CHANGED
@@ -6,7 +6,9 @@ namespace Nextend\Framework\Platform\WordPress;
6
 
7
  use Nextend\Framework\Filesystem\Filesystem;
8
  use Nextend\Framework\Platform\AbstractPlatform;
 
9
  use Nextend\Framework\Url\Url;
 
10
 
11
  class PlatformWordPress extends AbstractPlatform {
12
 
@@ -105,6 +107,12 @@ class PlatformWordPress extends AbstractPlatform {
105
  public function getDebug() {
106
  $debug = array('');
107
 
 
 
 
 
 
 
108
 
109
  $debug[] = 'Path to uri:';
110
  $uris = Url::getUris();
@@ -153,6 +161,6 @@ class PlatformWordPress extends AbstractPlatform {
153
  }
154
 
155
  public function isBeaverBuilderActive() {
156
- return isset($_GET['fl_builder']);
157
  }
158
  }
6
 
7
  use Nextend\Framework\Filesystem\Filesystem;
8
  use Nextend\Framework\Platform\AbstractPlatform;
9
+ use Nextend\Framework\Request\Request;
10
  use Nextend\Framework\Url\Url;
11
+ use Nextend\SmartSlider3\Settings;
12
 
13
  class PlatformWordPress extends AbstractPlatform {
14
 
107
  public function getDebug() {
108
  $debug = array('');
109
 
110
+ $debug[] = 'get_site_url: ' . get_site_url();
111
+ $debug[] = 'WP_CONTENT_URL: ' . WP_CONTENT_URL;
112
+
113
+ $translateUrl = Settings::get('translate-url', '|*|');
114
+ $debug[] = 'Translate url: ' . ($translateUrl == '|*|' ? 'not used' : $translateUrl);
115
+ $debug[] = '';
116
 
117
  $debug[] = 'Path to uri:';
118
  $uris = Url::getUris();
161
  }
162
 
163
  public function isBeaverBuilderActive() {
164
+ return Request::$GET->getVar('fl_builder') !== null;
165
  }
166
  }
Nextend/Framework/Request/Parser/WordPressRequestParser.php CHANGED
@@ -4,12 +4,22 @@ namespace Nextend\Framework\Request\Parser;
4
 
5
  class WordPressRequestParser extends AbstractRequestParser {
6
 
 
 
 
 
 
 
7
  public function parseData($data) {
8
- if (is_array($data)) {
9
- return $this->stripslashesRecursive($data);
 
 
 
 
10
  }
11
 
12
- return stripslashes($data);
13
  }
14
 
15
  private function stripslashesRecursive($array) {
4
 
5
  class WordPressRequestParser extends AbstractRequestParser {
6
 
7
+ private $isSlashed;
8
+
9
+ public function __construct() {
10
+ $this->isSlashed = did_action('init') > 0;
11
+ }
12
+
13
  public function parseData($data) {
14
+ if ($this->isSlashed) {
15
+ if (is_array($data)) {
16
+ return $this->stripslashesRecursive($data);
17
+ }
18
+
19
+ return stripslashes($data);
20
  }
21
 
22
+ return $data;
23
  }
24
 
25
  private function stripslashesRecursive($array) {
Nextend/Framework/Request/Request.php CHANGED
@@ -22,6 +22,21 @@ class Request {
22
  */
23
  public static $POST;
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  private static $requestUri;
26
 
27
  public static $isAjax = false;
@@ -30,6 +45,9 @@ class Request {
30
  self::$REQUEST = new Storage($_REQUEST);
31
  self::$GET = new Storage($_GET);
32
  self::$POST = new Storage($_POST);
 
 
 
33
  }
34
 
35
  /**
22
  */
23
  public static $POST;
24
 
25
+ /**
26
+ * @var Storage
27
+ */
28
+ public static $SERVER;
29
+
30
+ /**
31
+ * @var Storage
32
+ */
33
+ public static $COOKIE;
34
+
35
+ /**
36
+ * @var Storage
37
+ */
38
+ public static $FILES;
39
+
40
  private static $requestUri;
41
 
42
  public static $isAjax = false;
45
  self::$REQUEST = new Storage($_REQUEST);
46
  self::$GET = new Storage($_GET);
47
  self::$POST = new Storage($_POST);
48
+ self::$SERVER = new Storage($_SERVER);
49
+ self::$COOKIE = new Storage($_COOKIE);
50
+ self::$FILES = new Storage($_FILES, true);
51
  }
52
 
53
  /**
Nextend/Framework/Request/Storage.php CHANGED
@@ -9,6 +9,7 @@ use Nextend\Framework\Request\Parser\WordPressRequestParser;
9
  class Storage {
10
 
11
  public $originalStorage;
 
12
  public $storage;
13
 
14
  /**
@@ -16,11 +17,12 @@ class Storage {
16
  */
17
  public $parserInstance;
18
 
19
- public function __construct($data) {
20
  $this->parserInstance = new WordPressRequestParser();
21
 
22
 
23
  $this->originalStorage = $data;
 
24
  $this->storage = array();
25
  }
26
 
@@ -29,13 +31,17 @@ class Storage {
29
  }
30
 
31
  protected function get($var, $default = false) {
32
- if (isset($this->storage[$var])) {
33
- return $this->storage[$var];
34
- } else if (isset($this->originalStorage[$var])) {
 
35
 
36
- $this->storage[$var] = $this->parserInstance->parseData($this->originalStorage[$var]);
37
 
38
- return $this->storage[$var];
 
 
 
39
  }
40
 
41
  return $default;
9
  class Storage {
10
 
11
  public $originalStorage;
12
+ public $returnOriginal;
13
  public $storage;
14
 
15
  /**
17
  */
18
  public $parserInstance;
19
 
20
+ public function __construct($data, $returnOriginal = false) {
21
  $this->parserInstance = new WordPressRequestParser();
22
 
23
 
24
  $this->originalStorage = $data;
25
+ $this->returnOriginal = $returnOriginal;
26
  $this->storage = array();
27
  }
28
 
31
  }
32
 
33
  protected function get($var, $default = false) {
34
+ if (!$this->returnOriginal) {
35
+ if (isset($this->storage[$var])) {
36
+ return $this->storage[$var];
37
+ } else if (isset($this->originalStorage[$var])) {
38
 
39
+ $this->storage[$var] = $this->parserInstance->parseData($this->originalStorage[$var]);
40
 
41
+ return $this->storage[$var];
42
+ }
43
+ } else if (isset($this->originalStorage[$var])) {
44
+ return $this->originalStorage[$var];
45
  }
46
 
47
  return $default;
Nextend/Framework/Sanitize.php CHANGED
@@ -268,6 +268,20 @@ $allowedentitynames = is_array($allowedentitynames) ? $allowedentitynames : arra
268
 
269
  class Sanitize {
270
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  private static function getCharset() {
272
 
273
  return Platform::getCharset();
@@ -636,7 +650,7 @@ class Sanitize {
636
 
637
  public static function filter_allowed_html($input, $extraTags = '') {
638
 
639
- return self::filter_attributes_on(strip_tags($input, '<a><span><sub><sup><em><i><var><cite><b><strong><small><bdo><br><img><picture><source>' . $extraTags));
640
  }
641
 
642
  public static function remove_all_html($input) {
@@ -686,4 +700,104 @@ class Sanitize {
686
  return '';
687
 
688
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
689
  }
268
 
269
  class Sanitize {
270
 
271
+ public static $basicTags = array();
272
+
273
+ // Tags for admin page forms with text fields, on-offs, selects, textareas, etc..
274
+ public static $adminFormTags = array();
275
+
276
+ // Tags for the rest of the admin page layout.
277
+ public static $adminTemplateTags = array();
278
+
279
+ // Tags for CSS and JS codes.
280
+ public static $assetTags = array();
281
+
282
+ // Tags for html videos.
283
+ public static $videoTags = array();
284
+
285
  private static function getCharset() {
286
 
287
  return Platform::getCharset();
650
 
651
  public static function filter_allowed_html($input, $extraTags = '') {
652
 
653
+ return self::filter_attributes_on(strip_tags($input, '<a><span><sub><sup><em><i><var><cite><b><strong><small><bdo><br><img><picture><source><u>' . $extraTags));
654
  }
655
 
656
  public static function remove_all_html($input) {
700
  return '';
701
 
702
  }
703
+
704
+ public static function set_allowed_tags() {
705
+ global $allowedposttags;
706
+
707
+ self::$basicTags = array_merge_recursive($allowedposttags, array(
708
+ 'div' => array(
709
+ 'style' => true,
710
+ ),
711
+ 'script' => array(),
712
+ ));
713
+
714
+ self::$adminTemplateTags = array_merge_recursive(self::$basicTags, array(
715
+ 'svg' => array(
716
+ 'xmlns' => true,
717
+ 'width' => true,
718
+ 'height' => true,
719
+ ),
720
+ 'path' => array(
721
+ 'fill' => true,
722
+ 'd' => true,
723
+ ),
724
+ 'a' => array(
725
+ 'tabindex' => true,
726
+ ),
727
+ ));
728
+
729
+ self::$adminFormTags = array_merge_recursive(self::$basicTags, array(
730
+ 'input' => array(
731
+ 'id' => true,
732
+ 'name' => true,
733
+ 'value' => true,
734
+ 'type' => true,
735
+ 'autocomplete' => true,
736
+ 'style' => true,
737
+ ),
738
+ 'div' => array(
739
+ 'aria-checked' => true,
740
+ 'tabindex' => true,
741
+ ),
742
+ 'a' => array(
743
+ 'tabindex' => true,
744
+ ),
745
+ 'select' => array(
746
+ 'id' => true,
747
+ 'name' => true,
748
+ 'aria-labelledby' => true,
749
+ 'autocomplete' => true,
750
+ 'multiple' => true,
751
+ 'size' => true,
752
+ ),
753
+ 'option' => array(
754
+ 'value' => true,
755
+ 'selected' => true,
756
+ ),
757
+ 'textarea' => array(
758
+ 'autocomplete' => true,
759
+ ),
760
+ ));
761
+
762
+ self::$assetTags = array(
763
+ 'style' => array(
764
+ 'data-related' => true,
765
+ ),
766
+ 'link' => array(
767
+ 'rel' => true,
768
+ 'type' => true,
769
+ 'href' => true,
770
+ 'media' => true,
771
+ ),
772
+ 'script' => array(
773
+ 'src' => true,
774
+ 'defer' => true,
775
+ 'async' => true,
776
+ ),
777
+ );
778
+
779
+ self::$videoTags = array(
780
+ 'video' => array(
781
+ 'muted' => true,
782
+ 'loop' => true,
783
+ 'class' => true,
784
+ 'style' => true,
785
+ 'playsinline' => true,
786
+ 'webkit-playsinline' => true,
787
+ 'data-*' => true,
788
+ 'preload' => true,
789
+ ),
790
+ 'source' => array(
791
+ 'src' => true,
792
+ 'type' => true,
793
+ )
794
+ );
795
+
796
+ }
797
+
798
+ public static function esc_js_filter($safe_text, $text) {
799
+ $safe_text = wp_check_invalid_utf8($text);
800
+
801
+ return $safe_text;
802
+ }
803
  }
Nextend/Framework/Session/AbstractStorage.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace Nextend\Framework\Session;
4
 
5
  use Nextend\Framework\Plugin;
 
6
 
7
  abstract class AbstractStorage {
8
 
@@ -19,12 +20,13 @@ abstract class AbstractStorage {
19
  public function __construct($userIdentifier) {
20
 
21
  $this->register();
22
- if (!isset($_COOKIE['nextendsession']) || substr($_COOKIE['nextendsession'], 0, 2) != 'n2' || !preg_match('/^[a-f0-9]{32}$/', substr($_COOKIE['nextendsession'], 2))) {
 
23
  $this->hash = 'n2' . md5(self::$salt . $userIdentifier);
24
- setcookie('nextendsession', $this->hash, time() + self::$expire, $_SERVER["HTTP_HOST"]);
25
- $_COOKIE['nextendsession'] = $this->hash;
26
  } else {
27
- $this->hash = $_COOKIE['nextendsession'];
28
  }
29
 
30
  $this->load();
3
  namespace Nextend\Framework\Session;
4
 
5
  use Nextend\Framework\Plugin;
6
+ use Nextend\Framework\Request\Request;
7
 
8
  abstract class AbstractStorage {
9
 
20
  public function __construct($userIdentifier) {
21
 
22
  $this->register();
23
+ $cookie = Request::$COOKIE->getCmd('nextendsession');
24
+ if ($cookie === '' || substr($cookie, 0, 2) != 'n2' || !preg_match('/^[a-f0-9]{32}$/', substr($cookie, 2))) {
25
  $this->hash = 'n2' . md5(self::$salt . $userIdentifier);
26
+ setcookie('nextendsession', $this->hash, time() + self::$expire, Request::$SERVER->getVar('HTTP_HOST'));
27
+ Request::$COOKIE->set('nextendsession', $this->hash);
28
  } else {
29
+ $this->hash = $cookie;
30
  }
31
 
32
  $this->load();
Nextend/Framework/Url/UrlHelper.php CHANGED
@@ -3,6 +3,7 @@
3
 
4
  namespace Nextend\Framework\Url;
5
 
 
6
 
7
  class UrlHelper {
8
 
@@ -46,13 +47,13 @@ class UrlHelper {
46
  $args = func_get_args();
47
  if (is_array($args[0])) {
48
  if (count($args) < 2 || false === $args[1]) {
49
- $uri = $_SERVER['REQUEST_URI'];
50
  } else {
51
  $uri = $args[1];
52
  }
53
  } else {
54
  if (count($args) < 3 || false === $args[2]) {
55
- $uri = $_SERVER['REQUEST_URI'];
56
  } else {
57
  $uri = $args[2];
58
  }
3
 
4
  namespace Nextend\Framework\Url;
5
 
6
+ use Nextend\Framework\Request\Request;
7
 
8
  class UrlHelper {
9
 
47
  $args = func_get_args();
48
  if (is_array($args[0])) {
49
  if (count($args) < 2 || false === $args[1]) {
50
+ $uri = Request::$SERVER->getVar('REQUEST_URI');
51
  } else {
52
  $uri = $args[1];
53
  }
54
  } else {
55
  if (count($args) < 3 || false === $args[2]) {
56
+ $uri = Request::$SERVER->getVar('REQUEST_URI');
57
  } else {
58
  $uri = $args[2];
59
  }
Nextend/Framework/Url/WordPress/WordPressUrl.php CHANGED
@@ -3,6 +3,7 @@
3
  namespace Nextend\Framework\Url\WordPress;
4
 
5
  use Nextend\Framework\Filesystem\Filesystem;
 
6
  use Nextend\Framework\Url\AbstractPlatformUrl;
7
  use function content_url;
8
  use function wp_upload_dir;
@@ -17,7 +18,7 @@ class WordPressUrl extends AbstractPlatformUrl {
17
 
18
  $this->_baseuri = content_url();
19
 
20
- if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') {
21
  $this->_baseuri = str_replace('http://', 'https://', $this->_baseuri);
22
  }
23
 
@@ -31,7 +32,7 @@ class WordPressUrl extends AbstractPlatformUrl {
31
  $wp_upload_dir = wp_upload_dir();
32
  $uploadUri = rtrim($wp_upload_dir['baseurl'], "/\\");
33
  if (strpos($this->_baseuri, $uploadUri) !== 0) {
34
- if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') {
35
  $uploadUri = str_replace('http://', 'https://', $uploadUri);
36
  }
37
  $this->uris[] = $uploadUri;
3
  namespace Nextend\Framework\Url\WordPress;
4
 
5
  use Nextend\Framework\Filesystem\Filesystem;
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\Framework\Url\AbstractPlatformUrl;
8
  use function content_url;
9
  use function wp_upload_dir;
18
 
19
  $this->_baseuri = content_url();
20
 
21
+ if (strtolower(Request::$SERVER->getCmd('HTTPS', 'off')) != 'off') {
22
  $this->_baseuri = str_replace('http://', 'https://', $this->_baseuri);
23
  }
24
 
32
  $wp_upload_dir = wp_upload_dir();
33
  $uploadUri = rtrim($wp_upload_dir['baseurl'], "/\\");
34
  if (strpos($this->_baseuri, $uploadUri) !== 0) {
35
+ if (strtolower(Request::$SERVER->getCmd('HTTPS', 'off')) != 'off') {
36
  $uploadUri = str_replace('http://', 'https://', $uploadUri);
37
  }
38
  $this->uris[] = $uploadUri;
Nextend/Framework/View/AbstractLayout.php CHANGED
@@ -6,6 +6,7 @@ namespace Nextend\Framework\View;
6
 
7
  use Nextend\Framework\Pattern\GetPathTrait;
8
  use Nextend\Framework\Pattern\MVCHelperTrait;
 
9
 
10
  abstract class AbstractLayout {
11
 
@@ -46,7 +47,7 @@ abstract class AbstractLayout {
46
  }
47
 
48
  /**
49
- * @param string $html
50
  */
51
  public function addContent($html) {
52
 
@@ -54,7 +55,7 @@ abstract class AbstractLayout {
54
  }
55
 
56
  /**
57
- * @param AbstractBlock $block
58
  */
59
  public function addContentBlock($block) {
60
 
@@ -64,9 +65,11 @@ abstract class AbstractLayout {
64
  public function displayContent() {
65
  foreach ($this->contentBlocks as $content) {
66
  if (is_string($content)) {
67
- echo $content;
 
68
  } else if (is_array($content)) {
69
- echo call_user_func_array($content[0], $content[1]);
 
70
  } else {
71
  $content->display();
72
  }
6
 
7
  use Nextend\Framework\Pattern\GetPathTrait;
8
  use Nextend\Framework\Pattern\MVCHelperTrait;
9
+ use Nextend\Framework\Sanitize;
10
 
11
  abstract class AbstractLayout {
12
 
47
  }
48
 
49
  /**
50
+ * @param string $html contains already escaped data
51
  */
52
  public function addContent($html) {
53
 
55
  }
56
 
57
  /**
58
+ * @param AbstractBlock $block contains already escaped data
59
  */
60
  public function addContentBlock($block) {
61
 
65
  public function displayContent() {
66
  foreach ($this->contentBlocks as $content) {
67
  if (is_string($content)) {
68
+ // PHPCS - Content already escaped
69
+ echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
70
  } else if (is_array($content)) {
71
+ // PHPCS - Content already escaped
72
+ echo call_user_func_array($content[0], $content[1]); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
73
  } else {
74
  $content->display();
75
  }
Nextend/Framework/View/AbstractView.php CHANGED
@@ -31,6 +31,11 @@ abstract class AbstractView {
31
  $this->setMVCHelper($controller);
32
  }
33
 
 
 
 
 
 
34
  protected function render($templateName) {
35
  ob_start();
36
  include self::getPath() . '/Template/' . $templateName . '.php';
31
  $this->setMVCHelper($controller);
32
  }
33
 
34
+ /**
35
+ * @param $templateName
36
+ *
37
+ * @return false|string output is a safe file, so nothing to escape.
38
+ */
39
  protected function render($templateName) {
40
  ob_start();
41
  include self::getPath() . '/Template/' . $templateName . '.php';
Nextend/Framework/WordPress/AssetInjector.php CHANGED
@@ -163,7 +163,7 @@ class AssetInjector {
163
  public function injectCSSComment() {
164
  static $once;
165
  if (!$once) {
166
- echo self::$cssComment;
167
  $once = true;
168
  }
169
  }
163
  public function injectCSSComment() {
164
  static $once;
165
  if (!$once) {
166
+ echo wp_kses(self::$cssComment, array());
167
  $once = true;
168
  }
169
  }
Nextend/Languages/es.mo CHANGED
Binary file
Nextend/Languages/es.po CHANGED
@@ -1,8 +1,8 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
- "POT-Creation-Date: 2022-05-13 07:44+0200\n"
5
- "PO-Revision-Date: 2022-05-17 12:52+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: es\n"
@@ -10,7 +10,7 @@ msgstr ""
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
- "X-Generator: Poedit 3.0\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
16
  "X-Poedit-Flags-xgettext: --no-location\n"
@@ -1583,9 +1583,6 @@ msgstr "Fijo"
1583
  msgid "Background video"
1584
  msgstr "Video de fondo"
1585
 
1586
- msgid "Muted"
1587
- msgstr "Mudo"
1588
-
1589
  msgctxt "Video/Audio play"
1590
  msgid "Loop"
1591
  msgstr "Loop"
@@ -1763,27 +1760,27 @@ msgid "Max"
1763
  msgstr "Max"
1764
 
1765
  msgid "Breakpoints"
1766
- msgstr "Puntos de parada o \"breakpoints\""
1767
 
1768
  msgid ""
1769
  "Breakpoints define the browser width in pixel when the slider switches to a "
1770
  "different device."
1771
  msgstr ""
1772
- "Los puntos de parada o \"breakpoints\" definen el ancho del navegador en "
1773
  "pixeles cuando el slider cambia a un dispositivo diferente."
1774
 
1775
  msgid "Global breakpoints"
1776
- msgstr "Puntos de parada (breakpoints) globales"
1777
 
1778
  #, php-format
1779
  msgid ""
1780
  "You can use the global breakpoints, or adjust them locally here. You can "
1781
- "configure the Global breakpoints at <a href=\"%1$s\" target=\"_blank"
1782
- "\">Global settings</a> > General > Breakpoints"
1783
  msgstr ""
1784
- "Puedes utilizar los puntos de parada (breakpoints), o los ajustas aquí. "
1785
- "Puedes configurar los puntos de parada en <a href=\"%1$s\" target=\"_blank"
1786
- "\">Ajustes</a> en General > Puntos de parada"
1787
 
1788
  msgid "Custom size"
1789
  msgstr "Tamaño personalizado"
@@ -1791,13 +1788,13 @@ msgstr "Tamaño personalizado"
1791
  #, php-format
1792
  msgid ""
1793
  "Use this option to customize the aspect ratio for each device. %1$s Read "
1794
- "more in the documentation%2$s. <b>Beware:</b> This option is rarely needed "
1795
  "and might be hard to set properly!"
1796
  msgstr ""
1797
  "Utiliza esta opción para personalizar la relación de aspecto de cada "
1798
- "dispositivo. %1$s Puedes leer más en la documentación%2$s. <b>Importante:</"
1799
- "b> ¡Ten en cuenta que está opción se necesita rara vez y puede ser difícil "
1800
- "configurarla correctamente!"
1801
 
1802
  msgid "Slides"
1803
  msgstr "Slides"
@@ -1968,12 +1965,12 @@ msgid "Get started with the Pro version now!"
1968
  msgstr "¡Comienza con la versión Pro ahora!"
1969
 
1970
  #, php-format
1971
- msgid "Unable to connect to the API (%s)."
1972
- msgstr "No se pudo conectar a la API (%s)."
1973
-
1974
- msgid "See <b>Debug Information</b> for more details!"
1975
  msgstr ""
1976
- "¡Consulta la <b>Información de Depuración</b> para obtener más detalles!"
 
1977
 
1978
  msgid "Successful connection with the API."
1979
  msgstr "Conexión exitosa con la API."
@@ -2740,9 +2737,10 @@ msgid "Delete resized image cache"
2740
  msgstr "Eliminar cache de imágenes redimencionadas"
2741
 
2742
  #, php-format
2743
- msgid "If enabled the following folder will be <b>permanently deleted</b>: %s"
 
2744
  msgstr ""
2745
- "Si se activa la siguiente carpeta se <b>eliminará permanentemente</b>: %s"
2746
 
2747
  msgid "Configuration"
2748
  msgstr "Configuración"
@@ -2832,19 +2830,6 @@ msgstr ""
2832
  msgid "Load Font Awesome 4"
2833
  msgstr "Cargar Font Awesome 4"
2834
 
2835
- msgid "API requests"
2836
- msgstr "Solicitudes de la API"
2837
-
2838
- #, php-format
2839
- msgctxt "Curl"
2840
- msgid "Use %s"
2841
- msgstr "Usar %s"
2842
-
2843
- #, php-format
2844
- msgctxt "curl proxy"
2845
- msgid "Clean %s"
2846
- msgstr "Limpiar %s"
2847
-
2848
  msgid "General settings"
2849
  msgstr "Ajustes generales"
2850
 
@@ -2939,7 +2924,7 @@ msgstr "Excluir plugins"
2939
  msgid ""
2940
  "At each slider you can override the global breakpoints with local values."
2941
  msgstr ""
2942
- "En cada slider puedes sobrescribir los puntos de parada (breakpoint) "
2943
  "globales con los valores locales."
2944
 
2945
  msgid "Focus offset"
@@ -3112,9 +3097,9 @@ msgid "File"
3112
  msgstr "Archivo"
3113
 
3114
  #, php-format
3115
- msgid "Files with <i>.ss3</i> extension are listed from: %s"
3116
  msgstr ""
3117
- "Los archivos con la extensión <i>.ss3</i> son los que se muestran en: %s"
3118
 
3119
  msgid "Delete file"
3120
  msgstr "Eliminar archivo"
@@ -3261,6 +3246,11 @@ msgstr ""
3261
  msgid "Unable to connect to the API"
3262
  msgstr "No se pudo conectar a la API"
3263
 
 
 
 
 
 
3264
  msgid "MySQL table missing"
3265
  msgstr "Falta una tabla de MySQL"
3266
 
@@ -5523,6 +5513,12 @@ msgstr ""
5523
  "Escribe los ID's de productos que quieres mostrar aquí, en el orden que "
5524
  "quieres que aparezcan en el generador. Un ID de producto por línea."
5525
 
 
 
 
 
 
 
5526
  msgid "One time events"
5527
  msgstr "Eventos de una única vez"
5528
 
@@ -5908,12 +5904,14 @@ msgid "Vertical pendulum 3D"
5908
  msgstr "Péndulo vertical 3D"
5909
 
5910
  msgid "We are Passionate About"
5911
- msgstr ""
5912
 
5913
  msgid ""
5914
  "Amazing Food\n"
5915
  "Great Hospitality"
5916
  msgstr ""
 
 
5917
 
5918
  msgid "Before text"
5919
  msgstr "Antes del texto"
@@ -6187,13 +6185,11 @@ msgstr "Redirigir a la URL"
6187
  msgid "Choose what happens after the counter reached zero."
6188
  msgstr "Selecciona lo que ocurre cuando el contador alcanza el cero."
6189
 
6190
- #, fuzzy
6191
- #| msgid "The image is empty"
6192
  msgid "This page is"
6193
- msgstr "La imagen está vacía"
6194
 
6195
  msgid "Amazing"
6196
- msgstr ""
6197
 
6198
  #, php-format
6199
  msgid "Circle %d"
@@ -6243,20 +6239,21 @@ msgid "HTML"
6243
  msgstr "HTML"
6244
 
6245
  msgid "Empty element"
6246
- msgstr ""
6247
 
 
6248
  msgid ""
6249
- "Please note that <b>we do not support</b> the HTML layer and the 3rd party "
6250
  "codes loaded by it. We only suggest using this layer if you are a developer. "
6251
- "<br>Also, make sure your HTML code is valid! Invalid HTML codes can mess up "
6252
  "the entire slide and the only way resolving this problem is deleting the "
6253
  "slide."
6254
  msgstr ""
6255
- "Ten en cuenta que <b> no damos soporte</b> sobre la capa HTML y los códigos "
6256
- "de terceros que incluyas en ella. Sugerimos que solo utilices capa si eres "
6257
- "un/a desarrollador/a. <br>También asegúrate que el código HTML sea válido. "
6258
- "Los códigos HTML no válidos pueden romper todo el slide y la única forma de "
6259
- "resolverlo sería eliminarlo."
6260
 
6261
  msgid "Item"
6262
  msgstr "Item"
@@ -6367,15 +6364,16 @@ msgstr "Enter an %1$s aria-label attribute %2$s that describes the link."
6367
  msgid "Iframe"
6368
  msgstr "Iframe"
6369
 
 
6370
  msgid ""
6371
- "Please note, that <b>we do not support</b> customized coding! The iframe "
6372
  "layer often needs code customizations what you have to do yourself, so we "
6373
  "only suggest using this layer if you are a developer!"
6374
  msgstr ""
6375
- "Ten en cuenta que <b>no damos soporte</b> sobre el código personalizado. ¡La "
6376
- "capa iframe por lo general necesita código personalizado que debes realizar "
6377
- "tu mismo/a, así que sugerimos que utilices esta capa solo si eres un "
6378
- "desarrollador/a!"
6379
 
6380
  msgid "Iframe url"
6381
  msgstr "Url del iframe"
@@ -6392,6 +6390,9 @@ msgstr "Área de la imagen"
6392
  msgid "Image box"
6393
  msgstr "Caja de imagen"
6394
 
 
 
 
6395
  msgid ""
6396
  "Positions the text inside the layer. Only works with left and right layout."
6397
  msgstr ""
@@ -6475,15 +6476,16 @@ msgstr "Precarga"
6475
  msgid "Joomla module"
6476
  msgstr "Módulo de Joomla"
6477
 
 
6478
  msgid ""
6479
- "Please note, that <b>we do not support</b> the Joomla module layer!<br>The "
6480
  "loaded module often needs code customizations what you have to do yourself, "
6481
  "so we only suggest using this layer if you are a developer!"
6482
  msgstr ""
6483
- "Por favor ten en cuenta que <b>no damos soporte</b> sobre la capa de módulos "
6484
- "de Joomla.<br>El código que carga el modulo con frecuencia necesita código "
6485
- "personalizado que debes escribir, ¡te sugerimos que utilices esta capa solo "
6486
- "sí eres un desarrollador!"
6487
 
6488
  msgid "Position name or module ID"
6489
  msgstr "Nombre de la posición o ID del módulo"
@@ -6747,6 +6749,26 @@ msgstr "Color de la pista"
6747
  msgid "Bar color"
6748
  msgstr "Color de la barra"
6749
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6750
  #~ msgctxt "Default Google font family for admin"
6751
  #~ msgid "Montserrat"
6752
  #~ msgstr "Montserrat"
@@ -6907,9 +6929,6 @@ msgstr "Color de la barra"
6907
  #~ msgid "ZigZag 3"
6908
  #~ msgstr "ZigZag 3"
6909
 
6910
- #~ msgid "Aria label"
6911
- #~ msgstr "Etiqueta Aria"
6912
-
6913
  #~ msgid "iframe"
6914
  #~ msgstr "iframe"
6915
 
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
+ "POT-Creation-Date: 2022-07-21 09:26+0200\n"
5
+ "PO-Revision-Date: 2022-07-27 16:52-0300\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: es\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
+ "X-Generator: Poedit 3.1\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
16
  "X-Poedit-Flags-xgettext: --no-location\n"
1583
  msgid "Background video"
1584
  msgstr "Video de fondo"
1585
 
 
 
 
1586
  msgctxt "Video/Audio play"
1587
  msgid "Loop"
1588
  msgstr "Loop"
1760
  msgstr "Max"
1761
 
1762
  msgid "Breakpoints"
1763
+ msgstr "Puntos de ruptura o \"breakpoints\""
1764
 
1765
  msgid ""
1766
  "Breakpoints define the browser width in pixel when the slider switches to a "
1767
  "different device."
1768
  msgstr ""
1769
+ "Los puntos de ruptura o \"breakpoints\" definen el ancho del navegador en "
1770
  "pixeles cuando el slider cambia a un dispositivo diferente."
1771
 
1772
  msgid "Global breakpoints"
1773
+ msgstr "Puntos de ruptura (breakpoints) globales"
1774
 
1775
  #, php-format
1776
  msgid ""
1777
  "You can use the global breakpoints, or adjust them locally here. You can "
1778
+ "configure the Global breakpoints at %1$sGlobal settings%2$s > General > "
1779
+ "Breakpoints"
1780
  msgstr ""
1781
+ "Puedes utilizar los puntos de ruptura (breakpoints) globales, o ajustarlos "
1782
+ "localmente aquí. Puedes configurar los puntos de ruptura en %1$sAjustes%2$s "
1783
+ "> General > Puntos de ruptura"
1784
 
1785
  msgid "Custom size"
1786
  msgstr "Tamaño personalizado"
1788
  #, php-format
1789
  msgid ""
1790
  "Use this option to customize the aspect ratio for each device. %1$s Read "
1791
+ "more in the documentation%2$s. %3$sBeware:%4$s This option is rarely needed "
1792
  "and might be hard to set properly!"
1793
  msgstr ""
1794
  "Utiliza esta opción para personalizar la relación de aspecto de cada "
1795
+ "dispositivo. %1$s Puedes leer más en la documentación%2$s. %3$sTen cuidado:"
1796
+ "%4$s ¡Está opción raramente se necesita y puede ser complicado ajustarla "
1797
+ "correctamente!"
1798
 
1799
  msgid "Slides"
1800
  msgstr "Slides"
1965
  msgstr "¡Comienza con la versión Pro ahora!"
1966
 
1967
  #, php-format
1968
+ msgid ""
1969
+ "Unable to connect to the API (%1$s). %2$s See %3$sDebug Information%4$s for "
1970
+ "more details!"
 
1971
  msgstr ""
1972
+ "No fue posible conectarse a la API (%1$s). %2$s ¡Consulta la %3$sInformación "
1973
+ "de depuración%4$s para más detalles!"
1974
 
1975
  msgid "Successful connection with the API."
1976
  msgstr "Conexión exitosa con la API."
2737
  msgstr "Eliminar cache de imágenes redimencionadas"
2738
 
2739
  #, php-format
2740
+ msgid ""
2741
+ "If enabled the following folder will be %1$spermanently deleted%2$s: %3$s"
2742
  msgstr ""
2743
+ "Si se activa la siguiente carpeta se %1$seliminará permanentemente%2$s: %3$s"
2744
 
2745
  msgid "Configuration"
2746
  msgstr "Configuración"
2830
  msgid "Load Font Awesome 4"
2831
  msgstr "Cargar Font Awesome 4"
2832
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2833
  msgid "General settings"
2834
  msgstr "Ajustes generales"
2835
 
2924
  msgid ""
2925
  "At each slider you can override the global breakpoints with local values."
2926
  msgstr ""
2927
+ "En cada slider puedes sobrescribir los puntos de ruptura (breakpoints) "
2928
  "globales con los valores locales."
2929
 
2930
  msgid "Focus offset"
3097
  msgstr "Archivo"
3098
 
3099
  #, php-format
3100
+ msgid "Files with %1$s.ss3%2$s extension are listed from: %3$s"
3101
  msgstr ""
3102
+ "Los archivos con la extensión %1$s.ss3%2$s son los que se muestran en: %3$s"
3103
 
3104
  msgid "Delete file"
3105
  msgstr "Eliminar archivo"
3246
  msgid "Unable to connect to the API"
3247
  msgstr "No se pudo conectar a la API"
3248
 
3249
+ #, php-format
3250
+ msgid "See %1$sDebug Information%2$s for more details!"
3251
+ msgstr ""
3252
+ "¡Consulta la %1$sInformación de Depuración%2$s para obtener más detalles!"
3253
+
3254
  msgid "MySQL table missing"
3255
  msgstr "Falta una tabla de MySQL"
3256
 
5513
  "Escribe los ID's de productos que quieres mostrar aquí, en el orden que "
5514
  "quieres que aparezcan en el generador. Un ID de producto por línea."
5515
 
5516
+ msgid ""
5517
+ "Update your Ignite Gallery! Only Ignite Gallery 4.8+ versions are supported."
5518
+ msgstr ""
5519
+ "¡Actualiza tu versión de Ignite Gallery! Solo las versiones superiores a la "
5520
+ "4.8 son soportadas."
5521
+
5522
  msgid "One time events"
5523
  msgstr "Eventos de una única vez"
5524
 
5904
  msgstr "Péndulo vertical 3D"
5905
 
5906
  msgid "We are Passionate About"
5907
+ msgstr "Nos apasiona"
5908
 
5909
  msgid ""
5910
  "Amazing Food\n"
5911
  "Great Hospitality"
5912
  msgstr ""
5913
+ "La comida es increíble\n"
5914
+ "y la atención mucho mejor"
5915
 
5916
  msgid "Before text"
5917
  msgstr "Antes del texto"
6185
  msgid "Choose what happens after the counter reached zero."
6186
  msgstr "Selecciona lo que ocurre cuando el contador alcanza el cero."
6187
 
 
 
6188
  msgid "This page is"
6189
+ msgstr "La página es"
6190
 
6191
  msgid "Amazing"
6192
+ msgstr "Increíble"
6193
 
6194
  #, php-format
6195
  msgid "Circle %d"
6239
  msgstr "HTML"
6240
 
6241
  msgid "Empty element"
6242
+ msgstr "Elemento vacío"
6243
 
6244
+ #, php-format
6245
  msgid ""
6246
+ "Please note that %1$swe do not support%2$s the HTML layer and the 3rd party "
6247
  "codes loaded by it. We only suggest using this layer if you are a developer. "
6248
+ "%3$sAlso, make sure your HTML code is valid! Invalid HTML codes can mess up "
6249
  "the entire slide and the only way resolving this problem is deleting the "
6250
  "slide."
6251
  msgstr ""
6252
+ "Ten en cuenta que %1$sno damos soporte%2$s acerca de la capa HTML y los "
6253
+ "códigos de terceros que incluyas en ella. Sugerimos que solo utilices esta "
6254
+ "capa si eres un/a desarrollador/a. %3$sTambién asegúrate que el código HTML "
6255
+ "sea válido. Los códigos HTML no válidos pueden romper todo el slide y la "
6256
+ "única forma de resolverlo sería eliminarlo."
6257
 
6258
  msgid "Item"
6259
  msgstr "Item"
6364
  msgid "Iframe"
6365
  msgstr "Iframe"
6366
 
6367
+ #, php-format
6368
  msgid ""
6369
+ "Please note, that %1$swe do not support%2$s customized coding! The iframe "
6370
  "layer often needs code customizations what you have to do yourself, so we "
6371
  "only suggest using this layer if you are a developer!"
6372
  msgstr ""
6373
+ "Ten en cuenta que %1$sno damos soporte%2$s sobre el código personalizado. "
6374
+ "¡La capa iframe por lo general necesita código personalizado que debes "
6375
+ "realizar tu mismo/a, así que sugerimos que utilices esta capa solo si eres "
6376
+ "un desarrollador/a!"
6377
 
6378
  msgid "Iframe url"
6379
  msgstr "Url del iframe"
6390
  msgid "Image box"
6391
  msgstr "Caja de imagen"
6392
 
6393
+ msgid "Aria label"
6394
+ msgstr "Etiqueta Aria"
6395
+
6396
  msgid ""
6397
  "Positions the text inside the layer. Only works with left and right layout."
6398
  msgstr ""
6476
  msgid "Joomla module"
6477
  msgstr "Módulo de Joomla"
6478
 
6479
+ #, php-format
6480
  msgid ""
6481
+ "Please note, that %1$swe do not support%2$s the Joomla module layer!%3$sThe "
6482
  "loaded module often needs code customizations what you have to do yourself, "
6483
  "so we only suggest using this layer if you are a developer!"
6484
  msgstr ""
6485
+ "Por favor ten en cuenta que %1$sno damos soporte%2$s sobre la capa de "
6486
+ "módulos de Joomla.%3$sEl código que carga el modulo con frecuencia necesita "
6487
+ "código personalizado que debes escribir, ¡Te sugerimos que utilices esta "
6488
+ "capa solo sí eres un desarrollador/a!"
6489
 
6490
  msgid "Position name or module ID"
6491
  msgstr "Nombre de la posición o ID del módulo"
6749
  msgid "Bar color"
6750
  msgstr "Color de la barra"
6751
 
6752
+ #~ msgid "Muted"
6753
+ #~ msgstr "Mudo"
6754
+
6755
+ #, php-format
6756
+ #~ msgid "Unable to connect to the API (%s)."
6757
+ #~ msgstr "No se pudo conectar a la API (%s)."
6758
+
6759
+ #~ msgid "API requests"
6760
+ #~ msgstr "Solicitudes de la API"
6761
+
6762
+ #, php-format
6763
+ #~ msgctxt "Curl"
6764
+ #~ msgid "Use %s"
6765
+ #~ msgstr "Usar %s"
6766
+
6767
+ #, php-format
6768
+ #~ msgctxt "curl proxy"
6769
+ #~ msgid "Clean %s"
6770
+ #~ msgstr "Limpiar %s"
6771
+
6772
  #~ msgctxt "Default Google font family for admin"
6773
  #~ msgid "Montserrat"
6774
  #~ msgstr "Montserrat"
6929
  #~ msgid "ZigZag 3"
6930
  #~ msgstr "ZigZag 3"
6931
 
 
 
 
6932
  #~ msgid "iframe"
6933
  #~ msgstr "iframe"
6934
 
Nextend/Languages/nl_BE.mo CHANGED
Binary file
Nextend/Languages/nl_BE.po CHANGED
@@ -1,8 +1,8 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
- "POT-Creation-Date: 2022-05-13 07:44+0200\n"
5
- "PO-Revision-Date: 2022-05-17 14:25+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: nl_BE\n"
@@ -10,7 +10,7 @@ msgstr ""
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
- "X-Generator: Poedit 3.0.1\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-Basepath: ..\n"
16
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
@@ -182,12 +182,14 @@ msgid "You can load Google Fonts on the frontend."
182
  msgstr "U kunt Google Fonts in de frontend inladen."
183
 
184
  msgid "Save fonts locally"
185
- msgstr ""
186
 
187
  msgid ""
188
  "You can store the used Google Fonts on your server. This way all Google "
189
  "Fonts will load from your own domain."
190
  msgstr ""
 
 
191
 
192
  msgid "Backend"
193
  msgstr "Backend"
@@ -971,8 +973,7 @@ msgstr "Hoogte"
971
  msgid "Below %s pixels."
972
  msgstr "Onder %s pixels."
973
 
974
- #, fuzzy, javascript-format
975
- #| msgid "Boven %s pixels."
976
  msgid "Above %s pixels."
977
  msgstr "Boven %s pixels."
978
 
@@ -1052,11 +1053,6 @@ msgstr ""
1052
  msgid "Create a New Project"
1053
  msgstr "Maak een nieuw project"
1054
 
1055
- #, fuzzy
1056
- #| msgid ""
1057
- #| "Start a new project from scratch and build exactly what you’ve "
1058
- #| "imagined. You can easily customize every pixels and create anything with "
1059
- #| "layers."
1060
  msgid ""
1061
  "Start a new project from scratch and build exactly what you’ve imagined. You "
1062
  "can easily customize every pixels and create anything with layers."
@@ -1214,25 +1210,17 @@ msgstr "Max breedte"
1214
  msgid "Margin"
1215
  msgstr "Marge"
1216
 
1217
- #, fuzzy
1218
- #| msgid "Top"
1219
  msgid "top"
1220
- msgstr "Bovenaan"
1221
 
1222
- #, fuzzy
1223
- #| msgid "Light"
1224
  msgid "right"
1225
- msgstr "Licht"
1226
 
1227
- #, fuzzy
1228
- #| msgid "Bottom"
1229
  msgid "bottom"
1230
- msgstr "Onderkant"
1231
 
1232
- #, fuzzy
1233
- #| msgid "To left"
1234
  msgid "left"
1235
- msgstr "Naar links"
1236
 
1237
  msgid "Animations"
1238
  msgstr "Animaties"
@@ -1497,10 +1485,8 @@ msgstr "U kunt eigen CSS classes aan de container van de slider toevoegen."
1497
  msgid "JavaScript callbacks"
1498
  msgstr "JavaScript callbacks"
1499
 
1500
- #, fuzzy
1501
- #| msgid "Main animation start"
1502
  msgid "Loading animation waiting time"
1503
- msgstr "Start hoofdanimatie"
1504
 
1505
  msgid "Post IDs"
1506
  msgstr "Post IDs"
@@ -2141,18 +2127,16 @@ msgstr "Ik vond het geweldig"
2141
  msgid "Why upgrade to Smart Slider 3 Pro?"
2142
  msgstr "Waarom upgraden naar Smart Slider 3 Pro?"
2143
 
2144
- #, fuzzy, php-format
2145
- #| msgid "120+ slider templates"
2146
  msgid "%d+ slider templates"
2147
- msgstr "120+ slider templates"
2148
 
2149
  msgid "Full slide library access"
2150
  msgstr "Volledige toegang tot slide bibliotheek"
2151
 
2152
- #, fuzzy, php-format
2153
- #| msgid "20 new layers"
2154
  msgid "%d new layers"
2155
- msgstr "20 nieuwe lagen"
2156
 
2157
  msgid "Extra advanced options"
2158
  msgstr "Extra geavanceerde opties"
@@ -2617,10 +2601,8 @@ msgstr "Slide twee"
2617
  msgid "Drop images here"
2618
  msgstr "Laat afbeeldingen hier vallen"
2619
 
2620
- #, fuzzy
2621
- #| msgid "New project"
2622
  msgid "Search Project"
2623
- msgstr "Nieuw project"
2624
 
2625
  msgid "View trash"
2626
  msgstr "Bekijk prullenbak"
@@ -2646,32 +2628,28 @@ msgstr "Oudste eerst"
2646
  msgid "Export"
2647
  msgstr "Exporteren"
2648
 
2649
- #, fuzzy
2650
- #| msgid "Showcase"
2651
  msgid "Show"
2652
- msgstr "Etalage"
2653
 
2654
  #, php-format
2655
  msgid "Showing %s to %s of %s projects"
2656
- msgstr ""
2657
 
2658
- #, fuzzy
2659
- #| msgid "New project"
2660
  msgid "No projects to show"
2661
- msgstr "Nieuw project"
2662
 
2663
  msgid "New project"
2664
  msgstr "Nieuw project"
2665
 
2666
  msgid "Sorry we couldn’t find any matches"
2667
- msgstr ""
2668
 
2669
  msgid "Please try searching with another term."
2670
- msgstr ""
2671
 
2672
  #, php-format
2673
  msgid "Showing %s results for %s."
2674
- msgstr ""
2675
 
2676
  msgid "Module"
2677
  msgstr "Module"
@@ -4892,26 +4870,23 @@ msgstr "Pirouette"
4892
  msgid "Sparkling"
4893
  msgstr "Glinsterend"
4894
 
4895
- #, fuzzy, php-format
4896
- #| msgid "Curve 1"
4897
  msgid "Curve %d"
4898
- msgstr "Curve 1"
4899
 
4900
  msgid "Curves"
4901
  msgstr "Curves"
4902
 
4903
- #, fuzzy, php-format
4904
- #| msgid "Fan 1"
4905
  msgid "Fan %d"
4906
- msgstr "Ventilator 1"
4907
 
4908
  msgid "Hills"
4909
  msgstr "Bergen"
4910
 
4911
- #, fuzzy, php-format
4912
- #| msgid "Incline 1"
4913
  msgid "Incline %d"
4914
- msgstr "Helling 1"
4915
 
4916
  msgid "Inverse arrow"
4917
  msgstr "Omgekeerde pijl"
@@ -4922,32 +4897,28 @@ msgstr "Rechthoek"
4922
  msgid "Slopes"
4923
  msgstr "Hellingen"
4924
 
4925
- #, fuzzy, php-format
4926
- #| msgid "Tilt 1"
4927
  msgid "Tilt %d"
4928
- msgstr "Kantelen 1"
4929
 
4930
- #, fuzzy, php-format
4931
- #| msgid "Triangle 1"
4932
  msgid "Triangle %d"
4933
- msgstr "Driehoek 1"
4934
 
4935
- #, fuzzy, php-format
4936
- #| msgid "Wave 1"
4937
  msgid "Wave %d"
4938
- msgstr "Golf 1"
4939
 
4940
  msgid "Waves"
4941
  msgstr "Golven"
4942
 
4943
- #, fuzzy, php-format
4944
- #| msgid "Columns"
4945
  msgid "Columns %d"
4946
- msgstr "Kolommen"
4947
 
4948
  #, php-format
4949
  msgid "Paper %d"
4950
- msgstr ""
4951
 
4952
  msgid "2 Colors"
4953
  msgstr "2 kleuren"
@@ -4967,21 +4938,16 @@ msgstr "Het geheim is leeeg. Geef die waarde ook in!"
4967
  msgid "The App ID is empty. Please insert that value too!"
4968
  msgstr "Het App ID is leeg. Geef die waarde ook in!"
4969
 
4970
- #, fuzzy, php-format
4971
- #| msgid ""
4972
- #| "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4973
- #| "order to use this generator! - %2$s How to get SSL for my WordPress site? "
4974
- #| "%3$s"
4975
  msgid ""
4976
  "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4977
  "order to use this generator!"
4978
  msgstr ""
4979
  "%1$s laat alleen HTTPS doorverwijzing URIs toe! U moet uw site naar HTTPS "
4980
- "verplaatsen om deze generator te gebruiken! - %2$s Hoe verkrijg ik SSL voor "
4981
- "mijn WordPress site? %3$s"
4982
 
4983
  msgid "How to get SSL for my website?"
4984
- msgstr ""
4985
 
4986
  #, php-format
4987
  msgid ""
@@ -5114,10 +5080,8 @@ msgstr "Video's in map"
5114
  msgid "Source folder"
5115
  msgstr "Bronmap"
5116
 
5117
- #, fuzzy
5118
- #| msgid "Slide name and description"
5119
  msgid "Filename based exclusion"
5120
- msgstr "Slide naam en beschrijving"
5121
 
5122
  msgid "Remove resized images"
5123
  msgstr "Verwijder herschaalde afbeeldingen"
@@ -5135,20 +5099,26 @@ msgstr ""
5135
  "afbeelding gaat, alleen in een kleiner formaat."
5136
 
5137
  msgid "Filename has to contain"
5138
- msgstr ""
5139
 
5140
  msgid ""
5141
  "Only those images will be asked down, which have the given texts within "
5142
  "their filenames. You can write down multiple texts separated by comma."
5143
  msgstr ""
 
 
 
5144
 
5145
  msgid "Filename cannot contain"
5146
- msgstr ""
5147
 
5148
  msgid ""
5149
  "Only those images will be asked down, which don't have the given texts "
5150
  "within their filenames. You can write down multiple texts separated by comma."
5151
  msgstr ""
 
 
 
5152
 
5153
  msgid "Filename"
5154
  msgstr "Bestandsnaam"
@@ -5174,45 +5144,38 @@ msgstr ""
5174
  "te navigeren vanaf hier:"
5175
 
5176
  msgid "The App ID and the Secret is empty!"
5177
- msgstr ""
5178
 
5179
  msgid "The token will expire at:"
5180
- msgstr ""
5181
 
5182
  msgid "Access token was not returned.Please check the credentials!"
5183
  msgstr ""
 
5184
 
5185
- #, fuzzy
5186
- #| msgid "The token expired. Please request new token! "
5187
  msgid "The token expired. Please request new token!"
5188
- msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen! "
5189
 
5190
- #, fuzzy
5191
- #| msgid "The token expired. Please request new token! "
5192
  msgid "The token will expire in two days! Please refresh the token!"
5193
- msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen! "
5194
 
5195
- #, fuzzy
5196
- #| msgid "Request token"
5197
  msgid "Refresh Token"
5198
- msgstr "Request token"
5199
 
5200
  msgid "Refresh"
5201
- msgstr ""
5202
 
5203
- #, fuzzy
5204
- #| msgid "Sorting method"
5205
  msgid "Album loading method"
5206
- msgstr "Sorteermethode"
5207
 
5208
  msgid "Load first images only"
5209
- msgstr ""
5210
 
5211
  msgid "Load album images separately"
5212
- msgstr ""
5213
 
5214
  msgid "Load Album images as record data"
5215
- msgstr ""
5216
 
5217
  msgid "JSON from url"
5218
  msgstr "JSON van URL"
@@ -5259,10 +5222,8 @@ msgstr ""
5259
  msgid "Images"
5260
  msgstr "Afbeeldingen"
5261
 
5262
- #, fuzzy
5263
- #| msgid "Offset value"
5264
  msgid "Offset hours"
5265
- msgstr "Compensatie waarde"
5266
 
5267
  msgid "Timezone offset in hours. For example: +2 or -7."
5268
  msgstr "Tijdzone compensatie in uur. Bijvoorbeeld: +2 of -7."
@@ -5568,13 +5529,11 @@ msgstr "Herhalende evenementen"
5568
  msgid "Date language"
5569
  msgstr "Datum taal"
5570
 
5571
- #, fuzzy
5572
- #| msgid "Replace variables"
5573
  msgid "Date variable offset"
5574
- msgstr "Vervang variabelen"
5575
 
5576
  msgid "Date filter offset"
5577
- msgstr ""
5578
 
5579
  msgid "Status"
5580
  msgstr "Status"
@@ -5754,10 +5713,8 @@ msgstr "Submenu limiet"
5754
  msgid "No limit"
5755
  msgstr "Geen limiet"
5756
 
5757
- #, fuzzy
5758
- #| msgid "Include subcategories"
5759
  msgid "Hide empty categories"
5760
- msgstr "Inclusief subcategorieën"
5761
 
5762
  msgid "Yes"
5763
  msgstr "Ja"
@@ -5951,12 +5908,14 @@ msgid "Vertical pendulum 3D"
5951
  msgstr "Verticale slinger 3D"
5952
 
5953
  msgid "We are Passionate About"
5954
- msgstr ""
5955
 
5956
  msgid ""
5957
  "Amazing Food\n"
5958
  "Great Hospitality"
5959
  msgstr ""
 
 
5960
 
5961
  msgid "Before text"
5962
  msgstr "Voor de tekst"
@@ -6162,10 +6121,8 @@ msgstr "Pre"
6162
  msgid "Animation duration"
6163
  msgstr "Animatie duur"
6164
 
6165
- #, fuzzy
6166
- #| msgid "Counter"
6167
  msgid "Countdown"
6168
- msgstr "Teller"
6169
 
6170
  msgid "Days"
6171
  msgstr "Dag"
@@ -6176,120 +6133,99 @@ msgstr "Minuut"
6176
  msgid "Seconds"
6177
  msgstr "Secundair"
6178
 
6179
- #, fuzzy
6180
- #| msgid "First slide changed."
6181
  msgid "Use slide schedule"
6182
- msgstr "Eerste slide veranderd."
6183
 
6184
- #, fuzzy
6185
- #| msgid "You can use this alias in the slider's shortcode."
6186
  msgid "You can use the \"Unpublished on\" date of the slide itself."
6187
- msgstr "U kunt dit alias in de snelcode van de slider gebruiken."
6188
 
6189
  msgid "Use Slide Schedule"
6190
- msgstr ""
6191
 
6192
  msgid "Go to Slide → Content tab and set the Unpublish on date for the slide."
6193
  msgstr ""
 
 
6194
 
6195
  msgid ""
6196
  "Displays the days, hours, minutes and seconds texts under the counter "
6197
  "numbers. To display the labels in your own language, translate the texts in "
6198
  "the language files."
6199
  msgstr ""
 
 
 
6200
 
6201
  msgid "Gap"
6202
- msgstr ""
6203
 
6204
- #, fuzzy
6205
- #| msgid "Creates space between the columns"
6206
  msgid "Creates vertical and horizontal distance between the counter elements."
6207
- msgstr "Maakt ruimte tussen de kolommen"
6208
 
6209
- #, fuzzy
6210
- #| msgid "Tablet text"
6211
  msgid "Tablet style"
6212
- msgstr "Tablet tekst"
6213
 
6214
  msgid "Set custom Gap and Column for tablet."
6215
- msgstr ""
6216
 
6217
- #, fuzzy
6218
- #| msgid "Mobile text"
6219
  msgid "Mobile style"
6220
- msgstr "Tekst mobieltjes"
6221
 
6222
  msgid "Set custom Gap and Column for mobile."
6223
- msgstr ""
6224
 
6225
- #, fuzzy
6226
- #| msgid "Actions"
6227
  msgid "Action when ends"
6228
- msgstr "Acties"
6229
 
6230
- #, fuzzy
6231
- #| msgid "Form action"
6232
  msgid "No action"
6233
- msgstr "Formulier actie"
6234
 
6235
- #, fuzzy
6236
- #| msgid "Child layers"
6237
  msgid "Hide layer"
6238
- msgstr "Onderliggende lagen"
6239
 
6240
  msgid "Redirect to URL"
6241
- msgstr ""
6242
 
6243
  msgid "Choose what happens after the counter reached zero."
6244
- msgstr ""
6245
 
6246
- #, fuzzy
6247
- #| msgid "The image is empty"
6248
  msgid "This page is"
6249
- msgstr "De afbeelding is leeg"
6250
 
6251
  msgid "Amazing"
6252
- msgstr ""
6253
 
6254
- #, fuzzy, php-format
6255
- #| msgid "Circle 1"
6256
  msgid "Circle %d"
6257
- msgstr "Circel 1"
6258
 
6259
- #, fuzzy, php-format
6260
- #| msgid "Curly 1"
6261
  msgid "Curly %d"
6262
- msgstr "Gekruld 1"
6263
 
6264
- #, fuzzy, php-format
6265
- #| msgid "Highlight 1"
6266
  msgid "Highlight %d"
6267
- msgstr "Accentuering 1"
6268
 
6269
- #, fuzzy, php-format
6270
- #| msgid "Line Through 1"
6271
  msgid "Line Through %d"
6272
- msgstr "Doorhaling 1"
6273
 
6274
- #, fuzzy, php-format
6275
- #| msgid "Rectangle 1"
6276
  msgid "Rectangle %d"
6277
- msgstr "Rechthoek 1"
6278
 
6279
- #, fuzzy, php-format
6280
- #| msgid "Underline 1"
6281
  msgid "Underline %d"
6282
- msgstr "Onderlijn 1"
6283
 
6284
- #, fuzzy, php-format
6285
- #| msgid "Underline double 1"
6286
  msgid "Underline double %d"
6287
- msgstr "Onderlijn dubbel 1"
6288
 
6289
- #, fuzzy, php-format
6290
- #| msgid "ZigZag 1"
6291
  msgid "ZigZag %d"
6292
- msgstr "ZigZag 1"
6293
 
6294
  msgid "Highlighted text"
6295
  msgstr "Geaccentueerde tekst"
@@ -6307,7 +6243,7 @@ msgid "HTML"
6307
  msgstr "HTML"
6308
 
6309
  msgid "Empty element"
6310
- msgstr ""
6311
 
6312
  msgid ""
6313
  "Please note that <b>we do not support</b> the HTML layer and the 3rd party "
@@ -6440,18 +6376,14 @@ msgstr ""
6440
  "heeft vaak code aanpassingen nodig die u zelf moet aanbrengen. We raden dus "
6441
  "aan deze laag alleen te gebruiken als u een ontwikkelaar bent!"
6442
 
6443
- #, fuzzy
6444
- #| msgid "iframe url"
6445
  msgid "Iframe url"
6446
- msgstr "iframe URL"
6447
 
6448
  msgid "You can disable the scroll on the iframe content."
6449
  msgstr "U kun het scrollen op de iframe inhoud deactiveren."
6450
 
6451
- #, fuzzy
6452
- #| msgid "iframe title"
6453
  msgid "Iframe title"
6454
- msgstr "iframe titel"
6455
 
6456
  msgid "Image area"
6457
  msgstr "Afbeeldingszone"
@@ -6459,6 +6391,9 @@ msgstr "Afbeeldingszone"
6459
  msgid "Image box"
6460
  msgstr "Afbeeldingsvak"
6461
 
 
 
 
6462
  msgid ""
6463
  "Positions the text inside the layer. Only works with left and right layout."
6464
  msgstr ""
@@ -6990,8 +6925,5 @@ msgstr "Balk kleur"
6990
  #~ msgid "ZigZag 3"
6991
  #~ msgstr "ZigZag 3"
6992
 
6993
- #~ msgid "Aria label"
6994
- #~ msgstr "Aria label"
6995
-
6996
  #~ msgid "iframe"
6997
  #~ msgstr "iframe"
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
+ "POT-Creation-Date: 2022-05-24 09:10+0200\n"
5
+ "PO-Revision-Date: 2022-06-16 18:15+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
  "Language: nl_BE\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
+ "X-Generator: Poedit 3.1\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-Basepath: ..\n"
16
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
182
  msgstr "U kunt Google Fonts in de frontend inladen."
183
 
184
  msgid "Save fonts locally"
185
+ msgstr "Sla fonts lokaal op"
186
 
187
  msgid ""
188
  "You can store the used Google Fonts on your server. This way all Google "
189
  "Fonts will load from your own domain."
190
  msgstr ""
191
+ "U kunt de gebruikte Google Fonts op uw server opslaan. Op die manier zullen "
192
+ "alle Google Fonts laden vanuit uw eigen domein."
193
 
194
  msgid "Backend"
195
  msgstr "Backend"
973
  msgid "Below %s pixels."
974
  msgstr "Onder %s pixels."
975
 
976
+ #, javascript-format
 
977
  msgid "Above %s pixels."
978
  msgstr "Boven %s pixels."
979
 
1053
  msgid "Create a New Project"
1054
  msgstr "Maak een nieuw project"
1055
 
 
 
 
 
 
1056
  msgid ""
1057
  "Start a new project from scratch and build exactly what you’ve imagined. You "
1058
  "can easily customize every pixels and create anything with layers."
1210
  msgid "Margin"
1211
  msgstr "Marge"
1212
 
 
 
1213
  msgid "top"
1214
+ msgstr "bovenaan"
1215
 
 
 
1216
  msgid "right"
1217
+ msgstr "rechts"
1218
 
 
 
1219
  msgid "bottom"
1220
+ msgstr "onderaan"
1221
 
 
 
1222
  msgid "left"
1223
+ msgstr "links"
1224
 
1225
  msgid "Animations"
1226
  msgstr "Animaties"
1485
  msgid "JavaScript callbacks"
1486
  msgstr "JavaScript callbacks"
1487
 
 
 
1488
  msgid "Loading animation waiting time"
1489
+ msgstr "Inladen animatie wachttijd"
1490
 
1491
  msgid "Post IDs"
1492
  msgstr "Post IDs"
2127
  msgid "Why upgrade to Smart Slider 3 Pro?"
2128
  msgstr "Waarom upgraden naar Smart Slider 3 Pro?"
2129
 
2130
+ #, php-format
 
2131
  msgid "%d+ slider templates"
2132
+ msgstr "%d+ slider templates"
2133
 
2134
  msgid "Full slide library access"
2135
  msgstr "Volledige toegang tot slide bibliotheek"
2136
 
2137
+ #, php-format
 
2138
  msgid "%d new layers"
2139
+ msgstr "%d nieuwe lagen"
2140
 
2141
  msgid "Extra advanced options"
2142
  msgstr "Extra geavanceerde opties"
2601
  msgid "Drop images here"
2602
  msgstr "Laat afbeeldingen hier vallen"
2603
 
 
 
2604
  msgid "Search Project"
2605
+ msgstr "Zoek project"
2606
 
2607
  msgid "View trash"
2608
  msgstr "Bekijk prullenbak"
2628
  msgid "Export"
2629
  msgstr "Exporteren"
2630
 
 
 
2631
  msgid "Show"
2632
+ msgstr "Tonen"
2633
 
2634
  #, php-format
2635
  msgid "Showing %s to %s of %s projects"
2636
+ msgstr "%s tot %s van de %s projecten worden getoond"
2637
 
 
 
2638
  msgid "No projects to show"
2639
+ msgstr "Geen projecten om te tonen"
2640
 
2641
  msgid "New project"
2642
  msgstr "Nieuw project"
2643
 
2644
  msgid "Sorry we couldn’t find any matches"
2645
+ msgstr "Sorry, we vonden geen overeenkomsten"
2646
 
2647
  msgid "Please try searching with another term."
2648
+ msgstr "Probeer eens te zoeken met een ander trefwoord."
2649
 
2650
  #, php-format
2651
  msgid "Showing %s results for %s."
2652
+ msgstr "Tonen van %s resultaten voor %s."
2653
 
2654
  msgid "Module"
2655
  msgstr "Module"
4870
  msgid "Sparkling"
4871
  msgstr "Glinsterend"
4872
 
4873
+ #, php-format
 
4874
  msgid "Curve %d"
4875
+ msgstr "Curve %d"
4876
 
4877
  msgid "Curves"
4878
  msgstr "Curves"
4879
 
4880
+ #, php-format
 
4881
  msgid "Fan %d"
4882
+ msgstr "Ventilator %d"
4883
 
4884
  msgid "Hills"
4885
  msgstr "Bergen"
4886
 
4887
+ #, php-format
 
4888
  msgid "Incline %d"
4889
+ msgstr "Helling %d"
4890
 
4891
  msgid "Inverse arrow"
4892
  msgstr "Omgekeerde pijl"
4897
  msgid "Slopes"
4898
  msgstr "Hellingen"
4899
 
4900
+ #, php-format
 
4901
  msgid "Tilt %d"
4902
+ msgstr "Kantelen %d"
4903
 
4904
+ #, php-format
 
4905
  msgid "Triangle %d"
4906
+ msgstr "Driehoek %d"
4907
 
4908
+ #, php-format
 
4909
  msgid "Wave %d"
4910
+ msgstr "Golf %d"
4911
 
4912
  msgid "Waves"
4913
  msgstr "Golven"
4914
 
4915
+ #, php-format
 
4916
  msgid "Columns %d"
4917
+ msgstr "Kolommen %d"
4918
 
4919
  #, php-format
4920
  msgid "Paper %d"
4921
+ msgstr "Papier %d"
4922
 
4923
  msgid "2 Colors"
4924
  msgstr "2 kleuren"
4938
  msgid "The App ID is empty. Please insert that value too!"
4939
  msgstr "Het App ID is leeg. Geef die waarde ook in!"
4940
 
4941
+ #, php-format
 
 
 
 
4942
  msgid ""
4943
  "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4944
  "order to use this generator!"
4945
  msgstr ""
4946
  "%1$s laat alleen HTTPS doorverwijzing URIs toe! U moet uw site naar HTTPS "
4947
+ "verplaatsen om deze generator te gebruiken!"
 
4948
 
4949
  msgid "How to get SSL for my website?"
4950
+ msgstr "Hoe get SSL voor mijn website verkrijgen?"
4951
 
4952
  #, php-format
4953
  msgid ""
5080
  msgid "Source folder"
5081
  msgstr "Bronmap"
5082
 
 
 
5083
  msgid "Filename based exclusion"
5084
+ msgstr "Op bestandsnaam gebaseerde uitsluiting"
5085
 
5086
  msgid "Remove resized images"
5087
  msgstr "Verwijder herschaalde afbeeldingen"
5099
  "afbeelding gaat, alleen in een kleiner formaat."
5100
 
5101
  msgid "Filename has to contain"
5102
+ msgstr "Bestandsnaam moet bevatten"
5103
 
5104
  msgid ""
5105
  "Only those images will be asked down, which have the given texts within "
5106
  "their filenames. You can write down multiple texts separated by comma."
5107
  msgstr ""
5108
+ "Alleen die afbeeldingen die de gegeven tekst in hun bestandsnaam hebben "
5109
+ "zullen opgevraagd worden. U mag meerdere teksten neerschrijven, gescheiden "
5110
+ "door komma's."
5111
 
5112
  msgid "Filename cannot contain"
5113
+ msgstr "Bestandsnaam mag niet bevatten"
5114
 
5115
  msgid ""
5116
  "Only those images will be asked down, which don't have the given texts "
5117
  "within their filenames. You can write down multiple texts separated by comma."
5118
  msgstr ""
5119
+ "Alleen die afbeeldingen die de gegeven tekst niet in hun bestandsnaam hebben "
5120
+ "zullen opgevraagd worden. U mag meerdere teksten neerschrijven, gescheiden "
5121
+ "door komma's."
5122
 
5123
  msgid "Filename"
5124
  msgstr "Bestandsnaam"
5144
  "te navigeren vanaf hier:"
5145
 
5146
  msgid "The App ID and the Secret is empty!"
5147
+ msgstr "Het App ID en het geheim zijn leeg!"
5148
 
5149
  msgid "The token will expire at:"
5150
+ msgstr "Het token zal vervallen op:"
5151
 
5152
  msgid "Access token was not returned.Please check the credentials!"
5153
  msgstr ""
5154
+ "Het toegangstoken werd niet teruggegeven. Controleer uw aanmeldgegevens!"
5155
 
 
 
5156
  msgid "The token expired. Please request new token!"
5157
+ msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen!"
5158
 
 
 
5159
  msgid "The token will expire in two days! Please refresh the token!"
5160
+ msgstr "Het token zal binnen twee dagen vervallen. Gelieve het te vernieuwen!"
5161
 
 
 
5162
  msgid "Refresh Token"
5163
+ msgstr "Vernieuw token"
5164
 
5165
  msgid "Refresh"
5166
+ msgstr "Vernieuwen"
5167
 
 
 
5168
  msgid "Album loading method"
5169
+ msgstr "Album laadmethode"
5170
 
5171
  msgid "Load first images only"
5172
+ msgstr "Laad alleen de eerste afbeeldingen"
5173
 
5174
  msgid "Load album images separately"
5175
+ msgstr "Album afbeeldingen apart inladen"
5176
 
5177
  msgid "Load Album images as record data"
5178
+ msgstr "Laad album afbeeldingen als record data"
5179
 
5180
  msgid "JSON from url"
5181
  msgstr "JSON van URL"
5222
  msgid "Images"
5223
  msgstr "Afbeeldingen"
5224
 
 
 
5225
  msgid "Offset hours"
5226
+ msgstr "Compensatie uren"
5227
 
5228
  msgid "Timezone offset in hours. For example: +2 or -7."
5229
  msgstr "Tijdzone compensatie in uur. Bijvoorbeeld: +2 of -7."
5529
  msgid "Date language"
5530
  msgstr "Datum taal"
5531
 
 
 
5532
  msgid "Date variable offset"
5533
+ msgstr "Datumvariabele compensatie"
5534
 
5535
  msgid "Date filter offset"
5536
+ msgstr "Datumfilter compensatie"
5537
 
5538
  msgid "Status"
5539
  msgstr "Status"
5713
  msgid "No limit"
5714
  msgstr "Geen limiet"
5715
 
 
 
5716
  msgid "Hide empty categories"
5717
+ msgstr "Verberg lege categorieën"
5718
 
5719
  msgid "Yes"
5720
  msgstr "Ja"
5908
  msgstr "Verticale slinger 3D"
5909
 
5910
  msgid "We are Passionate About"
5911
+ msgstr "We zijn gepassioneerd door"
5912
 
5913
  msgid ""
5914
  "Amazing Food\n"
5915
  "Great Hospitality"
5916
  msgstr ""
5917
+ "Geweldig eten\n"
5918
+ "Warme gastvrijheid"
5919
 
5920
  msgid "Before text"
5921
  msgstr "Voor de tekst"
6121
  msgid "Animation duration"
6122
  msgstr "Animatie duur"
6123
 
 
 
6124
  msgid "Countdown"
6125
+ msgstr "Aftellen"
6126
 
6127
  msgid "Days"
6128
  msgstr "Dag"
6133
  msgid "Seconds"
6134
  msgstr "Secundair"
6135
 
 
 
6136
  msgid "Use slide schedule"
6137
+ msgstr "Gebruik slide planning"
6138
 
 
 
6139
  msgid "You can use the \"Unpublished on\" date of the slide itself."
6140
+ msgstr "U kunt de \"Depubliceer op\" datum van de slide zelf gebruiken."
6141
 
6142
  msgid "Use Slide Schedule"
6143
+ msgstr "Gebruik slide planning"
6144
 
6145
  msgid "Go to Slide → Content tab and set the Unpublish on date for the slide."
6146
  msgstr ""
6147
+ "Ga naar de Slide → Content tab en stel de Depubliceer op datum optie in voor "
6148
+ "de slide."
6149
 
6150
  msgid ""
6151
  "Displays the days, hours, minutes and seconds texts under the counter "
6152
  "numbers. To display the labels in your own language, translate the texts in "
6153
  "the language files."
6154
  msgstr ""
6155
+ "Toont de dagen, uren, minuten en seconden teksten onder de tellergetallen. "
6156
+ "Om de labels in uw eigen taal te tonen kunt u de teksten vertalen in de "
6157
+ "taalbestanden."
6158
 
6159
  msgid "Gap"
6160
+ msgstr "Leemte"
6161
 
 
 
6162
  msgid "Creates vertical and horizontal distance between the counter elements."
6163
+ msgstr "Maakt verticale en horizontale afstand tussen de teller elementen."
6164
 
 
 
6165
  msgid "Tablet style"
6166
+ msgstr "Tablet stijl"
6167
 
6168
  msgid "Set custom Gap and Column for tablet."
6169
+ msgstr "Stel een aangepaste leemte en kolom in voor tablets."
6170
 
 
 
6171
  msgid "Mobile style"
6172
+ msgstr "Mobieltjes stijl"
6173
 
6174
  msgid "Set custom Gap and Column for mobile."
6175
+ msgstr "Stel een aangepaste leemte en kolom in voor mobieltjes."
6176
 
 
 
6177
  msgid "Action when ends"
6178
+ msgstr "Actie aan het einde"
6179
 
 
 
6180
  msgid "No action"
6181
+ msgstr "Geen actie"
6182
 
 
 
6183
  msgid "Hide layer"
6184
+ msgstr "Verberg laag"
6185
 
6186
  msgid "Redirect to URL"
6187
+ msgstr "Doorverwijzen naar URL"
6188
 
6189
  msgid "Choose what happens after the counter reached zero."
6190
+ msgstr "Kies wat er gebeurt als de teller nul bereikt."
6191
 
 
 
6192
  msgid "This page is"
6193
+ msgstr "Deze pagina is"
6194
 
6195
  msgid "Amazing"
6196
+ msgstr "Verbazingwekkend"
6197
 
6198
+ #, php-format
 
6199
  msgid "Circle %d"
6200
+ msgstr "Circel %d"
6201
 
6202
+ #, php-format
 
6203
  msgid "Curly %d"
6204
+ msgstr "Gekruld %d"
6205
 
6206
+ #, php-format
 
6207
  msgid "Highlight %d"
6208
+ msgstr "Accentuering %d"
6209
 
6210
+ #, php-format
 
6211
  msgid "Line Through %d"
6212
+ msgstr "Doorhaling %d"
6213
 
6214
+ #, php-format
 
6215
  msgid "Rectangle %d"
6216
+ msgstr "Rechthoek %d"
6217
 
6218
+ #, php-format
 
6219
  msgid "Underline %d"
6220
+ msgstr "Onderlijn %d"
6221
 
6222
+ #, php-format
 
6223
  msgid "Underline double %d"
6224
+ msgstr "Onderlijn dubbel %d"
6225
 
6226
+ #, php-format
 
6227
  msgid "ZigZag %d"
6228
+ msgstr "ZigZag %d"
6229
 
6230
  msgid "Highlighted text"
6231
  msgstr "Geaccentueerde tekst"
6243
  msgstr "HTML"
6244
 
6245
  msgid "Empty element"
6246
+ msgstr "Leeg element"
6247
 
6248
  msgid ""
6249
  "Please note that <b>we do not support</b> the HTML layer and the 3rd party "
6376
  "heeft vaak code aanpassingen nodig die u zelf moet aanbrengen. We raden dus "
6377
  "aan deze laag alleen te gebruiken als u een ontwikkelaar bent!"
6378
 
 
 
6379
  msgid "Iframe url"
6380
+ msgstr "Iframe url"
6381
 
6382
  msgid "You can disable the scroll on the iframe content."
6383
  msgstr "U kun het scrollen op de iframe inhoud deactiveren."
6384
 
 
 
6385
  msgid "Iframe title"
6386
+ msgstr "Iframe titel"
6387
 
6388
  msgid "Image area"
6389
  msgstr "Afbeeldingszone"
6391
  msgid "Image box"
6392
  msgstr "Afbeeldingsvak"
6393
 
6394
+ msgid "Aria label"
6395
+ msgstr "Aria label"
6396
+
6397
  msgid ""
6398
  "Positions the text inside the layer. Only works with left and right layout."
6399
  msgstr ""
6925
  #~ msgid "ZigZag 3"
6926
  #~ msgstr "ZigZag 3"
6927
 
 
 
 
6928
  #~ msgid "iframe"
6929
  #~ msgstr "iframe"
Nextend/Languages/nl_NL.mo CHANGED
Binary file
Nextend/Languages/nl_NL.po CHANGED
@@ -1,16 +1,16 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
- "POT-Creation-Date: 2022-05-13 07:44+0200\n"
5
- "PO-Revision-Date: 2022-05-17 14:16+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: \n"
8
- "Language: nl_NL\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
- "X-Generator: Poedit 3.0.1\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-Basepath: ..\n"
16
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
@@ -182,12 +182,14 @@ msgid "You can load Google Fonts on the frontend."
182
  msgstr "U kunt Google Fonts in de frontend inladen."
183
 
184
  msgid "Save fonts locally"
185
- msgstr ""
186
 
187
  msgid ""
188
  "You can store the used Google Fonts on your server. This way all Google "
189
  "Fonts will load from your own domain."
190
  msgstr ""
 
 
191
 
192
  msgid "Backend"
193
  msgstr "Backend"
@@ -971,8 +973,7 @@ msgstr "Hoogte"
971
  msgid "Below %s pixels."
972
  msgstr "Onder %s pixels."
973
 
974
- #, fuzzy, javascript-format
975
- #| msgid "Boven %s pixels."
976
  msgid "Above %s pixels."
977
  msgstr "Boven %s pixels."
978
 
@@ -1052,11 +1053,6 @@ msgstr ""
1052
  msgid "Create a New Project"
1053
  msgstr "Maak een nieuw project"
1054
 
1055
- #, fuzzy
1056
- #| msgid ""
1057
- #| "Start a new project from scratch and build exactly what you’ve "
1058
- #| "imagined. You can easily customize every pixels and create anything with "
1059
- #| "layers."
1060
  msgid ""
1061
  "Start a new project from scratch and build exactly what you’ve imagined. You "
1062
  "can easily customize every pixels and create anything with layers."
@@ -1214,25 +1210,17 @@ msgstr "Max breedte"
1214
  msgid "Margin"
1215
  msgstr "Marge"
1216
 
1217
- #, fuzzy
1218
- #| msgid "Top"
1219
  msgid "top"
1220
- msgstr "Bovenaan"
1221
 
1222
- #, fuzzy
1223
- #| msgid "Light"
1224
  msgid "right"
1225
- msgstr "Licht"
1226
 
1227
- #, fuzzy
1228
- #| msgid "Bottom"
1229
  msgid "bottom"
1230
- msgstr "Onderkant"
1231
 
1232
- #, fuzzy
1233
- #| msgid "To left"
1234
  msgid "left"
1235
- msgstr "Naar links"
1236
 
1237
  msgid "Animations"
1238
  msgstr "Animaties"
@@ -1497,10 +1485,8 @@ msgstr "U kunt eigen CSS classes aan de container van de slider toevoegen."
1497
  msgid "JavaScript callbacks"
1498
  msgstr "JavaScript callbacks"
1499
 
1500
- #, fuzzy
1501
- #| msgid "Main animation start"
1502
  msgid "Loading animation waiting time"
1503
- msgstr "Start hoofdanimatie"
1504
 
1505
  msgid "Post IDs"
1506
  msgstr "Post IDs"
@@ -2141,18 +2127,16 @@ msgstr "Ik vond het geweldig"
2141
  msgid "Why upgrade to Smart Slider 3 Pro?"
2142
  msgstr "Waarom upgraden naar Smart Slider 3 Pro?"
2143
 
2144
- #, fuzzy, php-format
2145
- #| msgid "120+ slider templates"
2146
  msgid "%d+ slider templates"
2147
- msgstr "120+ slider templates"
2148
 
2149
  msgid "Full slide library access"
2150
  msgstr "Volledige toegang tot slide bibliotheek"
2151
 
2152
- #, fuzzy, php-format
2153
- #| msgid "20 new layers"
2154
  msgid "%d new layers"
2155
- msgstr "20 nieuwe lagen"
2156
 
2157
  msgid "Extra advanced options"
2158
  msgstr "Extra geavanceerde opties"
@@ -2617,10 +2601,8 @@ msgstr "Slide twee"
2617
  msgid "Drop images here"
2618
  msgstr "Laat afbeeldingen hier vallen"
2619
 
2620
- #, fuzzy
2621
- #| msgid "New project"
2622
  msgid "Search Project"
2623
- msgstr "Nieuw project"
2624
 
2625
  msgid "View trash"
2626
  msgstr "Bekijk prullenbak"
@@ -2646,32 +2628,28 @@ msgstr "Oudste eerst"
2646
  msgid "Export"
2647
  msgstr "Exporteren"
2648
 
2649
- #, fuzzy
2650
- #| msgid "Showcase"
2651
  msgid "Show"
2652
- msgstr "Etalage"
2653
 
2654
  #, php-format
2655
  msgid "Showing %s to %s of %s projects"
2656
- msgstr ""
2657
 
2658
- #, fuzzy
2659
- #| msgid "New project"
2660
  msgid "No projects to show"
2661
- msgstr "Nieuw project"
2662
 
2663
  msgid "New project"
2664
  msgstr "Nieuw project"
2665
 
2666
  msgid "Sorry we couldn’t find any matches"
2667
- msgstr ""
2668
 
2669
  msgid "Please try searching with another term."
2670
- msgstr ""
2671
 
2672
  #, php-format
2673
  msgid "Showing %s results for %s."
2674
- msgstr ""
2675
 
2676
  msgid "Module"
2677
  msgstr "Module"
@@ -4892,26 +4870,23 @@ msgstr "Pirouette"
4892
  msgid "Sparkling"
4893
  msgstr "Glinsterend"
4894
 
4895
- #, fuzzy, php-format
4896
- #| msgid "Curve 1"
4897
  msgid "Curve %d"
4898
- msgstr "Curve 1"
4899
 
4900
  msgid "Curves"
4901
  msgstr "Curves"
4902
 
4903
- #, fuzzy, php-format
4904
- #| msgid "Fan 1"
4905
  msgid "Fan %d"
4906
- msgstr "Ventilator 1"
4907
 
4908
  msgid "Hills"
4909
  msgstr "Bergen"
4910
 
4911
- #, fuzzy, php-format
4912
- #| msgid "Incline 1"
4913
  msgid "Incline %d"
4914
- msgstr "Helling 1"
4915
 
4916
  msgid "Inverse arrow"
4917
  msgstr "Omgekeerde pijl"
@@ -4922,32 +4897,28 @@ msgstr "Rechthoek"
4922
  msgid "Slopes"
4923
  msgstr "Hellingen"
4924
 
4925
- #, fuzzy, php-format
4926
- #| msgid "Tilt 1"
4927
  msgid "Tilt %d"
4928
- msgstr "Kantelen 1"
4929
 
4930
- #, fuzzy, php-format
4931
- #| msgid "Triangle 1"
4932
  msgid "Triangle %d"
4933
- msgstr "Driehoek 1"
4934
 
4935
- #, fuzzy, php-format
4936
- #| msgid "Wave 1"
4937
  msgid "Wave %d"
4938
- msgstr "Golf 1"
4939
 
4940
  msgid "Waves"
4941
  msgstr "Golven"
4942
 
4943
- #, fuzzy, php-format
4944
- #| msgid "Columns"
4945
  msgid "Columns %d"
4946
- msgstr "Kolommen"
4947
 
4948
  #, php-format
4949
  msgid "Paper %d"
4950
- msgstr ""
4951
 
4952
  msgid "2 Colors"
4953
  msgstr "2 kleuren"
@@ -4967,21 +4938,16 @@ msgstr "Het geheim is leeeg. Geef die waarde ook in!"
4967
  msgid "The App ID is empty. Please insert that value too!"
4968
  msgstr "Het App ID is leeg. Geef die waarde ook in!"
4969
 
4970
- #, fuzzy, php-format
4971
- #| msgid ""
4972
- #| "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4973
- #| "order to use this generator! - %2$s How to get SSL for my WordPress site? "
4974
- #| "%3$s"
4975
  msgid ""
4976
  "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4977
  "order to use this generator!"
4978
  msgstr ""
4979
  "%1$s laat alleen HTTPS doorverwijzing URIs toe! U moet uw site naar HTTPS "
4980
- "verplaatsen om deze generator te gebruiken! - %2$s Hoe verkrijg ik SSL voor "
4981
- "mijn WordPress site? %3$s"
4982
 
4983
  msgid "How to get SSL for my website?"
4984
- msgstr ""
4985
 
4986
  #, php-format
4987
  msgid ""
@@ -5114,10 +5080,8 @@ msgstr "Video's in map"
5114
  msgid "Source folder"
5115
  msgstr "Bronmap"
5116
 
5117
- #, fuzzy
5118
- #| msgid "Slide name and description"
5119
  msgid "Filename based exclusion"
5120
- msgstr "Slide naam en beschrijving"
5121
 
5122
  msgid "Remove resized images"
5123
  msgstr "Verwijder herschaalde afbeeldingen"
@@ -5135,20 +5099,26 @@ msgstr ""
5135
  "afbeelding gaat, alleen in een kleiner formaat."
5136
 
5137
  msgid "Filename has to contain"
5138
- msgstr ""
5139
 
5140
  msgid ""
5141
  "Only those images will be asked down, which have the given texts within "
5142
  "their filenames. You can write down multiple texts separated by comma."
5143
  msgstr ""
 
 
 
5144
 
5145
  msgid "Filename cannot contain"
5146
- msgstr ""
5147
 
5148
  msgid ""
5149
  "Only those images will be asked down, which don't have the given texts "
5150
  "within their filenames. You can write down multiple texts separated by comma."
5151
  msgstr ""
 
 
 
5152
 
5153
  msgid "Filename"
5154
  msgstr "Bestandsnaam"
@@ -5174,45 +5144,38 @@ msgstr ""
5174
  "te navigeren vanaf hier:"
5175
 
5176
  msgid "The App ID and the Secret is empty!"
5177
- msgstr ""
5178
 
5179
  msgid "The token will expire at:"
5180
- msgstr ""
5181
 
5182
  msgid "Access token was not returned.Please check the credentials!"
5183
  msgstr ""
 
5184
 
5185
- #, fuzzy
5186
- #| msgid "The token expired. Please request new token! "
5187
  msgid "The token expired. Please request new token!"
5188
- msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen! "
5189
 
5190
- #, fuzzy
5191
- #| msgid "The token expired. Please request new token! "
5192
  msgid "The token will expire in two days! Please refresh the token!"
5193
- msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen! "
5194
 
5195
- #, fuzzy
5196
- #| msgid "Request token"
5197
  msgid "Refresh Token"
5198
- msgstr "Request token"
5199
 
5200
  msgid "Refresh"
5201
- msgstr ""
5202
 
5203
- #, fuzzy
5204
- #| msgid "Sorting method"
5205
  msgid "Album loading method"
5206
- msgstr "Sorteermethode"
5207
 
5208
  msgid "Load first images only"
5209
- msgstr ""
5210
 
5211
  msgid "Load album images separately"
5212
- msgstr ""
5213
 
5214
  msgid "Load Album images as record data"
5215
- msgstr ""
5216
 
5217
  msgid "JSON from url"
5218
  msgstr "JSON van URL"
@@ -5259,10 +5222,8 @@ msgstr ""
5259
  msgid "Images"
5260
  msgstr "Afbeeldingen"
5261
 
5262
- #, fuzzy
5263
- #| msgid "Offset value"
5264
  msgid "Offset hours"
5265
- msgstr "Compensatie waarde"
5266
 
5267
  msgid "Timezone offset in hours. For example: +2 or -7."
5268
  msgstr "Tijdzone compensatie in uur. Bijvoorbeeld: +2 of -7."
@@ -5568,13 +5529,11 @@ msgstr "Herhalende evenementen"
5568
  msgid "Date language"
5569
  msgstr "Datum taal"
5570
 
5571
- #, fuzzy
5572
- #| msgid "Replace variables"
5573
  msgid "Date variable offset"
5574
- msgstr "Vervang variabelen"
5575
 
5576
  msgid "Date filter offset"
5577
- msgstr ""
5578
 
5579
  msgid "Status"
5580
  msgstr "Status"
@@ -5754,10 +5713,8 @@ msgstr "Submenu limiet"
5754
  msgid "No limit"
5755
  msgstr "Geen limiet"
5756
 
5757
- #, fuzzy
5758
- #| msgid "Include subcategories"
5759
  msgid "Hide empty categories"
5760
- msgstr "Inclusief subcategorieën"
5761
 
5762
  msgid "Yes"
5763
  msgstr "Ja"
@@ -5951,12 +5908,14 @@ msgid "Vertical pendulum 3D"
5951
  msgstr "Verticale slinger 3D"
5952
 
5953
  msgid "We are Passionate About"
5954
- msgstr ""
5955
 
5956
  msgid ""
5957
  "Amazing Food\n"
5958
  "Great Hospitality"
5959
  msgstr ""
 
 
5960
 
5961
  msgid "Before text"
5962
  msgstr "Voor de tekst"
@@ -6162,10 +6121,8 @@ msgstr "Pre"
6162
  msgid "Animation duration"
6163
  msgstr "Animatie duur"
6164
 
6165
- #, fuzzy
6166
- #| msgid "Counter"
6167
  msgid "Countdown"
6168
- msgstr "Teller"
6169
 
6170
  msgid "Days"
6171
  msgstr "Dag"
@@ -6176,120 +6133,99 @@ msgstr "Minuut"
6176
  msgid "Seconds"
6177
  msgstr "Secundair"
6178
 
6179
- #, fuzzy
6180
- #| msgid "First slide changed."
6181
  msgid "Use slide schedule"
6182
- msgstr "Eerste slide veranderd."
6183
 
6184
- #, fuzzy
6185
- #| msgid "You can use this alias in the slider's shortcode."
6186
  msgid "You can use the \"Unpublished on\" date of the slide itself."
6187
- msgstr "U kunt dit alias in de snelcode van de slider gebruiken."
6188
 
6189
  msgid "Use Slide Schedule"
6190
- msgstr ""
6191
 
6192
  msgid "Go to Slide → Content tab and set the Unpublish on date for the slide."
6193
  msgstr ""
 
 
6194
 
6195
  msgid ""
6196
  "Displays the days, hours, minutes and seconds texts under the counter "
6197
  "numbers. To display the labels in your own language, translate the texts in "
6198
  "the language files."
6199
  msgstr ""
 
 
 
6200
 
6201
  msgid "Gap"
6202
- msgstr ""
6203
 
6204
- #, fuzzy
6205
- #| msgid "Creates space between the columns"
6206
  msgid "Creates vertical and horizontal distance between the counter elements."
6207
- msgstr "Maakt ruimte tussen de kolommen"
6208
 
6209
- #, fuzzy
6210
- #| msgid "Tablet text"
6211
  msgid "Tablet style"
6212
- msgstr "Tablet tekst"
6213
 
6214
  msgid "Set custom Gap and Column for tablet."
6215
- msgstr ""
6216
 
6217
- #, fuzzy
6218
- #| msgid "Mobile text"
6219
  msgid "Mobile style"
6220
- msgstr "Tekst mobieltjes"
6221
 
6222
  msgid "Set custom Gap and Column for mobile."
6223
- msgstr ""
6224
 
6225
- #, fuzzy
6226
- #| msgid "Actions"
6227
  msgid "Action when ends"
6228
- msgstr "Acties"
6229
 
6230
- #, fuzzy
6231
- #| msgid "Form action"
6232
  msgid "No action"
6233
- msgstr "Formulier actie"
6234
 
6235
- #, fuzzy
6236
- #| msgid "Child layers"
6237
  msgid "Hide layer"
6238
- msgstr "Onderliggende lagen"
6239
 
6240
  msgid "Redirect to URL"
6241
- msgstr ""
6242
 
6243
  msgid "Choose what happens after the counter reached zero."
6244
- msgstr ""
6245
 
6246
- #, fuzzy
6247
- #| msgid "The image is empty"
6248
  msgid "This page is"
6249
- msgstr "De afbeelding is leeg"
6250
 
6251
  msgid "Amazing"
6252
- msgstr ""
6253
 
6254
- #, fuzzy, php-format
6255
- #| msgid "Circle 1"
6256
  msgid "Circle %d"
6257
- msgstr "Circel 1"
6258
 
6259
- #, fuzzy, php-format
6260
- #| msgid "Curly 1"
6261
  msgid "Curly %d"
6262
- msgstr "Gekruld 1"
6263
 
6264
- #, fuzzy, php-format
6265
- #| msgid "Highlight 1"
6266
  msgid "Highlight %d"
6267
- msgstr "Accentuering 1"
6268
 
6269
- #, fuzzy, php-format
6270
- #| msgid "Line Through 1"
6271
  msgid "Line Through %d"
6272
- msgstr "Doorhaling 1"
6273
 
6274
- #, fuzzy, php-format
6275
- #| msgid "Rectangle 1"
6276
  msgid "Rectangle %d"
6277
- msgstr "Rechthoek 1"
6278
 
6279
- #, fuzzy, php-format
6280
- #| msgid "Underline 1"
6281
  msgid "Underline %d"
6282
- msgstr "Onderlijn 1"
6283
 
6284
- #, fuzzy, php-format
6285
- #| msgid "Underline double 1"
6286
  msgid "Underline double %d"
6287
- msgstr "Onderlijn dubbel 1"
6288
 
6289
- #, fuzzy, php-format
6290
- #| msgid "ZigZag 1"
6291
  msgid "ZigZag %d"
6292
- msgstr "ZigZag 1"
6293
 
6294
  msgid "Highlighted text"
6295
  msgstr "Geaccentueerde tekst"
@@ -6307,7 +6243,7 @@ msgid "HTML"
6307
  msgstr "HTML"
6308
 
6309
  msgid "Empty element"
6310
- msgstr ""
6311
 
6312
  msgid ""
6313
  "Please note that <b>we do not support</b> the HTML layer and the 3rd party "
@@ -6440,18 +6376,14 @@ msgstr ""
6440
  "heeft vaak code aanpassingen nodig die u zelf moet aanbrengen. We raden dus "
6441
  "aan deze laag alleen te gebruiken als u een ontwikkelaar bent!"
6442
 
6443
- #, fuzzy
6444
- #| msgid "iframe url"
6445
  msgid "Iframe url"
6446
- msgstr "iframe URL"
6447
 
6448
  msgid "You can disable the scroll on the iframe content."
6449
  msgstr "U kun het scrollen op de iframe inhoud deactiveren."
6450
 
6451
- #, fuzzy
6452
- #| msgid "iframe title"
6453
  msgid "Iframe title"
6454
- msgstr "iframe titel"
6455
 
6456
  msgid "Image area"
6457
  msgstr "Afbeeldingszone"
@@ -6459,6 +6391,9 @@ msgstr "Afbeeldingszone"
6459
  msgid "Image box"
6460
  msgstr "Afbeeldingsvak"
6461
 
 
 
 
6462
  msgid ""
6463
  "Positions the text inside the layer. Only works with left and right layout."
6464
  msgstr ""
@@ -6990,8 +6925,5 @@ msgstr "Balk kleur"
6990
  #~ msgid "ZigZag 3"
6991
  #~ msgstr "ZigZag 3"
6992
 
6993
- #~ msgid "Aria label"
6994
- #~ msgstr "Aria label"
6995
-
6996
  #~ msgid "iframe"
6997
  #~ msgstr "iframe"
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: \n"
4
+ "POT-Creation-Date: 2022-05-24 09:10+0200\n"
5
+ "PO-Revision-Date: 2022-06-16 18:16+0200\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
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
+ "X-Generator: Poedit 3.1\n"
14
  "X-Poedit-SourceCharset: UTF-8\n"
15
  "X-Poedit-Basepath: ..\n"
16
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
182
  msgstr "U kunt Google Fonts in de frontend inladen."
183
 
184
  msgid "Save fonts locally"
185
+ msgstr "Sla fonts lokaal op"
186
 
187
  msgid ""
188
  "You can store the used Google Fonts on your server. This way all Google "
189
  "Fonts will load from your own domain."
190
  msgstr ""
191
+ "U kunt de gebruikte Google Fonts op uw server opslaan. Op die manier zullen "
192
+ "alle Google Fonts laden vanuit uw eigen domein."
193
 
194
  msgid "Backend"
195
  msgstr "Backend"
973
  msgid "Below %s pixels."
974
  msgstr "Onder %s pixels."
975
 
976
+ #, javascript-format
 
977
  msgid "Above %s pixels."
978
  msgstr "Boven %s pixels."
979
 
1053
  msgid "Create a New Project"
1054
  msgstr "Maak een nieuw project"
1055
 
 
 
 
 
 
1056
  msgid ""
1057
  "Start a new project from scratch and build exactly what you’ve imagined. You "
1058
  "can easily customize every pixels and create anything with layers."
1210
  msgid "Margin"
1211
  msgstr "Marge"
1212
 
 
 
1213
  msgid "top"
1214
+ msgstr "bovenaan"
1215
 
 
 
1216
  msgid "right"
1217
+ msgstr "rechts"
1218
 
 
 
1219
  msgid "bottom"
1220
+ msgstr "onderaan"
1221
 
 
 
1222
  msgid "left"
1223
+ msgstr "links"
1224
 
1225
  msgid "Animations"
1226
  msgstr "Animaties"
1485
  msgid "JavaScript callbacks"
1486
  msgstr "JavaScript callbacks"
1487
 
 
 
1488
  msgid "Loading animation waiting time"
1489
+ msgstr "Inladen animatie wachttijd"
1490
 
1491
  msgid "Post IDs"
1492
  msgstr "Post IDs"
2127
  msgid "Why upgrade to Smart Slider 3 Pro?"
2128
  msgstr "Waarom upgraden naar Smart Slider 3 Pro?"
2129
 
2130
+ #, php-format
 
2131
  msgid "%d+ slider templates"
2132
+ msgstr "%d+ slider templates"
2133
 
2134
  msgid "Full slide library access"
2135
  msgstr "Volledige toegang tot slide bibliotheek"
2136
 
2137
+ #, php-format
 
2138
  msgid "%d new layers"
2139
+ msgstr "%d nieuwe lagen"
2140
 
2141
  msgid "Extra advanced options"
2142
  msgstr "Extra geavanceerde opties"
2601
  msgid "Drop images here"
2602
  msgstr "Laat afbeeldingen hier vallen"
2603
 
 
 
2604
  msgid "Search Project"
2605
+ msgstr "Zoek project"
2606
 
2607
  msgid "View trash"
2608
  msgstr "Bekijk prullenbak"
2628
  msgid "Export"
2629
  msgstr "Exporteren"
2630
 
 
 
2631
  msgid "Show"
2632
+ msgstr "Tonen"
2633
 
2634
  #, php-format
2635
  msgid "Showing %s to %s of %s projects"
2636
+ msgstr "%s tot %s van de %s projecten worden getoond"
2637
 
 
 
2638
  msgid "No projects to show"
2639
+ msgstr "Geen projecten om te tonen"
2640
 
2641
  msgid "New project"
2642
  msgstr "Nieuw project"
2643
 
2644
  msgid "Sorry we couldn’t find any matches"
2645
+ msgstr "Sorry, we vonden geen overeenkomsten"
2646
 
2647
  msgid "Please try searching with another term."
2648
+ msgstr "Probeer eens te zoeken met een ander trefwoord."
2649
 
2650
  #, php-format
2651
  msgid "Showing %s results for %s."
2652
+ msgstr "Tonen van %s resultaten voor %s."
2653
 
2654
  msgid "Module"
2655
  msgstr "Module"
4870
  msgid "Sparkling"
4871
  msgstr "Glinsterend"
4872
 
4873
+ #, php-format
 
4874
  msgid "Curve %d"
4875
+ msgstr "Curve %d"
4876
 
4877
  msgid "Curves"
4878
  msgstr "Curves"
4879
 
4880
+ #, php-format
 
4881
  msgid "Fan %d"
4882
+ msgstr "Ventilator %d"
4883
 
4884
  msgid "Hills"
4885
  msgstr "Bergen"
4886
 
4887
+ #, php-format
 
4888
  msgid "Incline %d"
4889
+ msgstr "Helling %d"
4890
 
4891
  msgid "Inverse arrow"
4892
  msgstr "Omgekeerde pijl"
4897
  msgid "Slopes"
4898
  msgstr "Hellingen"
4899
 
4900
+ #, php-format
 
4901
  msgid "Tilt %d"
4902
+ msgstr "Kantelen %d"
4903
 
4904
+ #, php-format
 
4905
  msgid "Triangle %d"
4906
+ msgstr "Driehoek %d"
4907
 
4908
+ #, php-format
 
4909
  msgid "Wave %d"
4910
+ msgstr "Golf %d"
4911
 
4912
  msgid "Waves"
4913
  msgstr "Golven"
4914
 
4915
+ #, php-format
 
4916
  msgid "Columns %d"
4917
+ msgstr "Kolommen %d"
4918
 
4919
  #, php-format
4920
  msgid "Paper %d"
4921
+ msgstr "Papier %d"
4922
 
4923
  msgid "2 Colors"
4924
  msgstr "2 kleuren"
4938
  msgid "The App ID is empty. Please insert that value too!"
4939
  msgstr "Het App ID is leeg. Geef die waarde ook in!"
4940
 
4941
+ #, php-format
 
 
 
 
4942
  msgid ""
4943
  "%1$s allows HTTPS Redirect URIs only! You must move your site to HTTPS in "
4944
  "order to use this generator!"
4945
  msgstr ""
4946
  "%1$s laat alleen HTTPS doorverwijzing URIs toe! U moet uw site naar HTTPS "
4947
+ "verplaatsen om deze generator te gebruiken!"
 
4948
 
4949
  msgid "How to get SSL for my website?"
4950
+ msgstr "Hoe get SSL voor mijn website verkrijgen?"
4951
 
4952
  #, php-format
4953
  msgid ""
5080
  msgid "Source folder"
5081
  msgstr "Bronmap"
5082
 
 
 
5083
  msgid "Filename based exclusion"
5084
+ msgstr "Op bestandsnaam gebaseerde uitsluiting"
5085
 
5086
  msgid "Remove resized images"
5087
  msgstr "Verwijder herschaalde afbeeldingen"
5099
  "afbeelding gaat, alleen in een kleiner formaat."
5100
 
5101
  msgid "Filename has to contain"
5102
+ msgstr "Bestandsnaam moet bevatten"
5103
 
5104
  msgid ""
5105
  "Only those images will be asked down, which have the given texts within "
5106
  "their filenames. You can write down multiple texts separated by comma."
5107
  msgstr ""
5108
+ "Alleen die afbeeldingen die de gegeven tekst in hun bestandsnaam hebben "
5109
+ "zullen opgevraagd worden. U mag meerdere teksten neerschrijven, gescheiden "
5110
+ "door komma's."
5111
 
5112
  msgid "Filename cannot contain"
5113
+ msgstr "Bestandsnaam mag niet bevatten"
5114
 
5115
  msgid ""
5116
  "Only those images will be asked down, which don't have the given texts "
5117
  "within their filenames. You can write down multiple texts separated by comma."
5118
  msgstr ""
5119
+ "Alleen die afbeeldingen die de gegeven tekst niet in hun bestandsnaam hebben "
5120
+ "zullen opgevraagd worden. U mag meerdere teksten neerschrijven, gescheiden "
5121
+ "door komma's."
5122
 
5123
  msgid "Filename"
5124
  msgstr "Bestandsnaam"
5144
  "te navigeren vanaf hier:"
5145
 
5146
  msgid "The App ID and the Secret is empty!"
5147
+ msgstr "Het App ID en het geheim zijn leeg!"
5148
 
5149
  msgid "The token will expire at:"
5150
+ msgstr "Het token zal vervallen op:"
5151
 
5152
  msgid "Access token was not returned.Please check the credentials!"
5153
  msgstr ""
5154
+ "Het toegangstoken werd niet teruggegeven. Controleer uw aanmeldgegevens!"
5155
 
 
 
5156
  msgid "The token expired. Please request new token!"
5157
+ msgstr "Het token is vervallen. Gelieve een nieuw token aan te vragen!"
5158
 
 
 
5159
  msgid "The token will expire in two days! Please refresh the token!"
5160
+ msgstr "Het token zal binnen twee dagen vervallen. Gelieve het te vernieuwen!"
5161
 
 
 
5162
  msgid "Refresh Token"
5163
+ msgstr "Vernieuw token"
5164
 
5165
  msgid "Refresh"
5166
+ msgstr "Vernieuwen"
5167
 
 
 
5168
  msgid "Album loading method"
5169
+ msgstr "Album laadmethode"
5170
 
5171
  msgid "Load first images only"
5172
+ msgstr "Laad alleen de eerste afbeeldingen"
5173
 
5174
  msgid "Load album images separately"
5175
+ msgstr "Album afbeeldingen apart inladen"
5176
 
5177
  msgid "Load Album images as record data"
5178
+ msgstr "Laad album afbeeldingen als record data"
5179
 
5180
  msgid "JSON from url"
5181
  msgstr "JSON van URL"
5222
  msgid "Images"
5223
  msgstr "Afbeeldingen"
5224
 
 
 
5225
  msgid "Offset hours"
5226
+ msgstr "Compensatie uren"
5227
 
5228
  msgid "Timezone offset in hours. For example: +2 or -7."
5229
  msgstr "Tijdzone compensatie in uur. Bijvoorbeeld: +2 of -7."
5529
  msgid "Date language"
5530
  msgstr "Datum taal"
5531
 
 
 
5532
  msgid "Date variable offset"
5533
+ msgstr "Datumvariabele compensatie"
5534
 
5535
  msgid "Date filter offset"
5536
+ msgstr "Datumfilter compensatie"
5537
 
5538
  msgid "Status"
5539
  msgstr "Status"
5713
  msgid "No limit"
5714
  msgstr "Geen limiet"
5715
 
 
 
5716
  msgid "Hide empty categories"
5717
+ msgstr "Verberg lege categorieën"
5718
 
5719
  msgid "Yes"
5720
  msgstr "Ja"
5908
  msgstr "Verticale slinger 3D"
5909
 
5910
  msgid "We are Passionate About"
5911
+ msgstr "We zijn gepassioneerd door"
5912
 
5913
  msgid ""
5914
  "Amazing Food\n"
5915
  "Great Hospitality"
5916
  msgstr ""
5917
+ "Geweldig eten\n"
5918
+ "Warme gastvrijheid"
5919
 
5920
  msgid "Before text"
5921
  msgstr "Voor de tekst"
6121
  msgid "Animation duration"
6122
  msgstr "Animatie duur"
6123
 
 
 
6124
  msgid "Countdown"
6125
+ msgstr "Aftellen"
6126
 
6127
  msgid "Days"
6128
  msgstr "Dag"
6133
  msgid "Seconds"
6134
  msgstr "Secundair"
6135
 
 
 
6136
  msgid "Use slide schedule"
6137
+ msgstr "Gebruik slide planning"
6138
 
 
 
6139
  msgid "You can use the \"Unpublished on\" date of the slide itself."
6140
+ msgstr "U kunt de \"Depubliceer op\" datum van de slide zelf gebruiken."
6141
 
6142
  msgid "Use Slide Schedule"
6143
+ msgstr "Gebruik slide planning"
6144
 
6145
  msgid "Go to Slide → Content tab and set the Unpublish on date for the slide."
6146
  msgstr ""
6147
+ "Ga naar de Slide → Content tab en stel de Depubliceer op datum optie in voor "
6148
+ "de slide."
6149
 
6150
  msgid ""
6151
  "Displays the days, hours, minutes and seconds texts under the counter "
6152
  "numbers. To display the labels in your own language, translate the texts in "
6153
  "the language files."
6154
  msgstr ""
6155
+ "Toont de dagen, uren, minuten en seconden teksten onder de tellergetallen. "
6156
+ "Om de labels in uw eigen taal te tonen kunt u de teksten vertalen in de "
6157
+ "taalbestanden."
6158
 
6159
  msgid "Gap"
6160
+ msgstr "Leemte"
6161
 
 
 
6162
  msgid "Creates vertical and horizontal distance between the counter elements."
6163
+ msgstr "Maakt verticale en horizontale afstand tussen de teller elementen."
6164
 
 
 
6165
  msgid "Tablet style"
6166
+ msgstr "Tablet stijl"
6167
 
6168
  msgid "Set custom Gap and Column for tablet."
6169
+ msgstr "Stel een aangepaste leemte en kolom in voor tablets."
6170
 
 
 
6171
  msgid "Mobile style"
6172
+ msgstr "Mobieltjes stijl"
6173
 
6174
  msgid "Set custom Gap and Column for mobile."
6175
+ msgstr "Stel een aangepaste leemte en kolom in voor mobieltjes."
6176
 
 
 
6177
  msgid "Action when ends"
6178
+ msgstr "Actie aan het einde"
6179
 
 
 
6180
  msgid "No action"
6181
+ msgstr "Geen actie"
6182
 
 
 
6183
  msgid "Hide layer"
6184
+ msgstr "Verberg laag"
6185
 
6186
  msgid "Redirect to URL"
6187
+ msgstr "Doorverwijzen naar URL"
6188
 
6189
  msgid "Choose what happens after the counter reached zero."
6190
+ msgstr "Kies wat er gebeurt als de teller nul bereikt."
6191
 
 
 
6192
  msgid "This page is"
6193
+ msgstr "Deze pagina is"
6194
 
6195
  msgid "Amazing"
6196
+ msgstr "Verbazingwekkend"
6197
 
6198
+ #, php-format
 
6199
  msgid "Circle %d"
6200
+ msgstr "Circel %d"
6201
 
6202
+ #, php-format
 
6203
  msgid "Curly %d"
6204
+ msgstr "Gekruld %d"
6205
 
6206
+ #, php-format
 
6207
  msgid "Highlight %d"
6208
+ msgstr "Accentuering %d"
6209
 
6210
+ #, php-format
 
6211
  msgid "Line Through %d"
6212
+ msgstr "Doorhaling %d"
6213
 
6214
+ #, php-format
 
6215
  msgid "Rectangle %d"
6216
+ msgstr "Rechthoek %d"
6217
 
6218
+ #, php-format
 
6219
  msgid "Underline %d"
6220
+ msgstr "Onderlijn %d"
6221
 
6222
+ #, php-format
 
6223
  msgid "Underline double %d"
6224
+ msgstr "Onderlijn dubbel %d"
6225
 
6226
+ #, php-format
 
6227
  msgid "ZigZag %d"
6228
+ msgstr "ZigZag %d"
6229
 
6230
  msgid "Highlighted text"
6231
  msgstr "Geaccentueerde tekst"
6243
  msgstr "HTML"
6244
 
6245
  msgid "Empty element"
6246
+ msgstr "Leeg element"
6247
 
6248
  msgid ""
6249
  "Please note that <b>we do not support</b> the HTML layer and the 3rd party "
6376
  "heeft vaak code aanpassingen nodig die u zelf moet aanbrengen. We raden dus "
6377
  "aan deze laag alleen te gebruiken als u een ontwikkelaar bent!"
6378
 
 
 
6379
  msgid "Iframe url"
6380
+ msgstr "Iframe url"
6381
 
6382
  msgid "You can disable the scroll on the iframe content."
6383
  msgstr "U kun het scrollen op de iframe inhoud deactiveren."
6384
 
 
 
6385
  msgid "Iframe title"
6386
+ msgstr "Iframe titel"
6387
 
6388
  msgid "Image area"
6389
  msgstr "Afbeeldingszone"
6391
  msgid "Image box"
6392
  msgstr "Afbeeldingsvak"
6393
 
6394
+ msgid "Aria label"
6395
+ msgstr "Aria label"
6396
+
6397
  msgid ""
6398
  "Positions the text inside the layer. Only works with left and right layout."
6399
  msgstr ""
6925
  #~ msgid "ZigZag 3"
6926
  #~ msgstr "ZigZag 3"
6927
 
 
 
 
6928
  #~ msgid "iframe"
6929
  #~ msgstr "iframe"
Nextend/Languages/smartslider3.pot CHANGED
@@ -2,7 +2,7 @@
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: \n"
5
- "POT-Creation-Date: 2022-05-24 09:10+0200\n"
6
  "PO-Revision-Date: 2020-03-10 19:30+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
@@ -11,7 +11,7 @@ msgstr ""
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
14
- "X-Generator: Poedit 3.0.1\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
16
  "X-Poedit-Basepath: ..\n"
17
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
@@ -1459,9 +1459,6 @@ msgstr ""
1459
  msgid "Background video"
1460
  msgstr ""
1461
 
1462
- msgid "Muted"
1463
- msgstr ""
1464
-
1465
  msgctxt "Video/Audio play"
1466
  msgid "Loop"
1467
  msgstr ""
@@ -1625,14 +1622,14 @@ msgid "Global breakpoints"
1625
  msgstr ""
1626
 
1627
  #, php-format
1628
- msgid "You can use the global breakpoints, or adjust them locally here. You can configure the Global breakpoints at <a href=\"%1$s\" target=\"_blank\">Global settings</a> > General > Breakpoints"
1629
  msgstr ""
1630
 
1631
  msgid "Custom size"
1632
  msgstr ""
1633
 
1634
  #, php-format
1635
- msgid "Use this option to customize the aspect ratio for each device. %1$s Read more in the documentation%2$s. <b>Beware:</b> This option is rarely needed and might be hard to set properly!"
1636
  msgstr ""
1637
 
1638
  msgid "Slides"
@@ -1778,10 +1775,7 @@ msgid "Get started with the Pro version now!"
1778
  msgstr ""
1779
 
1780
  #, php-format
1781
- msgid "Unable to connect to the API (%s)."
1782
- msgstr ""
1783
-
1784
- msgid "See <b>Debug Information</b> for more details!"
1785
  msgstr ""
1786
 
1787
  msgid "Successful connection with the API."
@@ -2326,6 +2320,12 @@ msgstr ""
2326
  msgid "Convert to slider"
2327
  msgstr ""
2328
 
 
 
 
 
 
 
2329
  msgid "Slide one"
2330
  msgstr ""
2331
 
@@ -2474,7 +2474,7 @@ msgid "Delete resized image cache"
2474
  msgstr ""
2475
 
2476
  #, php-format
2477
- msgid "If enabled the following folder will be <b>permanently deleted</b>: %s"
2478
  msgstr ""
2479
 
2480
  msgid "Configuration"
@@ -2541,19 +2541,6 @@ msgstr ""
2541
  msgid "Load Font Awesome 4"
2542
  msgstr ""
2543
 
2544
- msgid "API requests"
2545
- msgstr ""
2546
-
2547
- #, php-format
2548
- msgctxt "Curl"
2549
- msgid "Use %s"
2550
- msgstr ""
2551
-
2552
- #, php-format
2553
- msgctxt "curl proxy"
2554
- msgid "Clean %s"
2555
- msgstr ""
2556
-
2557
  msgid "General settings"
2558
  msgstr ""
2559
 
@@ -2741,7 +2728,8 @@ msgstr ""
2741
  msgid "Your server has an upload file limit at %s, so if you have bigger export file, please use the local import file method."
2742
  msgstr ""
2743
 
2744
- msgid "You have to unzip your "
 
2745
  msgstr ""
2746
 
2747
  msgid "Only *.ss3 files can be uploaded!"
@@ -2779,7 +2767,7 @@ msgid "File"
2779
  msgstr ""
2780
 
2781
  #, php-format
2782
- msgid "Files with <i>.ss3</i> extension are listed from: %s"
2783
  msgstr ""
2784
 
2785
  msgid "Delete file"
@@ -2918,6 +2906,10 @@ msgstr ""
2918
  msgid "Unable to connect to the API"
2919
  msgstr ""
2920
 
 
 
 
 
2921
  msgid "MySQL table missing"
2922
  msgstr ""
2923
 
@@ -2943,6 +2935,9 @@ msgstr ""
2943
  msgid "This plugin breaks the filtering options of the dynamic slide generators when %1$s is set to %2$s. Also it has not received any updates since WordPress 3.9."
2944
  msgstr ""
2945
 
 
 
 
2946
  msgid "Add column"
2947
  msgstr ""
2948
 
@@ -2998,21 +2993,39 @@ msgstr ""
2998
  msgid "Tags"
2999
  msgstr ""
3000
 
 
 
 
3001
  msgid "Featured"
3002
  msgstr ""
3003
 
3004
  msgid "User ID"
3005
  msgstr ""
3006
 
 
 
 
 
 
 
3007
  msgid "Language"
3008
  msgstr ""
3009
 
 
 
 
3010
  msgid "Extra variables"
3011
  msgstr ""
3012
 
3013
  msgid "Turn on these options to generate more variables for the slides."
3014
  msgstr ""
3015
 
 
 
 
 
 
 
3016
  msgid "Date format"
3017
  msgstr ""
3018
 
@@ -3229,9 +3242,6 @@ msgstr ""
3229
  msgid "Categories"
3230
  msgstr ""
3231
 
3232
- msgid "Remove shortcodes"
3233
- msgstr ""
3234
-
3235
  msgid "You can remove shortcodes from variables to avoid 3rd party content rendering in your slider."
3236
  msgstr ""
3237
 
@@ -4669,6 +4679,9 @@ msgstr ""
4669
  msgid "optional"
4670
  msgstr ""
4671
 
 
 
 
4672
  #, php-format
4673
  msgid "Creates slides from %1$s content."
4674
  msgstr ""
@@ -4913,6 +4926,9 @@ msgstr ""
4913
  msgid "Write the product IDs you want to display here, in the order you want them to appear in the generator. One product ID per line."
4914
  msgstr ""
4915
 
 
 
 
4916
  msgid "One time events"
4917
  msgstr ""
4918
 
@@ -5601,7 +5617,8 @@ msgstr ""
5601
  msgid "Empty element"
5602
  msgstr ""
5603
 
5604
- msgid "Please note that <b>we do not support</b> the HTML layer and the 3rd party codes loaded by it. We only suggest using this layer if you are a developer. <br>Also, make sure your HTML code is valid! Invalid HTML codes can mess up the entire slide and the only way resolving this problem is deleting the slide."
 
5605
  msgstr ""
5606
 
5607
  msgid "Item"
@@ -5710,7 +5727,8 @@ msgstr ""
5710
  msgid "Iframe"
5711
  msgstr ""
5712
 
5713
- msgid "Please note, that <b>we do not support</b> customized coding! The iframe layer often needs code customizations what you have to do yourself, so we only suggest using this layer if you are a developer!"
 
5714
  msgstr ""
5715
 
5716
  msgid "Iframe url"
@@ -5806,7 +5824,8 @@ msgstr ""
5806
  msgid "Joomla module"
5807
  msgstr ""
5808
 
5809
- msgid "Please note, that <b>we do not support</b> the Joomla module layer!<br>The loaded module often needs code customizations what you have to do yourself, so we only suggest using this layer if you are a developer!"
 
5810
  msgstr ""
5811
 
5812
  msgid "Position name or module ID"
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: \n"
5
+ "POT-Creation-Date: 2022-08-11 14:03+0200\n"
6
  "PO-Revision-Date: 2020-03-10 19:30+0100\n"
7
  "Last-Translator: \n"
8
  "Language-Team: \n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
14
+ "X-Generator: Poedit 3.1.1\n"
15
  "X-Poedit-SourceCharset: UTF-8\n"
16
  "X-Poedit-Basepath: ..\n"
17
  "X-Poedit-KeywordsList: ;n2_;n2_e;n2_n:1,2;n2_en:1,2;n2_x:1,2c;n2_ex:1,2c\n"
1459
  msgid "Background video"
1460
  msgstr ""
1461
 
 
 
 
1462
  msgctxt "Video/Audio play"
1463
  msgid "Loop"
1464
  msgstr ""
1622
  msgstr ""
1623
 
1624
  #, php-format
1625
+ msgid "You can use the global breakpoints, or adjust them locally here. You can configure the Global breakpoints at %1$sGlobal settings%2$s > General > Breakpoints"
1626
  msgstr ""
1627
 
1628
  msgid "Custom size"
1629
  msgstr ""
1630
 
1631
  #, php-format
1632
+ msgid "Use this option to customize the aspect ratio for each device. %1$s Read more in the documentation%2$s. %3$sBeware:%4$s This option is rarely needed and might be hard to set properly!"
1633
  msgstr ""
1634
 
1635
  msgid "Slides"
1775
  msgstr ""
1776
 
1777
  #, php-format
1778
+ msgid "Unable to connect to the API (%1$s). %2$s See %3$sDebug Information%4$s for more details!"
 
 
 
1779
  msgstr ""
1780
 
1781
  msgid "Successful connection with the API."
2320
  msgid "Convert to slider"
2321
  msgstr ""
2322
 
2323
+ msgid "Single slides are duplicated while autoplay is used."
2324
+ msgstr ""
2325
+
2326
+ msgid "autoplay settings"
2327
+ msgstr ""
2328
+
2329
  msgid "Slide one"
2330
  msgstr ""
2331
 
2474
  msgstr ""
2475
 
2476
  #, php-format
2477
+ msgid "If enabled the following folder will be %1$spermanently deleted%2$s: %3$s"
2478
  msgstr ""
2479
 
2480
  msgid "Configuration"
2541
  msgid "Load Font Awesome 4"
2542
  msgstr ""
2543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2544
  msgid "General settings"
2545
  msgstr ""
2546
 
2728
  msgid "Your server has an upload file limit at %s, so if you have bigger export file, please use the local import file method."
2729
  msgstr ""
2730
 
2731
+ #, php-format
2732
+ msgid "You have to unzip your %1$s file to find the importable *.ss3 files!"
2733
  msgstr ""
2734
 
2735
  msgid "Only *.ss3 files can be uploaded!"
2767
  msgstr ""
2768
 
2769
  #, php-format
2770
+ msgid "Files with %1$s.ss3%2$s extension are listed from: %3$s"
2771
  msgstr ""
2772
 
2773
  msgid "Delete file"
2906
  msgid "Unable to connect to the API"
2907
  msgstr ""
2908
 
2909
+ #, php-format
2910
+ msgid "See %1$sDebug Information%2$s for more details!"
2911
+ msgstr ""
2912
+
2913
  msgid "MySQL table missing"
2914
  msgstr ""
2915
 
2935
  msgid "This plugin breaks the filtering options of the dynamic slide generators when %1$s is set to %2$s. Also it has not received any updates since WordPress 3.9."
2936
  msgstr ""
2937
 
2938
+ msgid "Optimization plugins often create issues, so if you see anything wrong, follow our documentation:"
2939
+ msgstr ""
2940
+
2941
  msgid "Add column"
2942
  msgstr ""
2943
 
2993
  msgid "Tags"
2994
  msgstr ""
2995
 
2996
+ msgid "Access level"
2997
+ msgstr ""
2998
+
2999
  msgid "Featured"
3000
  msgstr ""
3001
 
3002
  msgid "User ID"
3003
  msgstr ""
3004
 
3005
+ msgid "Included article IDs"
3006
+ msgstr ""
3007
+
3008
+ msgid "Excluded article IDs"
3009
+ msgstr ""
3010
+
3011
  msgid "Language"
3012
  msgstr ""
3013
 
3014
+ msgid "Fields"
3015
+ msgstr ""
3016
+
3017
  msgid "Extra variables"
3018
  msgstr ""
3019
 
3020
  msgid "Turn on these options to generate more variables for the slides."
3021
  msgstr ""
3022
 
3023
+ msgid "Remove shortcodes"
3024
+ msgstr ""
3025
+
3026
+ msgid "Remove shortcodes from article description with the following patterns."
3027
+ msgstr ""
3028
+
3029
  msgid "Date format"
3030
  msgstr ""
3031
 
3242
  msgid "Categories"
3243
  msgstr ""
3244
 
 
 
 
3245
  msgid "You can remove shortcodes from variables to avoid 3rd party content rendering in your slider."
3246
  msgstr ""
3247
 
4679
  msgid "optional"
4680
  msgstr ""
4681
 
4682
+ msgid "Privacy status"
4683
+ msgstr ""
4684
+
4685
  #, php-format
4686
  msgid "Creates slides from %1$s content."
4687
  msgstr ""
4926
  msgid "Write the product IDs you want to display here, in the order you want them to appear in the generator. One product ID per line."
4927
  msgstr ""
4928
 
4929
+ msgid "Update your Ignite Gallery! Only Ignite Gallery 4.8+ versions are supported."
4930
+ msgstr ""
4931
+
4932
  msgid "One time events"
4933
  msgstr ""
4934
 
5617
  msgid "Empty element"
5618
  msgstr ""
5619
 
5620
+ #, php-format
5621
+ msgid "Please note that %1$swe do not support%2$s the HTML layer and the 3rd party codes loaded by it. We only suggest using this layer if you are a developer. %3$sAlso, make sure your HTML code is valid! Invalid HTML codes can mess up the entire slide and the only way resolving this problem is deleting the slide."
5622
  msgstr ""
5623
 
5624
  msgid "Item"
5727
  msgid "Iframe"
5728
  msgstr ""
5729
 
5730
+ #, php-format
5731
+ msgid "Please note, that %1$swe do not support%2$s customized coding! The iframe layer often needs code customizations what you have to do yourself, so we only suggest using this layer if you are a developer!"
5732
  msgstr ""
5733
 
5734
  msgid "Iframe url"
5824
  msgid "Joomla module"
5825
  msgstr ""
5826
 
5827
+ #, php-format
5828
+ msgid "Please note, that %1$swe do not support%2$s the Joomla module layer!%3$sThe loaded module often needs code customizations what you have to do yourself, so we only suggest using this layer if you are a developer!"
5829
  msgstr ""
5830
 
5831
  msgid "Position name or module ID"
Nextend/Security/Kses.php ADDED
@@ -0,0 +1,355 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Nextend\Security;
4
+
5
+ class Kses {
6
+
7
+ public static $allowedposttags = array(
8
+ 'address' => array(),
9
+ 'a' => array(
10
+ 'href' => true,
11
+ 'rel' => true,
12
+ 'rev' => true,
13
+ 'name' => true,
14
+ 'target' => true,
15
+ 'download' => array(
16
+ 'valueless' => 'y',
17
+ ),
18
+ ),
19
+ 'abbr' => array(),
20
+ 'acronym' => array(),
21
+ 'area' => array(
22
+ 'alt' => true,
23
+ 'coords' => true,
24
+ 'href' => true,
25
+ 'nohref' => true,
26
+ 'shape' => true,
27
+ 'target' => true,
28
+ ),
29
+ 'article' => array(
30
+ 'align' => true,
31
+ ),
32
+ 'aside' => array(
33
+ 'align' => true,
34
+ ),
35
+ 'audio' => array(
36
+ 'autoplay' => true,
37
+ 'controls' => true,
38
+ 'loop' => true,
39
+ 'muted' => true,
40
+ 'preload' => true,
41
+ 'src' => true,
42
+ ),
43
+ 'b' => array(),
44
+ 'bdo' => array(),
45
+ 'big' => array(),
46
+ 'blockquote' => array(
47
+ 'cite' => true,
48
+ ),
49
+ 'br' => array(),
50
+ 'button' => array(
51
+ 'disabled' => true,
52
+ 'name' => true,
53
+ 'type' => true,
54
+ 'value' => true,
55
+ ),
56
+ 'caption' => array(
57
+ 'align' => true,
58
+ ),
59
+ 'cite' => array(),
60
+ 'code' => array(),
61
+ 'col' => array(
62
+ 'align' => true,
63
+ 'char' => true,
64
+ 'charoff' => true,
65
+ 'span' => true,
66
+ 'valign' => true,
67
+ 'width' => true,
68
+ ),
69
+ 'colgroup' => array(
70
+ 'align' => true,
71
+ 'char' => true,
72
+ 'charoff' => true,
73
+ 'span' => true,
74
+ 'valign' => true,
75
+ 'width' => true,
76
+ ),
77
+ 'del' => array(
78
+ 'datetime' => true,
79
+ ),
80
+ 'dd' => array(),
81
+ 'dfn' => array(),
82
+ 'details' => array(
83
+ 'align' => true,
84
+ 'open' => true,
85
+ ),
86
+ 'div' => array(
87
+ 'align' => true,
88
+ ),
89
+ 'dl' => array(),
90
+ 'dt' => array(),
91
+ 'em' => array(),
92
+ 'fieldset' => array(),
93
+ 'figure' => array(
94
+ 'align' => true,
95
+ ),
96
+ 'figcaption' => array(
97
+ 'align' => true,
98
+ ),
99
+ 'font' => array(
100
+ 'color' => true,
101
+ 'face' => true,
102
+ 'size' => true,
103
+ ),
104
+ 'footer' => array(
105
+ 'align' => true,
106
+ ),
107
+ 'h1' => array(
108
+ 'align' => true,
109
+ ),
110
+ 'h2' => array(
111
+ 'align' => true,
112
+ ),
113
+ 'h3' => array(
114
+ 'align' => true,
115
+ ),
116
+ 'h4' => array(
117
+ 'align' => true,
118
+ ),
119
+ 'h5' => array(
120
+ 'align' => true,
121
+ ),
122
+ 'h6' => array(
123
+ 'align' => true,
124
+ ),
125
+ 'header' => array(
126
+ 'align' => true,
127
+ ),
128
+ 'hgroup' => array(
129
+ 'align' => true,
130
+ ),
131
+ 'hr' => array(
132
+ 'align' => true,
133
+ 'noshade' => true,
134
+ 'size' => true,
135
+ 'width' => true,
136
+ ),
137
+ 'i' => array(),
138
+ 'img' => array(
139
+ 'alt' => true,
140
+ 'align' => true,
141
+ 'border' => true,
142
+ 'height' => true,
143
+ 'hspace' => true,
144
+ 'loading' => true,
145
+ 'longdesc' => true,
146
+ 'vspace' => true,
147
+ 'src' => true,
148
+ 'usemap' => true,
149
+ 'width' => true,
150
+ ),
151
+ 'ins' => array(
152
+ 'datetime' => true,
153
+ 'cite' => true,
154
+ ),
155
+ 'kbd' => array(),
156
+ 'label' => array(
157
+ 'for' => true,
158
+ ),
159
+ 'legend' => array(
160
+ 'align' => true,
161
+ ),
162
+ 'li' => array(
163
+ 'align' => true,
164
+ 'value' => true,
165
+ ),
166
+ 'main' => array(
167
+ 'align' => true,
168
+ ),
169
+ 'map' => array(
170
+ 'name' => true,
171
+ ),
172
+ 'mark' => array(),
173
+ 'menu' => array(
174
+ 'type' => true,
175
+ ),
176
+ 'nav' => array(
177
+ 'align' => true,
178
+ ),
179
+ 'object' => array(
180
+ 'data' => array(
181
+ 'required' => true,
182
+ 'value_callback' => '_wp_kses_allow_pdf_objects',
183
+ ),
184
+ 'type' => array(
185
+ 'required' => true,
186
+ 'values' => array('application/pdf'),
187
+ ),
188
+ ),
189
+ 'p' => array(
190
+ 'align' => true,
191
+ ),
192
+ 'pre' => array(
193
+ 'width' => true,
194
+ ),
195
+ 'q' => array(
196
+ 'cite' => true,
197
+ ),
198
+ 'rb' => array(),
199
+ 'rp' => array(),
200
+ 'rt' => array(),
201
+ 'rtc' => array(),
202
+ 'ruby' => array(),
203
+ 's' => array(),
204
+ 'samp' => array(),
205
+ 'span' => array(
206
+ 'align' => true,
207
+ ),
208
+ 'section' => array(
209
+ 'align' => true,
210
+ ),
211
+ 'small' => array(),
212
+ 'strike' => array(),
213
+ 'strong' => array(),
214
+ 'sub' => array(),
215
+ 'summary' => array(
216
+ 'align' => true,
217
+ ),
218
+ 'sup' => array(),
219
+ 'table' => array(
220
+ 'align' => true,
221
+ 'bgcolor' => true,
222
+ 'border' => true,
223
+ 'cellpadding' => true,
224
+ 'cellspacing' => true,
225
+ 'rules' => true,
226
+ 'summary' => true,
227
+ 'width' => true,
228
+ ),
229
+ 'tbody' => array(
230
+ 'align' => true,
231
+ 'char' => true,
232
+ 'charoff' => true,
233
+ 'valign' => true,
234
+ ),
235
+ 'td' => array(
236
+ 'abbr' => true,
237
+ 'align' => true,
238
+ 'axis' => true,
239
+ 'bgcolor' => true,
240
+ 'char' => true,
241
+ 'charoff' => true,
242
+ 'colspan' => true,
243
+ 'headers' => true,
244
+ 'height' => true,
245
+ 'nowrap' => true,
246
+ 'rowspan' => true,
247
+ 'scope' => true,
248
+ 'valign' => true,
249
+ 'width' => true,
250
+ ),
251
+ 'textarea' => array(
252
+ 'cols' => true,
253
+ 'rows' => true,
254
+ 'disabled' => true,
255
+ 'name' => true,
256
+ 'readonly' => true,
257
+ ),
258
+ 'tfoot' => array(
259
+ 'align' => true,
260
+ 'char' => true,
261
+ 'charoff' => true,
262
+ 'valign' => true,
263
+ ),
264
+ 'th' => array(
265
+ 'abbr' => true,
266
+ 'align' => true,
267
+ 'axis' => true,
268
+ 'bgcolor' => true,
269
+ 'char' => true,
270
+ 'charoff' => true,
271
+ 'colspan' => true,
272
+ 'headers' => true,
273
+ 'height' => true,
274
+ 'nowrap' => true,
275
+ 'rowspan' => true,
276
+ 'scope' => true,
277
+ 'valign' => true,
278
+ 'width' => true,
279
+ ),
280
+ 'thead' => array(
281
+ 'align' => true,
282
+ 'char' => true,
283
+ 'charoff' => true,
284
+ 'valign' => true,
285
+ ),
286
+ 'title' => array(),
287
+ 'tr' => array(
288
+ 'align' => true,
289
+ 'bgcolor' => true,
290
+ 'char' => true,
291
+ 'charoff' => true,
292
+ 'valign' => true,
293
+ ),
294
+ 'track' => array(
295
+ 'default' => true,
296
+ 'kind' => true,
297
+ 'label' => true,
298
+ 'src' => true,
299
+ 'srclang' => true,
300
+ ),
301
+ 'tt' => array(),
302
+ 'u' => array(),
303
+ 'ul' => array(
304
+ 'type' => true,
305
+ ),
306
+ 'ol' => array(
307
+ 'start' => true,
308
+ 'type' => true,
309
+ 'reversed' => true,
310
+ ),
311
+ 'var' => array(),
312
+ 'video' => array(
313
+ 'autoplay' => true,
314
+ 'controls' => true,
315
+ 'height' => true,
316
+ 'loop' => true,
317
+ 'muted' => true,
318
+ 'playsinline' => true,
319
+ 'poster' => true,
320
+ 'preload' => true,
321
+ 'src' => true,
322
+ 'width' => true,
323
+ ),
324
+ );
325
+
326
+ public static $allowedtags = array(
327
+ 'a' => array(
328
+ 'href' => true,
329
+ 'title' => true,
330
+ ),
331
+ 'abbr' => array(
332
+ 'title' => true,
333
+ ),
334
+ 'acronym' => array(
335
+ 'title' => true,
336
+ ),
337
+ 'b' => array(),
338
+ 'blockquote' => array(
339
+ 'cite' => true,
340
+ ),
341
+ 'cite' => array(),
342
+ 'code' => array(),
343
+ 'del' => array(
344
+ 'datetime' => true,
345
+ ),
346
+ 'em' => array(),
347
+ 'i' => array(),
348
+ 'q' => array(
349
+ 'cite' => true,
350
+ ),
351
+ 's' => array(),
352
+ 'strike' => array(),
353
+ 'strong' => array(),
354
+ );
355
+ }
Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderAutoplay.php CHANGED
@@ -57,7 +57,8 @@ class SliderAutoplay extends AbstractSliderTab {
57
  'relatedFieldsOn' => array(
58
  'table-rows-autoplay',
59
  'table-widget-autoplay',
60
- 'table-widget-indicator'
 
61
  )
62
  ));
63
 
57
  'relatedFieldsOn' => array(
58
  'table-rows-autoplay',
59
  'table-widget-autoplay',
60
+ 'table-widget-indicator',
61
+ 'autoplay-single-slide-notice'
62
  )
63
  ));
64
 
Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderControls.php CHANGED
@@ -12,6 +12,8 @@ use Nextend\SmartSlider3\Widget\WidgetGroupFactory;
12
 
13
  class SliderControls extends AbstractSliderTab {
14
 
 
 
15
  /**
16
  * SliderControls constructor.
17
  *
@@ -77,7 +79,7 @@ class SliderControls extends AbstractSliderTab {
77
 
78
  $plugins = WidgetGroupFactory::getGroups();
79
 
80
- OrderableTrait::uasort($plugins);
81
 
82
  unset($plugins['autoplay']);
83
  unset($plugins['indicator']);
12
 
13
  class SliderControls extends AbstractSliderTab {
14
 
15
+ use OrderableTrait;
16
+
17
  /**
18
  * SliderControls constructor.
19
  *
79
 
80
  $plugins = WidgetGroupFactory::getGroups();
81
 
82
+ self::uasort($plugins);
83
 
84
  unset($plugins['autoplay']);
85
  unset($plugins['indicator']);
Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderDeveloper.php CHANGED
@@ -122,8 +122,7 @@ class SliderDeveloper extends AbstractSliderTab {
122
 
123
  $row3 = $table->createRow('developer-3');
124
  new Textarea($row3, 'custom-css-codes', 'CSS', '', array(
125
- 'height' => 26,
126
- 'resize' => 'both'
127
  ));
128
 
129
  $row11 = $table->createRow('developer-11');
122
 
123
  $row3 = $table->createRow('developer-3');
124
  new Textarea($row3, 'custom-css-codes', 'CSS', '', array(
125
+ 'height' => 26
 
126
  ));
127
 
128
  $row11 = $table->createRow('developer-11');
Nextend/SmartSlider3/Application/Admin/FormManager/Slider/SliderSize.php CHANGED
@@ -186,8 +186,8 @@ class SliderSize extends AbstractSliderTab {
186
 
187
  new OnOff($row2, 'responsive-breakpoint-global', n2_('Global breakpoints'), 0, array(
188
  'tipLabel' => n2_('Global breakpoints'),
189
- 'tipDescription' => sprintf(n2_('You can use the global breakpoints, or adjust them locally here. You can configure the Global breakpoints at <a href="%1$s" target="_blank">Global settings</a> > General > Breakpoints'), $this->form->getMVCHelper()
190
- ->getUrlSettingsDefault())
191
  ));
192
  new Breakpoint($row2, 'breakpoints', array(
193
  'tabletportrait-portrait' => 'sliderresponsive-breakpoint-tablet-portrait',
186
 
187
  new OnOff($row2, 'responsive-breakpoint-global', n2_('Global breakpoints'), 0, array(
188
  'tipLabel' => n2_('Global breakpoints'),
189
+ 'tipDescription' => sprintf(n2_('You can use the global breakpoints, or adjust them locally here. You can configure the Global breakpoints at %1$sGlobal settings%2$s > General > Breakpoints'), sprintf('<a href="%s" target="_blank">', $this->form->getMVCHelper()
190
+ ->getUrlSettingsDefault()), '</a>')
191
  ));
192
  new Breakpoint($row2, 'breakpoints', array(
193
  'tabletportrait-portrait' => 'sliderresponsive-breakpoint-tablet-portrait',
Nextend/SmartSlider3/Application/Admin/Generator/ControllerGenerator.php CHANGED
@@ -217,7 +217,7 @@ class ControllerGenerator extends AbstractControllerAdmin {
217
  } else {
218
  $message = 'Something wrong with the credentials';
219
  }
220
- echo '<script>window.opener._N2.Notification.error("' . htmlspecialchars($message) . '");self.close();</script>';
221
  }
222
  PageFlow::exitApplication();
223
  }
217
  } else {
218
  $message = 'Something wrong with the credentials';
219
  }
220
+ echo '<script>window.opener._N2.Notification.error("' . esc_html($message) . '");self.close();</script>';
221
  }
222
  PageFlow::exitApplication();
223
  }
Nextend/SmartSlider3/Application/Admin/Generator/Template/CreateStep2Configure.php CHANGED
@@ -10,9 +10,9 @@ use Nextend\Framework\Asset\Js\Js;
10
 
11
  JS::addInline('new _N2.GeneratorConfigure();');
12
  ?>
13
- <form id="n2-ss-form-generator-configure" action="<?php echo $this->getAjaxUrlGeneratorCheckConfiguration($this->getGeneratorGroup()
14
- ->getName(), $this->getSliderID(), $this->getGroupID()); ?>" method="post">
15
  <?php
16
- echo $this->renderForm();
17
  ?>
18
  </form>
10
 
11
  JS::addInline('new _N2.GeneratorConfigure();');
12
  ?>
13
+ <form id="n2-ss-form-generator-configure" action="<?php echo esc_url($this->getAjaxUrlGeneratorCheckConfiguration($this->getGeneratorGroup()
14
+ ->getName(), $this->getSliderID(), $this->getGroupID())); ?>" method="post">
15
  <?php
16
+ $this->renderForm();
17
  ?>
18
  </form>
Nextend/SmartSlider3/Application/Admin/Generator/Template/CreateStep4Settings.php CHANGED
@@ -14,14 +14,14 @@ $generatorSource = $this->getGeneratorSource();
14
  JS::addInline('new _N2.GeneratorAdd();');
15
  ?>
16
 
17
- <form id="n2-ss-form-generator-add" action="<?php echo $this->getAjaxUrlGeneratorCreateSettings($this->getGeneratorGroup()
18
- ->getName(), $this->getGeneratorSource()
19
- ->getName(), $this->getSliderID(), $this->getGroupID()); ?>" method="post">
20
  <?php
21
 
22
  $this->displayForm();
23
  ?>
24
- <input name="generator[group]" value="<?php echo $generatorGroup->getName(); ?>" type="hidden">
25
- <input name="generator[type]" value="<?php echo $generatorSource->getName(); ?>" type="hidden">
26
- <input name="slider-id" value="<?php echo $this->getSliderID(); ?>" type="hidden">
27
  </form>
14
  JS::addInline('new _N2.GeneratorAdd();');
15
  ?>
16
 
17
+ <form id="n2-ss-form-generator-add" action="<?php echo esc_url($this->getAjaxUrlGeneratorCreateSettings($this->getGeneratorGroup()
18
+ ->getName(), $this->getGeneratorSource()
19
+ ->getName(), $this->getSliderID(), $this->getGroupID())); ?>" method="post">
20
  <?php
21
 
22
  $this->displayForm();
23
  ?>
24
+ <input name="generator[group]" value="<?php echo esc_attr($generatorGroup->getName()); ?>" type="hidden">
25
+ <input name="generator[type]" value="<?php echo esc_attr($generatorSource->getName()); ?>" type="hidden">
26
+ <input name="slider-id" value="<?php echo esc_attr($this->getSliderID()); ?>" type="hidden">
27
  </form>
Nextend/SmartSlider3/Application/Admin/Generator/Template/Edit.php CHANGED
@@ -19,11 +19,11 @@ JS::addInline('new _N2.GeneratorEdit(' . json_encode(array(
19
  )) . ');');
20
 
21
  ?>
22
- <form id="n2-ss-form-generator-edit" action="<?php echo $this->getAjaxUrlGeneratorEdit($generator['id'], $this->getGroupID()); ?>" method="post">
23
  <?php
24
  $this->renderForm();
25
  ?>
26
- <input name="generator[group]" value="<?php echo $generatorGroup->getName(); ?>" type="hidden">
27
- <input name="generator[type]" value="<?php echo $generatorSource->getName(); ?>" type="hidden">
28
- <input name="slider-id" value="<?php echo $this->getSliderID(); ?>" type="hidden">
29
  </form>
19
  )) . ');');
20
 
21
  ?>
22
+ <form id="n2-ss-form-generator-edit" action="<?php echo esc_url($this->getAjaxUrlGeneratorEdit($generator['id'], $this->getGroupID())); ?>" method="post">
23
  <?php
24
  $this->renderForm();
25
  ?>
26
+ <input name="generator[group]" value="<?php echo esc_attr($generatorGroup->getName()); ?>" type="hidden">
27
+ <input name="generator[type]" value="<?php echo esc_attr($generatorSource->getName()); ?>" type="hidden">
28
+ <input name="slider-id" value="<?php echo esc_attr($this->getSliderID()); ?>" type="hidden">
29
  </form>
Nextend/SmartSlider3/Application/Admin/Generator/ViewGeneratorCreateStep4Settings.php CHANGED
@@ -150,8 +150,7 @@ class ViewGeneratorCreateStep4Settings extends AbstractView {
150
 
151
  $generatorModel = new ModelGenerator($this);
152
  $generatorModel->renderFields($form->getContainer());
153
-
154
- echo $form->render();
155
  }
156
 
157
  }
150
 
151
  $generatorModel = new ModelGenerator($this);
152
  $generatorModel->renderFields($form->getContainer());
153
+ $form->render();
 
154
  }
155
 
156
  }
Nextend/SmartSlider3/Application/Admin/Generator/ViewGeneratorEdit.php CHANGED
@@ -107,7 +107,7 @@ class ViewGeneratorEdit extends AbstractView {
107
  $generatorModel = new ModelGenerator($this);
108
  $generatorModel->renderFields($form->getContainer());
109
 
110
- echo $form->render();
111
  }
112
 
113
  /**
107
  $generatorModel = new ModelGenerator($this);
108
  $generatorModel->renderFields($form->getContainer());
109
 
110
+ $form->render();
111
  }
112
 
113
  /**
Nextend/SmartSlider3/Application/Admin/GoPro/BlockAlreadyPurchased/AlreadyPurchased.php CHANGED
@@ -19,10 +19,10 @@ use Nextend\SmartSlider3\SmartSlider3Info;
19
  </div>
20
 
21
  <div class="n2_page_free_go_pro_already_purchased__paragraph">
22
- <?php printf(n2_('After making your purchase, %1$slog in to your account%3$s and download the Pro installer. To get started with Smart Slider 3 Pro, simply %2$sinstall it on your website%3$s.'), '<a href="' . SmartSlider3Info::decorateExternalUrl('https://secure.nextendweb.com/', array('utm_source' => 'already-purchased')) . '" target="_blank">', '<a href="' . SmartSlider3Info::decorateExternalUrl('https://secure.nextendweb.com/', array('utm_source' => 'already-purchased')) . '" target="_blank">', '</a>'); ?>
23
  </div>
24
 
25
- <a href="<?php echo SmartSlider3Info::decorateExternalUrl('https://secure.nextendweb.com/', array('utm_source' => 'already-purchased')); ?>" target="_blank" class="n2_page_free_go_pro_already_purchased__button">
26
  <?php n2_e('Download Pro'); ?>
27
  </a>
28
 
19
  </div>
20
 
21
  <div class="n2_page_free_go_pro_already_purchased__paragraph">
22
+ <?php echo sprintf(n2_('After making your purchase, %1$slog in to your account%3$s and download the Pro installer. To get started with Smart Slider 3 Pro, simply %2$sinstall it on your website%3$s.'), '<a href="' . esc_url(SmartSlider3Info::decorateExternalUrl('https://secure.nextendweb.com/', array('utm_source' => 'already-purchased'))) . '" target="_blank">', '<a href="https://smartslider.helpscoutdocs.com/category/1696-installation" target="_blank">', '</a>'); ?>
23
  </div>
24
 
25
+ <a href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://secure.nextendweb.com/', array('utm_source' => 'already-purchased'))); ?>" target="_blank" class="n2_page_free_go_pro_already_purchased__button">
26
  <?php n2_e('Download Pro'); ?>
27
  </a>
28
 
Nextend/SmartSlider3/Application/Admin/Help/ControllerHelp.php CHANGED
@@ -71,7 +71,7 @@ class ControllerHelp extends AbstractControllerAdmin {
71
  }
72
 
73
  if (strpos($output, 'ACTION_MISSING') === false) {
74
- Notification::error(sprintf(n2_('Unable to connect to the API (%s).') . '<br>' . n2_('See <b>Debug Information</b> for more details!'), Api::getApiUrl()));
75
  } else {
76
  Notification::notice(n2_('Successful connection with the API.'));
77
  }
71
  }
72
 
73
  if (strpos($output, 'ACTION_MISSING') === false) {
74
+ Notification::error(sprintf(n2_('Unable to connect to the API (%1$s). %2$s See %3$sDebug Information%4$s for more details!'), Api::getApiUrl(), '<br>', '<b>', '</b>'));
75
  } else {
76
  Notification::notice(n2_('Successful connection with the API.'));
77
  }
Nextend/SmartSlider3/Application/Admin/Help/Template/Index.php CHANGED
@@ -5,6 +5,8 @@ namespace Nextend\SmartSlider3\Application\Admin\Help;
5
 
6
  use Nextend\Framework\Filesystem\Filesystem;
7
  use Nextend\Framework\Platform\Platform;
 
 
8
  use Nextend\Framework\Url\Url;
9
  use Nextend\SmartSlider3\SmartSlider3Info;
10
 
@@ -39,7 +41,7 @@ $conflicts = $this->getConflicts();
39
  <div class="n2_help_center__conflicts_label"><?php n2_e('Possible conflicts'); ?></div>
40
  <div class="n2_help_center__conflicts_description">
41
  <div class="n2_help_center__conflicts_test_api">
42
- <a href="<?php echo $this->getUrlHelpTestApi(); ?>">
43
  <?php n2_e('Test connection'); ?>
44
  </a>
45
  </div>
@@ -47,7 +49,7 @@ $conflicts = $this->getConflicts();
47
  <div class="n2_help_center__no_conflicts_detected"><?php n2_e('No conflicts detected.'); ?></div>
48
  <?php else: ?>
49
  <?php foreach ($conflicts as $conflict): ?>
50
- <div class="n2_help_center__conflicts_detected"><?php echo $conflict; ?></div>
51
  <?php endforeach; ?>
52
  <?php endif; ?>
53
  </div>
@@ -76,7 +78,7 @@ $conflicts = $this->getConflicts();
76
  <div class="n2_help_center__actions">
77
  <div class="n2_help_center__action">
78
  <a class="n2_help_center__action_link"
79
- href="<?php echo 'https://smartslider.helpscoutdocs.com/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-documentation&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan; ?>"
80
  target="_blank"></a>
81
  <div class="n2_help_center__action_icon"><i class="ssi_48 ssi_48--doc"></i></div>
82
  <div class="n2_help_center__action_label"><?php n2_e('Documentation'); ?></div>
@@ -91,7 +93,7 @@ $conflicts = $this->getConflicts();
91
  </div>
92
  <div class="n2_help_center__action">
93
  <a class="n2_help_center__action_link"
94
- href="<?php echo 'https://www.youtube.com/watch?v=3PPtkRU7D74&list=PLSawiBnEUNfvVeY7M8Yx7UdyOpBEmoH7Z&utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-watch-videos&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan; ?>"
95
  target="_blank"></a>
96
  <div class="n2_help_center__action_icon"><i class="ssi_48 ssi_48--camera"></i></div>
97
  <div class="n2_help_center__action_label"><?php n2_e('Tutorial videos'); ?></div>
@@ -108,8 +110,8 @@ $conflicts = $this->getConflicts();
108
  foreach ($this->getArticles() as $article) {
109
  ?>
110
  <div class="n2_help_center__article">
111
- <a class="n2_help_center__article_link" href="<?php echo $article['url']; ?>" target="_blank"></a>
112
- <div class="n2_help_center__article_label"><?php echo $article['label']; ?></div>
113
  <i class="ssi_16 ssi_16--breadcrumb n2_help_center__article_icon"></i>
114
  </div>
115
  <?php
@@ -126,7 +128,7 @@ $conflicts = $this->getConflicts();
126
  <div class="n2_help_center__conflicts_label"><?php n2_e('Possible conflicts'); ?></div>
127
  <div class="n2_help_center__conflicts_description">
128
  <div class="n2_help_center__conflicts_test_api">
129
- <a href="<?php echo $this->getUrlHelpTestApi(); ?>">
130
  <?php n2_e('Test connection'); ?>
131
  </a>
132
  </div>
@@ -134,7 +136,7 @@ $conflicts = $this->getConflicts();
134
  <div class="n2_help_center__no_conflicts_detected"><?php n2_e('No conflicts detected.'); ?></div>
135
  <?php else: ?>
136
  <?php foreach ($conflicts as $conflict): ?>
137
- <div class="n2_help_center__conflicts_detected"><?php echo $conflict; ?></div>
138
  <?php endforeach; ?>
139
  <?php endif; ?>
140
  </div>
@@ -165,7 +167,7 @@ $conflicts = $this->getConflicts();
165
  'Site url: ' . Platform::getSiteUrl(),
166
  'Path: ' . Filesystem::getBasePath(),
167
  'Uri: ' . Url::getBaseUri(),
168
- 'Browser: ' . $_SERVER['HTTP_USER_AGENT'],
169
  ''
170
  );
171
 
@@ -271,7 +273,7 @@ $conflicts = $this->getConflicts();
271
 
272
  ?>
273
  <textarea readonly name="debug_information"
274
- style="width:100%;height:800px;"><?php echo htmlspecialchars(implode("\n", $debug), ENT_QUOTES, 'utf-8'); ?></textarea>
275
  </form>
276
  </div>
277
  </div>
5
 
6
  use Nextend\Framework\Filesystem\Filesystem;
7
  use Nextend\Framework\Platform\Platform;
8
+ use Nextend\Framework\Request\Request;
9
+ use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\Url\Url;
11
  use Nextend\SmartSlider3\SmartSlider3Info;
12
 
41
  <div class="n2_help_center__conflicts_label"><?php n2_e('Possible conflicts'); ?></div>
42
  <div class="n2_help_center__conflicts_description">
43
  <div class="n2_help_center__conflicts_test_api">
44
+ <a href="<?php echo esc_url($this->getUrlHelpTestApi()); ?>">
45
  <?php n2_e('Test connection'); ?>
46
  </a>
47
  </div>
49
  <div class="n2_help_center__no_conflicts_detected"><?php n2_e('No conflicts detected.'); ?></div>
50
  <?php else: ?>
51
  <?php foreach ($conflicts as $conflict): ?>
52
+ <div class="n2_help_center__conflicts_detected"><?php echo wp_kses($conflict, Sanitize::$basicTags); ?></div>
53
  <?php endforeach; ?>
54
  <?php endif; ?>
55
  </div>
78
  <div class="n2_help_center__actions">
79
  <div class="n2_help_center__action">
80
  <a class="n2_help_center__action_link"
81
+ href="<?php echo esc_url('https://smartslider.helpscoutdocs.com/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-documentation&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>"
82
  target="_blank"></a>
83
  <div class="n2_help_center__action_icon"><i class="ssi_48 ssi_48--doc"></i></div>
84
  <div class="n2_help_center__action_label"><?php n2_e('Documentation'); ?></div>
93
  </div>
94
  <div class="n2_help_center__action">
95
  <a class="n2_help_center__action_link"
96
+ href="<?php echo esc_url('https://www.youtube.com/watch?v=3PPtkRU7D74&list=PLSawiBnEUNfvVeY7M8Yx7UdyOpBEmoH7Z&utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-watch-videos&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>"
97
  target="_blank"></a>
98
  <div class="n2_help_center__action_icon"><i class="ssi_48 ssi_48--camera"></i></div>
99
  <div class="n2_help_center__action_label"><?php n2_e('Tutorial videos'); ?></div>
110
  foreach ($this->getArticles() as $article) {
111
  ?>
112
  <div class="n2_help_center__article">
113
+ <a class="n2_help_center__article_link" href="<?php echo esc_url($article['url']); ?>" target="_blank"></a>
114
+ <div class="n2_help_center__article_label"><?php echo esc_html($article['label']); ?></div>
115
  <i class="ssi_16 ssi_16--breadcrumb n2_help_center__article_icon"></i>
116
  </div>
117
  <?php
128
  <div class="n2_help_center__conflicts_label"><?php n2_e('Possible conflicts'); ?></div>
129
  <div class="n2_help_center__conflicts_description">
130
  <div class="n2_help_center__conflicts_test_api">
131
+ <a href="<?php echo esc_url($this->getUrlHelpTestApi()); ?>">
132
  <?php n2_e('Test connection'); ?>
133
  </a>
134
  </div>
136
  <div class="n2_help_center__no_conflicts_detected"><?php n2_e('No conflicts detected.'); ?></div>
137
  <?php else: ?>
138
  <?php foreach ($conflicts as $conflict): ?>
139
+ <div class="n2_help_center__conflicts_detected"><?php echo wp_kses($conflict, Sanitize::$basicTags); ?></div>
140
  <?php endforeach; ?>
141
  <?php endif; ?>
142
  </div>
167
  'Site url: ' . Platform::getSiteUrl(),
168
  'Path: ' . Filesystem::getBasePath(),
169
  'Uri: ' . Url::getBaseUri(),
170
+ 'Browser: ' . Request::$SERVER->getVar('HTTP_USER_AGENT'),
171
  ''
172
  );
173
 
273
 
274
  ?>
275
  <textarea readonly name="debug_information"
276
+ style="width:100%;height:800px;"><?php echo esc_html(implode("\n", $debug)); ?></textarea>
277
  </form>
278
  </div>
279
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Admin/Admin.php CHANGED
@@ -4,6 +4,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Admin;
4
 
5
  use Nextend\Framework\Notification\Notification;
6
  use Nextend\Framework\Plugin;
 
7
  use Nextend\SmartSlider3\Settings;
8
  use Nextend\SmartSlider3\SmartSlider3Info;
9
 
@@ -14,13 +15,13 @@ use Nextend\SmartSlider3\SmartSlider3Info;
14
 
15
  <div <?php $this->renderAttributes(); ?>>
16
  <div class="n2_admin__header">
17
- <?php echo $this->getHeader(); ?>
18
  </div>
19
  <div class="n2_admin__content">
20
- <?php echo $this->getSubNavigation(); ?>
21
  <?php $this->displayTopBar(); ?>
22
 
23
- <?php echo $this->displayContent(); ?>
24
  </div>
25
  <?php
26
  Plugin::doAction('afterApplicationContent');
4
 
5
  use Nextend\Framework\Notification\Notification;
6
  use Nextend\Framework\Plugin;
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\SmartSlider3\Settings;
9
  use Nextend\SmartSlider3\SmartSlider3Info;
10
 
15
 
16
  <div <?php $this->renderAttributes(); ?>>
17
  <div class="n2_admin__header">
18
+ <?php echo wp_kses($this->getHeader(), Sanitize::$adminTemplateTags); ?>
19
  </div>
20
  <div class="n2_admin__content">
21
+ <?php echo wp_kses($this->getSubNavigation(), Sanitize::$adminTemplateTags); ?>
22
  <?php $this->displayTopBar(); ?>
23
 
24
+ <?php $this->displayContent(); ?>
25
  </div>
26
  <?php
27
  Plugin::doAction('afterApplicationContent');
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Admin/BlockAdmin.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Admin;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\AbstractLayout;
9
  use Nextend\Framework\View\Html;
@@ -97,7 +98,7 @@ class BlockAdmin extends AbstractBlock {
97
  }
98
 
99
  public function displayTopBar() {
100
- echo $this->topBar;
101
  }
102
 
103
  /**
@@ -120,9 +121,9 @@ class BlockAdmin extends AbstractBlock {
120
 
121
  public function renderAttributes() {
122
 
123
- echo Html::renderAttributes($this->attributes + array(
124
  'id' => $this->id,
125
  'class' => implode(' ', $this->classes)
126
- ));
127
  }
128
  }
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Admin;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\AbstractLayout;
10
  use Nextend\Framework\View\Html;
98
  }
99
 
100
  public function displayTopBar() {
101
+ echo wp_kses($this->topBar, Sanitize::$adminTemplateTags);
102
  }
103
 
104
  /**
121
 
122
  public function renderAttributes() {
123
 
124
+ echo wp_kses(Html::renderAttributes($this->attributes + array(
125
  'id' => $this->id,
126
  'class' => implode(' ', $this->classes)
127
+ )), Sanitize::$adminTemplateTags);
128
  }
129
  }
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminEditor/BlockAdminEditor.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminEditor;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\Html;
9
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\EditorOverlay\BlockEditorOverlay;
@@ -56,10 +57,10 @@ class BlockAdminEditor extends AbstractBlock {
56
 
57
  public function renderAttributes() {
58
 
59
- echo Html::renderAttributes($this->attributes + array(
60
  'id' => $this->id,
61
  'class' => implode(' ', $this->classes)
62
- ));
63
  }
64
 
65
  public function displayEditorOverlay() {
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminEditor;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\Html;
10
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\EditorOverlay\BlockEditorOverlay;
57
 
58
  public function renderAttributes() {
59
 
60
+ echo wp_kses(Html::renderAttributes($this->attributes + array(
61
  'id' => $this->id,
62
  'class' => implode(' ', $this->classes)
63
+ )), Sanitize::$adminTemplateTags);
64
  }
65
 
66
  public function displayEditorOverlay() {
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminEmpty/BlockAdminEmpty.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminEmpty;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\AbstractLayout;
9
  use Nextend\Framework\View\Html;
@@ -45,9 +46,9 @@ class BlockAdminEmpty extends AbstractBlock {
45
 
46
  public function renderAttributes() {
47
 
48
- echo Html::renderAttributes($this->attributes + array(
49
  'id' => $this->id,
50
  'class' => implode(' ', $this->classes)
51
- ));
52
  }
53
  }
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminEmpty;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\AbstractLayout;
10
  use Nextend\Framework\View\Html;
46
 
47
  public function renderAttributes() {
48
 
49
+ echo wp_kses(Html::renderAttributes($this->attributes + array(
50
  'id' => $this->id,
51
  'class' => implode(' ', $this->classes)
52
+ )), Sanitize::$adminTemplateTags);
53
  }
54
  }
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminError/AdminError.php CHANGED
@@ -9,17 +9,17 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminError;
9
  <div style="margin: 20px;width: 500px;border: 2px solid #1D81F9;background-color: #FFFFFF;border-radius: 5px;padding: 40px 50px;">
10
  <div style="font-size: 18px;line-height: 28px;font-weight: bold;color: #283F4D;">
11
  <?php
12
- echo $this->getTitle();
13
  ?>
14
  </div>
15
  <div style="font-size: 14px;line-height: 24px;color: #325C77;">
16
  <?php
17
- echo $this->getContent();
18
  ?>
19
  </div>
20
  <?php if ($this->hasUrl()): ?>
21
  <div style="margin-top: 10px;">
22
- <a href="<?php echo $this->getUrl(); ?>" target="_blank" style="font-size: 14px;line-height: 24px;color: #1375E9;text-decoration: none;text-transform: capitalize"><?php n2_e('Read more'); ?></a>
23
  </div>
24
  <?php endif; ?>
25
  </div>
9
  <div style="margin: 20px;width: 500px;border: 2px solid #1D81F9;background-color: #FFFFFF;border-radius: 5px;padding: 40px 50px;">
10
  <div style="font-size: 18px;line-height: 28px;font-weight: bold;color: #283F4D;">
11
  <?php
12
+ echo esc_html($this->getTitle());
13
  ?>
14
  </div>
15
  <div style="font-size: 14px;line-height: 24px;color: #325C77;">
16
  <?php
17
+ echo esc_html($this->getContent());
18
  ?>
19
  </div>
20
  <?php if ($this->hasUrl()): ?>
21
  <div style="margin-top: 10px;">
22
+ <a href="<?php echo esc_url($this->getUrl()); ?>" target="_blank" style="font-size: 14px;line-height: 24px;color: #1375E9;text-decoration: none;text-transform: capitalize"><?php n2_e('Read more'); ?></a>
23
  </div>
24
  <?php endif; ?>
25
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminIframe/AdminIframe.php CHANGED
@@ -12,7 +12,7 @@ use Nextend\SmartSlider3\Settings;
12
  <div <?php $this->renderAttributes(); ?>>
13
  <div class="n2_iframe_application__nav_bar">
14
  <div class="n2_iframe_application__nav_bar_label">
15
- <?php echo $this->getLabel(); ?>
16
  </div>
17
  <div class="n2_iframe_application__nav_bar_actions">
18
  <?php
12
  <div <?php $this->renderAttributes(); ?>>
13
  <div class="n2_iframe_application__nav_bar">
14
  <div class="n2_iframe_application__nav_bar_label">
15
+ <?php echo esc_html($this->getLabel()); ?>
16
  </div>
17
  <div class="n2_iframe_application__nav_bar_actions">
18
  <?php
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/AdminIframe/BlockAdminIframe.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminIframe;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\AbstractLayout;
9
  use Nextend\Framework\View\Html;
@@ -102,9 +103,9 @@ class BlockAdminIframe extends AbstractBlock {
102
 
103
  public function renderAttributes() {
104
 
105
- echo Html::renderAttributes($this->attributes + array(
106
  'id' => $this->id,
107
  'class' => implode(' ', $this->classes)
108
- ));
109
  }
110
  }
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\AdminIframe;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\AbstractLayout;
10
  use Nextend\Framework\View\Html;
103
 
104
  public function renderAttributes() {
105
 
106
+ echo wp_kses(Html::renderAttributes($this->attributes + array(
107
  'id' => $this->id,
108
  'class' => implode(' ', $this->classes)
109
+ )), Sanitize::$adminTemplateTags);
110
  }
111
  }
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Banner/Banner.php CHANGED
@@ -9,16 +9,16 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Banner;
9
  $closeUrl = $this->getCloseUrl();
10
  ?>
11
 
12
- <div id="<?php echo $this->getID(); ?>" class="n2_admin__banner">
13
  <div class="n2_admin__banner_inner">
14
- <img src="<?php echo $this->getImage(); ?>" alt="">
15
- <div class="n2_admin__banner_inner_title"><?php echo $this->getTitle(); ?></div>
16
- <div class="n2_admin__banner_inner_description"><?php echo $this->getDescription(); ?></div>
17
  <a class="n2_admin__banner_inner_button n2_button n2_button--big n2_button--green"
18
- href="<?php echo $this->getButtonHref(); ?>"
19
- onclick="<?php echo $this->getButtonOnclick(); ?>"
20
  target="_blank">
21
- <?php echo $this->getButtonTitle(); ?>
22
  </a>
23
  </div>
24
  <?php if (!empty($closeUrl)): ?>
@@ -29,12 +29,12 @@ $closeUrl = $this->getCloseUrl();
29
  <script>
30
  _N2.r(['$', 'documentReady'], function () {
31
  var $ = _N2.$;
32
- var $banner = $('#<?php echo $this->getID(); ?>');
33
 
34
  $banner.find('.n2_admin__banner_close').on('click', function (e) {
35
  e.preventDefault();
36
 
37
- _N2.AjaxHelper.ajax({url: <?php echo json_encode($closeUrl); ?>});
38
  $banner.remove();
39
  });
40
  });
9
  $closeUrl = $this->getCloseUrl();
10
  ?>
11
 
12
+ <div id="<?php echo esc_attr($this->getID()); ?>" class="n2_admin__banner">
13
  <div class="n2_admin__banner_inner">
14
+ <img src="<?php echo esc_url($this->getImage()); ?>" alt="">
15
+ <div class="n2_admin__banner_inner_title"><?php echo esc_attr($this->getTitle()); ?></div>
16
+ <div class="n2_admin__banner_inner_description"><?php echo esc_attr($this->getDescription()); ?></div>
17
  <a class="n2_admin__banner_inner_button n2_button n2_button--big n2_button--green"
18
+ href="<?php echo esc_url($this->getButtonHref()); ?>"
19
+ onclick="<?php echo esc_js($this->getButtonOnclick()); ?>"
20
  target="_blank">
21
+ <?php echo esc_html($this->getButtonTitle()); ?>
22
  </a>
23
  </div>
24
  <?php if (!empty($closeUrl)): ?>
29
  <script>
30
  _N2.r(['$', 'documentReady'], function () {
31
  var $ = _N2.$;
32
+ var $banner = $('#<?php echo esc_html($this->getID()); ?>');
33
 
34
  $banner.find('.n2_admin__banner_close').on('click', function (e) {
35
  e.preventDefault();
36
 
37
+ _N2.AjaxHelper.ajax({url: <?php echo json_encode(esc_url($closeUrl)); ?>});
38
  $banner.remove();
39
  });
40
  });
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/ContentSidebar/ContentSidebar.php CHANGED
@@ -2,6 +2,9 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\ContentSidebar;
4
 
 
 
 
5
  /**
6
  * @var $this BlockContentSidebar
7
  */
@@ -9,12 +12,12 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\ContentSideba
9
  <div class="n2-admin-content-with-sidebar">
10
  <div class="n2-admin-content-with-sidebar__sidebar">
11
  <?php
12
- echo $this->getSidebar();
13
  ?>
14
  </div>
15
  <div class="n2-admin-content-with-sidebar__content">
16
  <?php
17
- echo $this->getContent();
18
  ?>
19
  </div>
20
  </div>
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\ContentSidebar;
4
 
5
+
6
+ use Nextend\Framework\Sanitize;
7
+
8
  /**
9
  * @var $this BlockContentSidebar
10
  */
12
  <div class="n2-admin-content-with-sidebar">
13
  <div class="n2-admin-content-with-sidebar__sidebar">
14
  <?php
15
+ echo wp_kses($this->getSidebar(), Sanitize::$adminTemplateTags);
16
  ?>
17
  </div>
18
  <div class="n2-admin-content-with-sidebar__content">
19
  <?php
20
+ echo wp_kses($this->getContent(), Sanitize::$adminTemplateTags);
21
  ?>
22
  </div>
23
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/FreeNeedMore/FreeNeedMore.php CHANGED
@@ -11,7 +11,7 @@ use Nextend\SmartSlider3\SmartSlider3Info;
11
  ?>
12
  <div class="n2_free_need_more">
13
  <div class="n2_free_need_more__logo">
14
- <img src="<?php echo ResourceTranslator::toUrl('$ss3-admin$/images/logo-filled.svg'); ?>" alt="logo">
15
  </div>
16
  <div class="n2_free_need_more__title">
17
  <?php n2_e('Need more?'); ?>
@@ -19,7 +19,7 @@ use Nextend\SmartSlider3\SmartSlider3Info;
19
  <div class="n2_free_need_more__paragraph">
20
  <?php n2_e('Unlock all the pro features by upgrading to Smart Slider 3 Pro.'); ?>
21
  </div>
22
- <a href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/pricing/', array('utm_source' => $this->getSource())); ?>" target="_blank" class="n2_free_need_more__button">
23
  <?php n2_e('Go Pro'); ?>
24
  </a>
25
  </div>
11
  ?>
12
  <div class="n2_free_need_more">
13
  <div class="n2_free_need_more__logo">
14
+ <img src="<?php echo esc_url(ResourceTranslator::toUrl('$ss3-admin$/images/logo-filled.svg')); ?>" alt="logo">
15
  </div>
16
  <div class="n2_free_need_more__title">
17
  <?php n2_e('Need more?'); ?>
19
  <div class="n2_free_need_more__paragraph">
20
  <?php n2_e('Unlock all the pro features by upgrading to Smart Slider 3 Pro.'); ?>
21
  </div>
22
+ <a href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/pricing/', array('utm_source' => $this->getSource()))); ?>" target="_blank" class="n2_free_need_more__button">
23
  <?php n2_e('Go Pro'); ?>
24
  </a>
25
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Header/Header.php CHANGED
@@ -2,6 +2,8 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
4
 
 
 
5
  /**
6
  * @var $this BlockHeader
7
  */
@@ -12,7 +14,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
12
  <div class="n2_header__heading">
13
  <div class="n2_header__heading_primary">
14
  <?php
15
- echo $this->getHeading();
16
  ?>
17
  </div>
18
  <?php
@@ -20,7 +22,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
20
  ?>
21
  <div class="n2_header__heading_after">
22
  <?php
23
- echo $this->getHeadingAfter();
24
  ?>
25
  </div>
26
  <?php
@@ -33,7 +35,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
33
  ?>
34
  <div class="n2_header__actions">
35
  <?php
36
- echo implode('', $this->getActions());
37
  ?>
38
  </div>
39
  <?php
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
4
 
5
+ use Nextend\Framework\Sanitize;
6
+
7
  /**
8
  * @var $this BlockHeader
9
  */
14
  <div class="n2_header__heading">
15
  <div class="n2_header__heading_primary">
16
  <?php
17
+ echo esc_html($this->getHeading());
18
  ?>
19
  </div>
20
  <?php
22
  ?>
23
  <div class="n2_header__heading_after">
24
  <?php
25
+ echo esc_html($this->getHeadingAfter());
26
  ?>
27
  </div>
28
  <?php
35
  ?>
36
  <div class="n2_header__actions">
37
  <?php
38
+ echo wp_kses(implode('', $this->getActions()), Sanitize::$adminTemplateTags);
39
  ?>
40
  </div>
41
  <?php
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/Header/MenuItem.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
5
 
6
 
 
7
  use Nextend\Framework\View\Html;
8
 
9
  class MenuItem {
@@ -39,7 +40,7 @@ class MenuItem {
39
  }
40
 
41
  public function display() {
42
- echo $this->getHtml();
43
  }
44
 
45
  /**
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Header;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\Html;
9
 
10
  class MenuItem {
40
  }
41
 
42
  public function display() {
43
+ echo wp_kses($this->getHtml(), Sanitize::$adminTemplateTags);
44
  }
45
 
46
  /**
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/NavBar/NavBar.php CHANGED
@@ -2,6 +2,8 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\NavBar;
4
 
 
 
5
  /**
6
  * @var $this BlockNavBar
7
  */
@@ -11,8 +13,8 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\NavBar;
11
  <?php $this->displayBreadCrumbs(); ?>
12
 
13
  <div class="n2_nav_bar__logo">
14
- <a href="<?php echo $this->getSidebarLink(); ?>" tabindex="-1">
15
- <?php echo $this->getLogo(); ?>
16
  </a>
17
  </div>
18
  <div class="n2_nav_bar__menu">
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\NavBar;
4
 
5
+ use Nextend\Framework\Sanitize;
6
+
7
  /**
8
  * @var $this BlockNavBar
9
  */
13
  <?php $this->displayBreadCrumbs(); ?>
14
 
15
  <div class="n2_nav_bar__logo">
16
+ <a href="<?php echo esc_url($this->getSidebarLink()); ?>" tabindex="-1">
17
+ <?php echo wp_kses($this->getLogo(), Sanitize::$adminTemplateTags); ?>
18
  </a>
19
  </div>
20
  <div class="n2_nav_bar__menu">
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarGroup/TopBarGroup.php CHANGED
@@ -7,7 +7,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarGroup;
7
  */
8
  ?>
9
 
10
- <div class="<?php echo implode(' ', $this->getClasses()); ?>">
11
  <div class="n2_top_bar_group__inner">
12
  <?php
13
  $this->displayBlocks();
7
  */
8
  ?>
9
 
10
+ <div class="<?php echo esc_html(implode(' ', $this->getClasses())); ?>">
11
  <div class="n2_top_bar_group__inner">
12
  <?php
13
  $this->displayBlocks();
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarMain/TopBarMain.php CHANGED
@@ -9,10 +9,10 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarMain;
9
  <script>
10
  _N2.r(['$', 'documentReady'], function () {
11
  var $ = _N2.$;
12
- $('#<?php echo $this->getID(); ?>').css('top', _N2.Window.getTopOffset() + 'px');
13
  });
14
  </script>
15
- <div id="<?php echo $this->getID(); ?>" class="n2_admin__top_bar n2_top_bar_main">
16
  <div class="n2_top_bar_main__primary">
17
  <?php
18
  $this->displayPrimary();
9
  <script>
10
  _N2.r(['$', 'documentReady'], function () {
11
  var $ = _N2.$;
12
+ $('#<?php echo esc_html($this->getID()); ?>').css('top', _N2.Window.getTopOffset() + 'px');
13
  });
14
  </script>
15
+ <div id="<?php echo esc_html($this->getID()); ?>" class="n2_admin__top_bar n2_top_bar_main">
16
  <div class="n2_top_bar_main__primary">
17
  <?php
18
  $this->displayPrimary();
Nextend/SmartSlider3/Application/Admin/Layout/Block/Core/TopBarMain/TopBarMainEditor/TopBarMainEditor.php CHANGED
@@ -2,20 +2,22 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarMain\TopBarMainEditor;
4
 
 
 
5
  /**
6
  * @var $this BlockTopBarMainEditor
7
  */
8
  ?>
9
- <div id="<?php echo $this->getID(); ?>" class="n2_admin__top_bar n2_top_bar_main n2_admin_editor_overlay__top_bar_main">
10
  <div class="n2_top_bar_main__primary">
11
  <?php
12
  $this->displayPrimary();
13
  ?>
14
  </div>
15
  <div class="n2_top_bar_main__logo">
16
- <a href="<?php echo $this->getUrlDashboard(); ?>">
17
- <?php echo $this->getApplicationType()
18
- ->getLogo(); ?>
19
  </a>
20
  </div>
21
  <div class="n2_top_bar_main__secondary">
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarMain\TopBarMainEditor;
4
 
5
+ use Nextend\Framework\Sanitize;
6
+
7
  /**
8
  * @var $this BlockTopBarMainEditor
9
  */
10
  ?>
11
+ <div id="<?php echo esc_attr($this->getID()); ?>" class="n2_admin__top_bar n2_top_bar_main n2_admin_editor_overlay__top_bar_main">
12
  <div class="n2_top_bar_main__primary">
13
  <?php
14
  $this->displayPrimary();
15
  ?>
16
  </div>
17
  <div class="n2_top_bar_main__logo">
18
+ <a href="<?php echo esc_url($this->getUrlDashboard()); ?>">
19
+ <?php echo wp_kses($this->getApplicationType()
20
+ ->getLogo(), Sanitize::$adminTemplateTags); ?>
21
  </a>
22
  </div>
23
  <div class="n2_top_bar_main__secondary">
Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardInfo/DashboardInfo.php CHANGED
@@ -28,7 +28,7 @@ Js::addInline('new _N2.DashboardInfo();');
28
  <div class="n2_dashboard_info__row_content n2_dashboard_info__row_content_version">
29
  Smart Slider
30
  <?php
31
- echo SmartSlider3Info::$version . '-' . SmartSlider3Info::$plan;
32
  ?>
33
  </div>
34
  <div class="n2_dashboard_info__row_action n2_dashboard_info__row_action_version">
@@ -50,7 +50,7 @@ Js::addInline('new _N2.DashboardInfo();');
50
  <?php n2_e('Check for update'); ?>
51
  </div>
52
  <div class="n2_dashboard_info__row_action n2_dashboard_info__row_action_check_update">
53
- <a target="_blank" href="<?php echo $checkForUpdateUrl; ?>"><?php n2_e('Check') ?></a>
54
  </div>
55
 
56
  <?php
28
  <div class="n2_dashboard_info__row_content n2_dashboard_info__row_content_version">
29
  Smart Slider
30
  <?php
31
+ echo esc_html(SmartSlider3Info::$version . '-' . SmartSlider3Info::$plan);
32
  ?>
33
  </div>
34
  <div class="n2_dashboard_info__row_action n2_dashboard_info__row_action_version">
50
  <?php n2_e('Check for update'); ?>
51
  </div>
52
  <div class="n2_dashboard_info__row_action n2_dashboard_info__row_action_check_update">
53
+ <a target="_blank" href="<?php echo esc_url($checkForUpdateUrl); ?>"><?php n2_e('Check') ?></a>
54
  </div>
55
 
56
  <?php
Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardNewsletter.php CHANGED
@@ -23,9 +23,9 @@ use Nextend\Framework\Platform\Platform;
23
  </div>
24
 
25
  <form class="n2_dashboard_newsletter__form">
26
- <input type="hidden" name="<?php echo strtoupper(Platform::getName()); ?>" value="Yes">
27
  <input type="hidden" name="SOURCE" value="Smart Slider 3">
28
- <input type="email" name="EMAIL" value="<?php echo Platform::getUserEmail(); ?>" placeholder="Email" tabindex="-1">
29
  </form>
30
 
31
  <div class="n2_dashboard_manager_newsletter__button">
23
  </div>
24
 
25
  <form class="n2_dashboard_newsletter__form">
26
+ <input type="hidden" name="<?php echo esc_attr(strtoupper(Platform::getName())); ?>" value="Yes">
27
  <input type="hidden" name="SOURCE" value="Smart Slider 3">
28
+ <input type="email" name="EMAIL" value="<?php echo esc_attr(Platform::getUserEmail()); ?>" placeholder="Email" tabindex="-1">
29
  </form>
30
 
31
  <div class="n2_dashboard_manager_newsletter__button">
Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardReview.php CHANGED
@@ -31,23 +31,23 @@ use Nextend\SmartSlider3\SmartSlider3Info;
31
 
32
  <div class="n2_dashboard_manager_review__star_selector">
33
 
34
- <div class="n2_dashboard_manager_review__star" data-star="1" data-href="https://smartslider3.com/suggestion/?utm_campaign=<?php echo SmartSlider3Info::$campaign; ?>&utm_source=dashboard-review-1&utm_medium=smartslider-<?php echo Platform::getName() . '-' . SmartSlider3Info::$plan; ?>">
35
  <i class="ssi_24 ssi_24--star"></i>
36
  </div>
37
- <div class="n2_dashboard_manager_review__star" data-star="2" data-href="https://smartslider3.com/suggestion/?utm_campaign=<?php echo SmartSlider3Info::$campaign; ?>&utm_source=dashboard-review-2&utm_medium=smartslider-<?php echo Platform::getName() . '-' . SmartSlider3Info::$plan; ?>">
38
  <i class="ssi_24 ssi_24--star"></i>
39
  </div>
40
- <div class="n2_dashboard_manager_review__star" data-star="3" data-href="https://smartslider3.com/satisfied-customer/?utm_campaign=<?php echo SmartSlider3Info::$campaign; ?>&utm_source=dashboard-review-3&utm_medium=smartslider-<?php echo Platform::getName() . '-' . SmartSlider3Info::$plan; ?>">
41
  <i class="ssi_24 ssi_24--star"></i>
42
  </div>
43
- <div class="n2_dashboard_manager_review__star" data-star="4" data-href="https://smartslider3.com/satisfied-customer/?utm_campaign=<?php echo SmartSlider3Info::$campaign; ?>&utm_source=dashboard-review-4&utm_medium=smartslider-<?php echo Platform::getName() . '-' . SmartSlider3Info::$plan; ?>">
44
  <i class="ssi_24 ssi_24--star"></i>
45
  </div>
46
 
47
  <?php
48
  $reviewUrl = 'https://smartslider3.com/redirect/wordpress-review.html?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-5&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan;
49
  ?>
50
- <div class="n2_dashboard_manager_review__star" data-star="5" data-href="<?php echo $reviewUrl; ?>">
51
  <i class="ssi_24 ssi_24--star"></i></div>
52
 
53
  </div>
31
 
32
  <div class="n2_dashboard_manager_review__star_selector">
33
 
34
+ <div class="n2_dashboard_manager_review__star" data-star="1" data-href="<?php echo esc_url('https://smartslider3.com/suggestion/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-1&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>">
35
  <i class="ssi_24 ssi_24--star"></i>
36
  </div>
37
+ <div class="n2_dashboard_manager_review__star" data-star="2" data-href="<?php echo esc_url('https://smartslider3.com/suggestion/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-2&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>">
38
  <i class="ssi_24 ssi_24--star"></i>
39
  </div>
40
+ <div class="n2_dashboard_manager_review__star" data-star="3" data-href="<?php echo esc_url('https://smartslider3.com/satisfied-customer/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-3&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>">
41
  <i class="ssi_24 ssi_24--star"></i>
42
  </div>
43
+ <div class="n2_dashboard_manager_review__star" data-star="4" data-href="<?php echo esc_url('https://smartslider3.com/satisfied-customer/?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-4&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan); ?>">
44
  <i class="ssi_24 ssi_24--star"></i>
45
  </div>
46
 
47
  <?php
48
  $reviewUrl = 'https://smartslider3.com/redirect/wordpress-review.html?utm_campaign=' . SmartSlider3Info::$campaign . '&utm_source=dashboard-review-5&utm_medium=smartslider-' . Platform::getName() . '-' . SmartSlider3Info::$plan;
49
  ?>
50
+ <div class="n2_dashboard_manager_review__star" data-star="5" data-href="<?php echo esc_url($reviewUrl); ?>">
51
  <i class="ssi_24 ssi_24--star"></i></div>
52
 
53
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Dashboard/DashboardManager/Boxes/DashboardUpgradePro.php CHANGED
@@ -19,33 +19,33 @@ use Nextend\SmartSlider3\SmartSlider3Info;
19
  </div>
20
 
21
  <div class="n2_dashboard_manager_upgrade_pro__details">
22
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/sample-sliders/', array('utm_source' => $this->getSource() . '-sample-sliders')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
23
  <i class="ssi_16 ssi_16--filledcheck"></i>
24
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php echo sprintf(n2_('%d+ slider templates'), '120'); ?></div>
25
  </a>
26
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/slide-library/', array('utm_source' => $this->getSource() . '-slide-library')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
27
  <i class="ssi_16 ssi_16--filledcheck"></i>
28
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Full slide library access'); ?></div>
29
  </a>
30
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/layers/', array('utm_source' => $this->getSource() . '-layers')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
31
  <i class="ssi_16 ssi_16--filledcheck"></i>
32
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php echo sprintf(n2_('%d new layers'), '20'); ?></div>
33
  </a>
34
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/features/', array('utm_source' => $this->getSource() . '-free-pro')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
35
  <i class="ssi_16 ssi_16--filledcheck"></i>
36
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Extra advanced options'); ?></div>
37
  </a>
38
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/animations-and-effects/', array('utm_source' => $this->getSource() . '-animations')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
39
  <i class="ssi_16 ssi_16--filledcheck"></i>
40
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('New animations & effects'); ?></div>
41
  </a>
42
- <a target="_blank" href="<?php echo SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/help/', array('utm_source' => $this->getSource() . '-support')); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
43
  <i class="ssi_16 ssi_16--filledcheck"></i>
44
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Lifetime update & support'); ?></div>
45
  </a>
46
  </div>
47
 
48
- <a href="<?php echo SmartSlider3Info::getWhyProUrl(array('utm_source' => $this->getSource())); ?>" target="_blank" class="n2_dashboard_manager_upgrade_pro__button">
49
  <?php n2_e('Upgrade to Pro'); ?>
50
  </a>
51
 
19
  </div>
20
 
21
  <div class="n2_dashboard_manager_upgrade_pro__details">
22
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/sample-sliders/', array('utm_source' => $this->getSource() . '-sample-sliders'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
23
  <i class="ssi_16 ssi_16--filledcheck"></i>
24
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php echo sprintf(n2_('%d+ slider templates'), '120'); ?></div>
25
  </a>
26
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/slide-library/', array('utm_source' => $this->getSource() . '-slide-library'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
27
  <i class="ssi_16 ssi_16--filledcheck"></i>
28
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Full slide library access'); ?></div>
29
  </a>
30
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/layers/', array('utm_source' => $this->getSource() . '-layers'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
31
  <i class="ssi_16 ssi_16--filledcheck"></i>
32
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php echo sprintf(n2_('%d new layers'), '20'); ?></div>
33
  </a>
34
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/features/', array('utm_source' => $this->getSource() . '-free-pro'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
35
  <i class="ssi_16 ssi_16--filledcheck"></i>
36
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Extra advanced options'); ?></div>
37
  </a>
38
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/animations-and-effects/', array('utm_source' => $this->getSource() . '-animations'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
39
  <i class="ssi_16 ssi_16--filledcheck"></i>
40
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('New animations & effects'); ?></div>
41
  </a>
42
+ <a target="_blank" href="<?php echo esc_url(SmartSlider3Info::decorateExternalUrl('https://smartslider3.com/help/', array('utm_source' => $this->getSource() . '-support'))); ?>" class="n2_dashboard_manager_upgrade_pro__details_option">
43
  <i class="ssi_16 ssi_16--filledcheck"></i>
44
  <div class="n2_dashboard_manager_upgrade_pro__details_option_label"><?php n2_e('Lifetime update & support'); ?></div>
45
  </a>
46
  </div>
47
 
48
+ <a href="<?php echo esc_url(SmartSlider3Info::getWhyProUrl(array('utm_source' => $this->getSource()))); ?>" target="_blank" class="n2_dashboard_manager_upgrade_pro__button">
49
  <?php n2_e('Upgrade to Pro'); ?>
50
  </a>
51
 
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/Button/AbstractButton.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\Html;
9
 
@@ -23,7 +24,7 @@ abstract class AbstractButton extends AbstractBlock {
23
 
24
  public function display() {
25
 
26
- echo Html::link($this->getContent(), $this->getUrl(), $this->getAttributes());
27
  }
28
 
29
  abstract protected function getContent();
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\Html;
10
 
24
 
25
  public function display() {
26
 
27
+ echo wp_kses(Html::link($this->getContent(), $this->getUrl(), $this->getAttributes()), Sanitize::$adminTemplateTags);
28
  }
29
 
30
  abstract protected function getContent();
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/Button/BlockButtonSpacer.php CHANGED
@@ -18,7 +18,7 @@ class BlockButtonSpacer extends AbstractBlock {
18
  $classes[] = 'n2_button_spacer--visible';
19
  }
20
 
21
- echo '<div class="' . implode(' ', $classes) . '"></div>';
22
  }
23
 
24
  /**
18
  $classes[] = 'n2_button_spacer--visible';
19
  }
20
 
21
+ echo '<div class="' . esc_attr(implode(' ', $classes)) . '"></div>';
22
  }
23
 
24
  /**
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenu.php CHANGED
@@ -5,6 +5,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu
5
 
6
 
7
  use Nextend\Framework\Asset\Js\Js;
 
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\Html;
10
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\AbstractButton;
@@ -94,9 +95,9 @@ class BlockFloatingMenu extends AbstractBlock {
94
 
95
  public function renderAttributes() {
96
 
97
- echo Html::renderAttributes($this->attributes + array(
98
  'class' => implode(' ', $this->classes)
99
- ));
100
  }
101
 
102
  public function setAttribute($name, $value) {
5
 
6
 
7
  use Nextend\Framework\Asset\Js\Js;
8
+ use Nextend\Framework\Sanitize;
9
  use Nextend\Framework\View\AbstractBlock;
10
  use Nextend\Framework\View\Html;
11
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\AbstractButton;
95
 
96
  public function renderAttributes() {
97
 
98
+ echo wp_kses(Html::renderAttributes($this->attributes + array(
99
  'class' => implode(' ', $this->classes)
100
+ )), Sanitize::$adminTemplateTags);
101
  }
102
 
103
  public function setAttribute($name, $value) {
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenuItem.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu;
5
 
6
 
 
7
  use Nextend\Framework\View\AbstractBlock;
8
  use Nextend\Framework\View\Html;
9
 
@@ -33,7 +34,7 @@ class BlockFloatingMenuItem extends AbstractBlock {
33
  }
34
  $label .= '<div class="n2_floating_menu__item_label">' . $this->label . '</div>';
35
 
36
- echo Html::link($label, $this->url, $this->attributes + array('class' => implode(' ', $this->getClasses())));
37
  }
38
 
39
  /**
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\Framework\View\AbstractBlock;
9
  use Nextend\Framework\View\Html;
10
 
34
  }
35
  $label .= '<div class="n2_floating_menu__item_label">' . $this->label . '</div>';
36
 
37
+ echo wp_kses(Html::link($label, $this->url, $this->attributes + array('class' => implode(' ', $this->getClasses()))), Sanitize::$adminTemplateTags);
38
  }
39
 
40
  /**
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/BlockFloatingMenuItemSeparator.php CHANGED
@@ -10,9 +10,9 @@ class BlockFloatingMenuItemSeparator extends AbstractBlock {
10
 
11
  public function display() {
12
 
13
- echo '<div class="' . implode(' ', array_merge(array(
14
  'n2_floating_menu__item_separator'
15
- ), $this->classes)) . '"></div>';
16
  }
17
 
18
  /**
10
 
11
  public function display() {
12
 
13
+ echo '<div class="' . esc_attr(implode(' ', array_merge(array(
14
  'n2_floating_menu__item_separator'
15
+ ), $this->classes))) . '"></div>';
16
  }
17
 
18
  /**
Nextend/SmartSlider3/Application/Admin/Layout/Block/Forms/FloatingMenu/FloatingMenu.php CHANGED
@@ -13,7 +13,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu
13
 
14
  $contentID = $this->getContentID();
15
  ?>
16
- <div <?php if (!empty($contentID)): ?>id="<?php echo $this->getContentID(); ?>"<?php endif; ?> class="n2_popover_content n2_floating_menu__items_container">
17
  <div class="n2_popover_content_exit"></div>
18
  <div class="n2_popover_content_inner n2_floating_menu__items">
19
  <?php
13
 
14
  $contentID = $this->getContentID();
15
  ?>
16
+ <div <?php if (!empty($contentID)): ?>id="<?php echo esc_attr($this->getContentID()); ?>"<?php endif; ?> class="n2_popover_content n2_floating_menu__items_container">
17
  <div class="n2_popover_content_exit"></div>
18
  <div class="n2_popover_content_inner n2_floating_menu__items">
19
  <?php
Nextend/SmartSlider3/Application/Admin/Layout/Block/Generator/GeneratorBox/GeneratorBox.php CHANGED
@@ -6,19 +6,19 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Generator\Generato
6
  * @var $this BlockGeneratorBox
7
  */
8
  ?>
9
- <div class="n2_slide_generator_box" style="background-image: url('<?php echo $this->getImageUrl(); ?>');">
10
  <div class="n2_slide_generator_box__title">
11
  <div class="n2_slide_generator_box__title_label">
12
  <div class="n2_slide_generator_box__title_label_inner">
13
  <?php
14
  $label = $this->getLabel();
15
- echo $label;
16
  ?>
17
  </div>
18
- <i class="ssi_16 ssi_16--info" data-tip-description="<?php echo $this->getDescription(); ?>" data-tip-label="<?php echo $label; ?>" data-tip-link="<?php echo $this->getDocsLink(); ?>"></i>
19
  </div>
20
- <a href="<?php echo $this->getButtonLink(); ?>" target="<?php echo $this->getButtonLinkTarget(); ?>" class="n2_slide_generator_box__title_button">
21
- <?php echo $this->getButtonLabel(); ?>
22
  </a>
23
  </div>
24
  </div>
6
  * @var $this BlockGeneratorBox
7
  */
8
  ?>
9
+ <div class="n2_slide_generator_box" style="background-image: url('<?php echo esc_url($this->getImageUrl()); ?>');">
10
  <div class="n2_slide_generator_box__title">
11
  <div class="n2_slide_generator_box__title_label">
12
  <div class="n2_slide_generator_box__title_label_inner">
13
  <?php
14
  $label = $this->getLabel();
15
+ echo esc_html($label);
16
  ?>
17
  </div>
18
+ <i class="ssi_16 ssi_16--info" data-tip-description="<?php echo esc_attr($this->getDescription()); ?>" data-tip-label="<?php echo esc_attr($label); ?>" data-tip-link="<?php echo esc_url($this->getDocsLink()); ?>"></i>
19
  </div>
20
+ <a href="<?php echo esc_url($this->getButtonLink()); ?>" target="<?php echo esc_attr($this->getButtonLinkTarget()); ?>" class="n2_slide_generator_box__title_button">
21
+ <?php echo esc_html($this->getButtonLabel()); ?>
22
  </a>
23
  </div>
24
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/AddLayer/AddLayer.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\AddLayer;
4
 
 
5
  use Nextend\Framework\View\Html;
6
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\FreeNeedMore\BlockFreeNeedMore;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonIconCode;
@@ -43,7 +44,7 @@ use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton
43
  <i class="ssi_24 ssi_24--layers"></i>
44
  </div>
45
  <div class="n2_add_layer__more_tab_button_label">
46
- <?php echo n2_('Layers'); ?>
47
  </div>
48
  </div>
49
  <div class="n2_add_layer__more_tab_button" data-related-tab="library">
@@ -51,7 +52,7 @@ use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton
51
  <i class="ssi_24 ssi_24--smart"></i>
52
  </div>
53
  <div class="n2_add_layer__more_tab_button_label">
54
- <?php echo n2_('Library'); ?>
55
  </div>
56
  </div>
57
  </div>
@@ -62,25 +63,25 @@ use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton
62
  ?>
63
  <div class="n2_add_layer_group">
64
  <div class="n2_add_layer_group__label">
65
- <?php echo $groupLabel; ?>
66
  </div>
67
  <div class="n2_add_layer_group__content">
68
  <?php
69
  foreach ($boxes as $box):
70
- echo Html::openTag('div', array(
71
  'class' => 'n2_add_layer_box'
72
- ) + $box['attributes']);
73
  ?>
74
  <div class="n2_add_layer_box__icon">
75
- <i class="<?php echo $box['icon'] ?>"></i>
76
  </div>
77
  <div class="n2_add_layer_box__label_wrap">
78
  <div class="n2_add_layer_box__label">
79
- <?php echo $box['label']; ?>
80
  </div>
81
  </div>
82
  <?php
83
- echo Html::closeTag('div');
84
  endforeach;
85
  ?>
86
  </div>
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\AddLayer;
4
 
5
+ use Nextend\Framework\Sanitize;
6
  use Nextend\Framework\View\Html;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\FreeNeedMore\BlockFreeNeedMore;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonIconCode;
44
  <i class="ssi_24 ssi_24--layers"></i>
45
  </div>
46
  <div class="n2_add_layer__more_tab_button_label">
47
+ <?php n2_e('Layers'); ?>
48
  </div>
49
  </div>
50
  <div class="n2_add_layer__more_tab_button" data-related-tab="library">
52
  <i class="ssi_24 ssi_24--smart"></i>
53
  </div>
54
  <div class="n2_add_layer__more_tab_button_label">
55
+ <?php n2_e('Library'); ?>
56
  </div>
57
  </div>
58
  </div>
63
  ?>
64
  <div class="n2_add_layer_group">
65
  <div class="n2_add_layer_group__label">
66
+ <?php echo esc_html($groupLabel); ?>
67
  </div>
68
  <div class="n2_add_layer_group__content">
69
  <?php
70
  foreach ($boxes as $box):
71
+ echo wp_kses(Html::openTag('div', array(
72
  'class' => 'n2_add_layer_box'
73
+ ) + $box['attributes']), Sanitize::$adminTemplateTags);
74
  ?>
75
  <div class="n2_add_layer_box__icon">
76
+ <i class="<?php echo esc_attr($box['icon']) ?>"></i>
77
  </div>
78
  <div class="n2_add_layer_box__label_wrap">
79
  <div class="n2_add_layer_box__label">
80
+ <?php echo esc_html($box['label']); ?>
81
  </div>
82
  </div>
83
  <?php
84
+ echo wp_kses(Html::closeTag('div'), Sanitize::$basicTags);
85
  endforeach;
86
  ?>
87
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/EditorOverlay/BlockEditorOverlay.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\EditorOverlay;
4
 
 
5
  use Nextend\Framework\View\AbstractBlock;
6
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\BlockBreadCrumb\BlockBreadCrumb;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarMain\TopBarMainEditor\BlockTopBarMainEditor;
@@ -96,7 +97,7 @@ class BlockEditorOverlay extends AbstractBlock {
96
  }
97
 
98
  public function displayBlockLayerWindow() {
99
- echo $this->contentLayerWindow;
100
  }
101
 
102
  }
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\EditorOverlay;
4
 
5
+ use Nextend\Framework\Sanitize;
6
  use Nextend\Framework\View\AbstractBlock;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\BlockBreadCrumb\BlockBreadCrumb;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\TopBarMain\TopBarMainEditor\BlockTopBarMainEditor;
97
  }
98
 
99
  public function displayBlockLayerWindow() {
100
+ echo wp_kses($this->contentLayerWindow, Sanitize::$adminFormTags);
101
  }
102
 
103
  }
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/LayerWindow/LayerWindow.php CHANGED
@@ -24,13 +24,13 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\LayerWindow;
24
  <?php
25
  foreach ($this->getTabs() as $tab):
26
  ?>
27
- <div class="n2_ss_layer_window__tab_button" data-related-tab="<?php echo $tab->getName(); ?>">
28
  <div class="n2_ss_layer_window__tab_button_icon">
29
- <i class="<?php echo $tab->getIcon(); ?>"></i>
30
  </div>
31
  <div class="n2_ss_layer_window__tab_button_label">
32
  <?php
33
- echo $tab->getLabel();
34
  ?>
35
  </div>
36
  </div>
@@ -43,7 +43,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\LayerWindow;
43
  <?php
44
  foreach ($this->getTabs() as $tab):
45
  ?>
46
- <div class="n2_ss_layer_window__tab" data-tab="<?php echo $tab->getName(); ?>">
47
  <?php
48
  $tab->display();
49
  ?>
24
  <?php
25
  foreach ($this->getTabs() as $tab):
26
  ?>
27
+ <div class="n2_ss_layer_window__tab_button" data-related-tab="<?php echo esc_attr($tab->getName()); ?>">
28
  <div class="n2_ss_layer_window__tab_button_icon">
29
+ <i class="<?php echo esc_attr($tab->getIcon()); ?>"></i>
30
  </div>
31
  <div class="n2_ss_layer_window__tab_button_label">
32
  <?php
33
+ echo esc_html($tab->getLabel());
34
  ?>
35
  </div>
36
  </div>
43
  <?php
44
  foreach ($this->getTabs() as $tab):
45
  ?>
46
+ <div class="n2_ss_layer_window__tab" data-tab="<?php echo esc_attr($tab->getName()); ?>">
47
  <?php
48
  $tab->display();
49
  ?>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideBox/BlockSlideBox.php CHANGED
@@ -131,13 +131,8 @@ class BlockSlideBox extends AbstractBlock {
131
  return $this->slide->getGeneratorLabel() . ' [' . $this->slide->getSlideStat() . ']';
132
  }
133
 
134
- public function getGeneratorAttribute() {
135
- if ($this->hasGenerator()) {
136
-
137
- return ' data-generator-edit="' . $this->getUrlGeneratorEdit($this->slide->generator_id, $this->groupID) . '"';
138
- }
139
-
140
- return '';
141
  }
142
 
143
  public function getHiddenDeviceText() {
131
  return $this->slide->getGeneratorLabel() . ' [' . $this->slide->getSlideStat() . ']';
132
  }
133
 
134
+ public function getGeneratorAttributeUrl() {
135
+ return $this->getUrlGeneratorEdit($this->slide->generator_id, $this->groupID) . '"';
 
 
 
 
 
136
  }
137
 
138
  public function getHiddenDeviceText() {
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideBox/SlideBox.php CHANGED
@@ -2,22 +2,20 @@
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\SlideBox;
4
 
5
- use Nextend\Framework\Sanitize;
6
-
7
  /**
8
  * @var BlockSlideBox $this
9
  */
10
  ?>
11
 
12
- <div class="n2_slide_manager__box n2_slide_box <?php echo implode(' ', $this->getClasses()) ?>"
13
- data-slideid="<?php echo $this->getSlideId(); ?>"
14
- <?php echo $this->getGeneratorAttribute(); ?>>
15
 
16
- <div class="n2_slide_box__content" style="background-image: URL('<?php echo Sanitize::esc_attr($this->getThumbnailOptimized()); ?>');">
17
 
18
  <div class="n2_slide_box__slide_overlay">
19
- <a class="n2_slide_box__slide_overlay_link" href="<?php echo $this->getEditUrl(); ?>"></a>
20
- <a class="n2_slide_box__slide_overlay_edit_button" href="<?php echo $this->getEditUrl(); ?>">
21
  <?php
22
  n2_e('Edit');
23
  ?>
@@ -35,14 +33,14 @@ use Nextend\Framework\Sanitize;
35
  <?php
36
  if ($this->isStaticSlide()):
37
  ?>
38
- <div class="n2_slide_box__details_static_slide"><?php echo n2_('Static overlay'); ?></div>
39
  <?php
40
  endif;
41
  ?>
42
  <?php
43
  if ($this->hasGenerator()):
44
  ?>
45
- <div class="n2_slide_box__details_generator"><?php echo $this->getGeneratorLabel(); ?></div>
46
  <?php
47
  endif;
48
  ?>
@@ -52,7 +50,7 @@ use Nextend\Framework\Sanitize;
52
  <div class="n2_slide_box__footer">
53
  <div class="n2_slide_box__footer_title">
54
  <?php
55
- echo Sanitize::esc_html($this->getSlideTitle());
56
  ?>
57
  </div>
58
 
@@ -61,7 +59,7 @@ use Nextend\Framework\Sanitize;
61
  <?php
62
  $hiddenViews = $this->getHiddenDeviceText();
63
  ?>
64
- <a class="n2_slide_box__footer_status_hidden" href="<?php echo $this->getEditUrl(); ?>" data-n2tip="<?php echo $hiddenViews; ?>">
65
  <i class="ssi_16 ssi_16--hide"></i>
66
  </a>
67
 
@@ -69,11 +67,11 @@ use Nextend\Framework\Sanitize;
69
  <i class="ssi_16 ssi_16--star"></i>
70
  </div>
71
 
72
- <a class="n2_slide_box__footer_status_published" href="<?php echo $this->getUnPublishUrl(); ?>" data-n2tip="<?php n2_e('Published'); ?>">
73
  <i class="ssi_16 ssi_16--filledcheck"></i>
74
  </a>
75
 
76
- <a class="n2_slide_box__footer_status_unpublished" href="<?php echo $this->getPublishUrl(); ?>" data-n2tip="<?php n2_e('Unpublished'); ?>">
77
  <i class="ssi_16 ssi_16--filledremove"></i>
78
  </a>
79
  </div>
2
 
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slide\SlideBox;
4
 
 
 
5
  /**
6
  * @var BlockSlideBox $this
7
  */
8
  ?>
9
 
10
+ <div class="n2_slide_manager__box n2_slide_box <?php echo esc_attr(implode(' ', $this->getClasses())); ?>"
11
+ data-slideid="<?php echo esc_attr($this->getSlideId()); ?>"
12
+ <?php echo $this->hasGenerator() ? ' data-generator-edit="' . esc_url($this->getGeneratorAttributeUrl()) . '"' : ''; ?>>
13
 
14
+ <div class="n2_slide_box__content" style="background-image: url('<?php echo esc_url($this->getThumbnailOptimized()); ?>');">
15
 
16
  <div class="n2_slide_box__slide_overlay">
17
+ <a class="n2_slide_box__slide_overlay_link" href="<?php echo esc_url($this->getEditUrl()); ?>"></a>
18
+ <a class="n2_slide_box__slide_overlay_edit_button" href="<?php echo esc_url($this->getEditUrl()); ?>">
19
  <?php
20
  n2_e('Edit');
21
  ?>
33
  <?php
34
  if ($this->isStaticSlide()):
35
  ?>
36
+ <div class="n2_slide_box__details_static_slide"><?php n2_e('Static overlay'); ?></div>
37
  <?php
38
  endif;
39
  ?>
40
  <?php
41
  if ($this->hasGenerator()):
42
  ?>
43
+ <div class="n2_slide_box__details_generator"><?php echo esc_html($this->getGeneratorLabel()); ?></div>
44
  <?php
45
  endif;
46
  ?>
50
  <div class="n2_slide_box__footer">
51
  <div class="n2_slide_box__footer_title">
52
  <?php
53
+ echo esc_html($this->getSlideTitle());
54
  ?>
55
  </div>
56
 
59
  <?php
60
  $hiddenViews = $this->getHiddenDeviceText();
61
  ?>
62
+ <a class="n2_slide_box__footer_status_hidden" href="<?php echo esc_url($this->getEditUrl()); ?>" data-n2tip="<?php echo esc_attr($hiddenViews); ?>">
63
  <i class="ssi_16 ssi_16--hide"></i>
64
  </a>
65
 
67
  <i class="ssi_16 ssi_16--star"></i>
68
  </div>
69
 
70
+ <a class="n2_slide_box__footer_status_published" href="<?php echo esc_url($this->getUnPublishUrl()); ?>" data-n2tip="<?php n2_e('Published'); ?>">
71
  <i class="ssi_16 ssi_16--filledcheck"></i>
72
  </a>
73
 
74
+ <a class="n2_slide_box__footer_status_unpublished" href="<?php echo esc_url($this->getPublishUrl()); ?>" data-n2tip="<?php n2_e('Unpublished'); ?>">
75
  <i class="ssi_16 ssi_16--filledremove"></i>
76
  </a>
77
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideManager/AddSlide/AddSlide.php CHANGED
@@ -46,7 +46,7 @@ use Nextend\Framework\Platform\Platform;
46
  <div class="n2_slide_manager__add_slide_action_label"><?php n2_e('Static overlay'); ?></div>
47
  </a>
48
 
49
- <a href="<?php echo $this->getDynamicSlidesUrl(); ?>" class="n2_slide_manager__add_slide_action n2_slide_manager__add_slide_action--dynamic">
50
  <div class="n2_slide_manager__add_slide_action_icon">
51
  <i class="ssi_48 ssi_48--dynamic"></i>
52
  </div>
46
  <div class="n2_slide_manager__add_slide_action_label"><?php n2_e('Static overlay'); ?></div>
47
  </a>
48
 
49
+ <a href="<?php echo esc_url($this->getDynamicSlidesUrl()); ?>" class="n2_slide_manager__add_slide_action n2_slide_manager__add_slide_action--dynamic">
50
  <div class="n2_slide_manager__add_slide_action_icon">
51
  <i class="ssi_48 ssi_48--dynamic"></i>
52
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slide/SlideManager/SlideManager.php CHANGED
@@ -42,7 +42,19 @@ $options = array(
42
 
43
  Js::addInline('new _N2.SlidesManager(' . json_encode($options) . ', ' . json_encode($parameters) . ', ' . (defined('N2_IMAGE_UPLOAD_DISABLE') ? 1 : 0) . ", '" . $this->createAjaxUrl(array('browse/upload')) . "', 'slider" . $sliderObj->sliderId . "');");
44
 
 
 
 
 
 
 
 
 
 
 
 
45
  Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . count($slides) . '");');
 
46
  ?>
47
 
48
  <script>
@@ -71,7 +83,7 @@ Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . c
71
  ?>
72
  </script>
73
 
74
- <div class="<?php echo $this->getClass(); ?>" data-breadcrumbopener="<?php echo $this->hasBreadcrumbOpener() ? 1 : 0; ?>">
75
  <div class="n2_slide_manager__inner">
76
  <?php
77
 
@@ -89,10 +101,10 @@ Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . c
89
  <div class="n2_slide_manager__box n2_slide_manager__add_slide">
90
  <i class="n2_slide_manager__add_slide_icon ssi_48 ssi_48--plus"></i>
91
  <div class="n2_slide_manager__add_slide_label n2_slide_manager__add_slide_label--add-slide">
92
- <?php echo n2_('Add slide'); ?>
93
  </div>
94
  <div class="n2_slide_manager__add_slide_label n2_slide_manager__add_slide_label--close">
95
- <?php echo n2_('Close'); ?>
96
  </div>
97
  </div>
98
 
@@ -102,10 +114,21 @@ Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . c
102
  ?>
103
  <div class="n2_slide_manager__box n2_slide_manager__block_notice">
104
  <div class="n2_slide_box__footer_title n2_slide_manager__block_notice_description">
105
- <?php echo n2_('Block must contain only one slide. Need more?'); ?>
 
 
 
 
 
 
 
 
 
 
 
106
  </div>
107
- <a class="n2_slide_manager__block_notice_button" href="<?php echo $sliderEditUrl; ?>#changeslidertype">
108
- <?php echo n2_('Convert to slider'); ?>
109
  </a>
110
  </div>
111
  <?php
@@ -133,21 +156,21 @@ Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . c
133
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
134
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--image"></i>
135
  <div class="n2_slide_manager__dummy_slide_label">
136
- <?php echo n2_('Slide one'); ?>
137
  </div>
138
  </div>
139
  <?php if ($sliderType != 'block'): ?>
140
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
141
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--image"></i>
142
  <div class="n2_slide_manager__dummy_slide_label">
143
- <?php echo n2_('Slide two'); ?>
144
  </div>
145
  </div>
146
  <?php endif; ?>
147
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
148
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--drop"></i>
149
  <div class="n2_slide_manager__dummy_slide_label">
150
- <?php echo n2_('Drop images here'); ?>
151
  </div>
152
  </div>
153
  </div>
42
 
43
  Js::addInline('new _N2.SlidesManager(' . json_encode($options) . ', ' . json_encode($parameters) . ', ' . (defined('N2_IMAGE_UPLOAD_DISABLE') ? 1 : 0) . ", '" . $this->createAjaxUrl(array('browse/upload')) . "', 'slider" . $sliderObj->sliderId . "');");
44
 
45
+ $slideCount = 0;
46
+ $hasPublishedGenerator = false;
47
+ foreach ($slides as $slide) {
48
+ if ($slide['published']) {
49
+ $slideCount++;
50
+ if (!empty($slide['generator_id'])) {
51
+ $hasPublishedGenerator = true;
52
+ }
53
+ }
54
+ }
55
+
56
  Js::addGlobalInline('document.documentElement.setAttribute("data-slides", "' . count($slides) . '");');
57
+ Js::addGlobalInline('document.documentElement.setAttribute("data-published-regular-slides", "' . $slideCount . '");');
58
  ?>
59
 
60
  <script>
83
  ?>
84
  </script>
85
 
86
+ <div class="<?php echo esc_attr($this->getClass()); ?>" data-breadcrumbopener="<?php echo $this->hasBreadcrumbOpener() ? 1 : 0; ?>">
87
  <div class="n2_slide_manager__inner">
88
  <?php
89
 
101
  <div class="n2_slide_manager__box n2_slide_manager__add_slide">
102
  <i class="n2_slide_manager__add_slide_icon ssi_48 ssi_48--plus"></i>
103
  <div class="n2_slide_manager__add_slide_label n2_slide_manager__add_slide_label--add-slide">
104
+ <?php n2_e('Add slide'); ?>
105
  </div>
106
  <div class="n2_slide_manager__add_slide_label n2_slide_manager__add_slide_label--close">
107
+ <?php n2_e('Close'); ?>
108
  </div>
109
  </div>
110
 
114
  ?>
115
  <div class="n2_slide_manager__box n2_slide_manager__block_notice">
116
  <div class="n2_slide_box__footer_title n2_slide_manager__block_notice_description">
117
+ <?php n2_e('Block must contain only one slide. Need more?'); ?>
118
+ </div>
119
+ <a class="n2_slide_manager__block_notice_button" href="<?php echo esc_url($sliderEditUrl); ?>#changeslidertype">
120
+ <?php n2_e('Convert to slider'); ?>
121
+ </a>
122
+ </div>
123
+ <?php
124
+ elseif (!$hasPublishedGenerator):
125
+ ?>
126
+ <div class="n2_slide_manager__box n2_slide_manager__autoplay_notice n2_form_element--hidden" data-field="autoplay-single-slide-notice">
127
+ <div class="n2_slide_box__footer_title n2_slide_manager__autoplay_notice_description">
128
+ <?php n2_e('Single slides are duplicated while autoplay is used.'); ?>
129
  </div>
130
+ <a class="n2_slide_manager__autoplay_notice_button" href="#n2_top_bar_main_1" onclick="_N2.$('.n2_form__tab_button[data-related-tab=n2_form__tab_slider_autoplay]').trigger('click');">
131
+ <?php n2_e('autoplay settings'); ?>
132
  </a>
133
  </div>
134
  <?php
156
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
157
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--image"></i>
158
  <div class="n2_slide_manager__dummy_slide_label">
159
+ <?php n2_e('Slide one'); ?>
160
  </div>
161
  </div>
162
  <?php if ($sliderType != 'block'): ?>
163
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
164
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--image"></i>
165
  <div class="n2_slide_manager__dummy_slide_label">
166
+ <?php n2_e('Slide two'); ?>
167
  </div>
168
  </div>
169
  <?php endif; ?>
170
  <div class="n2_slide_manager__box n2_slide_manager__dummy_slide">
171
  <i class="n2_slide_manager__dummy_slide_icon ssi_48 ssi_48--drop"></i>
172
  <div class="n2_slide_manager__dummy_slide_label">
173
+ <?php n2_e('Drop images here'); ?>
174
  </div>
175
  </div>
176
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderBox/SliderBox.php CHANGED
@@ -11,19 +11,19 @@ use Nextend\Framework\Sanitize;
11
 
12
  <div class="n2_slider_manager__box n2_slider_box<?php echo $this->isGroup() ? ' n2_slider_box--group' : ' n2_slider_box--slider'; ?>"
13
  data-group="<?php echo $this->isGroup() ? '1' : '0'; ?>"
14
- data-title="<?php echo Sanitize::esc_attr($this->getSliderTitle()); ?>"
15
- data-sliderid="<?php echo $this->getSliderID(); ?>"
16
- data-ordering="<?php echo $this->getOrdering(); ?>">
17
 
18
  <?php
19
- $thumbnailUrl = Sanitize::esc_attr($this->getThumbnail());
20
  $thumbnailStyle = '';
21
  if (!empty($thumbnailUrl)) {
22
  $thumbnailStyle = "background-image: url('" . $thumbnailUrl . "');";
23
  }
24
  ?>
25
 
26
- <div class="n2_slider_box__content" style="<?php echo $thumbnailStyle; ?>">
27
  <?php
28
  if ($this->isThumbnailEmpty()):
29
  $icon = "ssi_64 ssi_64--image";
@@ -34,7 +34,7 @@ use Nextend\Framework\Sanitize;
34
 
35
  <div class="n2_slider_box__icon">
36
  <div class="n2_slider_box__icon_container">
37
- <i class="<?php echo $icon; ?>"></i>
38
  </div>
39
  </div>
40
 
@@ -43,8 +43,8 @@ use Nextend\Framework\Sanitize;
43
  ?>
44
 
45
  <div class="n2_slider_box__slider_overlay">
46
- <a class="n2_slider_box__slider_overlay_link" href="<?php echo $this->getEditUrl(); ?>"></a>
47
- <a class="n2_slider_box__slider_overlay_edit_button n2_button n2_button--small n2_button--green" href="<?php echo $this->getEditUrl(); ?>">
48
  <?php
49
  n2_e('Edit');
50
  ?>
@@ -57,7 +57,7 @@ use Nextend\Framework\Sanitize;
57
  <div class="n2_slider_box__slider_identifiers">
58
  <div class="n2_slider_box__slider_identifier">
59
  <?php
60
- echo '#' . $this->getSliderID();
61
  ?>
62
  </div>
63
  <?php
@@ -76,7 +76,7 @@ use Nextend\Framework\Sanitize;
76
  ?>
77
  <div class="n2_slider_box__slider_identifier">
78
  <?php
79
- echo $this->getSliderAlias();
80
  ?>
81
  </div>
82
  <?php
@@ -101,18 +101,18 @@ use Nextend\Framework\Sanitize;
101
  ?>
102
  <div class="n2_slider_box__footer_title">
103
  <?php
104
- echo Sanitize::esc_html($this->getSliderTitle());
105
  ?>
106
  </div>
107
  <div class="n2_slider_box__footer_children_count">
108
  <?php
109
- echo $this->getChildrenCount();
110
  ?>
111
  </div>
112
  </div>
113
- <a class="n2_slide_box__screen_reader" href="<?php echo $this->getSimpleEditUrl(); ?>">
114
  <?php
115
- echo n2_('Edit Slider') . ': ' . Sanitize::esc_html($this->getSliderTitle());
116
  ?>
117
  </a>
118
  </div>
11
 
12
  <div class="n2_slider_manager__box n2_slider_box<?php echo $this->isGroup() ? ' n2_slider_box--group' : ' n2_slider_box--slider'; ?>"
13
  data-group="<?php echo $this->isGroup() ? '1' : '0'; ?>"
14
+ data-title="<?php echo esc_attr($this->getSliderTitle()); ?>"
15
+ data-sliderid="<?php echo esc_attr($this->getSliderID()); ?>"
16
+ data-ordering="<?php echo esc_attr($this->getOrdering()); ?>">
17
 
18
  <?php
19
+ $thumbnailUrl = esc_attr($this->getThumbnail());
20
  $thumbnailStyle = '';
21
  if (!empty($thumbnailUrl)) {
22
  $thumbnailStyle = "background-image: url('" . $thumbnailUrl . "');";
23
  }
24
  ?>
25
 
26
+ <div class="n2_slider_box__content" style="<?php echo esc_attr($thumbnailStyle); ?>">
27
  <?php
28
  if ($this->isThumbnailEmpty()):
29
  $icon = "ssi_64 ssi_64--image";
34
 
35
  <div class="n2_slider_box__icon">
36
  <div class="n2_slider_box__icon_container">
37
+ <i class="<?php echo esc_attr($icon); ?>"></i>
38
  </div>
39
  </div>
40
 
43
  ?>
44
 
45
  <div class="n2_slider_box__slider_overlay">
46
+ <a class="n2_slider_box__slider_overlay_link" href="<?php echo esc_url($this->getEditUrl()); ?>"></a>
47
+ <a class="n2_slider_box__slider_overlay_edit_button n2_button n2_button--small n2_button--green" href="<?php echo esc_url($this->getEditUrl()); ?>">
48
  <?php
49
  n2_e('Edit');
50
  ?>
57
  <div class="n2_slider_box__slider_identifiers">
58
  <div class="n2_slider_box__slider_identifier">
59
  <?php
60
+ echo '#' . esc_html($this->getSliderID());
61
  ?>
62
  </div>
63
  <?php
76
  ?>
77
  <div class="n2_slider_box__slider_identifier">
78
  <?php
79
+ echo esc_html($this->getSliderAlias());
80
  ?>
81
  </div>
82
  <?php
101
  ?>
102
  <div class="n2_slider_box__footer_title">
103
  <?php
104
+ echo esc_html($this->getSliderTitle());
105
  ?>
106
  </div>
107
  <div class="n2_slider_box__footer_children_count">
108
  <?php
109
+ echo esc_html($this->getChildrenCount());
110
  ?>
111
  </div>
112
  </div>
113
+ <a class="n2_slide_box__screen_reader" href="<?php echo esc_url($this->getSimpleEditUrl()); ?>">
114
  <?php
115
+ echo esc_html(n2_('Edit Slider') . ': ' . $this->getSliderTitle());
116
  ?>
117
  </a>
118
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/ActionBar/ActionBar.php CHANGED
@@ -30,7 +30,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slider\SliderManag
30
  <i class="ssi_16 ssi_16--circularremove"></i>
31
  </div>
32
  <form class="n2_slider_manager__search_form" autocomplete="off">
33
- <input type="text" name="kw" class="n2_slider_manager__search_input" value="" placeholder="<?php echo n2_('Search Project'); ?>" tabindex="-1">
34
  </form>
35
  </div>
36
  <?php } ?>
30
  <i class="ssi_16 ssi_16--circularremove"></i>
31
  </div>
32
  <form class="n2_slider_manager__search_form" autocomplete="off">
33
+ <input type="text" name="kw" class="n2_slider_manager__search_input" value="" placeholder="<?php n2_e('Search Project'); ?>" tabindex="-1">
34
  </form>
35
  </div>
36
  <?php } ?>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/Paginator/BlockPaginator.php CHANGED
@@ -3,7 +3,6 @@
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slider\SliderManager\Paginator;
4
 
5
  use Nextend\Framework\View\AbstractBlock;
6
- use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonIconCode;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonPlain;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonPlainIcon;
9
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu\BlockFloatingMenu;
@@ -147,11 +146,11 @@ class BlockPaginator extends AbstractBlock {
147
  $actualSlidersEnd = $actualSliderStart + $this->transformedPaginationLimit();
148
  $allSliders = $this->sliderCount;
149
 
150
- echo sprintf(n2_("Showing %s to %s of %s projects"), "<span class='n2_slider_manager__paginator_label_item__from'>" . (($actualSliderStart === 0) ? 1 : $actualSliderStart) . "</span>", "<span class='n2_slider_manager__paginator_label_item__to' > " . (($actualSlidersEnd < $this->sliderCount) ? $actualSlidersEnd : $this->sliderCount) . "</span > ", "<span class='n2_slider_manager__paginator_label_item__max' > " . $allSliders . "</span > ");
151
  }
152
 
153
  public function displayNoSlidersLabel() {
154
- echo n2_('No projects to show');
155
  }
156
 
157
  }
3
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Block\Slider\SliderManager\Paginator;
4
 
5
  use Nextend\Framework\View\AbstractBlock;
 
6
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonPlain;
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButtonPlainIcon;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\FloatingMenu\BlockFloatingMenu;
146
  $actualSlidersEnd = $actualSliderStart + $this->transformedPaginationLimit();
147
  $allSliders = $this->sliderCount;
148
 
149
+ echo sprintf(n2_("Showing %s to %s of %s projects"), "<span class='n2_slider_manager__paginator_label_item__from'>" . (($actualSliderStart === 0) ? 1 : esc_html($actualSliderStart)) . "</span>", "<span class='n2_slider_manager__paginator_label_item__to' > " . esc_html(($actualSlidersEnd < $this->sliderCount) ? $actualSlidersEnd : $this->sliderCount) . "</span > ", "<span class='n2_slider_manager__paginator_label_item__max' > " . esc_html($allSliders) . "</span > ");
150
  }
151
 
152
  public function displayNoSlidersLabel() {
153
+ n2_e('No projects to show');
154
  }
155
 
156
  }
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderManager/SliderManager.php CHANGED
@@ -19,7 +19,7 @@ $limit = $this->getPaginationLimit();
19
  $paginationIndex = $this->getPaginationIndex();
20
 
21
  ?>
22
- <div class="n2_slider_manager" data-groupid="<?php echo $groupID; ?>" data-orderby="<?php echo $orderBy; ?>" data-orderbydirection="<?php echo $orderByDirection; ?>">
23
  <?php
24
 
25
  $actionBar = new BlockActionBar($this);
@@ -32,7 +32,7 @@ $paginationIndex = $this->getPaginationIndex();
32
  <div class="n2_slider_manager__box n2_slider_manager__new_slider">
33
  <i class="n2_slider_manager__new_slider_icon ssi_48 ssi_48--plus"></i>
34
  <span class="n2_slider_manager__new_slider_label">
35
- <?php echo n2_('New project'); ?>
36
  </span>
37
  </div>
38
  <?php
@@ -61,7 +61,7 @@ $paginationIndex = $this->getPaginationIndex();
61
 
62
  </div>
63
  <?php if ($groupID <= 0) { ?>
64
- <div class="n2_slider_manager__paginator" data-countstart="<?php echo $sliderCount ?>" data-currentstart="<?php echo $paginationIndex ?>" data-limitstart="<?php echo $limit ?>">
65
  <?php
66
  $blockPaginator = new BlockPaginator($this);
67
  $blockPaginator->setSliderManager($this);
19
  $paginationIndex = $this->getPaginationIndex();
20
 
21
  ?>
22
+ <div class="n2_slider_manager" data-groupid="<?php echo esc_attr($groupID); ?>" data-orderby="<?php echo esc_attr($orderBy); ?>" data-orderbydirection="<?php echo esc_attr($orderByDirection); ?>">
23
  <?php
24
 
25
  $actionBar = new BlockActionBar($this);
32
  <div class="n2_slider_manager__box n2_slider_manager__new_slider">
33
  <i class="n2_slider_manager__new_slider_icon ssi_48 ssi_48--plus"></i>
34
  <span class="n2_slider_manager__new_slider_label">
35
+ <?php n2_e('New project'); ?>
36
  </span>
37
  </div>
38
  <?php
61
 
62
  </div>
63
  <?php if ($groupID <= 0) { ?>
64
+ <div class="n2_slider_manager__paginator" data-countstart="<?php echo esc_attr($sliderCount); ?>" data-currentstart="<?php echo esc_attr($paginationIndex); ?>" data-limitstart="<?php echo esc_attr($limit); ?>">
65
  <?php
66
  $blockPaginator = new BlockPaginator($this);
67
  $blockPaginator->setSliderManager($this);
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderPublish/WordPress.php CHANGED
@@ -18,11 +18,11 @@ $slider = $model->get($this->getSliderID());
18
 
19
  <div class="n2_ss_slider_publish__option_description"><?php n2_e('Copy and paste this shortcode into your posts or pages:'); ?></div>
20
  <div class="n2_ss_slider_publish__option_code" data-mode="id" dir="ltr">
21
- [smartslider3 slider="<?php echo $this->getSliderID(); ?>"]
22
  </div>
23
  <?php if (!empty($slider['alias'])): ?>
24
  <div class="n2_ss_slider_publish__option_code" data-mode="alias" dir="ltr">
25
- [smartslider3 alias="<?php echo $slider['alias']; ?>"]
26
  </div>
27
  <?php endif; ?>
28
  </div>
@@ -41,7 +41,7 @@ $slider = $model->get($this->getSliderID());
41
  'WPBakery Page Builder'
42
  );
43
  ?>
44
- <div class="n2_ss_slider_publish__option_description"><?php printf(n2_('Smart Slider 3 has integration with %s.'), implode(', ', $pageBuilders)); ?></div>
45
  </div>
46
 
47
  <div class="n2_ss_slider_publish__option">
@@ -50,7 +50,7 @@ $slider = $model->get($this->getSliderID());
50
  <div class="n2_ss_slider_publish__option_description"><?php n2_e('Paste the PHP code into your theme\'s file:'); ?></div>
51
  <div class="n2_ss_slider_publish__option_code" dir="ltr">
52
  &lt;?php <br>
53
- echo do_shortcode('[smartslider3 slider="<?php echo $this->getSliderID(); ?>"]');<br>
54
  ?&gt;
55
  </div>
56
  </div>
18
 
19
  <div class="n2_ss_slider_publish__option_description"><?php n2_e('Copy and paste this shortcode into your posts or pages:'); ?></div>
20
  <div class="n2_ss_slider_publish__option_code" data-mode="id" dir="ltr">
21
+ [smartslider3 slider="<?php echo esc_html($this->getSliderID()); ?>"]
22
  </div>
23
  <?php if (!empty($slider['alias'])): ?>
24
  <div class="n2_ss_slider_publish__option_code" data-mode="alias" dir="ltr">
25
+ [smartslider3 alias="<?php echo esc_html($slider['alias']); ?>"]
26
  </div>
27
  <?php endif; ?>
28
  </div>
41
  'WPBakery Page Builder'
42
  );
43
  ?>
44
+ <div class="n2_ss_slider_publish__option_description"><?php echo sprintf(n2_('Smart Slider 3 has integration with %s.'), esc_html(implode(', ', $pageBuilders))); ?></div>
45
  </div>
46
 
47
  <div class="n2_ss_slider_publish__option">
50
  <div class="n2_ss_slider_publish__option_description"><?php n2_e('Paste the PHP code into your theme\'s file:'); ?></div>
51
  <div class="n2_ss_slider_publish__option_code" dir="ltr">
52
  &lt;?php <br>
53
+ echo do_shortcode('[smartslider3 slider="<?php echo esc_html($this->getSliderID()); ?>"]');<br>
54
  ?&gt;
55
  </div>
56
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Block/Slider/SliderTrash/SliderTrashBox.php CHANGED
@@ -11,17 +11,17 @@ use Nextend\Framework\Sanitize;
11
 
12
  <div class="n2_slider_manager__box n2_slider_box<?php echo $this->isGroup() ? ' n2_slider_box--group' : ' n2_slider_box--slider'; ?>"
13
  data-group="<?php echo $this->isGroup() ? '1' : '0'; ?>"
14
- data-sliderid="<?php echo $this->getSliderID(); ?>">
15
 
16
  <?php
17
- $thumbnailUrl = Sanitize::esc_attr($this->getThumbnail());
18
  $thumbnailStyle = '';
19
  if (!empty($thumbnailUrl)) {
20
  $thumbnailStyle = "background-image: url('" . $thumbnailUrl . "');";
21
  }
22
  ?>
23
 
24
- <div class="n2_slider_box__content" style="<?php echo $thumbnailStyle; ?>">
25
  <?php
26
  if ($this->isThumbnailEmpty()):
27
  $icon = "ssi_64 ssi_64--image";
@@ -32,7 +32,7 @@ use Nextend\Framework\Sanitize;
32
 
33
  <div class="n2_slider_box__icon">
34
  <div class="n2_slider_box__icon_container">
35
- <i class="<?php echo $icon; ?>"></i>
36
  </div>
37
  </div>
38
 
@@ -51,7 +51,7 @@ use Nextend\Framework\Sanitize;
51
  <div class="n2_slider_box__slider_identifiers">
52
  <div class="n2_slider_box__slider_identifier">
53
  <?php
54
- echo '#' . $this->getSliderID();
55
  ?>
56
  </div>
57
  <?php
@@ -70,7 +70,7 @@ use Nextend\Framework\Sanitize;
70
  ?>
71
  <div class="n2_slider_box__slider_identifier">
72
  <?php
73
- echo $this->getSliderAlias();
74
  ?>
75
  </div>
76
  <?php
@@ -95,12 +95,12 @@ use Nextend\Framework\Sanitize;
95
  ?>
96
  <div class="n2_slider_box__footer_title">
97
  <?php
98
- echo Sanitize::esc_html($this->getSliderTitle());
99
  ?>
100
  </div>
101
  <div class="n2_slider_box__footer_children_count">
102
  <?php
103
- echo $this->getChildrenCount();
104
  ?>
105
  </div>
106
  </div>
11
 
12
  <div class="n2_slider_manager__box n2_slider_box<?php echo $this->isGroup() ? ' n2_slider_box--group' : ' n2_slider_box--slider'; ?>"
13
  data-group="<?php echo $this->isGroup() ? '1' : '0'; ?>"
14
+ data-sliderid="<?php echo esc_attr($this->getSliderID()); ?>">
15
 
16
  <?php
17
+ $thumbnailUrl = esc_url($this->getThumbnail());
18
  $thumbnailStyle = '';
19
  if (!empty($thumbnailUrl)) {
20
  $thumbnailStyle = "background-image: url('" . $thumbnailUrl . "');";
21
  }
22
  ?>
23
 
24
+ <div class="n2_slider_box__content" style="<?php echo esc_attr($thumbnailStyle); ?>">
25
  <?php
26
  if ($this->isThumbnailEmpty()):
27
  $icon = "ssi_64 ssi_64--image";
32
 
33
  <div class="n2_slider_box__icon">
34
  <div class="n2_slider_box__icon_container">
35
+ <i class="<?php echo esc_attr($icon); ?>"></i>
36
  </div>
37
  </div>
38
 
51
  <div class="n2_slider_box__slider_identifiers">
52
  <div class="n2_slider_box__slider_identifier">
53
  <?php
54
+ echo '#' . esc_html($this->getSliderID());
55
  ?>
56
  </div>
57
  <?php
70
  ?>
71
  <div class="n2_slider_box__slider_identifier">
72
  <?php
73
+ echo esc_html($this->getSliderAlias());
74
  ?>
75
  </div>
76
  <?php
95
  ?>
96
  <div class="n2_slider_box__footer_title">
97
  <?php
98
+ echo esc_html($this->getSliderTitle());
99
  ?>
100
  </div>
101
  <div class="n2_slider_box__footer_children_count">
102
  <?php
103
+ echo esc_html($this->getChildrenCount());
104
  ?>
105
  </div>
106
  </div>
Nextend/SmartSlider3/Application/Admin/Layout/Helper/Breadcrumb.php CHANGED
@@ -4,6 +4,8 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Helper;
5
 
6
 
 
 
7
  class Breadcrumb {
8
 
9
  protected $label = '';
@@ -44,9 +46,9 @@ class Breadcrumb {
44
  $html .= '<span>' . $this->label . '</span>';
45
 
46
  if ($this->url == '#') {
47
- echo '<div class="' . $this->getClass() . '">' . $html . '</div>';
48
  } else {
49
- echo '<a class="' . $this->getClass() . '" href="' . $this->url . '">' . $html . '</a>';
50
  }
51
  }
52
 
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Helper;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
+
9
  class Breadcrumb {
10
 
11
  protected $label = '';
46
  $html .= '<span>' . $this->label . '</span>';
47
 
48
  if ($this->url == '#') {
49
+ echo wp_kses('<div class="' . $this->getClass() . '">' . $html . '</div>', Sanitize::$adminTemplateTags);
50
  } else {
51
+ echo wp_kses('<a class="' . $this->getClass() . '" href="' . $this->url . '">' . $html . '</a>', Sanitize::$adminTemplateTags);
52
  }
53
  }
54
 
Nextend/SmartSlider3/Application/Admin/Layout/Helper/MenuItem.php CHANGED
@@ -4,6 +4,8 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Helper;
5
 
6
 
 
 
7
  class MenuItem {
8
 
9
  protected $html = '';
@@ -24,6 +26,6 @@ class MenuItem {
24
  }
25
 
26
  public function display() {
27
- echo $this->html;
28
  }
29
  }
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout\Helper;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
+
9
  class MenuItem {
10
 
11
  protected $html = '';
26
  }
27
 
28
  public function display() {
29
+ echo wp_kses($this->html, Sanitize::$adminTemplateTags);
30
  }
31
  }
Nextend/SmartSlider3/Application/Admin/Layout/LayoutDefaultSidebar.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout;
5
 
6
 
 
7
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Admin\BlockAdmin;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\ContentSidebar\BlockContentSidebar;
9
 
@@ -23,7 +24,7 @@ class LayoutDefaultSidebar extends AbstractLayoutMenu {
23
  }
24
 
25
  public function renderSidebarBlock() {
26
- echo $this->getSidebarBlock();
27
  }
28
 
29
  public function getSidebarBlock() {
4
  namespace Nextend\SmartSlider3\Application\Admin\Layout;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\Admin\BlockAdmin;
9
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Core\ContentSidebar\BlockContentSidebar;
10
 
24
  }
25
 
26
  public function renderSidebarBlock() {
27
+ echo wp_kses($this->getSidebarBlock(), Sanitize::$adminTemplateTags);
28
  }
29
 
30
  public function getSidebarBlock() {
Nextend/SmartSlider3/Application/Admin/Preview/Template/Full.php CHANGED
@@ -3,7 +3,6 @@
3
  namespace Nextend\SmartSlider3\Application\Admin\Preview;
4
 
5
  use Nextend\Framework\Asset\Js\Js;
6
- use Nextend\Framework\Sanitize;
7
  use Nextend\SmartSlider3\Settings;
8
 
9
  /**
@@ -19,11 +18,12 @@ $externals = Settings::get('external-css-files');
19
  if (!empty($externals)) {
20
  $externals = explode("\n", $externals);
21
  foreach ($externals as $external) {
22
- echo "<link rel='stylesheet' href='" . Sanitize::esc_attr($external) . "' type='text/css' media='all'>";
23
  }
24
  }
25
 
26
- echo $slider;
 
27
 
28
 
29
  $slidesData = $this->getSlidesData();
@@ -32,9 +32,9 @@ if (!empty($slidesData)) {
32
  if ($slideId > 0) {
33
  ?>
34
  <script>
35
- n2ss.ready(<?php echo $this->getSliderID(); ?>, function (slider) {
36
  slider.visible(function () {
37
- slider.slideToID(<?php echo key($slidesData); ?>);
38
  });
39
  });
40
  </script>
3
  namespace Nextend\SmartSlider3\Application\Admin\Preview;
4
 
5
  use Nextend\Framework\Asset\Js\Js;
 
6
  use Nextend\SmartSlider3\Settings;
7
 
8
  /**
18
  if (!empty($externals)) {
19
  $externals = explode("\n", $externals);
20
  foreach ($externals as $external) {
21
+ echo "<link rel='stylesheet' href='" . esc_url($external) . "' type='text/css' media='all'>";
22
  }
23
  }
24
 
25
+ // PHPCS - Content already escaped
26
+ echo $slider; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
27
 
28
 
29
  $slidesData = $this->getSlidesData();
32
  if ($slideId > 0) {
33
  ?>
34
  <script>
35
+ n2ss.ready(<?php echo esc_html($this->getSliderID()); ?>, function (slider) {
36
  slider.visible(function () {
37
+ slider.slideToID(<?php echo esc_html($slideId); ?>);
38
  });
39
  });
40
  </script>
Nextend/SmartSlider3/Application/Admin/Preview/Template/Index.php CHANGED
@@ -3,7 +3,6 @@
3
  namespace Nextend\SmartSlider3\Application\Admin\Preview;
4
 
5
  use Nextend\Framework\Asset\Js\Js;
6
- use Nextend\Framework\Sanitize;
7
 
8
  /**
9
  * @var $this ViewPreviewIndex
@@ -15,10 +14,10 @@ Js::addFirstCode("new _N2.SliderPreview();");
15
 
16
  ?>
17
  <div class="n2_preview">
18
- <form target="n2_preview__device_screen_inner_frame" action="<?php echo $this->getUrlPreviewFull($this->getSliderID()); ?>" method="post">
19
- <input type="hidden" name="sliderData" value="<?php echo Sanitize::esc_attr(json_encode($this->sliderData)); ?>">
20
- <input type="hidden" name="slidesData" value="<?php echo Sanitize::esc_attr(json_encode($this->slidesData)); ?>">
21
- <input type="hidden" name="generatorData" value="<?php echo Sanitize::esc_attr(json_encode($this->generatorData)); ?>">
22
  </form>
23
  <div class="n2_preview__ruler">
24
  <div class="n2_preview__ruler_label"></div>
@@ -30,7 +29,7 @@ Js::addFirstCode("new _N2.SliderPreview();");
30
  </div>
31
 
32
  <div class="n2_preview__device_screen">
33
- <div class="n2_preview__device_screen_inner" style="<?php echo $this->getWidthCSS(); ?>">
34
  <iframe name="n2_preview__device_screen_inner_frame"></iframe>
35
  <div class="n2_preview__frame_overlay"></div>
36
  <div class="n2_preview__resize_width">
3
  namespace Nextend\SmartSlider3\Application\Admin\Preview;
4
 
5
  use Nextend\Framework\Asset\Js\Js;
 
6
 
7
  /**
8
  * @var $this ViewPreviewIndex
14
 
15
  ?>
16
  <div class="n2_preview">
17
+ <form target="n2_preview__device_screen_inner_frame" action="<?php echo esc_url($this->getUrlPreviewFull($this->getSliderID())); ?>" method="post">
18
+ <input type="hidden" name="sliderData" value="<?php echo esc_attr(json_encode($this->sliderData)); ?>">
19
+ <input type="hidden" name="slidesData" value="<?php echo esc_attr(json_encode($this->slidesData)); ?>">
20
+ <input type="hidden" name="generatorData" value="<?php echo esc_attr(json_encode($this->generatorData)); ?>">
21
  </form>
22
  <div class="n2_preview__ruler">
23
  <div class="n2_preview__ruler_label"></div>
29
  </div>
30
 
31
  <div class="n2_preview__device_screen">
32
+ <div class="n2_preview__device_screen_inner" style="<?php echo esc_attr($this->getWidthCSS()); ?>">
33
  <iframe name="n2_preview__device_screen_inner_frame"></iframe>
34
  <div class="n2_preview__frame_overlay"></div>
35
  <div class="n2_preview__resize_width">
Nextend/SmartSlider3/Application/Admin/Preview/ViewPreviewFull.php CHANGED
@@ -87,6 +87,9 @@ class ViewPreviewFull extends AbstractView {
87
  $this->generatorData = $generatorData;
88
  }
89
 
 
 
 
90
  public function renderSlider() {
91
 
92
  $locale = setlocale(LC_NUMERIC, 0);
87
  $this->generatorData = $generatorData;
88
  }
89
 
90
+ /**
91
+ * @return string Return value is already escaped
92
+ */
93
  public function renderSlider() {
94
 
95
  $locale = setlocale(LC_NUMERIC, 0);
Nextend/SmartSlider3/Application/Admin/Settings/Template/ClearCache.php CHANGED
@@ -6,7 +6,7 @@ namespace Nextend\SmartSlider3\Application\Admin\Settings;
6
  * @var $this ViewSettingsClearCache
7
  */
8
  ?>
9
- <form id="n2_slider_clear_cache_form" action="<?php echo $this->getAjaxUrlSettingsClearCache(); ?>" method="post">
10
  <?php
11
  $this->renderForm();
12
  ?>
6
  * @var $this ViewSettingsClearCache
7
  */
8
  ?>
9
+ <form id="n2_slider_clear_cache_form" action="<?php echo esc_url($this->getAjaxUrlSettingsClearCache()); ?>" method="post">
10
  <?php
11
  $this->renderForm();
12
  ?>
Nextend/SmartSlider3/Application/Admin/Settings/Template/Fonts.php CHANGED
@@ -12,7 +12,7 @@ JS::addInline('new _N2.SettingsFonts();');
12
 
13
  ?>
14
 
15
- <form id="n2-ss-form-settings-fonts" method="post" action="<?php echo $this->getAjaxUrlSettingsFonts(); ?>">
16
  <?php
17
  $this->renderForm();
18
  ?>
12
 
13
  ?>
14
 
15
+ <form id="n2-ss-form-settings-fonts" method="post" action="<?php echo esc_url($this->getAjaxUrlSettingsFonts()); ?>">
16
  <?php
17
  $this->renderForm();
18
  ?>
Nextend/SmartSlider3/Application/Admin/Settings/Template/Framework.php CHANGED
@@ -10,7 +10,7 @@ use Nextend\Framework\Asset\Js\Js;
10
 
11
  JS::addInline('new _N2.SettingsFramework();');
12
  ?>
13
- <form id="n2-ss-form-settings-framework" method="post" action="<?php echo $this->getAjaxUrlSettingsFramework(); ?>">
14
  <?php
15
  $this->renderForm();
16
  ?>
10
 
11
  JS::addInline('new _N2.SettingsFramework();');
12
  ?>
13
+ <form id="n2-ss-form-settings-framework" method="post" action="<?php echo esc_url($this->getAjaxUrlSettingsFramework()); ?>">
14
  <?php
15
  $this->renderForm();
16
  ?>
Nextend/SmartSlider3/Application/Admin/Settings/Template/General.php CHANGED
@@ -12,7 +12,7 @@ use Nextend\Framework\Asset\Js\Js;
12
  JS::addInline('new _N2.SettingsGeneral();');
13
  ?>
14
 
15
- <form id="n2-ss-form-settings-general" action="<?php echo $this->getAjaxUrlSettingsDefault(); ?>" method="post">
16
  <?php
17
  $this->renderForm();
18
  ?>
12
  JS::addInline('new _N2.SettingsGeneral();');
13
  ?>
14
 
15
+ <form id="n2-ss-form-settings-general" action="<?php echo esc_url($this->getAjaxUrlSettingsDefault()); ?>" method="post">
16
  <?php
17
  $this->renderForm();
18
  ?>
Nextend/SmartSlider3/Application/Admin/Settings/Template/GeneratorConfigure.php CHANGED
@@ -10,10 +10,10 @@ use Nextend\Framework\Asset\Js\Js;
10
 
11
  JS::addInline('new _N2.GeneratorConfigure();');
12
  ?>
13
- <form id="n2-ss-form-generator-configure" action="<?php echo $this->getAjaxUrlSettingsGenerator($this->getGeneratorGroup()
14
- ->getName()); ?>" method="post">
15
  <?php
16
- echo $this->renderForm();
17
  ?>
18
  </form>
19
 
10
 
11
  JS::addInline('new _N2.GeneratorConfigure();');
12
  ?>
13
+ <form id="n2-ss-form-generator-configure" action="<?php echo esc_url($this->getAjaxUrlSettingsGenerator($this->getGeneratorGroup()
14
+ ->getName())); ?>" method="post">
15
  <?php
16
+ $this->renderForm();
17
  ?>
18
  </form>
19
 
Nextend/SmartSlider3/Application/Admin/Settings/Template/ItemDefaults.php CHANGED
@@ -12,7 +12,7 @@ use Nextend\Framework\Asset\Js\Js;
12
  JS::addInline('new _N2.SettingsItemDefaults();');
13
  ?>
14
 
15
- <form id="n2-ss-form-settings-item-defaults" action="<?php echo $this->getAjaxUrlSettingsItemDefaults(); ?>" method="post">
16
  <?php
17
  $this->renderForm();
18
  ?>
12
  JS::addInline('new _N2.SettingsItemDefaults();');
13
  ?>
14
 
15
+ <form id="n2-ss-form-settings-item-defaults" action="<?php echo esc_url($this->getAjaxUrlSettingsItemDefaults()); ?>" method="post">
16
  <?php
17
  $this->renderForm();
18
  ?>
Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsClearCache.php CHANGED
@@ -79,8 +79,8 @@ class ViewSettingsClearCache extends AbstractView {
79
 
80
  new OnOff($row1, 'delete-image-cache', n2_('Delete resized image cache'), 0);
81
 
82
- $instructions = sprintf(n2_('If enabled the following folder will be <b>permanently deleted</b>: %s'), CacheImage::getStorage()
83
- ->getPath('slider/cache', '', 'image'));
84
  new Notice($row1, 'instructions', n2_('Instruction'), $instructions);
85
 
86
  $form->render();
79
 
80
  new OnOff($row1, 'delete-image-cache', n2_('Delete resized image cache'), 0);
81
 
82
+ $instructions = sprintf(n2_('If enabled the following folder will be %1$spermanently deleted%2$s: %3$s'), '<b>', '</b>', CacheImage::getStorage()
83
+ ->getPath('slider/cache', '', 'image'));
84
  new Notice($row1, 'instructions', n2_('Instruction'), $instructions);
85
 
86
  $form->render();
Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsFramework.php CHANGED
@@ -75,14 +75,6 @@ class ViewSettingsFramework extends AbstractViewSettings {
75
  'tipDescription' => n2_('Google Fonts, icon and lightbox CSS are loaded in a non-blocking way. Disable if you see missing icons, fonts or styles.')
76
  ));
77
 
78
- $table = new ContainerTable($form->getContainer(), 'requests', n2_('API requests'));
79
-
80
- $row1 = $table->createRow('requests-1');
81
-
82
- new OnOff($row1, 'curl', sprintf(n2_x('Use %s', 'Curl'), 'Curl'), 1);
83
-
84
- new OnOff($row1, 'curl-clean-proxy', sprintf(n2_x('Clean %s', 'curl proxy'), 'curl proxy'), 0);
85
-
86
 
87
  $form->render();
88
  }
75
  'tipDescription' => n2_('Google Fonts, icon and lightbox CSS are loaded in a non-blocking way. Disable if you see missing icons, fonts or styles.')
76
  ));
77
 
 
 
 
 
 
 
 
 
78
 
79
  $form->render();
80
  }
Nextend/SmartSlider3/Application/Admin/Settings/ViewSettingsGeneral.php CHANGED
@@ -16,6 +16,7 @@ use Nextend\Framework\Form\Element\Text\TextAutoComplete;
16
  use Nextend\Framework\Form\Element\Textarea;
17
  use Nextend\Framework\Form\Element\Token;
18
  use Nextend\Framework\Form\Form;
 
19
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton;
20
  use Nextend\SmartSlider3\Application\Admin\TraitAdminUrl;
21
  use Nextend\SmartSlider3\Platform\Joomla\JoomlaShim;
@@ -178,7 +179,7 @@ class ViewSettingsGeneral extends AbstractViewSettings {
178
  'tipDescription' => n2_('The new URL you want to use. E.g. https://newsite.com')
179
  ));
180
 
181
- echo $form->render();
182
 
183
  echo '<input name="namespace" value="default" type="hidden">';
184
  }
16
  use Nextend\Framework\Form\Element\Textarea;
17
  use Nextend\Framework\Form\Element\Token;
18
  use Nextend\Framework\Form\Form;
19
+ use Nextend\Framework\Sanitize;
20
  use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton;
21
  use Nextend\SmartSlider3\Application\Admin\TraitAdminUrl;
22
  use Nextend\SmartSlider3\Platform\Joomla\JoomlaShim;
179
  'tipDescription' => n2_('The new URL you want to use. E.g. https://newsite.com')
180
  ));
181
 
182
+ $form->render();
183
 
184
  echo '<input name="namespace" value="default" type="hidden">';
185
  }
Nextend/SmartSlider3/Application/Admin/Slider/ControllerAjaxSlider.php CHANGED
@@ -250,6 +250,8 @@ class ControllerAjaxSlider extends AdminAjaxController {
250
  public function actionChangeSliderType() {
251
  $this->validateToken();
252
 
 
 
253
  $sliderID = Request::$GET->getInt('sliderID');
254
  if ($sliderID > 0) {
255
  $targetSliderType = Request::$POST->getVar('targetSliderType');
@@ -273,6 +275,8 @@ class ControllerAjaxSlider extends AdminAjaxController {
273
  public function actionRenderResponsiveType() {
274
  $this->validateToken();
275
 
 
 
276
  $responsiveType = ResponsiveTypeFactory::getType(Request::$POST->getVar('value'))
277
  ->createAdmin();
278
  if ($responsiveType) {
@@ -347,6 +351,8 @@ class ControllerAjaxSlider extends AdminAjaxController {
347
 
348
  private function renderWidgetForm($type) {
349
  $this->validateToken();
 
 
350
 
351
  $group = WidgetGroupFactory::getGroup($type);
352
 
250
  public function actionChangeSliderType() {
251
  $this->validateToken();
252
 
253
+ $this->validatePermission('smartslider_edit');
254
+
255
  $sliderID = Request::$GET->getInt('sliderID');
256
  if ($sliderID > 0) {
257
  $targetSliderType = Request::$POST->getVar('targetSliderType');
275
  public function actionRenderResponsiveType() {
276
  $this->validateToken();
277
 
278
+ $this->validatePermission('smartslider_config');
279
+
280
  $responsiveType = ResponsiveTypeFactory::getType(Request::$POST->getVar('value'))
281
  ->createAdmin();
282
  if ($responsiveType) {
351
 
352
  private function renderWidgetForm($type) {
353
  $this->validateToken();
354
+
355
+ $this->validatePermission('smartslider_config');
356
 
357
  $group = WidgetGroupFactory::getGroup($type);
358
 
Nextend/SmartSlider3/Application/Admin/Slider/Template/SimpleEdit.php CHANGED
@@ -31,8 +31,8 @@ $sliderData['thumbnail'] = $slider['thumbnail'];
31
  $sliderData['alias'] = isset($slider['alias']) ? $slider['alias'] : '';
32
 
33
  ?>
34
- <form id="n2_slider_form" action="<?php echo $this->getUrlSliderSimpleEdit($slider['id'], $this->groupID); ?>" method="post">
35
- <div id="slider-settings-region" role="region" tabindex="0" aria-label="<?php echo n2_('Slider settings') . ': ' . Sanitize::esc_attr($slider['title']); ?>">
36
  <?php
37
  $form = new Form($this, 'slider');
38
 
@@ -72,7 +72,7 @@ $sliderData['alias'] = isset($slider['alias']) ? $slider['alias'] : '';
72
  $slideData['title'] = $slide['title'];
73
  $slideData['description'] = $slide['description'];
74
  ?>
75
- <div role="region" tabindex="0" aria-label="<?php echo Sanitize::esc_attr(n2_('Edit slide') . ': ' . $slide['title']); ?>">
76
  <?php
77
 
78
  $form = new Form($this, 'slide[' . $slide['id'] . ']');
31
  $sliderData['alias'] = isset($slider['alias']) ? $slider['alias'] : '';
32
 
33
  ?>
34
+ <form id="n2_slider_form" action="<?php echo esc_url($this->getUrlSliderSimpleEdit($slider['id'], $this->groupID)); ?>" method="post">
35
+ <div id="slider-settings-region" role="region" tabindex="0" aria-label="<?php echo esc_attr(n2_('Slider settings') . ': ' . $slider['title']); ?>">
36
  <?php
37
  $form = new Form($this, 'slider');
38
 
72
  $slideData['title'] = $slide['title'];
73
  $slideData['description'] = $slide['description'];
74
  ?>
75
+ <div role="region" tabindex="0" aria-label="<?php echo esc_attr(n2_('Edit slide') . ': ' . $slide['title']); ?>">
76
  <?php
77
 
78
  $form = new Form($this, 'slide[' . $slide['id'] . ']');
Nextend/SmartSlider3/Application/Admin/Slider/Template/SimpleEditAddSlide.php CHANGED
@@ -17,8 +17,8 @@ use Nextend\SmartSlider3\Application\Admin\Layout\Block\Forms\Button\BlockButton
17
  $slider = $this->getSlider();
18
 
19
  ?>
20
- <form id="n2_slider_add_slide_form" action="<?php echo $this->getUrlSliderSimpleEditAddSlide($slider['id'], $this->groupID); ?>" method="post">
21
- <div id="slider-add-slide-region" role="region" tabindex="0" aria-label="<?php echo n2_('Add slide'); ?>">
22
  <?php
23
  $form = new Form($this, 'slide');
24
 
17
  $slider = $this->getSlider();
18
 
19
  ?>
20
+ <form id="n2_slider_add_slide_form" action="<?php echo esc_url($this->getUrlSliderSimpleEditAddSlide($slider['id'], $this->groupID)); ?>" method="post">
21
+ <div id="slider-add-slide-region" role="region" tabindex="0" aria-label="<?php n2_e('Add slide'); ?>">
22
  <?php
23
  $form = new Form($this, 'slide');
24
 
Nextend/SmartSlider3/Application/Admin/Sliders/ControllerAjaxSliders.php CHANGED
@@ -140,6 +140,8 @@ class ControllerAjaxSliders extends AdminAjaxController {
140
  public function actionHideReview() {
141
  $this->validateToken();
142
 
 
 
143
  StorageSectionManager::getStorage('smartslider')
144
  ->set('free', 'review', 1);
145
 
@@ -148,15 +150,18 @@ class ControllerAjaxSliders extends AdminAjaxController {
148
 
149
  public function actionSearch() {
150
  $this->validateToken();
 
 
 
151
  $slidersModel = new ModelSliders($this);
152
 
153
  $keyword = Request::$REQUEST->getVar('keyword', '');
154
  $sliders = array();
155
 
156
  $url = parse_url($keyword);
157
- $baseUrl =parse_url(Platform::getSiteUrl()) ;
158
 
159
- if (isset($url['host']) && $url['host'] === $baseUrl['host']) {
160
  $options = array(
161
  'error' => true,
162
  );
@@ -194,6 +199,9 @@ class ControllerAjaxSliders extends AdminAjaxController {
194
 
195
  public function actionPagination() {
196
  $this->validateToken();
 
 
 
197
  $slidersModel = new ModelSliders($this);
198
  $pageIndex = Request::$REQUEST->getInt('pageIndex', 0);
199
  $limit = Request::$REQUEST->getVar('limit', 20);
@@ -244,6 +252,8 @@ class ControllerAjaxSliders extends AdminAjaxController {
244
 
245
  $this->validateToken();
246
 
 
 
247
  if (empty($_FILES) && empty($_POST)) {
248
  Notification::error(sprintf(n2_('Your server has an upload file limit at %s, so if you have bigger export file, please use the local import file method.'), @ini_get('post_max_size')));
249
  $this->response->respond();
@@ -255,9 +265,11 @@ class ControllerAjaxSliders extends AdminAjaxController {
255
 
256
  $file = '';
257
 
258
- if (isset($_FILES['slider']) && isset($_FILES['slider']['tmp_name']['import-file'])) {
 
 
259
 
260
- switch ($_FILES['slider']['error']['import-file']) {
261
  case UPLOAD_ERR_OK:
262
  case UPLOAD_ERR_NO_FILE:
263
  break;
@@ -268,7 +280,7 @@ class ControllerAjaxSliders extends AdminAjaxController {
268
  throw new RuntimeException('Unknown errors.');
269
  }
270
 
271
- $file = $_FILES['slider']['tmp_name']['import-file'];
272
  }
273
 
274
  if (empty($file)) {
@@ -298,9 +310,9 @@ class ControllerAjaxSliders extends AdminAjaxController {
298
 
299
  $this->response->redirect($this->getUrlSliderEdit($sliderId, $groupID));
300
  } else {
301
- $extension = pathinfo($_FILES['slider']['name']['import-file'], PATHINFO_EXTENSION);
302
- if (strpos($_FILES['slider']['name']['import-file'], 'sliders_unzip_to_import') !== false) {
303
- Notification::error(n2_('You have to unzip your ' . $_FILES['slider']['name']['import-file'] . ' file to find the importable *.ss3 files!'));
304
  $this->response->error();
305
  } else if ($extension != 'ss3') {
306
  Notification::error(n2_('Only *.ss3 files can be uploaded!'));
140
  public function actionHideReview() {
141
  $this->validateToken();
142
 
143
+ $this->validatePermission('smartslider_config');
144
+
145
  StorageSectionManager::getStorage('smartslider')
146
  ->set('free', 'review', 1);
147
 
150
 
151
  public function actionSearch() {
152
  $this->validateToken();
153
+
154
+ $this->validatePermission('smartslider_config');
155
+
156
  $slidersModel = new ModelSliders($this);
157
 
158
  $keyword = Request::$REQUEST->getVar('keyword', '');
159
  $sliders = array();
160
 
161
  $url = parse_url($keyword);
162
+ $baseUrl = parse_url(Platform::getSiteUrl());
163
 
164
+ if (isset($url['host']) && $url['host'] === $baseUrl['host']) {
165
  $options = array(
166
  'error' => true,
167
  );
199
 
200
  public function actionPagination() {
201
  $this->validateToken();
202
+
203
+ $this->validatePermission('smartslider_config');
204
+
205
  $slidersModel = new ModelSliders($this);
206
  $pageIndex = Request::$REQUEST->getInt('pageIndex', 0);
207
  $limit = Request::$REQUEST->getVar('limit', 20);
252
 
253
  $this->validateToken();
254
 
255
+ $this->validatePermission('smartslider_edit');
256
+
257
  if (empty($_FILES) && empty($_POST)) {
258
  Notification::error(sprintf(n2_('Your server has an upload file limit at %s, so if you have bigger export file, please use the local import file method.'), @ini_get('post_max_size')));
259
  $this->response->respond();
265
 
266
  $file = '';
267
 
268
+ $slider = Request::$FILES->getVar('slider');
269
+
270
+ if ($slider['tmp_name']['import-file'] !== null) {
271
 
272
+ switch ($slider['error']['import-file']) {
273
  case UPLOAD_ERR_OK:
274
  case UPLOAD_ERR_NO_FILE:
275
  break;
280
  throw new RuntimeException('Unknown errors.');
281
  }
282
 
283
+ $file = $slider['tmp_name']['import-file'];
284
  }
285
 
286
  if (empty($file)) {
310
 
311
  $this->response->redirect($this->getUrlSliderEdit($sliderId, $groupID));
312
  } else {
313
+ $extension = pathinfo($slider['name']['import-file'], PATHINFO_EXTENSION);
314
+ if (strpos($slider['name']['import-file'], 'sliders_unzip_to_import') !== false) {
315
+ Notification::error(sprintf(n2_('You have to unzip your %1$s file to find the importable *.ss3 files!'), $slider['name']['import-file']));
316
  $this->response->error();
317
  } else if ($extension != 'ss3') {
318
  Notification::error(n2_('Only *.ss3 files can be uploaded!'));
Nextend/SmartSlider3/Application/Admin/Sliders/ControllerSliders.php CHANGED
@@ -56,9 +56,9 @@ class ControllerSliders extends AbstractControllerAdmin {
56
 
57
  protected function actionExportAll() {
58
  $slidersModel = new ModelSliders($this);
59
- $groupID = (Request::$REQUEST->getVar('inSearch', false))?'*':Request::$REQUEST->getInt('currentGroupID', 0);
60
  $sliders = $slidersModel->getAll($groupID, 'published');
61
- $ids = Request::$REQUEST->getVar('sliders');
62
 
63
  $files = array();
64
  foreach ($sliders as $slider) {
@@ -77,7 +77,8 @@ class ControllerSliders extends AbstractControllerAdmin {
77
  PageFlow::cleanOutputBuffers();
78
  header('Content-disposition: attachment; filename=sliders_unzip_to_import.zip');
79
  header('Content-type: application/zip');
80
- echo $zip->file();
 
81
  PageFlow::exitApplication();
82
 
83
  }
56
 
57
  protected function actionExportAll() {
58
  $slidersModel = new ModelSliders($this);
59
+ $groupID = (Request::$REQUEST->getVar('inSearch', false)) ? '*' : Request::$REQUEST->getInt('currentGroupID', 0);
60
  $sliders = $slidersModel->getAll($groupID, 'published');
61
+ $ids = Request::$REQUEST->getVar('sliders');
62
 
63
  $files = array();
64
  foreach ($sliders as $slider) {
77
  PageFlow::cleanOutputBuffers();
78
  header('Content-disposition: attachment; filename=sliders_unzip_to_import.zip');
79
  header('Content-type: application/zip');
80
+ // PHPCS - Contains binary zip data, so nothing to escape.
81
+ echo $zip->file(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
82
  PageFlow::exitApplication();
83
 
84
  }
Nextend/SmartSlider3/Application/Admin/Sliders/Template/GettingStarted.php CHANGED
@@ -20,10 +20,10 @@ namespace Nextend\SmartSlider3\Application\Admin\Sliders;
20
  </div>
21
  <div class="n2_getting_started__buttons">
22
  <div class="n2_getting_started__button_dont_show">
23
- <a href="<?php echo $this->getUrlGettingStartedDontShow(); ?>"><?php n2_e('Don\'t show again'); ?></a>
24
  </div>
25
  <div class="n2_getting_started__button_dashboard">
26
- <a href="<?php echo $this->getUrlDashboard(); ?>"><?php n2_e('Go to dashboard'); ?></a>
27
  </div>
28
  </div>
29
  </div>
20
  </div>
21
  <div class="n2_getting_started__buttons">
22
  <div class="n2_getting_started__button_dont_show">
23
+ <a href="<?php echo esc_url($this->getUrlGettingStartedDontShow()); ?>"><?php n2_e('Don\'t show again'); ?></a>
24
  </div>
25
  <div class="n2_getting_started__button_dashboard">
26
+ <a href="<?php echo esc_url($this->getUrlDashboard()); ?>"><?php n2_e('Go to dashboard'); ?></a>
27
  </div>
28
  </div>
29
  </div>
Nextend/SmartSlider3/Application/Admin/Sliders/Template/Import.php CHANGED
@@ -13,7 +13,7 @@ use Nextend\Framework\Asset\Js\Js;
13
  JS::addInline('new _N2.SliderImport();');
14
  ?>
15
 
16
- <form id="n2-ss-form-slider-import" action="<?php echo $this->getAjaxUrlImport($this->getGroupID()); ?>" method="post">
17
  <?php
18
  $this->renderForm();
19
  ?>
13
  JS::addInline('new _N2.SliderImport();');
14
  ?>
15
 
16
+ <form id="n2-ss-form-slider-import" action="<?php echo esc_url($this->getAjaxUrlImport($this->getGroupID())); ?>" method="post">
17
  <?php
18
  $this->renderForm();
19
  ?>
Nextend/SmartSlider3/Application/Admin/Sliders/ViewSlidersImport.php CHANGED
@@ -108,7 +108,7 @@ class ViewSlidersImport extends AbstractView {
108
 
109
  new SelectFile($localImportGrouping, 'local-import-file', n2_('File'), '', 'ss3');
110
 
111
- new Notice($localImportGrouping, 'instructions', '', sprintf(n2_('Files with <i>.ss3</i> extension are listed from: %s'), Platform::getPublicDirectory()));
112
 
113
  new OnOff($localImportGrouping, 'delete', n2_('Delete file'), 0, array(
114
  'tipLabel' => n2_('Delete file'),
108
 
109
  new SelectFile($localImportGrouping, 'local-import-file', n2_('File'), '', 'ss3');
110
 
111
+ new Notice($localImportGrouping, 'instructions', '', sprintf(n2_('Files with %1$s.ss3%2$s extension are listed from: %3$s'), '<i>', '</i>', Platform::getPublicDirectory()));
112
 
113
  new OnOff($localImportGrouping, 'delete', n2_('Delete file'), 0, array(
114
  'tipLabel' => n2_('Delete file'),
Nextend/SmartSlider3/Application/Admin/Slides/ControllerAjaxSlides.php CHANGED
@@ -39,8 +39,9 @@ class ControllerAjaxSlides extends AdminAjaxController {
39
 
40
  $response = array();
41
 
42
- if (Settings::get('slide-as-file', 0) && isset($_FILES['slide'])) {
43
- $slide = Filesystem::readFile($_FILES['slide']['tmp_name']);
 
44
  } else {
45
  $slide = Request::$REQUEST->getVar('slide');
46
  }
39
 
40
  $response = array();
41
 
42
+ $file = Request::$FILES->getVar('slide');
43
+ if (Settings::get('slide-as-file', 0) && $file !== null) {
44
+ $slide = Filesystem::readFile($file['tmp_name']);
45
  } else {
46
  $slide = Request::$REQUEST->getVar('slide');
47
  }
Nextend/SmartSlider3/Application/Admin/Slides/Template/Edit.php CHANGED
@@ -6,7 +6,6 @@ namespace Nextend\SmartSlider3\Application\Admin\Slides;
6
  use Nextend\Framework\Asset\Js\Js;
7
  use Nextend\Framework\Platform\Platform;
8
  use Nextend\Framework\Request\Request;
9
- use Nextend\Framework\Sanitize;
10
  use Nextend\Framework\View\Html;
11
  use Nextend\SmartSlider3\Application\Model\ModelLicense;
12
  use Nextend\SmartSlider3\Settings;
@@ -20,11 +19,11 @@ use Nextend\SmartSlider3Pro\LayerAnimation\LayerAnimationStorage;
20
 
21
  JS::addGlobalInline('document.documentElement.classList.add("n2_html--application-only");');
22
 
23
- $externals = Sanitize::esc_attr(Settings::get('external-css-files'));
24
  if (!empty($externals)) {
25
  $externals = explode("\n", $externals);
26
  foreach ($externals as $external) {
27
- echo "<link rel='stylesheet' href='" . $external . "' type='text/css' media='all'>";
28
  }
29
  }
30
 
@@ -41,12 +40,14 @@ $renderedSlider = $this->renderedSlider;
41
  </form>
42
 
43
  <div id='n2-ss-slide-canvas-container' class='n2_slide_editor_slider'>
44
- <?php echo Html::tag('div', array(
45
- 'class' => "n2_slide_editor_slider__editor",
46
- 'style' => 'width:' . $slider->features->responsive->sizes['desktopPortrait']['width'] . 'px'
47
- ), Html::tag('div', array(
48
- 'class' => "n2_slide_editor_slider__editor_inner"
49
- ), $renderedSlider)); ?>
 
 
50
  </div>
51
 
52
  <?php
6
  use Nextend\Framework\Asset\Js\Js;
7
  use Nextend\Framework\Platform\Platform;
8
  use Nextend\Framework\Request\Request;
 
9
  use Nextend\Framework\View\Html;
10
  use Nextend\SmartSlider3\Application\Model\ModelLicense;
11
  use Nextend\SmartSlider3\Settings;
19
 
20
  JS::addGlobalInline('document.documentElement.classList.add("n2_html--application-only");');
21
 
22
+ $externals = esc_attr(Settings::get('external-css-files'));
23
  if (!empty($externals)) {
24
  $externals = explode("\n", $externals);
25
  foreach ($externals as $external) {
26
+ echo "<link rel='stylesheet' href='" . esc_url($external) . "' type='text/css' media='all'>";
27
  }
28
  }
29
 
40
  </form>
41
 
42
  <div id='n2-ss-slide-canvas-container' class='n2_slide_editor_slider'>
43
+ <div class="n2_slide_editor_slider__editor" style="width: <?php esc_attr($slider->features->responsive->sizes['desktopPortrait']['width']); ?>px">
44
+ <div class="n2_slide_editor_slider__editor_inner">
45
+ <?php
46
+ // PHPCS - Content already escaped
47
+ echo $renderedSlider; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
48
+ ?>
49
+ </div>
50
+ </div>
51
  </div>
52
 
53
  <?php
Nextend/SmartSlider3/Application/Admin/Slides/ViewSlidesEdit.php CHANGED
@@ -47,7 +47,7 @@ class ViewSlidesEdit extends AbstractView {
47
  protected $frontendSlider;
48
 
49
  /**
50
- * @var string
51
  */
52
  protected $renderedSlider;
53
 
47
  protected $frontendSlider;
48
 
49
  /**
50
+ * @var string contains already escaped data
51
  */
52
  protected $renderedSlider;
53
 
Nextend/SmartSlider3/Application/Frontend/Slider/ControllerPreRenderSlider.php CHANGED
@@ -7,13 +7,14 @@ namespace Nextend\SmartSlider3\Application\Frontend\Slider;
7
  use Nextend\Framework\Asset\Css\Css;
8
  use Nextend\Framework\Controller\AbstractController;
9
  use Nextend\Framework\ResourceTranslator\ResourceTranslator;
 
10
 
11
  class ControllerPreRenderSlider extends AbstractController {
12
 
13
 
14
  public function actionIframe() {
15
 
16
- $sliderIDorAlias = isset($_GET['sliderid']) ? $_GET['sliderid'] : false;
17
 
18
  if (empty($sliderIDorAlias)) {
19
  echo 'Slider ID or alias is empty.';
7
  use Nextend\Framework\Asset\Css\Css;
8
  use Nextend\Framework\Controller\AbstractController;
9
  use Nextend\Framework\ResourceTranslator\ResourceTranslator;
10
+ use Nextend\Framework\Request\Request;
11
 
12
  class ControllerPreRenderSlider extends AbstractController {
13
 
14
 
15
  public function actionIframe() {
16
 
17
+ $sliderIDorAlias = Request::$GET->getVar('sliderid') !== null ? Request::$GET->getVar('sliderid') : false;
18
 
19
  if (empty($sliderIDorAlias)) {
20
  echo 'Slider ID or alias is empty.';
Nextend/SmartSlider3/Application/Frontend/Slider/Template/Iframe.php CHANGED
@@ -3,7 +3,7 @@
3
  namespace Nextend\SmartSlider3\Application\Frontend\Slider;
4
 
5
  use Nextend\Framework\Asset\AssetManager;
6
- use Nextend\Framework\Sanitize;
7
  use Nextend\SmartSlider3\Settings;
8
  use Nextend\WordPress\OutputBuffer;
9
 
@@ -31,7 +31,7 @@ use Nextend\WordPress\OutputBuffer;
31
  /**
32
  * In page builder -> editors, we must force sliders to be visible on every device.
33
  */
34
- if (isset($_GET['iseditor']) && $_GET['iseditor']):
35
  ?>
36
  <script>
37
  window.ssOverrideHideOn = {
@@ -53,23 +53,30 @@ use Nextend\WordPress\OutputBuffer;
53
  $handlers = ob_list_handlers();
54
  if (!in_array(OutputBuffer::class . '::outputCallback', $handlers)) {
55
  if (class_exists('\\Nextend\\Framework\\Asset\\AssetManager', false)) {
56
- echo AssetManager::getCSS();
57
- echo AssetManager::getJs();
 
 
 
 
58
  }
59
  }
60
 
61
- $externals = Sanitize::esc_attr(Settings::get('external-css-files'));
62
  if (!empty($externals)) {
63
  $externals = explode("\n", $externals);
64
  foreach ($externals as $external) {
65
- echo "<link rel='stylesheet' href='" . $external . "' type='text/css' media='all' />";
66
  }
67
  }
68
  ?>
69
  </head>
70
  <body>
71
  <?php
72
- echo $this->getSliderHTML();
 
 
 
73
  ?>
74
  <script>
75
 
3
  namespace Nextend\SmartSlider3\Application\Frontend\Slider;
4
 
5
  use Nextend\Framework\Asset\AssetManager;
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\SmartSlider3\Settings;
8
  use Nextend\WordPress\OutputBuffer;
9
 
31
  /**
32
  * In page builder -> editors, we must force sliders to be visible on every device.
33
  */
34
+ if (Request::$GET->getInt('iseditor')):
35
  ?>
36
  <script>
37
  window.ssOverrideHideOn = {
53
  $handlers = ob_list_handlers();
54
  if (!in_array(OutputBuffer::class . '::outputCallback', $handlers)) {
55
  if (class_exists('\\Nextend\\Framework\\Asset\\AssetManager', false)) {
56
+
57
+ // PHPCS - Content already escaped
58
+ echo AssetManager::getCSS(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
59
+
60
+ // PHPCS - Content already escaped
61
+ echo AssetManager::getJs(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
  }
63
  }
64
 
65
+ $externals = esc_attr(Settings::get('external-css-files'));
66
  if (!empty($externals)) {
67
  $externals = explode("\n", $externals);
68
  foreach ($externals as $external) {
69
+ echo "<link rel='stylesheet' href='" . esc_url($external) . "' type='text/css' media='all' />";
70
  }
71
  }
72
  ?>
73
  </head>
74
  <body>
75
  <?php
76
+
77
+
78
+ // PHPCS - Content already escaped
79
+ echo $this->getSliderHTML(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
80
  ?>
81
  <script>
82
 
Nextend/SmartSlider3/Application/Frontend/Slider/ViewDisplay.php CHANGED
@@ -25,7 +25,9 @@ class ViewDisplay extends AbstractView {
25
 
26
  $sliderManager = new SliderManager($this, $this->sliderIDorAlias, false);
27
  $sliderManager->setUsage($this->usage);
28
- echo $sliderManager->render(true);
 
 
29
 
30
  setlocale(LC_NUMERIC, $locale);
31
  }
25
 
26
  $sliderManager = new SliderManager($this, $this->sliderIDorAlias, false);
27
  $sliderManager->setUsage($this->usage);
28
+
29
+ // PHPCS - Content already escaped
30
+ echo $sliderManager->render(true); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
31
 
32
  setlocale(LC_NUMERIC, $locale);
33
  }
Nextend/SmartSlider3/Application/Frontend/Slider/ViewIframe.php CHANGED
@@ -42,7 +42,9 @@ class ViewIframe extends AbstractView {
42
 
43
  setlocale(LC_NUMERIC, $locale);
44
 
45
- echo $this->render('Iframe');
 
 
46
  }
47
 
48
  /**
@@ -60,7 +62,7 @@ class ViewIframe extends AbstractView {
60
  }
61
 
62
  /**
63
- * @return string
64
  */
65
  public function getSliderHTML() {
66
  return $this->sliderHTML;
42
 
43
  setlocale(LC_NUMERIC, $locale);
44
 
45
+
46
+ // PHPCS - Content already escaped
47
+ echo $this->render('Iframe'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
48
  }
49
 
50
  /**
62
  }
63
 
64
  /**
65
+ * @return string already escaped
66
  */
67
  public function getSliderHTML() {
68
  return $this->sliderHTML;
Nextend/SmartSlider3/Application/Model/ModelGenerator.php CHANGED
@@ -195,7 +195,6 @@ class ModelGenerator extends AbstractModelTable {
195
  $slideBuilder->set(array(
196
  'title' => "{title}",
197
  'description' => '{description}',
198
- 'href' => '{url}',
199
  'thumbnail' => "{thumbnail}",
200
  'backgroundColor' => "ffffff00",
201
  'background-type' => 'color',
@@ -217,7 +216,6 @@ class ModelGenerator extends AbstractModelTable {
217
  $slideBuilder->set(array(
218
  'title' => "{title}",
219
  'description' => '{description}',
220
- 'href' => '{url}',
221
  'thumbnail' => "{image200x150/1}",
222
  'backgroundColor' => "ffffff00",
223
  'background-type' => 'color',
@@ -237,6 +235,23 @@ class ModelGenerator extends AbstractModelTable {
237
 
238
  break;
239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  case 'social_post':
241
  $slideBuilder->set(array(
242
  'title' => "{title}",
@@ -317,7 +332,6 @@ class ModelGenerator extends AbstractModelTable {
317
  'font' => Base64::encode('{"data":[{"extra":"","color":"ffffffff","size":"36||px","tshadow":"0|*|0|*|0|*|000000ff","afont":"Roboto,Arial","lineheight":"1.5","bold":0,"italic":0,"underline":0,"align":"inherit","letterspacing":"normal","wordspacing":"normal","texttransform":"none"},{"extra":""}]}')
318
  ));
319
  break;
320
- break;
321
 
322
  case 'text_generator':
323
  $slideBuilder->set(array(
195
  $slideBuilder->set(array(
196
  'title' => "{title}",
197
  'description' => '{description}',
 
198
  'thumbnail' => "{thumbnail}",
199
  'backgroundColor' => "ffffff00",
200
  'background-type' => 'color',
216
  $slideBuilder->set(array(
217
  'title' => "{title}",
218
  'description' => '{description}',
 
219
  'thumbnail' => "{image200x150/1}",
220
  'backgroundColor' => "ffffff00",
221
  'background-type' => 'color',
235
 
236
  break;
237
 
238
+ case 'video_mp4':
239
+ $slideBuilder->set(array(
240
+ 'title' => "{name}"
241
+ ));
242
+
243
+ $video = new BuilderComponentLayer($slideBuilder, 'video');
244
+ $video->set(array(
245
+ 'desktopportraitwidth' => '100%',
246
+ 'desktopportraitheight' => '100%',
247
+ 'desktopportraitalign' => 'left',
248
+ 'desktopportraitvalign' => 'top'
249
+ ));
250
+ $video->item->set(array(
251
+ "video_mp4" => "{video}",
252
+ ));
253
+ break;
254
+
255
  case 'social_post':
256
  $slideBuilder->set(array(
257
  'title' => "{title}",
332
  'font' => Base64::encode('{"data":[{"extra":"","color":"ffffffff","size":"36||px","tshadow":"0|*|0|*|0|*|000000ff","afont":"Roboto,Arial","lineheight":"1.5","bold":0,"italic":0,"underline":0,"align":"inherit","letterspacing":"normal","wordspacing":"normal","texttransform":"none"},{"extra":""}]}')
333
  ));
334
  break;
 
335
 
336
  case 'text_generator':
337
  $slideBuilder->set(array(
Nextend/SmartSlider3/BackgroundAnimation/ModelBackgroundAnimation.php CHANGED
@@ -32,7 +32,7 @@ class ModelBackgroundAnimation extends ModelVisual {
32
  $setsTab = new FieldsetVisualSet($form->getContainer(), 'backgroundanimation-sets', n2_('Animation type'));
33
  new Select($setsTab, 'sets', false);
34
 
35
- echo $form->render();
36
  }
37
 
38
  public function renderForm() {
32
  $setsTab = new FieldsetVisualSet($form->getContainer(), 'backgroundanimation-sets', n2_('Animation type'));
33
  new Select($setsTab, 'sets', false);
34
 
35
+ $form->render();
36
  }
37
 
38
  public function renderForm() {
Nextend/SmartSlider3/BackupSlider/ExportSlider.php CHANGED
@@ -182,7 +182,8 @@ class ExportSlider {
182
  PageFlow::cleanOutputBuffers();
183
  header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($this->backup->slider['title'] . '.ss3'));
184
  header('Content-type: application/zip');
185
- echo $zip->file();
 
186
  PageFlow::exitApplication();
187
  } else {
188
  $file = $this->sliderId . '-' . preg_replace('/[^a-zA-Z0-9_-]/', '', $this->backup->slider['title']) . '.ss3';
@@ -348,7 +349,8 @@ class ExportSlider {
348
  PageFlow::cleanOutputBuffers();
349
  header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($slider['title'] . '.zip'));
350
  header('Content-type: application/zip');
351
- echo $zip->file();
 
352
 
353
  Platform::setIsAdmin(false); // Restore admin area
354
 
182
  PageFlow::cleanOutputBuffers();
183
  header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($this->backup->slider['title'] . '.ss3'));
184
  header('Content-type: application/zip');
185
+ // PHPCS - contains binary zip data, so nothing to escape
186
+ echo $zip->file(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
187
  PageFlow::exitApplication();
188
  } else {
189
  $file = $this->sliderId . '-' . preg_replace('/[^a-zA-Z0-9_-]/', '', $this->backup->slider['title']) . '.ss3';
349
  PageFlow::cleanOutputBuffers();
350
  header('Content-disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($slider['title'] . '.zip'));
351
  header('Content-type: application/zip');
352
+ // PHPCS - contains binary zip data, so nothing to escape
353
+ echo $zip->file(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
354
 
355
  Platform::setIsAdmin(false); // Restore admin area
356
 
Nextend/SmartSlider3/Conflict/Conflict.php CHANGED
@@ -65,7 +65,7 @@ class Conflict {
65
  if (function_exists('ini_get')) {
66
  $max_input_vars = intval(ini_get('max_input_vars'));
67
  if ($max_input_vars < 1000) {
68
- $this->displayConflict('PHP', sprintf(n2_('Increase %1$s in php.ini to 1000 or more. Current value: %2$s'), '<b>max_input_vars</b>', $max_input_vars), 'https://smartslider.helpscoutdocs.com/article/1717-wordpress-installation');
69
  }
70
  }
71
  }
@@ -74,7 +74,7 @@ class Conflict {
74
  if (function_exists('ini_get') && ini_get('opcache.enable')) {
75
  $revalidateFrequenty = intval(ini_get('opcache.revalidate_freq'));
76
  if ($revalidateFrequenty >= 15) {
77
- $this->displayConflict('PHP', sprintf(n2_('Decrease %1$s below 15 in php.ini to prevent fatal errors on plugin updates. Current value: %2$s'), '<b>opcache.revalidate_freq</b>', $revalidateFrequenty), 'https://smartslider.helpscoutdocs.com/article/1717-wordpress-installation');
78
  }
79
  }
80
  }
@@ -84,7 +84,7 @@ class Conflict {
84
  ->get('log', 'api');
85
  if (!empty($log)) {
86
  if (strpos($log, 'ACTION_MISSING') === false) {
87
- $this->displayConflict(n2_('Unable to connect to the API'), n2_('See <b>Debug Information</b> for more details!'));
88
 
89
  $this->curlLog = json_decode($log, true);
90
  }
65
  if (function_exists('ini_get')) {
66
  $max_input_vars = intval(ini_get('max_input_vars'));
67
  if ($max_input_vars < 1000) {
68
+ $this->displayConflict('PHP - max_input_vars', sprintf(n2_('Increase %1$s in php.ini to 1000 or more. Current value: %2$s'), '<b>max_input_vars</b>', $max_input_vars), 'https://smartslider.helpscoutdocs.com/article/1717-wordpress-installation');
69
  }
70
  }
71
  }
74
  if (function_exists('ini_get') && ini_get('opcache.enable')) {
75
  $revalidateFrequenty = intval(ini_get('opcache.revalidate_freq'));
76
  if ($revalidateFrequenty >= 15) {
77
+ $this->displayConflict('PHP - opcache', sprintf(n2_('Decrease %1$s below 15 in php.ini to prevent fatal errors on plugin updates. Current value: %2$s'), '<b>opcache.revalidate_freq</b>', $revalidateFrequenty), 'https://smartslider.helpscoutdocs.com/article/1717-wordpress-installation');
78
  }
79
  }
80
  }
84
  ->get('log', 'api');
85
  if (!empty($log)) {
86
  if (strpos($log, 'ACTION_MISSING') === false) {
87
+ $this->displayConflict(n2_('Unable to connect to the API'), sprintf(n2_('See %1$sDebug Information%2$s for more details!'), '<b>', '</b>'));
88
 
89
  $this->curlLog = json_decode($log, true);
90
  }
Nextend/SmartSlider3/Conflict/WordPress/WordPressConflict.php CHANGED
@@ -17,6 +17,7 @@ class WordPressConflict extends Conflict {
17
  $this->testPluginNetbaseWidgetsForSiteOrigin();
18
  $this->testPluginNavMenuAddonForElementor();
19
  $this->testPluginSimplyExclude();
 
20
  }
21
 
22
  /**
@@ -81,4 +82,41 @@ class WordPressConflict extends Conflict {
81
  $this->displayConflict('Simply Exclude', sprintf(n2_('This plugin breaks the filtering options of the dynamic slide generators when %1$s is set to %2$s. Also it has not received any updates since WordPress 3.9.'), 'Query Filtering', 'All Loops'));
82
  }
83
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
17
  $this->testPluginNetbaseWidgetsForSiteOrigin();
18
  $this->testPluginNavMenuAddonForElementor();
19
  $this->testPluginSimplyExclude();
20
+ $this->testPluginCaches();
21
  }
22
 
23
  /**
82
  $this->displayConflict('Simply Exclude', sprintf(n2_('This plugin breaks the filtering options of the dynamic slide generators when %1$s is set to %2$s. Also it has not received any updates since WordPress 3.9.'), 'Query Filtering', 'All Loops'));
83
  }
84
  }
85
+
86
+
87
+ /**
88
+ * Cache plugins
89
+ */
90
+ private function testPluginCaches() {
91
+ $description = n2_('Optimization plugins often create issues, so if you see anything wrong, follow our documentation:');
92
+ $link = 'https://smartslider.helpscoutdocs.com/article/1976-cache-or-minification';
93
+
94
+ if (defined('WP_ROCKET_VERSION')) {
95
+ $this->displayConflict('WP Rocket', $description, $link . '#wp-rocket');
96
+ }
97
+ if (defined('WPFC_WP_PLUGIN_DIR')) {
98
+ $this->displayConflict('WP Fastest Cache', $description, $link . '#wp-fastest-cache');
99
+ }
100
+ if (defined('NITROPACK_VERSION')) {
101
+ $this->displayConflict('Nitropack', $description, $link . '#nitropack');
102
+ }
103
+ if (defined('AUTOPTIMIZE_PLUGIN_VERSION')) {
104
+ $this->displayConflict('Autoptimize', $description, $link . '#autoptimize');
105
+ }
106
+ if (defined('LSCWP_V')) {
107
+ $this->displayConflict('Litespeed Cache', $description, $link . '#litespeed');
108
+ }
109
+ if (defined('SiteGround_Optimizer\VERSION')) {
110
+ $this->displayConflict('SiteGround Optimizer', $description, $link . '#sg-optimizer');
111
+ }
112
+ if (defined('W3TC_DIR')) {
113
+ $this->displayConflict('W3 Total Cache', $description, $link . '#w3-total-cache');
114
+ }
115
+ if (defined('WPCACHEHOME')) {
116
+ $this->displayConflict('WP Super Cache', $description, $link . '#wp-super-cache');
117
+ }
118
+ if (defined('JETPACK__VERSION')) {
119
+ $this->displayConflict('Jetpack', $description, $link . '#jetpack');
120
+ }
121
+ }
122
  }
Nextend/SmartSlider3/Platform/WordPress/Admin/AdminHelper.php CHANGED
@@ -7,7 +7,6 @@ namespace Nextend\SmartSlider3\Platform\WordPress\Admin;
7
  use Nextend\Framework\PageFlow;
8
  use Nextend\Framework\Sanitize;
9
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
10
- use Nextend\SmartSlider3\Application\Model\ModelLicense;
11
  use Nextend\SmartSlider3\Application\Model\ModelSliders;
12
  use Nextend\SmartSlider3\Platform\SmartSlider3Platform;
13
  use Nextend\SmartSlider3\Platform\WordPress\HelperTinyMCE;
@@ -126,7 +125,7 @@ class AdminHelper {
126
  $documentationUrl = 'https://smartslider.helpscoutdocs.com/article/1983-how-to-give-access-to-smart-slider-for-non-admin-users#wordpress';
127
  }
128
 
129
- wp_die(sprintf('<div class="error">%s</div>', wpautop(sprintf('Smart Slider allows you to place many things on your slider, so only users with the %s capability can have access to it. You do not have this capability and only %s.', '<i>unfiltered_html</i>', sprintf('<a href="%s" target="_blank">%s</a>', $documentationUrl, 'the administrator of your website can grant it to you')))));
130
  }
131
  }
132
 
@@ -180,7 +179,7 @@ class AdminHelper {
180
 
181
  public function action_admin_head_network_update() {
182
 
183
- echo '<style type="text/css">#adminmenu .toplevel_page_' . NEXTEND_SMARTSLIDER_3_URL_PATH . '{display: none;}</style>';
184
  }
185
 
186
  public function display_network_update() {
7
  use Nextend\Framework\PageFlow;
8
  use Nextend\Framework\Sanitize;
9
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
 
10
  use Nextend\SmartSlider3\Application\Model\ModelSliders;
11
  use Nextend\SmartSlider3\Platform\SmartSlider3Platform;
12
  use Nextend\SmartSlider3\Platform\WordPress\HelperTinyMCE;
125
  $documentationUrl = 'https://smartslider.helpscoutdocs.com/article/1983-how-to-give-access-to-smart-slider-for-non-admin-users#wordpress';
126
  }
127
 
128
+ wp_die(sprintf('<div class="error"><p>%s</p></div>', sprintf('Smart Slider allows you to place many things on your slider, so only users with the %s capability can have access to it. You do not have this capability and only %s.', '<i>unfiltered_html</i>', sprintf('<a href="%s" target="_blank">%s</a>', esc_url($documentationUrl), 'the administrator of your website can grant it to you'))));
129
  }
130
  }
131
 
179
 
180
  public function action_admin_head_network_update() {
181
 
182
+ echo '<style type="text/css">#adminmenu .toplevel_page_' . esc_html(NEXTEND_SMARTSLIDER_3_URL_PATH) . '{display: none;}</style>';
183
  }
184
 
185
  public function display_network_update() {
Nextend/SmartSlider3/Platform/WordPress/Admin/free/notice.php CHANGED
@@ -9,7 +9,7 @@ if (mktime(0, 0, 0, 11, 23, 2021) <= $current && $current < mktime(0, 0, 0, 12,
9
  add_action('admin_notices', function () {
10
  ?>
11
  <div class="notice notice-info is-dismissible" data-ss3dismissable="ss3_bf_2021" style="display:grid;grid-template-columns: 100px auto;padding-top: 25px; padding-bottom: 22px;">
12
- <img alt="Smart Slider 3" src="<?php echo ResourceTranslator::toUrl('$ss3-admin$/images/notice.png'); ?>" width="74" height="74" style="grid-row: 1 / 4; align-self: center;justify-self: center">
13
  <h3 style="margin:0;">Smart Slider 3 Pro Black Friday Deal</h3>
14
  <p style="margin:0 0 2px;">Don't miss out on our biggest sale of the year!
15
  Get your <b>Smart Slider 3 Pro plan</b> with <b>40% OFF</b>!
9
  add_action('admin_notices', function () {
10
  ?>
11
  <div class="notice notice-info is-dismissible" data-ss3dismissable="ss3_bf_2021" style="display:grid;grid-template-columns: 100px auto;padding-top: 25px; padding-bottom: 22px;">
12
+ <img alt="Smart Slider 3" src="<?php echo esc_url(ResourceTranslator::toUrl('$ss3-admin$/images/notice.png')); ?>" width="74" height="74" style="grid-row: 1 / 4; align-self: center;justify-self: center">
13
  <h3 style="margin:0;">Smart Slider 3 Pro Black Friday Deal</h3>
14
  <p style="margin:0 0 2px;">Don't miss out on our biggest sale of the year!
15
  Get your <b>Smart Slider 3 Pro plan</b> with <b>40% OFF</b>!
Nextend/SmartSlider3/Platform/WordPress/Compatibility.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Platform\WordPress;
5
 
6
 
 
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
  use Nextend\SmartSlider3\Settings;
9
 
@@ -15,7 +16,7 @@ class Compatibility {
15
  * Fix for NextGenGallery and Divi live editor bug
16
  */
17
  add_filter('run_ngg_resource_manager', function ($ret) {
18
- if (isset($_GET['n2prerender']) && isset($_GET['n2app'])) {
19
  $ret = false;
20
  }
21
 
@@ -35,7 +36,7 @@ class Compatibility {
35
  'swup'
36
  );
37
 
38
- if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && in_array($_SERVER['HTTP_X_REQUESTED_WITH'], $xRequestedWiths)) || isset($_SERVER['HTTP_X_BARBA'])) {
39
 
40
  if (intval(Settings::get('wp-ajax-iframe-slider', 0))) {
41
  Shortcode::forceIframe('ajax');
@@ -63,7 +64,7 @@ class Compatibility {
63
  /**
64
  * Not sure which page builder is it...
65
  */
66
- if (isset($_GET['pswLoad']) && $_GET['pswLoad'] == 1) {
67
  Shortcode::forceIframe('psw');
68
  }
69
 
@@ -81,7 +82,7 @@ class Compatibility {
81
  *
82
  * @see SSDEV-3551
83
  */
84
- if (defined('WEGLOT_NAME') && isset($_GET['n2prerender']) && isset($_GET['n2app'])) {
85
  add_filter('weglot_button_html', function ($button_html) {
86
  return '';
87
  });
4
  namespace Nextend\SmartSlider3\Platform\WordPress;
5
 
6
 
7
+ use Nextend\Framework\Request\Request;
8
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
9
  use Nextend\SmartSlider3\Settings;
10
 
16
  * Fix for NextGenGallery and Divi live editor bug
17
  */
18
  add_filter('run_ngg_resource_manager', function ($ret) {
19
+ if (Request::$GET->getInt('n2prerender') && Request::$GET->getCmd('n2app') !== '') {
20
  $ret = false;
21
  }
22
 
36
  'swup'
37
  );
38
 
39
+ if ((Request::$SERVER->getCmd('HTTP_X_REQUESTED_WITH') !== '' && in_array(Request::$SERVER->getCmd('HTTP_X_REQUESTED_WITH'), $xRequestedWiths)) || Request::$SERVER->getCmd('HTTP_X_BARBA') !== '') {
40
 
41
  if (intval(Settings::get('wp-ajax-iframe-slider', 0))) {
42
  Shortcode::forceIframe('ajax');
64
  /**
65
  * Not sure which page builder is it...
66
  */
67
+ if (Request::$GET->getInt('pswLoad')) {
68
  Shortcode::forceIframe('psw');
69
  }
70
 
82
  *
83
  * @see SSDEV-3551
84
  */
85
+ if (defined('WEGLOT_NAME') && Request::$GET->getInt('n2prerender') && Request::$GET->getCmd('n2app') !== '') {
86
  add_filter('weglot_button_html', function ($button_html) {
87
  return '';
88
  });
Nextend/SmartSlider3/Platform/WordPress/HelperInstall.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Platform\WordPress;
5
 
6
 
 
7
  use Nextend\SmartSlider3\Install\Install;
8
  use Nextend\SmartSlider3\Install\Tables;
9
  use Nextend\SmartSlider3\Platform\SmartSlider3Platform;
@@ -32,7 +33,7 @@ class HelperInstall {
32
 
33
  if (get_option("n2_ss3_version") != SmartSlider3Info::$completeVersion) {
34
  $this->install();
35
- } else if (isset($_REQUEST['repairss3']) && current_user_can('manage_options') && check_admin_referer('repairss3')) {
36
  $this->install();
37
 
38
  Tables::repair();
4
  namespace Nextend\SmartSlider3\Platform\WordPress;
5
 
6
 
7
+ use Nextend\Framework\Request\Request;
8
  use Nextend\SmartSlider3\Install\Install;
9
  use Nextend\SmartSlider3\Install\Tables;
10
  use Nextend\SmartSlider3\Platform\SmartSlider3Platform;
33
 
34
  if (get_option("n2_ss3_version") != SmartSlider3Info::$completeVersion) {
35
  $this->install();
36
+ } else if (Request::$REQUEST->getInt('repairss3') && current_user_can('manage_options') && check_admin_referer('repairss3')) {
37
  $this->install();
38
 
39
  Tables::repair();
Nextend/SmartSlider3/Platform/WordPress/HelperTinyMCE.php CHANGED
@@ -12,6 +12,7 @@ use Nextend\Framework\Pattern\SingletonTrait;
12
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
13
  use Nextend\SmartSlider3\Settings;
14
  use Nextend\SmartSlider3\SmartSlider3Info;
 
15
 
16
  class HelperTinyMCE {
17
 
@@ -29,7 +30,7 @@ class HelperTinyMCE {
29
  if ((!current_user_can('edit_posts') && !current_user_can('edit_pages'))) {
30
  return;
31
  }
32
- if (in_array(basename($_SERVER['PHP_SELF']), array(
33
  'post-new.php',
34
  'page-new.php',
35
  'post.php',
12
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
13
  use Nextend\SmartSlider3\Settings;
14
  use Nextend\SmartSlider3\SmartSlider3Info;
15
+ use Nextend\Framework\Request\Request;
16
 
17
  class HelperTinyMCE {
18
 
30
  if ((!current_user_can('edit_posts') && !current_user_can('edit_pages'))) {
31
  return;
32
  }
33
+ if (in_array(basename(Request::$SERVER->getVar('PHP_SELF')), array(
34
  'post-new.php',
35
  'page-new.php',
36
  'post.php',
Nextend/SmartSlider3/Platform/WordPress/Integration/ACF/AcfFieldSmartSlider3.php CHANGED
@@ -96,11 +96,11 @@ class AcfFieldSmartSlider3 extends acf_field {
96
  <table style="width:100%;border:0;">
97
  <tr>
98
  <td style="white-space: nowrap;">
99
- <a href="#" onclick="<?php echo "NextendSmartSliderSelectModal(jQuery('#" . $field['id'] . "'));"; ?>return false;" class="button" title="<?php echo n2_('Select Slider'); ?>"><?php echo n2_('Select Slider'); ?></a>
100
  <span style="line-height:2;padding:10px;"><?php n2_e('OR'); ?></span>
101
  </td>
102
  <td style="width:90%;">
103
- <select id="<?php echo $field['id']; ?>" class="<?php echo $field['class']; ?>" name="<?php echo $field['name']; ?>">
104
  <?php if (!isset($field['required']) || !$field['required']): ?>
105
  <option value=""><?php n2_e('None'); ?></option>
106
  <?php endif; ?>
@@ -108,11 +108,11 @@ class AcfFieldSmartSlider3 extends acf_field {
108
  foreach ($choices as $id => $choice) {
109
  if (is_array($choice)) {
110
  ?>
111
- <optgroup label="<?php echo $choice['label']; ?>">
112
  <?php
113
  foreach ($choice['choices'] as $_id => $_choice) {
114
  ?>
115
- <option <?php if ($_id == $field['value']){ ?>selected <?php } ?>value="<?php echo $_id; ?>"><?php echo $_choice; ?></option>
116
  <?php
117
  }
118
  ?>
@@ -120,7 +120,7 @@ class AcfFieldSmartSlider3 extends acf_field {
120
  <?php
121
  } else {
122
  ?>
123
- <option <?php if ($id == $field['value']){ ?>selected <?php } ?>value="<?php echo $id; ?>"><?php echo $choice; ?></option>
124
  <?php
125
  }
126
  }
96
  <table style="width:100%;border:0;">
97
  <tr>
98
  <td style="white-space: nowrap;">
99
+ <a href="#" onclick="<?php echo "NextendSmartSliderSelectModal(jQuery('#" . esc_js($field['id']) . "'));"; ?>return false;" class="button" title="<?php n2_e('Select Slider'); ?>"><?php n2_e('Select Slider'); ?></a>
100
  <span style="line-height:2;padding:10px;"><?php n2_e('OR'); ?></span>
101
  </td>
102
  <td style="width:90%;">
103
+ <select id="<?php echo esc_attr($field['id']); ?>" class="<?php echo esc_attr($field['class']); ?>" name="<?php echo esc_attr($field['name']); ?>">
104
  <?php if (!isset($field['required']) || !$field['required']): ?>
105
  <option value=""><?php n2_e('None'); ?></option>
106
  <?php endif; ?>
108
  foreach ($choices as $id => $choice) {
109
  if (is_array($choice)) {
110
  ?>
111
+ <optgroup label="<?php echo esc_attr($choice['label']); ?>">
112
  <?php
113
  foreach ($choice['choices'] as $_id => $_choice) {
114
  ?>
115
+ <option <?php if ($_id == $field['value']){ ?>selected <?php } ?>value="<?php echo esc_attr($_id); ?>"><?php echo esc_html($_choice); ?></option>
116
  <?php
117
  }
118
  ?>
120
  <?php
121
  } else {
122
  ?>
123
+ <option <?php if ($id == $field['value']){ ?>selected <?php } ?>value="<?php echo esc_attr($id); ?>"><?php echo esc_html($choice); ?></option>
124
  <?php
125
  }
126
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/BeaverBuilder/BeaverBuilder.php CHANGED
@@ -163,17 +163,17 @@ class BeaverBuilder {
163
  }
164
  }
165
  ?>
166
- <select name="<?php echo $name; ?>">
167
  <option value=""><?php n2_e('None'); ?></option>
168
  <?php
169
  foreach ($choices as $id => $choice) {
170
  if (is_array($choice)) {
171
  ?>
172
- <optgroup label="<?php echo $choice['label']; ?>">
173
  <?php
174
  foreach ($choice['choices'] as $_id => $_choice) {
175
  ?>
176
- <option <?php if ($_id == $value){ ?>selected <?php } ?>value="<?php echo $_id; ?>"><?php echo $_choice; ?></option>
177
  <?php
178
  }
179
  ?>
@@ -181,7 +181,7 @@ class BeaverBuilder {
181
  <?php
182
  } else {
183
  ?>
184
- <option <?php if ($id == $value){ ?>selected <?php } ?>value="<?php echo $id; ?>"><?php echo $choice; ?></option>
185
  <?php
186
  }
187
  }
@@ -189,10 +189,10 @@ class BeaverBuilder {
189
  </select>
190
  <div style="line-height:2;padding:10px;"><?php n2_e('OR'); ?></div>
191
 
192
- <a href="#" onclick="NextendSmartSliderSelectModal(jQuery(this).siblings('select')) ;return false;" class="fl-builder-smart-slider-select fl-builder-button fl-builder-button-small fl-builder-button-primary" title="Select slider"><?php echo n2_('Select Slider'); ?></a>
193
  <script>
194
  (function ($) {
195
- var value = $('select[name="<?php echo $name; ?>"]').val();
196
  if (value == '' || value == '0') {
197
  $('.fl-builder-smart-slider-select').trigger('click');
198
  }
163
  }
164
  }
165
  ?>
166
+ <select name="<?php echo esc_attr($name); ?>">
167
  <option value=""><?php n2_e('None'); ?></option>
168
  <?php
169
  foreach ($choices as $id => $choice) {
170
  if (is_array($choice)) {
171
  ?>
172
+ <optgroup label="<?php echo esc_attr($choice['label']); ?>">
173
  <?php
174
  foreach ($choice['choices'] as $_id => $_choice) {
175
  ?>
176
+ <option <?php if ($_id == $value){ ?>selected <?php } ?>value="<?php echo esc_attr($_id); ?>"><?php echo esc_html($_choice); ?></option>
177
  <?php
178
  }
179
  ?>
181
  <?php
182
  } else {
183
  ?>
184
+ <option <?php if ($id == $value){ ?>selected <?php } ?>value="<?php echo esc_attr($id); ?>"><?php echo esc_html($choice); ?></option>
185
  <?php
186
  }
187
  }
189
  </select>
190
  <div style="line-height:2;padding:10px;"><?php n2_e('OR'); ?></div>
191
 
192
+ <a href="#" onclick="NextendSmartSliderSelectModal(jQuery(this).siblings('select')) ;return false;" class="fl-builder-smart-slider-select fl-builder-button fl-builder-button-small fl-builder-button-primary" title="Select slider"><?php n2_e('Select Slider'); ?></a>
193
  <script>
194
  (function ($) {
195
+ var value = $('select[name="<?php echo esc_js($name); ?>"]').val();
196
  if (value == '' || value == '0') {
197
  $('.fl-builder-smart-slider-select').trigger('click');
198
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/BeaverBuilder/includes/frontend.php CHANGED
@@ -3,7 +3,7 @@ if (!defined('ABSPATH')) {
3
  exit; // Exit if accessed directly
4
  }
5
  if (is_numeric($settings->sliderid)) {
6
- echo '[smartslider3 slider=' . $settings->sliderid . ']';
7
  } else {
8
- echo '[smartslider3 alias="' . $settings->sliderid . '"]';
9
  }
3
  exit; // Exit if accessed directly
4
  }
5
  if (is_numeric($settings->sliderid)) {
6
+ echo '[smartslider3 slider=' . esc_html($settings->sliderid) . ']';
7
  } else {
8
+ echo '[smartslider3 alias="' . esc_html($settings->sliderid) . '"]';
9
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/BoldGrid/BoldGrid.php CHANGED
@@ -3,12 +3,13 @@
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\BoldGrid;
5
 
 
6
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
7
 
8
  class BoldGrid {
9
 
10
  public function __construct() {
11
- if (class_exists('Boldgrid_Editor') && isset($_REQUEST['action']) && ($_REQUEST['action'] == 'boldgrid_shortcode_smartslider3' || $_REQUEST['action'] == 'boldgrid_component_wp_smartslider3')) {
12
  Shortcode::forceIframe('Boldgrid', true);
13
  }
14
  }
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\BoldGrid;
5
 
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
 
9
  class BoldGrid {
10
 
11
  public function __construct() {
12
+ if (class_exists('Boldgrid_Editor') && (Request::$REQUEST->getCmd('action') == 'boldgrid_shortcode_smartslider3' || Request::$REQUEST->getCmd('action') == 'boldgrid_component_wp_smartslider3')) {
13
  Shortcode::forceIframe('Boldgrid', true);
14
  }
15
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/Brizy/Brizy.php CHANGED
@@ -4,12 +4,13 @@
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\Brizy;
5
 
6
  use Brizy_Editor;
 
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
 
9
  class Brizy {
10
 
11
  public function __construct() {
12
- if (class_exists('Brizy_Editor') && isset($_REQUEST['action']) && $_REQUEST['action'] == Brizy_Editor::prefix() . '_shortcode_content') {
13
  Shortcode::forceIframe('Brizy', true);
14
  }
15
  }
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\Brizy;
5
 
6
  use Brizy_Editor;
7
+ use Nextend\Framework\Request\Request;
8
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
9
 
10
  class Brizy {
11
 
12
  public function __construct() {
13
+ if (class_exists('Brizy_Editor') && Request::$REQUEST->getVar('action') == Brizy_Editor::prefix() . '_shortcode_content') {
14
  Shortcode::forceIframe('Brizy', true);
15
  }
16
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/Divi/V31ge/includes/modules/SmartSlider3/SmartSlider3.php CHANGED
@@ -38,10 +38,12 @@ class ET_Builder_Module_SmartSlider3 extends ET_Builder_Module {
38
 
39
  <?php
40
  $path = ApplicationTypeFrontend::getAssetsPath() . '/dist/iframe.min.js';
 
41
  if (file_exists($path)) {
42
- echo file_get_contents($path);
43
  } else {
44
  }
 
45
  ?>
46
  </script>
47
  <?php
38
 
39
  <?php
40
  $path = ApplicationTypeFrontend::getAssetsPath() . '/dist/iframe.min.js';
41
+ add_filter('js_escape', 'Nextend\Framework\Sanitize::esc_js_filter', 10, 2);
42
  if (file_exists($path)) {
43
+ echo esc_js(file_get_contents($path));
44
  } else {
45
  }
46
+ remove_filter('js_escape', 'Nextend\Framework\Sanitize::esc_js_filter', 10);
47
  ?>
48
  </script>
49
  <?php
Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider.php CHANGED
@@ -41,7 +41,9 @@ class ElementorWidgetSmartSlider extends Widget_Base {
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
- echo Shortcode::renderIframe($this->get_settings('smartsliderid'));
 
 
45
  } else {
46
  $sliderIDorAlias = $this->get_settings('smartsliderid');
47
  if (is_numeric($sliderIDorAlias)) {
@@ -59,6 +61,8 @@ class ElementorWidgetSmartSlider extends Widget_Base {
59
  }
60
 
61
  protected function content_template() {
62
- echo Shortcode::renderIframe('{{{settings.smartsliderid}}}');
 
 
63
  }
64
  }
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
+
45
+ // PHPCS - Content already escaped
46
+ echo Shortcode::renderIframe($this->get_settings('smartsliderid')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
47
  } else {
48
  $sliderIDorAlias = $this->get_settings('smartsliderid');
49
  if (is_numeric($sliderIDorAlias)) {
61
  }
62
 
63
  protected function content_template() {
64
+
65
+ // PHPCS - Content already escaped
66
+ echo Shortcode::renderIframe('{{{settings.smartsliderid}}}'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
67
  }
68
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider290.php CHANGED
@@ -41,7 +41,9 @@ class ElementorWidgetSmartSlider290 extends Widget_Base {
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
- echo Shortcode::renderIframe($this->get_settings('smartsliderid'));
 
 
45
  } else {
46
  $sliderIDorAlias = $this->get_settings('smartsliderid');
47
  if (is_numeric($sliderIDorAlias)) {
@@ -63,6 +65,8 @@ class ElementorWidgetSmartSlider290 extends Widget_Base {
63
  * @url https://developers.elementor.com/v2-9-0-planned-deprecations/
64
  */
65
  protected function _content_template() {
66
- echo Shortcode::renderIframe('{{{settings.smartsliderid}}}');
 
 
67
  }
68
  }
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
+
45
+ // PHPCS - Content already escaped
46
+ echo Shortcode::renderIframe($this->get_settings('smartsliderid')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
47
  } else {
48
  $sliderIDorAlias = $this->get_settings('smartsliderid');
49
  if (is_numeric($sliderIDorAlias)) {
65
  * @url https://developers.elementor.com/v2-9-0-planned-deprecations/
66
  */
67
  protected function _content_template() {
68
+
69
+ // PHPCS - Content already escaped
70
+ echo Shortcode::renderIframe('{{{settings.smartsliderid}}}'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
71
  }
72
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/Elementor/ElementorWidgetSmartSlider350.php CHANGED
@@ -41,7 +41,9 @@ class ElementorWidgetSmartSlider350 extends Widget_Base {
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
- echo Shortcode::renderIframe($this->get_settings('smartsliderid'));
 
 
45
  } else {
46
  $sliderIDorAlias = $this->get_settings('smartsliderid');
47
  if (is_numeric($sliderIDorAlias)) {
@@ -59,6 +61,8 @@ class ElementorWidgetSmartSlider350 extends Widget_Base {
59
  }
60
 
61
  protected function content_template() {
62
- echo Shortcode::renderIframe('{{{settings.smartsliderid}}}');
 
 
63
  }
64
  }
41
 
42
  protected function render() {
43
  if (Plugin::instance()->editor->is_edit_mode() || Plugin::instance()->preview->is_preview_mode()) {
44
+
45
+ // PHPCS - Content already escaped
46
+ echo Shortcode::renderIframe($this->get_settings('smartsliderid')); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
47
  } else {
48
  $sliderIDorAlias = $this->get_settings('smartsliderid');
49
  if (is_numeric($sliderIDorAlias)) {
61
  }
62
 
63
  protected function content_template() {
64
+
65
+ // PHPCS - Content already escaped
66
+ echo Shortcode::renderIframe('{{{settings.smartsliderid}}}'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
67
  }
68
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/Jetpack/Jetpack.php CHANGED
@@ -17,6 +17,11 @@ class Jetpack {
17
  $this,
18
  'action_assets_manager_started'
19
  ));
 
 
 
 
 
20
  }
21
  }
22
 
@@ -36,4 +41,10 @@ class Jetpack {
36
 
37
  return $val;
38
  }
 
 
 
 
 
 
39
  }
17
  $this,
18
  'action_assets_manager_started'
19
  ));
20
+
21
+ add_filter('kses_allowed_protocols', array(
22
+ $this,
23
+ 'kses_allowed_protocols'
24
+ ), 10, 1);
25
  }
26
  }
27
 
41
 
42
  return $val;
43
  }
44
+
45
+ public function kses_allowed_protocols($protocols) {
46
+ $protocols[] = 'data';
47
+
48
+ return $protocols;
49
+ }
50
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/OxygenBuilder/OxygenBuilder.php CHANGED
@@ -4,17 +4,14 @@
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\OxygenBuilder;
5
 
6
 
 
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
 
9
  class OxygenBuilder {
10
 
11
  public function __construct() {
12
- if (defined('CT_VERSION')) {
13
- if (isset($_REQUEST['action'])) {
14
- if ($_REQUEST['action'] == 'ct_render_shortcode' || $_REQUEST['action'] == 'ct_get_post_data') {
15
- self::forceShortcodeIframe();
16
- }
17
- }
18
  }
19
  }
20
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\OxygenBuilder;
5
 
6
 
7
+ use Nextend\Framework\Request\Request;
8
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
9
 
10
  class OxygenBuilder {
11
 
12
  public function __construct() {
13
+ if (defined('CT_VERSION') && (Request::$REQUEST->getCmd('action') == 'ct_render_shortcode' || Request::$REQUEST->getCmd('action') == 'ct_get_post_data')) {
14
+ self::forceShortcodeIframe();
 
 
 
 
15
  }
16
  }
17
 
Nextend/SmartSlider3/Platform/WordPress/Integration/TatsuBuilder/TatsuBuilder.php CHANGED
@@ -3,13 +3,14 @@
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\TatsuBuilder;
5
 
 
6
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
7
 
8
  class TatsuBuilder {
9
 
10
  public function __construct() {
11
- if (class_exists('Tatsu_Builder') && isset($_REQUEST['action']) && $_REQUEST['action'] == 'tatsu_module' && isset($_REQUEST['module'])) {
12
- $tatsuModuleData = json_decode($_REQUEST['module']);
13
  if ($tatsuModuleData && is_object($tatsuModuleData) && isset($tatsuModuleData->name) && $tatsuModuleData->name === 'tatsu_text_with_shortcodes') {
14
  Shortcode::forceIframe('TatsuBuilder', true);
15
  }
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\TatsuBuilder;
5
 
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
 
9
  class TatsuBuilder {
10
 
11
  public function __construct() {
12
+ if (class_exists('Tatsu_Builder') && Request::$REQUEST->getCmd('action') == 'tatsu_module' && Request::$REQUEST->getVar('module') !== null) {
13
+ $tatsuModuleData = json_decode(Request::$REQUEST->getVar('module'));
14
  if ($tatsuModuleData && is_object($tatsuModuleData) && isset($tatsuModuleData->name) && $tatsuModuleData->name === 'tatsu_text_with_shortcodes') {
15
  Shortcode::forceIframe('TatsuBuilder', true);
16
  }
Nextend/SmartSlider3/Platform/WordPress/Integration/VisualComposer2/VisualComposer2.php CHANGED
@@ -3,12 +3,13 @@
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\VisualComposer2;
5
 
 
6
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
7
 
8
  class VisualComposer2 {
9
 
10
  public function __construct() {
11
- if (class_exists('VcvEnv') && isset($_REQUEST['vcv-ajax']) && $_REQUEST['vcv-ajax'] == 1) {
12
  Shortcode::forceIframe('VisualComposer2', true);
13
  }
14
  }
3
 
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Integration\VisualComposer2;
5
 
6
+ use Nextend\Framework\Request\Request;
7
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
8
 
9
  class VisualComposer2 {
10
 
11
  public function __construct() {
12
+ if (class_exists('VcvEnv') && Request::$REQUEST->getInt('vcv-ajax')) {
13
  Shortcode::forceIframe('VisualComposer2', true);
14
  }
15
  }
Nextend/SmartSlider3/Platform/WordPress/Shortcode/Shortcode.php CHANGED
@@ -8,6 +8,7 @@ use AmpProject\AmpWP\Option;
8
  use Nextend\Framework\Asset\Builder\BuilderJs;
9
  use Nextend\Framework\Localization\Localization;
10
  use Nextend\Framework\Request\Request;
 
11
  use Nextend\Framework\View\Html;
12
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
13
  use Nextend\SmartSlider3\Application\Frontend\ApplicationTypeFrontend;
@@ -232,6 +233,11 @@ class Shortcode {
232
  return self::render($parameters);
233
  }
234
 
 
 
 
 
 
235
  public static function renderIframe($sliderIDorAlias) {
236
 
237
  $path = ApplicationTypeFrontend::getAssetsPath() . '/dist/iframe.min.js';
@@ -346,12 +352,12 @@ class Shortcode {
346
  $slideTo = intval($parameters['slide']);
347
  }
348
 
349
- if ($parameters['get'] !== null && !empty($_GET[$parameters['get']])) {
350
- $slideTo = intval($_GET[$parameters['get']]);
351
  }
352
 
353
  if ($slideTo) {
354
- echo "<script>window['ss" . $parameters['slider'] . "'] = " . ($slideTo - 1) . ";</script>";
355
  }
356
 
357
  $applicationTypeFrontend = ApplicationSmartSlider3::getInstance()
8
  use Nextend\Framework\Asset\Builder\BuilderJs;
9
  use Nextend\Framework\Localization\Localization;
10
  use Nextend\Framework\Request\Request;
11
+ use Nextend\Framework\Sanitize;
12
  use Nextend\Framework\View\Html;
13
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
14
  use Nextend\SmartSlider3\Application\Frontend\ApplicationTypeFrontend;
233
  return self::render($parameters);
234
  }
235
 
236
+ /**
237
+ * @param $sliderIDorAlias
238
+ *
239
+ * @return string contains escaped data
240
+ */
241
  public static function renderIframe($sliderIDorAlias) {
242
 
243
  $path = ApplicationTypeFrontend::getAssetsPath() . '/dist/iframe.min.js';
352
  $slideTo = intval($parameters['slide']);
353
  }
354
 
355
+ if ($parameters['get'] !== null) {
356
+ $slideTo = Request::$GET->getInt($parameters['get']);
357
  }
358
 
359
  if ($slideTo) {
360
+ echo wp_kses("<script>window['ss" . $parameters['slider'] . "'] = " . ($slideTo - 1) . ";</script>", Sanitize::$assetTags);
361
  }
362
 
363
  $applicationTypeFrontend = ApplicationSmartSlider3::getInstance()
Nextend/SmartSlider3/Platform/WordPress/SmartSlider3PlatformWordPress.php CHANGED
@@ -3,10 +3,12 @@
3
  namespace Nextend\SmartSlider3\Platform\WordPress;
4
 
5
  use Nextend\Framework\Asset\Predefined;
 
6
  use Nextend\Framework\WordPress\AssetInjector;
7
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
8
  use Nextend\SmartSlider3\Platform\AbstractSmartSlider3Platform;
9
  use Nextend\SmartSlider3\Platform\WordPress\Admin\AdminHelper;
 
10
  use Nextend\SmartSlider3\Platform\WordPress\Integration\ACF\ACF;
11
  use Nextend\SmartSlider3\Platform\WordPress\Integration\BeaverBuilder\BeaverBuilder;
12
  use Nextend\SmartSlider3\Platform\WordPress\Integration\BoldGrid\BoldGrid;
@@ -30,7 +32,6 @@ use Nextend\SmartSlider3\Platform\WordPress\Integration\WPRocket\WPRocket;
30
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
31
  use Nextend\SmartSlider3\Platform\WordPress\Widget\WidgetHelper;
32
  use Nextend\SmartSlider3\PublicApi\Project;
33
- use Nextend\SmartSlider3\SmartSlider3Info;
34
 
35
  class SmartSlider3PlatformWordPress extends AbstractSmartSlider3Platform {
36
 
@@ -58,15 +59,13 @@ class SmartSlider3PlatformWordPress extends AbstractSmartSlider3Platform {
58
  }
59
  });
60
 
61
- if (SmartSlider3Info::$plan == 'pro' || SmartSlider3Info::$channel != 'stable') {
62
- WordPressUpdate::getInstance();
63
- }
64
-
65
  new WordPressFrontend();
66
 
67
  AssetInjector::getInstance();
68
 
69
  $this->integrate();
 
 
70
  }
71
 
72
  public function getAdminUrl() {
@@ -134,6 +133,10 @@ class SmartSlider3PlatformWordPress extends AbstractSmartSlider3Platform {
134
  new TatsuBuilder();
135
  }
136
 
 
 
 
 
137
  /**
138
  * @param $file
139
  *
3
  namespace Nextend\SmartSlider3\Platform\WordPress;
4
 
5
  use Nextend\Framework\Asset\Predefined;
6
+ use Nextend\Framework\Sanitize;
7
  use Nextend\Framework\WordPress\AssetInjector;
8
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
9
  use Nextend\SmartSlider3\Platform\AbstractSmartSlider3Platform;
10
  use Nextend\SmartSlider3\Platform\WordPress\Admin\AdminHelper;
11
+ use Nextend\SmartSlider3\Platform\WordPress\Admin\Pro\WordPressUpdate;
12
  use Nextend\SmartSlider3\Platform\WordPress\Integration\ACF\ACF;
13
  use Nextend\SmartSlider3\Platform\WordPress\Integration\BeaverBuilder\BeaverBuilder;
14
  use Nextend\SmartSlider3\Platform\WordPress\Integration\BoldGrid\BoldGrid;
32
  use Nextend\SmartSlider3\Platform\WordPress\Shortcode\Shortcode;
33
  use Nextend\SmartSlider3\Platform\WordPress\Widget\WidgetHelper;
34
  use Nextend\SmartSlider3\PublicApi\Project;
 
35
 
36
  class SmartSlider3PlatformWordPress extends AbstractSmartSlider3Platform {
37
 
59
  }
60
  });
61
 
 
 
 
 
62
  new WordPressFrontend();
63
 
64
  AssetInjector::getInstance();
65
 
66
  $this->integrate();
67
+
68
+ $this->initSanitize();
69
  }
70
 
71
  public function getAdminUrl() {
133
  new TatsuBuilder();
134
  }
135
 
136
+ private function initSanitize() {
137
+ Sanitize::set_allowed_tags();
138
+ }
139
+
140
  /**
141
  * @param $file
142
  *
Nextend/SmartSlider3/Platform/WordPress/Widget/WidgetHelper.php CHANGED
@@ -62,7 +62,7 @@ class WidgetHelper {
62
 
63
  public function dynamic_sidebar_before($index) {
64
  if (substr($index, 0, strlen('smartslider_area_')) === 'smartslider_area_') {
65
- echo '<div class="description">Display this widget area in your theme with: <pre style="white-space: pre-wrap;overflow:hidden;">&lt;?php dynamic_sidebar(\'' . $index . '\'); ?&gt;</pre></div>';
66
  }
67
 
68
  }
62
 
63
  public function dynamic_sidebar_before($index) {
64
  if (substr($index, 0, strlen('smartslider_area_')) === 'smartslider_area_') {
65
+ echo '<div class="description">Display this widget area in your theme with: <pre style="white-space: pre-wrap;overflow:hidden;">&lt;?php dynamic_sidebar(\'' . esc_html($index) . '\'); ?&gt;</pre></div>';
66
  }
67
 
68
  }
Nextend/SmartSlider3/Platform/WordPress/Widget/WidgetSmartSlider3.php CHANGED
@@ -4,6 +4,7 @@
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Widget;
5
 
6
 
 
7
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
8
  use Nextend\SmartSlider3\Application\Model\ModelSliders;
9
  use Nextend\SmartSlider3\Platform\WordPress\HelperTinyMCE;
@@ -68,12 +69,13 @@ class WidgetSmartSlider3 extends WP_Widget {
68
 
69
  $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
70
 
71
- echo $args['before_widget'];
72
- if (!empty($title)) echo $args['before_title'] . $title . $args['after_title'];
73
 
74
- echo $slider;
 
75
 
76
- echo $args['after_widget'];
77
  }
78
  }
79
 
@@ -129,7 +131,7 @@ class WidgetSmartSlider3 extends WP_Widget {
129
 
130
  $_title = '';
131
  ?>
132
- <select id="<?php echo $this->get_field_id('slider'); ?>" name="<?php echo $this->get_field_name('slider'); ?>" class="widefat">
133
  <?php if (empty($choices)): ?>
134
  <option value=""><?php n2_e('None'); ?></option>
135
  <?php else: ?>
@@ -142,12 +144,12 @@ class WidgetSmartSlider3 extends WP_Widget {
142
  foreach ($choices as $id => $choice) {
143
  if (is_array($choice)) {
144
  ?>
145
- <optgroup label="<?php echo $choice['label']; ?>">
146
  <?php
147
  foreach ($choice['choices'] as $_id => $_choice) {
148
  ?>
149
  <option <?php if ($_id == $value){
150
- $_title = $_choice; ?>selected <?php } ?>value="<?php echo $_id; ?>"><?php echo $_choice; ?></option>
151
  <?php
152
  }
153
  ?>
@@ -156,23 +158,23 @@ class WidgetSmartSlider3 extends WP_Widget {
156
  } else {
157
  ?>
158
  <option <?php if ($id == $value){
159
- $_title = $choice; ?>selected <?php } ?>value="<?php echo $id; ?>"><?php echo $choice; ?></option>
160
  <?php
161
  }
162
  }
163
  ?>
164
  <?php endif; ?>
165
  </select>
166
- <input id="<?php echo $this->get_field_id('temp-title'); ?>"
167
- name="<?php echo $this->get_field_name('temp-title'); ?>" type="hidden"
168
- value="<?php echo $_title; ?>">
169
 
170
  </p>
171
  <p>
172
- <label for="<?php echo $this->get_field_id('title'); ?>">
173
  Title:
174
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>"
175
- name="<?php echo $this->get_field_name('title'); ?>" type="text"
176
  value="<?php echo esc_attr($title); ?>">
177
  </label>
178
  </p>
4
  namespace Nextend\SmartSlider3\Platform\WordPress\Widget;
5
 
6
 
7
+ use Nextend\Framework\Sanitize;
8
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
9
  use Nextend\SmartSlider3\Application\Model\ModelSliders;
10
  use Nextend\SmartSlider3\Platform\WordPress\HelperTinyMCE;
69
 
70
  $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base);
71
 
72
+ echo wp_kses($args['before_widget'], Sanitize::$basicTags);
73
+ if (!empty($title)) echo wp_kses($args['before_title'] . $title . $args['after_title'], Sanitize::$basicTags);
74
 
75
+ // PHPCS - Content already escaped
76
+ echo $slider; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
77
 
78
+ echo wp_kses($args['after_widget'], Sanitize::$basicTags);
79
  }
80
  }
81
 
131
 
132
  $_title = '';
133
  ?>
134
+ <select id="<?php echo esc_attr($this->get_field_id('slider')); ?>" name="<?php echo esc_attr($this->get_field_name('slider')); ?>" class="widefat">
135
  <?php if (empty($choices)): ?>
136
  <option value=""><?php n2_e('None'); ?></option>
137
  <?php else: ?>
144
  foreach ($choices as $id => $choice) {
145
  if (is_array($choice)) {
146
  ?>
147
+ <optgroup label="<?php echo esc_attr($choice['label']); ?>">
148
  <?php
149
  foreach ($choice['choices'] as $_id => $_choice) {
150
  ?>
151
  <option <?php if ($_id == $value){
152
+ $_title = $_choice; ?>selected <?php } ?>value="<?php echo esc_attr($_id); ?>"><?php echo esc_html($_choice); ?></option>
153
  <?php
154
  }
155
  ?>
158
  } else {
159
  ?>
160
  <option <?php if ($id == $value){
161
+ $_title = $choice; ?>selected <?php } ?>value="<?php echo esc_attr($id); ?>"><?php echo esc_html($choice); ?></option>
162
  <?php
163
  }
164
  }
165
  ?>
166
  <?php endif; ?>
167
  </select>
168
+ <input id="<?php echo esc_attr($this->get_field_id('temp-title')); ?>"
169
+ name="<?php echo esc_attr($this->get_field_name('temp-title')); ?>" type="hidden"
170
+ value="<?php echo esc_attr($_title); ?>">
171
 
172
  </p>
173
  <p>
174
+ <label for="<?php echo esc_attr($this->get_field_id('title')); ?>">
175
  Title:
176
+ <input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>"
177
+ name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text"
178
  value="<?php echo esc_attr($title); ?>">
179
  </label>
180
  </p>
Nextend/SmartSlider3/Platform/WordPress/WordPressFrontend.php CHANGED
@@ -6,6 +6,7 @@ namespace Nextend\SmartSlider3\Platform\WordPress;
6
 
7
  use Exception;
8
  use Nextend\Framework\PageFlow;
 
9
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
10
 
11
  class WordPressFrontend {
@@ -19,22 +20,21 @@ class WordPressFrontend {
19
  }
20
 
21
  public function preRender() {
22
-
23
- if (isset($_GET['n2prerender']) && isset($_GET['n2app'])) {
24
- if (current_user_can('smartslider') || (!empty($_GET['h']) && ($_GET['h'] === sha1(NONCE_SALT . date('Y-m-d')) || $_GET['h'] === sha1(NONCE_SALT . date('Y-m-d', time() - 60 * 60 * 24))))) {
25
  try {
26
 
27
  $application = ApplicationSmartSlider3::getInstance();
28
 
29
  $applicationType = $application->getApplicationTypeFrontend();
30
 
31
- $applicationType->process('PreRender' . $_GET['n2controller'], $_GET['n2action']);
32
 
33
  PageFlow::exitApplication();
34
  } catch (Exception $e) {
35
  exit;
36
  }
37
- } else if (isset($_GET['sliderid']) && isset($_GET['hash']) && md5($_GET['sliderid'] . NONCE_SALT) == $_GET['hash']) {
38
  try {
39
  $application = ApplicationSmartSlider3::getInstance();
40
 
6
 
7
  use Exception;
8
  use Nextend\Framework\PageFlow;
9
+ use Nextend\Framework\Request\Request;
10
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
11
 
12
  class WordPressFrontend {
20
  }
21
 
22
  public function preRender() {
23
+ if (Request::$GET->getInt('n2prerender') && Request::$GET->getCmd('n2app') !== '') {
24
+ if (current_user_can('smartslider') || current_user_can('edit_posts') || current_user_can('edit_pages') || (Request::$GET->getCmd('h') === sha1(NONCE_SALT . date('Y-m-d') || Request::$GET->getCmd('h') === sha1(NONCE_SALT . date('Y-m-d', time() - 60 * 60 * 24))))) {
 
25
  try {
26
 
27
  $application = ApplicationSmartSlider3::getInstance();
28
 
29
  $applicationType = $application->getApplicationTypeFrontend();
30
 
31
+ $applicationType->process('PreRender' . Request::$GET->getCmd('n2controller'), Request::$GET->getCmd('n2action'));
32
 
33
  PageFlow::exitApplication();
34
  } catch (Exception $e) {
35
  exit;
36
  }
37
+ } else if (Request::$GET->getInt('sliderid') !== 0 && Request::$GET->getCmd('hash') !== null && md5(Request::$GET->getInt('sliderid') . NONCE_SALT) == Request::$GET->getCmd('hash')) {
38
  try {
39
  $application = ApplicationSmartSlider3::getInstance();
40
 
Nextend/SmartSlider3/Platform/WordPress/WordPressUpdate.php DELETED
@@ -1,145 +0,0 @@
1
- <?php
2
-
3
-
4
- namespace Nextend\SmartSlider3\Platform\WordPress;
5
-
6
-
7
- use Exception;
8
- use Nextend\Framework\Pattern\SingletonTrait;
9
- use Nextend\SmartSlider3\Application\Model\ModelLicense;
10
- use Nextend\SmartSlider3\SmartSlider3Info;
11
- use WP_Error;
12
-
13
- class WordPressUpdate {
14
-
15
- use SingletonTrait;
16
-
17
- protected function init() {
18
-
19
- add_filter('plugins_api', array(
20
- $this,
21
- 'plugins_api'
22
- ), 20, 3); // WooCommerce use priority 20, so better to follow
23
-
24
- add_filter('pre_set_site_transient_update_plugins', array(
25
- $this,
26
- 'injectUpdate'
27
- ));
28
-
29
- add_filter('upgrader_pre_download', array(
30
- $this,
31
- 'upgrader_pre_download'
32
- ), 10, 3);
33
- }
34
-
35
- public static function plugins_api($res, $action, $args) {
36
- if ($action === 'plugin_information' && $args->slug === NEXTEND_SMARTSLIDER_3_SLUG) {
37
- try {
38
- $a = (array)$args;
39
- $a['action'] = $action;
40
- $a['channel'] = SmartSlider3Info::$channel;
41
- $response = SmartSlider3Info::api($a);
42
-
43
- $res = (object)$response['data'];
44
- } catch (Exception $e) {
45
- $res = new WP_Error('error', $e->getMessage());
46
- }
47
- }
48
-
49
- return $res;
50
- }
51
-
52
- public static function injectUpdate($transient) {
53
-
54
- $filename = NEXTEND_SMARTSLIDER_3_BASENAME;
55
-
56
- if (is_object($transient) && !isset($transient->response[$filename])) {
57
-
58
- try {
59
- $response = SmartSlider3Info::api(array(
60
- 'action' => 'plugin_information',
61
- 'slug' => NEXTEND_SMARTSLIDER_3_SLUG,
62
- 'channel' => SmartSlider3Info::$channel
63
- ));
64
- if ($response['status'] == 'OK') {
65
- $item = (object)$response['data'];
66
- } else {
67
- throw new Exception();
68
- }
69
- } catch (Exception $e) {
70
- $item = new WP_Error('error', $e->getMessage());
71
- }
72
-
73
- if (!is_wp_error($item)) {
74
-
75
- $updateLink = SmartSlider3Info::api(array(
76
- 'action' => 'update',
77
- 'channel' => SmartSlider3Info::$channel
78
- ), true);
79
-
80
- $item->plugin = 'nextend-smart-slider3-pro/nextend-smart-slider3-pro.php';
81
- $item->package = $updateLink;
82
- $item->download_link = $updateLink;
83
- $item->versions = array();
84
- $item->versions[$item->version] = $updateLink;
85
-
86
- if (version_compare(SmartSlider3Info::$version, $item->version, '<')) {
87
- $transient->response[$filename] = (object)$item;
88
- unset($transient->no_update[$filename]);
89
- } else {
90
- $transient->no_update[$filename] = (object)$item;
91
- unset($transient->response[$filename]);
92
- }
93
-
94
-
95
- }
96
- }
97
-
98
- return $transient;
99
- }
100
-
101
- public function upgrader_pre_download($reply, $package, $upgrader) {
102
- if (strpos($package, 'product=smartslider3') === false) {
103
- return $reply;
104
- }
105
-
106
- $status = ModelLicense::getInstance()
107
- ->isActive(false);
108
-
109
- $message = '';
110
- switch ($status) {
111
- case 'OK':
112
- return $reply;
113
- case 'ASSET_PREMIUM':
114
- case 'LICENSE_EXPIRED':
115
- $message = 'Your <a href="https://smartslider.helpscoutdocs.com/article/1718-activation" target="_blank">license</a> has expired! Get new one: <a href="https://smartslider3.com/pricing" target="_blank">smartslider3.com</a>.';
116
- break;
117
- case 'DOMAIN_REGISTER_FAILED':
118
- $message = 'Smart Slider 3 Pro license is not registered on the current domain. Please activate this domain by following <a href="https://smartslider.helpscoutdocs.com/article/1718-activation" target="_blank">the license activation documentation</a>.';
119
- break;
120
- case 'LICENSE_INVALID':
121
- $message = 'Smart Slider 3 Pro license is not registered on the current domain. Please activate this domain by following <a href="https://smartslider.helpscoutdocs.com/article/1718-activation" target="_blank">the license activation documentation</a>.';
122
- ModelLicense::getInstance()
123
- ->setKey('');
124
- break;
125
- case 'PLATFORM_NOT_ALLOWED':
126
- $message = 'Your <a href="https://smartslider.helpscoutdocs.com/article/1718-activation" target="_blank">license</a> is not valid for WordPress! Get a license for WordPress: <a href="https://smartslider3.com/pricing" target="_blank">smartslider3.com</a>';
127
- break;
128
- case '503':
129
- $message = 'Licensing server is down, try again later!';
130
- break;
131
- case null:
132
- $message = 'Licensing server not reachable, try again later!';
133
- break;
134
- default:
135
- $message = 'Unknown error, please write an email to support@nextendweb.com with the following status: ' . $status;
136
- break;
137
- }
138
-
139
- $reply = new WP_Error('SS3_ERROR', $message);
140
- $upgrader->result = null;
141
- $upgrader->skin->result = $reply;
142
-
143
- return $reply;
144
- }
145
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Nextend/SmartSlider3/Renderable/Component/ComponentSlide.php CHANGED
@@ -123,7 +123,6 @@ class ComponentSlide extends AbstractComponent {
123
 
124
  $this->createProperty('backgroundVideoMp4', '');
125
  $this->createProperty('backgroundVideoOpacity', 100);
126
- $this->createProperty('backgroundVideoMuted', 1);
127
  $this->createProperty('backgroundVideoLoop', 1);
128
  $this->createProperty('backgroundVideoReset', 1);
129
  $this->createProperty('backgroundVideoMode', 'fill');
123
 
124
  $this->createProperty('backgroundVideoMp4', '');
125
  $this->createProperty('backgroundVideoOpacity', 100);
 
126
  $this->createProperty('backgroundVideoLoop', 1);
127
  $this->createProperty('backgroundVideoReset', 1);
128
  $this->createProperty('backgroundVideoMode', 'fill');
Nextend/SmartSlider3/Renderable/Item/ItemFactory.php CHANGED
@@ -23,7 +23,7 @@ use Nextend\SmartSlider3\Renderable\Item\YouTube\ItemYouTube;
23
 
24
  class ItemFactory {
25
 
26
- use SingletonTrait, PluggableTrait;
27
 
28
  public static $i = array();
29
  /** @var AbstractItem[][] */
@@ -172,7 +172,7 @@ class ItemFactory {
172
 
173
  $this->makePluggable('RenderableItem');
174
 
175
- OrderableTrait::uasort(self::$items);
176
 
177
  self::$itemGroups[n2_x('Basic', 'Layer group')] = array();
178
  self::$itemGroups[n2_x('Media', 'Layer group')] = array();
23
 
24
  class ItemFactory {
25
 
26
+ use SingletonTrait, PluggableTrait, OrderableTrait;
27
 
28
  public static $i = array();
29
  /** @var AbstractItem[][] */
172
 
173
  $this->makePluggable('RenderableItem');
174
 
175
+ self::uasort(self::$items);
176
 
177
  self::$itemGroups[n2_x('Basic', 'Layer group')] = array();
178
  self::$itemGroups[n2_x('Media', 'Layer group')] = array();
Nextend/SmartSlider3/SlideBuilder/BuilderComponentSlide.php CHANGED
@@ -21,7 +21,6 @@ class BuilderComponentSlide extends AbstractBuilderComponent {
21
  "backgroundMode" => "default",
22
  "backgroundVideoMp4" => "",
23
  "backgroundVideoOpacity" => 100,
24
- "backgroundVideoMuted" => 1,
25
  "backgroundVideoLoop" => 1,
26
  "backgroundVideoReset" => 1,
27
  "backgroundVideoMode" => "fill",
21
  "backgroundMode" => "default",
22
  "backgroundVideoMp4" => "",
23
  "backgroundVideoOpacity" => 100,
 
24
  "backgroundVideoLoop" => 1,
25
  "backgroundVideoReset" => 1,
26
  "backgroundVideoMode" => "fill",
Nextend/SmartSlider3/Slider/Cache/CacheSlider.php CHANGED
@@ -83,12 +83,12 @@ class CacheSlider extends Manifest {
83
 
84
  $generatorGroup = $generatorModel->getGeneratorGroup($group);
85
  if (!$generatorGroup) {
86
- echo n2_('Slider error! Generator group not found: ' . $group);
87
  } else {
88
 
89
  $generatorSource = $generatorGroup->getSource($type);
90
  if (!$generatorSource) {
91
- echo n2_('Slider error! Generator source not found: ' . $type);
92
  } else {
93
 
94
  $fileName .= call_user_func(array(
83
 
84
  $generatorGroup = $generatorModel->getGeneratorGroup($group);
85
  if (!$generatorGroup) {
86
+ echo esc_html(n2_('Slider error! Generator group not found: ') . $group);
87
  } else {
88
 
89
  $generatorSource = $generatorGroup->getSource($type);
90
  if (!$generatorSource) {
91
+ echo esc_html(n2_('Slider error! Generator source not found: ') . $type);
92
  } else {
93
 
94
  $fileName .= call_user_func(array(
Nextend/SmartSlider3/Slider/Feature/TranslateUrl.php CHANGED
@@ -19,7 +19,7 @@ class TranslateUrl {
19
  public function __construct($slider) {
20
 
21
  $this->slider = $slider;
22
- list($this->from, $this->to) = (array)Common::parse(Sanitize::esc_attr(Settings::get('translate-url', '||')));
23
  }
24
 
25
  public function replaceUrl($string) {
19
  public function __construct($slider) {
20
 
21
  $this->slider = $slider;
22
+ list($this->from, $this->to) = (array)Common::parse(esc_attr(Settings::get('translate-url', '||')));
23
  }
24
 
25
  public function replaceUrl($string) {
Nextend/SmartSlider3/Slider/ResponsiveType/ResponsiveTypeFactory.php CHANGED
@@ -11,7 +11,7 @@ use Nextend\SmartSlider3\Slider\Feature\Responsive;
11
 
12
  class ResponsiveTypeFactory {
13
 
14
- use SingletonTrait, PluggableTrait;
15
 
16
  /**
17
  * @var AbstractResponsiveType[]
@@ -64,7 +64,7 @@ class ResponsiveTypeFactory {
64
  $adminTypes[$name] = $type->createAdmin();
65
  }
66
 
67
- OrderableTrait::uasort($adminTypes);
68
 
69
  return $adminTypes;
70
  }
11
 
12
  class ResponsiveTypeFactory {
13
 
14
+ use SingletonTrait, PluggableTrait, OrderableTrait;
15
 
16
  /**
17
  * @var AbstractResponsiveType[]
64
  $adminTypes[$name] = $type->createAdmin();
65
  }
66
 
67
+ self::uasort($adminTypes);
68
 
69
  return $adminTypes;
70
  }
Nextend/SmartSlider3/Slider/Slide.php CHANGED
@@ -37,7 +37,12 @@ class Slide extends AbstractRenderableOwner {
37
 
38
  protected $title = '', $description = '', $thumbnail = '';
39
 
40
- public $parameters, $background = '';
 
 
 
 
 
41
 
42
  protected $html = '';
43
 
@@ -378,7 +383,7 @@ class Slide extends AbstractRenderableOwner {
378
  'class' => 'n2-ss-slide-thumbnail'
379
  ));
380
 
381
- $this->html .= Html::image($this->sliderObject->features->optimize->optimizeThumbnail($thumbnail), Sanitize::esc_attr($this->getThumbnailAltDynamic()), $attributes);
382
  }
383
  }
384
 
@@ -425,6 +430,9 @@ class Slide extends AbstractRenderableOwner {
425
  return $this->parameters->get('mobilelandscape', 1);
426
  }
427
 
 
 
 
428
  public function getHTML() {
429
  return $this->html;
430
  }
37
 
38
  protected $title = '', $description = '', $thumbnail = '';
39
 
40
+ public $parameters;
41
+
42
+ /**
43
+ * @var string contains escaped html data
44
+ */
45
+ public $background = '';
46
 
47
  protected $html = '';
48
 
383
  'class' => 'n2-ss-slide-thumbnail'
384
  ));
385
 
386
+ $this->html .= Html::image($this->sliderObject->features->optimize->optimizeThumbnail($thumbnail), esc_attr($this->getThumbnailAltDynamic()), $attributes);
387
  }
388
  }
389
 
430
  return $this->parameters->get('mobilelandscape', 1);
431
  }
432
 
433
+ /**
434
+ * @return string contains escaped html data
435
+ */
436
  public function getHTML() {
437
  return $this->html;
438
  }
Nextend/SmartSlider3/Slider/Slider.php CHANGED
@@ -81,6 +81,9 @@ class Slider extends AbstractRenderable {
81
  */
82
  public $assets;
83
 
 
 
 
84
  public $staticHtml = '';
85
 
86
  private $sliderRow;
81
  */
82
  public $assets;
83
 
84
+ /**
85
+ * @var string contains already escaped data
86
+ */
87
  public $staticHtml = '';
88
 
89
  private $sliderRow;
Nextend/SmartSlider3/Slider/SliderType/AbstractSliderTypeFrontend.php CHANGED
@@ -200,8 +200,8 @@ abstract class AbstractSliderTypeFrontend {
200
 
201
  }
202
 
203
-
204
- echo implode('', $svgs);
205
  }
206
 
207
  protected function initSliderBackground($selector) {
@@ -214,7 +214,7 @@ abstract class AbstractSliderTypeFrontend {
214
  $sliderCSS2 = '';
215
 
216
  if (!empty($backgroundImage)) {
217
- $sliderCSS2 .= 'background-image: URL(' . ResourceTranslator::toUrl($backgroundImage) . ');';
218
  }
219
  if (!empty($backgroundColor)) {
220
  $rgba = Color::hex2rgba($backgroundColor);
@@ -230,5 +230,7 @@ abstract class AbstractSliderTypeFrontend {
230
  }
231
 
232
  protected function getBackgroundVideo($params) {
 
 
233
  }
234
  }
200
 
201
  }
202
 
203
+ // PHPCS - Content already escaped
204
+ echo implode('', $svgs); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
205
  }
206
 
207
  protected function initSliderBackground($selector) {
214
  $sliderCSS2 = '';
215
 
216
  if (!empty($backgroundImage)) {
217
+ $sliderCSS2 .= 'background-image: url(' . ResourceTranslator::toUrl($backgroundImage) . ');';
218
  }
219
  if (!empty($backgroundColor)) {
220
  $rgba = Color::hex2rgba($backgroundColor);
230
  }
231
 
232
  protected function getBackgroundVideo($params) {
233
+ return '';
234
+
235
  }
236
  }
Nextend/SmartSlider3/Slider/SliderType/Block/SliderTypeBlockFrontend.php CHANGED
@@ -38,40 +38,46 @@ class SliderTypeBlockFrontend extends AbstractSliderTypeFrontend {
38
 
39
  $this->initParticleJS();
40
 
41
- echo $this->openSliderElement();
42
  ob_start();
43
 
44
  $slide = $this->slider->getActiveSlide();
45
  $slide->finalize();
46
  ?>
47
 
48
- <div class="n2-ss-slider-1 n2-ow"<?php echo empty($sliderCSS) ? '' : ' style="' . Sanitize::esc_attr($sliderCSS) . '"'; ?>>
49
  <div class="n2-ss-slider-2 n2-ow">
50
  <?php
51
- echo $this->getBackgroundVideo($params);
52
 
53
- echo Html::tag('div', array('class' => 'n2-ss-slide-backgrounds n2-ow-all'), $slide->background);
 
54
  ?>
55
  <div class="n2-ss-slider-3 n2-ow">
56
  <?php
57
  $this->displaySizeSVGs($css);
58
 
59
- echo $this->slider->staticHtml;
 
60
 
61
- echo Html::tag('div', Html::mergeAttributes($slide->attributes, $slide->linkAttributes, array(
62
- 'class' => 'n2-ss-slide n2-ow ' . $slide->classes,
63
- 'style' => $slide->style
 
64
  )), $slide->getHTML());
65
  ?>
66
  </div>
67
  <?php
 
68
  $this->renderShapeDividers();
69
  ?>
70
  </div>
71
  </div>
72
  <?php
73
- echo $this->widgets->wrapSlider(ob_get_clean());
74
- echo $this->closeSliderElement();
 
 
75
 
76
  $this->style .= $css->getCSS();
77
  }
38
 
39
  $this->initParticleJS();
40
 
41
+ echo wp_kses($this->openSliderElement(), Sanitize::$basicTags);
42
  ob_start();
43
 
44
  $slide = $this->slider->getActiveSlide();
45
  $slide->finalize();
46
  ?>
47
 
48
+ <div class="n2-ss-slider-1 n2-ow"<?php echo empty($sliderCSS) ? '' : ' style="' . esc_attr($sliderCSS) . '"'; ?>>
49
  <div class="n2-ss-slider-2 n2-ow">
50
  <?php
51
+ echo wp_kses($this->getBackgroundVideo($params), Sanitize::$videoTags);
52
 
53
+ // PHPCS - Content already escaped
54
+ echo Html::tag('div', array('class' => 'n2-ss-slide-backgrounds n2-ow-all'), $slide->background); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
55
  ?>
56
  <div class="n2-ss-slider-3 n2-ow">
57
  <?php
58
  $this->displaySizeSVGs($css);
59
 
60
+ // PHPCS - Content already escaped
61
+ echo $this->slider->staticHtml; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
62
 
63
+ // PHPCS - Content already escaped
64
+ echo Html::tag('div', Html::mergeAttributes($slide->attributes, $slide->linkAttributes, array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
65
+ 'class' => 'n2-ss-slide n2-ow ' . $slide->classes,
66
+ 'style' => $slide->style
67
  )), $slide->getHTML());
68
  ?>
69
  </div>
70
  <?php
71
+
72
  $this->renderShapeDividers();
73
  ?>
74
  </div>
75
  </div>
76
  <?php
77
+
78
+ // PHPCS - Content already escaped
79
+ echo $this->widgets->wrapSlider(ob_get_clean()); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
80
+ echo wp_kses($this->closeSliderElement(), Sanitize::$basicTags);
81
 
82
  $this->style .= $css->getCSS();
83
  }
Nextend/SmartSlider3/Slider/SliderType/Simple/SliderTypeSimpleFrontend.php CHANGED
@@ -54,31 +54,35 @@ class SliderTypeSimpleFrontend extends AbstractSliderTypeFrontend {
54
 
55
  $this->initBackgroundAnimation();
56
 
57
- echo $this->openSliderElement();
58
 
59
  ob_start();
60
 
61
  $slides = $this->slider->getSlides();
62
  ?>
63
 
64
- <div class="n2-ss-slider-1 n2_ss__touch_element n2-ow"<?php echo empty($sliderCSS) ? '' : ' style="' . Sanitize::esc_attr($sliderCSS) . '"'; ?>>
65
  <div class="n2-ss-slider-2 n2-ow">
66
  <?php
67
- echo $this->getBackgroundVideo($params);
68
  ?>
69
  <?php if ($this->backgroundAnimation): ?>
70
  <div class="n2-ss-background-animation n2-ow"></div>
71
  <?php endif; ?>
72
- <div class="n2-ss-slider-3 n2-ow"<?php echo empty($slideCSS) ? '' : ' style="' . $slideCSS . '"'; ?>>
73
 
74
  <?php
75
- echo $this->slider->staticHtml;
76
 
77
- echo Html::openTag('div', array('class' => 'n2-ss-slide-backgrounds n2-ow-all'));
 
 
 
78
  foreach ($slides as $slide) {
79
- echo $slide->background;
 
 
80
  }
81
- echo Html::closeTag('div');
82
  ?>
83
  <div class="n2-ss-slider-4 n2-ow">
84
  <?php
@@ -87,9 +91,10 @@ class SliderTypeSimpleFrontend extends AbstractSliderTypeFrontend {
87
  foreach ($slides as $slide) {
88
  $slide->finalize();
89
 
90
- echo Html::tag('div', Html::mergeAttributes($slide->attributes, $slide->linkAttributes, array(
91
- 'class' => 'n2-ss-slide n2-ow ' . $slide->classes,
92
- 'style' => $slide->style
 
93
  )), $slide->getHTML());
94
  }
95
  ?>
@@ -101,9 +106,11 @@ class SliderTypeSimpleFrontend extends AbstractSliderTypeFrontend {
101
  </div>
102
  </div>
103
  <?php
104
- echo $this->widgets->wrapSlider(ob_get_clean());
105
 
106
- echo $this->closeSliderElement();
 
 
 
107
 
108
  $this->javaScriptProperties['mainanimation'] = array(
109
  'type' => $params->get('animation'),
54
 
55
  $this->initBackgroundAnimation();
56
 
57
+ echo wp_kses($this->openSliderElement(), Sanitize::$basicTags);
58
 
59
  ob_start();
60
 
61
  $slides = $this->slider->getSlides();
62
  ?>
63
 
64
+ <div class="n2-ss-slider-1 n2_ss__touch_element n2-ow"<?php echo empty($sliderCSS) ? '' : ' style="' . esc_attr($sliderCSS) . '"'; ?>>
65
  <div class="n2-ss-slider-2 n2-ow">
66
  <?php
67
+ echo wp_kses($this->getBackgroundVideo($params), Sanitize::$videoTags);
68
  ?>
69
  <?php if ($this->backgroundAnimation): ?>
70
  <div class="n2-ss-background-animation n2-ow"></div>
71
  <?php endif; ?>
72
+ <div class="n2-ss-slider-3 n2-ow"<?php echo empty($slideCSS) ? '' : ' style="' . esc_attr($slideCSS) . '"'; ?>>
73
 
74
  <?php
 
75
 
76
+ // PHPCS - Content already escaped
77
+ echo $this->slider->staticHtml; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
78
+
79
+ echo wp_kses(Html::openTag('div', array('class' => 'n2-ss-slide-backgrounds n2-ow-all')), Sanitize::$basicTags);
80
  foreach ($slides as $slide) {
81
+
82
+ // PHPCS - Content already escaped
83
+ echo $slide->background; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
84
  }
85
+ echo wp_kses(Html::closeTag('div'), Sanitize::$basicTags);
86
  ?>
87
  <div class="n2-ss-slider-4 n2-ow">
88
  <?php
91
  foreach ($slides as $slide) {
92
  $slide->finalize();
93
 
94
+ // PHPCS - Content already escaped
95
+ echo Html::tag('div', Html::mergeAttributes($slide->attributes, $slide->linkAttributes, array( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
96
+ 'class' => 'n2-ss-slide n2-ow ' . $slide->classes,
97
+ 'style' => $slide->style
98
  )), $slide->getHTML());
99
  }
100
  ?>
106
  </div>
107
  </div>
108
  <?php
 
109
 
110
+ // PHPCS - Content already escaped
111
+ echo $this->widgets->wrapSlider(ob_get_clean()); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
112
+
113
+ echo wp_kses($this->closeSliderElement(), Sanitize::$basicTags);
114
 
115
  $this->javaScriptProperties['mainanimation'] = array(
116
  'type' => $params->get('animation'),
Nextend/SmartSlider3/Slider/SliderType/SliderTypeFactory.php CHANGED
@@ -11,7 +11,7 @@ use Nextend\SmartSlider3\Slider\Slider;
11
 
12
  class SliderTypeFactory {
13
 
14
- use SingletonTrait, PluggableTrait;
15
 
16
  /**
17
  * @var AbstractSliderType[]
@@ -67,7 +67,7 @@ class SliderTypeFactory {
67
  }
68
  }
69
 
70
- OrderableTrait::uasort($adminTypes);
71
 
72
  return $adminTypes;
73
  }
11
 
12
  class SliderTypeFactory {
13
 
14
+ use SingletonTrait, PluggableTrait, OrderableTrait;
15
 
16
  /**
17
  * @var AbstractSliderType[]
67
  }
68
  }
69
 
70
+ self::uasort($adminTypes);
71
 
72
  return $adminTypes;
73
  }
Nextend/SmartSlider3/Slider/Slides.php CHANGED
@@ -100,6 +100,11 @@ class Slides {
100
  shuffle($slides);
101
  }
102
 
 
 
 
 
 
103
  if ($this->maximumSlideCount > 0) {
104
  $mustShowSlides = array();
105
  if (!empty($slidesData)) {
@@ -124,11 +129,6 @@ class Slides {
124
 
125
  }
126
 
127
- $reverse = intval($this->slider->params->get('reverse-slides', 0));
128
- if ($reverse) {
129
- $slides = array_reverse($slides);
130
- }
131
-
132
  if (!$randomizeCache && $randomizeFirst) {
133
  $this->slider->setActiveSlide($slides[mt_rand(0, count($slides) - 1)]);
134
  } else {
100
  shuffle($slides);
101
  }
102
 
103
+ $reverse = intval($this->slider->params->get('reverse-slides', 0));
104
+ if ($reverse) {
105
+ $slides = array_reverse($slides);
106
+ }
107
+
108
  if ($this->maximumSlideCount > 0) {
109
  $mustShowSlides = array();
110
  if (!empty($slidesData)) {
129
 
130
  }
131
 
 
 
 
 
 
132
  if (!$randomizeCache && $randomizeFirst) {
133
  $this->slider->setActiveSlide($slides[mt_rand(0, count($slides) - 1)]);
134
  } else {
Nextend/SmartSlider3/SliderManager/SliderManager.php CHANGED
@@ -90,6 +90,11 @@ class SliderManager {
90
  return $this->slider;
91
  }
92
 
 
 
 
 
 
93
  public function render($cache = false) {
94
  if ($this->hasError) {
95
  return '';
90
  return $this->slider;
91
  }
92
 
93
+ /**
94
+ * @param $cache
95
+ *
96
+ * @return string contains already escaped data
97
+ */
98
  public function render($cache = false) {
99
  if ($this->hasError) {
100
  return '';
Nextend/SmartSlider3/SmartSlider3Info.php CHANGED
@@ -7,6 +7,7 @@ use Nextend\Framework\Api;
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Notification\Notification;
9
  use Nextend\Framework\Platform\Platform;
 
10
  use Nextend\Framework\Url\Url;
11
  use Nextend\Framework\Url\UrlHelper;
12
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
@@ -14,15 +15,15 @@ use Nextend\SmartSlider3\Application\Model\ModelLicense;
14
 
15
  class SmartSlider3Info {
16
 
17
- public static $version = '3.5.1.7';
18
 
19
  public static $channel = 'stable';
20
 
21
- public static $revision = '6da043836534827654088675078f4dcfd1ded6e7';
22
 
23
- public static $revisionShort = '6da04383';
24
 
25
- public static $branch = 'release-3.5.1.7';
26
 
27
  public static $completeVersion;
28
 
@@ -114,13 +115,13 @@ class SmartSlider3Info {
114
  public static function getDomain() {
115
  $domain = parse_url(Url::getSiteUri(), PHP_URL_HOST);
116
  if (empty($domain)) {
117
- if (isset($_SERVER['HTTP_HOST'])) {
118
 
119
- $domain = $_SERVER['HTTP_HOST'];
120
  }
121
- if (empty($domain) && isset($_SERVER['SERVER_NAME'])) {
122
 
123
- $domain = $_SERVER['SERVER_NAME'];
124
  }
125
  }
126
 
7
  use Nextend\Framework\Asset\Js\Js;
8
  use Nextend\Framework\Notification\Notification;
9
  use Nextend\Framework\Platform\Platform;
10
+ use Nextend\Framework\Request\Request;
11
  use Nextend\Framework\Url\Url;
12
  use Nextend\Framework\Url\UrlHelper;
13
  use Nextend\SmartSlider3\Application\ApplicationSmartSlider3;
15
 
16
  class SmartSlider3Info {
17
 
18
+ public static $version = '3.5.1.9';
19
 
20
  public static $channel = 'stable';
21
 
22
+ public static $revision = 'e122aaff11bdb7dcf3f29d7722c73a9a6f51f552';
23
 
24
+ public static $revisionShort = 'e122aaff';
25
 
26
+ public static $branch = 'release-3.5.1.9';
27
 
28
  public static $completeVersion;
29
 
115
  public static function getDomain() {
116
  $domain = parse_url(Url::getSiteUri(), PHP_URL_HOST);
117
  if (empty($domain)) {
118
+ if (Request::$SERVER->getVar('HTTP_HOST') !== null) {
119
 
120
+ $domain = Request::$SERVER->getVar('HTTP_HOST');
121
  }
122
+ if (empty($domain) && Request::$SERVER->getVar('SERVER_NAME') !== null) {
123
 
124
+ $domain = Request::$SERVER->getVar('SERVER_NAME');
125
  }
126
  }
127
 
Nextend/SmartSlider3/Widget/SliderWidget.php CHANGED
@@ -93,6 +93,11 @@ class SliderWidget {
93
  $this->placementAdvanced->add($renderCallback, $horizontalSide, $horizontalPosition, $horizontalUnit, $verticalSide, $verticalPosition, $verticalUnit);
94
  }
95
 
 
 
 
 
 
96
  public function wrapSlider($innerHTML) {
97
 
98
  $insideAbsoluteHTML = '';
93
  $this->placementAdvanced->add($renderCallback, $horizontalSide, $horizontalPosition, $horizontalUnit, $verticalSide, $verticalPosition, $verticalUnit);
94
  }
95
 
96
+ /**
97
+ * @param $innerHTML
98
+ *
99
+ * @return mixed|string contains already escaped data
100
+ */
101
  public function wrapSlider($innerHTML) {
102
 
103
  $insideAbsoluteHTML = '';
Nextend/WordPress/Fail.php CHANGED
@@ -1,5 +1,7 @@
1
  <?php
2
 
 
 
3
  if (!function_exists('smartslider3_admin_menu')) {
4
  if (!defined('NEXTEND_SMARTSLIDER_3_URL_PATH')) {
5
  define('NEXTEND_SMARTSLIDER_3_URL_PATH', 'smart-slider3');
@@ -14,13 +16,13 @@ if (!function_exists('smartslider3_admin_menu')) {
14
  function smartslider3_admin_error() {
15
  }
16
 
17
- if (isset($_GET['page']) && $_GET['page'] == NEXTEND_SMARTSLIDER_3_URL_PATH) {
18
  if (!version_compare(PHP_VERSION, '7.0', '>=')) {
19
 
20
- wp_die(sprintf('<div class="error">%s</div>', wpautop(sprintf('Smart Slider 3 requires PHP version 7.0+, plugin is currently NOT RUNNING. Current PHP version: %1$s. %2$s%2$s Consult your host about %3$s upgrading your PHP version%4$s.', PHP_VERSION, '<br>', '<a href="https://wordpress.org/support/update-php/" target="_blank">', '</a>'))));
21
  } else if (!version_compare(get_bloginfo('version'), '4.9', '>=')) {
22
 
23
- wp_die(sprintf('<div class="error">%s</div>', wpautop('Smart Slider 3 requires WordPress version 4.9+. Because you are using an earlier version, the plugin is currently NOT RUNNING.')));
24
  }
25
  }
26
  }
@@ -28,14 +30,14 @@ if (!function_exists('smartslider3_admin_menu')) {
28
 
29
  if (!function_exists('smartslider3_fail_php_version')) {
30
  function smartslider3_fail_php_version() {
31
- $html_message = sprintf('<div class="error">%s</div>', wpautop(sprintf('Smart Slider 3 requires PHP version 7.0+, plugin is currently NOT RUNNING. Current PHP version: %1$s. %2$s%2$s Consult your host about %3$s upgrading your PHP version%4$s.', PHP_VERSION, '<br>', '<a href="https://wordpress.org/support/update-php/" target="_blank">', '</a>')));
32
  echo wp_kses_post($html_message);
33
  }
34
  }
35
 
36
  if (!function_exists('smartslider3_fail_wp_version')) {
37
  function smartslider3_fail_wp_version() {
38
- $html_message = sprintf('<div class="error">%s</div>', wpautop('Smart Slider 3 requires WordPress version 4.9+. Because you are using an earlier version, the plugin is currently NOT RUNNING.'));
39
  echo wp_kses_post($html_message);
40
  }
41
  }
1
  <?php
2
 
3
+ use Nextend\Framework\Request\Request;
4
+
5
  if (!function_exists('smartslider3_admin_menu')) {
6
  if (!defined('NEXTEND_SMARTSLIDER_3_URL_PATH')) {
7
  define('NEXTEND_SMARTSLIDER_3_URL_PATH', 'smart-slider3');
16
  function smartslider3_admin_error() {
17
  }
18
 
19
+ if (Request::$GET->getVar('page') == NEXTEND_SMARTSLIDER_3_URL_PATH) {
20
  if (!version_compare(PHP_VERSION, '7.0', '>=')) {
21
 
22
+ wp_die(sprintf('<div class="error"><p>%s</p></div>', sprintf('Smart Slider 3 requires PHP version 7.0+, plugin is currently NOT RUNNING. Current PHP version: %1$s. %2$s%2$s Consult your host about %3$s upgrading your PHP version%4$s.', PHP_VERSION, '<br>', '<a href="https://wordpress.org/support/update-php/" target="_blank">', '</a>')));
23
  } else if (!version_compare(get_bloginfo('version'), '4.9', '>=')) {
24
 
25
+ wp_die(sprintf('<div class="error"><p>%s</p></div>', 'Smart Slider 3 requires WordPress version 4.9+. Because you are using an earlier version, the plugin is currently NOT RUNNING.'));
26
  }
27
  }
28
  }
30
 
31
  if (!function_exists('smartslider3_fail_php_version')) {
32
  function smartslider3_fail_php_version() {
33
+ $html_message = sprintf('<div class="error"><p>%s</p></div>', sprintf('Smart Slider 3 requires PHP version 7.0+, plugin is currently NOT RUNNING. Current PHP version: %1$s. %2$s%2$s Consult your host about %3$s upgrading your PHP version%4$s.', PHP_VERSION, '<br>', '<a href="https://wordpress.org/support/update-php/" target="_blank">', '</a>'));
34
  echo wp_kses_post($html_message);
35
  }
36
  }
37
 
38
  if (!function_exists('smartslider3_fail_wp_version')) {
39
  function smartslider3_fail_wp_version() {
40
+ $html_message = sprintf('<div class="error"><p>%s</p></div>', 'Smart Slider 3 requires WordPress version 4.9+. Because you are using an earlier version, the plugin is currently NOT RUNNING.');
41
  echo wp_kses_post($html_message);
42
  }
43
  }
Public/SmartSlider3/Application/Admin/Assets/dist/smartslider-admin.min.css CHANGED
@@ -1 +1 @@
1
- @font-face{font-family:'Inter-Nextend';font-style:normal;font-weight:400;src:url(../fonts/Inter-Medium.woff2) format("woff2");font-display:block}@font-face{font-family:'Inter-Nextend';font-style:normal;font-weight:700;src:url(../fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:'SmartSliderIcons';src:url(../fonts/SmartSliderIcons.woff2?JC0JNU) format("woff2");font-weight:400;font-style:normal}.ssi_16,.ssi_24,.ssi_32,.ssi_48,.ssi_64{font-family:'SmartSliderIcons'!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssi_16{font-size:16px!important}.ssi_24{font-size:24px!important}.ssi_32{font-size:32px!important}.ssi_48{font-size:48px!important}.ssi_64{font-size:64px!important}.ssi_16--animation::before{content:"\E91F"}.ssi_16--arrowdown::before{content:"\E14B"}.ssi_16--arrowright::before{content:"\E15E"}.ssi_16--bold::before{content:"\E601"}.ssi_16--breadcrumb::before{content:"\E91E"}.ssi_16--bringforward::before{content:"\E15F"}.ssi_16--bringfront::before{content:"\E143"}.ssi_16--buttonarrow::before{content:"\E155"}.ssi_16--check::before{content:"\E600"}.ssi_16--circularremove::before{content:"\E62C"}.ssi_16--clearanimation::before{content:"\E948"}.ssi_16--cog::before{content:"\E934"}.ssi_16--color::before{content:"\E144"}.ssi_16--column::before{content:"\E145"}.ssi_16--content::before{content:"\E146"}.ssi_16--copy::before{content:"\E907"}.ssi_16--crop::before{content:"\E161"}.ssi_16--dashboard::before{content:"\E149"}.ssi_16--data::before{content:"\E152"}.ssi_16--delete::before{content:"\E612"}.ssi_16--desktoplandscape::before{content:"\E95a"}.ssi_16--desktopportrait::before{content:"\E925"}.ssi_16--divide::before{content:"\E639"}.ssi_16--download::before{content:"\E162"}.ssi_16--dummy::before{content:"\E15D"}.ssi_16--duplicate::before{content:"\E611"}.ssi_16--edit::before{content:"\E154"}.ssi_16--eye::before{content:"\E60F"}.ssi_16--filledcheck::before{content:"\E60C"}.ssi_16--filledremove::before{content:"\E62D"}.ssi_16--folderclosed::before{content:"\E921"}.ssi_16--folderopened::before{content:"\E922"}.ssi_16--fontresize::before{content:"\E650"}.ssi_16--fullscreen::before{content:"\E163"}.ssi_16--grid::before{content:"\E164"}.ssi_16--group::before{content:"\E1B6"}.ssi_16--hide::before{content:"\E923"}.ssi_16--horizontalcenter::before{content:"\E646"}.ssi_16--horizontalleft::before{content:"\E647"}.ssi_16--horizontalright::before{content:"\E645"}.ssi_16--image::before{content:"\E14A"}.ssi_16--info::before{content:"\E620"}.ssi_16--italic::before{content:"\E615"}.ssi_16--keyboard::before{content:"\E165"}.ssi_16--layer::before{content:"\E935"}.ssi_16--link::before{content:"\E64D"}.ssi_16--magnifier::before{content:"\E1B9"}.ssi_16--miniarrowdown::before{content:"\E19E"}.ssi_16--miniarrowright::before{content:"\E19D"}.ssi_16--minidesktopportrait::before{content:"\E980"}.ssi_16--mobilelandscape::before{content:"\E929"}.ssi_16--mobileportrait::before{content:"\E92A"}.ssi_16--mobileportraitlarge::before{content:"\E1AB"}.ssi_16--more::before{content:"\E911"}.ssi_16--none::before{content:"\E971"}.ssi_16--off::before{content:"\E19A"}.ssi_16--on::before{content:"\E199"}.ssi_16--order::before{content:"\E1B7"}.ssi_16--paginatiorarrow::before{content:"\E1B8"}.ssi_16--paste::before{content:"\E908"}.ssi_16--pause::before{content:"\E606"}.ssi_16--play::before{content:"\E605"}.ssi_16--plus::before{content:"\E92F"}.ssi_16--position::before{content:"\E14E"}.ssi_16--remove::before{content:"\E90A"}.ssi_16--rename::before{content:"\E19C"}.ssi_16--reset::before{content:"\E946"}.ssi_16--resize::before{content:"\E19F"}.ssi_16--row::before{content:"\E14F"}.ssi_16--save::before{content:"\E947"}.ssi_16--selectarrow::before{content:"\E638"}.ssi_16--sendback::before{content:"\E166"}.ssi_16--sendbackward::before{content:"\E167"}.ssi_16--shrink::before{content:"\E196"}.ssi_16--slides::before{content:"\E151"}.ssi_16--smart::before{content:"\E147"}.ssi_16--star::before{content:"\E603"}.ssi_16--stop::before{content:"\E607"}.ssi_16--style::before{content:"\E169"}.ssi_16--tabletlandscape::before{content:"\E927"}.ssi_16--tabletportrait::before{content:"\E928"}.ssi_16--tabletportraitlarge::before{content:"\E1AC"}.ssi_16--textcenter::before{content:"\E614"}.ssi_16--textjustify::before{content:"\E60B"}.ssi_16--textleft::before{content:"\E60A"}.ssi_16--textright::before{content:"\E604"}.ssi_16--underline::before{content:"\E602"}.ssi_16--unlink::before{content:"\E64B"}.ssi_16--up::before{content:"\E16A"}.ssi_16--verticalaround::before{content:"\E97B"}.ssi_16--verticalbetween::before{content:"\E97A"}.ssi_16--verticalbottom::before{content:"\E97F"}.ssi_16--verticalcenter::before{content:"\E97E"}.ssi_16--verticaltop::before{content:"\E97C"}.ssi_16--video::before{content:"\E153"}.ssi_16--wordpress::before{content:"\E197"}.ssi_24--active::before{content:"\D7FD"}.ssi_24--animation::before{content:"\E115"}.ssi_24--attention::before{content:"\E195"}.ssi_24--bounce::before{content:"\E998"}.ssi_24--button::before{content:"\E192"}.ssi_24--check::before{content:"\E14C"}.ssi_24--circularcheck::before{content:"\E129"}.ssi_24--circularinfo::before{content:"\E11B"}.ssi_24--close::before{content:"\E116"}.ssi_24--cog::before{content:"\E15C"}.ssi_24--col2::before{content:"\E193"}.ssi_24--desktop::before{content:"\E11A"}.ssi_24--desktoplandscape::before{content:"\E119"}.ssi_24--dummy::before{content:"\E17B"}.ssi_24--edit::before{content:"\E117"}.ssi_24--fade::before{content:"\E993"}.ssi_24--flip::before{content:"\E996"}.ssi_24--heading::before{content:"\E17E"}.ssi_24--image::before{content:"\E191"}.ssi_24--info::before{content:"\E14D"}.ssi_24--layers::before{content:"\E11C"}.ssi_24--mobilelandscape::before{content:"\E11D"}.ssi_24--mobileportrait::before{content:"\E11E"}.ssi_24--mobileportraitlarge::before{content:"\E1AD"}.ssi_24--more::before{content:"\E17D"}.ssi_24--move::before{content:"\E995"}.ssi_24--newwindow::before{content:"\E1A2"}.ssi_24--notification::before{content:"\E99F"}.ssi_24--orientation::before{content:"\E1A1"}.ssi_24--play::before{content:"\E11F"}.ssi_24--preview::before{content:"\E121"}.ssi_24--redo::before{content:"\E122"}.ssi_24--refresh::before{content:"\E194"}.ssi_24--remove::before{content:"\E16B"}.ssi_24--reveal::before{content:"\E992"}.ssi_24--rotate::before{content:"\E999"}.ssi_24--scale::before{content:"\E994"}.ssi_24--smart::before{content:"\E16C"}.ssi_24--special::before{content:"\E997"}.ssi_24--star::before{content:"\E1A4"}.ssi_24--stop::before{content:"\E16D"}.ssi_24--style::before{content:"\E123"}.ssi_24--tabletlandscape::before{content:"\E124"}.ssi_24--tabletportrait::before{content:"\E125"}.ssi_24--tabletportraitlarge::before{content:"\E1AE"}.ssi_24--text::before{content:"\E17F"}.ssi_24--timeline::before{content:"\E126"}.ssi_24--undo::before{content:"\E127"}.ssi_32--animatedheading::before{content:"\E991"}.ssi_32--area::before{content:"\E937"}.ssi_32--audio::before{content:"\E986"}.ssi_32--beforeafter::before{content:"\E1B4"}.ssi_32--button::before{content:"\E942"}.ssi_32--circlecounter::before{content:"\E985"}.ssi_32--col1::before{content:"\E112"}.ssi_32--col2::before{content:"\E113"}.ssi_32--col3::before{content:"\E157"}.ssi_32--countdown::before{content:"\E1B5"}.ssi_32--counter::before{content:"\E984"}.ssi_32--dummy::before{content:"\E15B"}.ssi_32--heading::before{content:"\E945"}.ssi_32--highlightheading::before{content:"\E990"}.ssi_32--html::before{content:"\E93A"}.ssi_32--icon::before{content:"\E941"}.ssi_32--iframe::before{content:"\E938"}.ssi_32--image::before{content:"\E943"}.ssi_32--imagearea::before{content:"\E950"}.ssi_32--imagebox::before{content:"\E983"}.ssi_32--imagecaption::before{content:"\E940"}.ssi_32--input::before{content:"\E939"}.ssi_32--joomla::before{content:"\E19B"}.ssi_32--list::before{content:"\E93E"}.ssi_32--plus::before{content:"\E114"}.ssi_32--progressbar::before{content:"\E982"}.ssi_32--smart::before{content:"\E16E"}.ssi_32--text::before{content:"\E944"}.ssi_32--transition::before{content:"\E93F"}.ssi_32--video::before{content:"\E93B"}.ssi_32--vimeo::before{content:"\E93C"}.ssi_32--youtube::before{content:"\E93D"}.ssi_48--bug::before{content:"\E17C"}.ssi_48--camera::before{content:"\E141"}.ssi_48--convert::before{content:"\E134"}.ssi_48--data::before{content:"\E13E"}.ssi_48--delete::before{content:"\E135"}.ssi_48--doc::before{content:"\E13B"}.ssi_48--drop::before{content:"\E136"}.ssi_48--dummy::before{content:"\E159"}.ssi_48--dynamic::before{content:"\E98F"}.ssi_48--empty::before{content:"\E98E"}.ssi_48--error::before{content:"\E137"}.ssi_48--grid::before{content:"\E16F"}.ssi_48--group::before{content:"\E139"}.ssi_48--help::before{content:"\E13A"}.ssi_48--image::before{content:"\E98D"}.ssi_48--keyboard::before{content:"\E171"}.ssi_48--link::before{content:"\E13C"}.ssi_48--newsletter::before{content:"\E13D"}.ssi_48--plus::before{content:"\D7FE"}.ssi_48--post::before{content:"\E98B"}.ssi_48--protect::before{content:"\E133"}.ssi_48--remove::before{content:"\E156"}.ssi_48--review0::before{content:"\E13F"}.ssi_48--review1::before{content:"\E1A5"}.ssi_48--review2::before{content:"\E1A6"}.ssi_48--review3::before{content:"\E1A7"}.ssi_48--review4::before{content:"\E1A9"}.ssi_48--review5::before{content:"\E1AA"}.ssi_48--static::before{content:"\E98A"}.ssi_48--upgrade::before{content:"\E1A3"}.ssi_48--video::before{content:"\E989"}.ssi_64--accordionslider::before{content:"\E12A"}.ssi_64--auto::before{content:"\E17A"}.ssi_64--block::before{content:"\E12B"}.ssi_64--blurfit::before{content:"\E172"}.ssi_64--carousel::before{content:"\E12C"}.ssi_64--center::before{content:"\E173"}.ssi_64--drop::before{content:"\E12D"}.ssi_64--dummy::before{content:"\E15A"}.ssi_64--fill::before{content:"\E174"}.ssi_64--fit::before{content:"\E175"}.ssi_64--folder::before{content:"\E957"}.ssi_64--folderup::before{content:"\E63E"}.ssi_64--fullwidthslider::before{content:"\E132"}.ssi_64--image::before{content:"\E176"}.ssi_64--page::before{content:"\E12E"}.ssi_64--showcase::before{content:"\E12F"}.ssi_64--slider::before{content:"\E131"}.ssi_64--stretch::before{content:"\E177"}.ssi_64--tile::before{content:"\E179"}.n2_color_picker{position:fixed;top:0;left:0;z-index:10000000;border:2px solid #b9c3c9;border-radius:3px;background-color:#fff;width:min-content;display:grid;grid-gap:10px;grid-template-columns:auto auto auto auto;padding:10px;user-select:none}.n2_color_picker.n2_color_picker--has-opacity{grid-template-columns:auto auto auto auto auto}.n2_color_picker__palette{width:min-content;display:grid;grid-gap:8px;grid-template-columns:1fr 1fr 1fr 1fr}.n2_color_picker__palette_item{width:20px;height:20px;overflow:hidden;border-radius:3px;cursor:pointer}.n2_color_picker__palette_item_color{width:100%;height:100%;background-color:var(--palette-item-color);box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset;border-radius:3px}.n2_color_picker__palette_item_alpha{display:none}.n2_color_picker--has-opacity .n2_color_picker__palette_item_alpha{display:block}.n2_color_picker__palette_history{width:min-content;display:grid;grid-gap:8px;grid-template-columns:1fr;border-left:1px solid rgba(0,0,0,.2);border-right:1px solid rgba(0,0,0,.2);padding:0 10px}.n2_color_picker__palette_history .n2_color_picker__palette_item:last-child{display:none}.n2_color_picker--has-opacity .n2_color_picker__palette_history .n2_color_picker__palette_item:last-child{display:block}.n2_color_picker__picker_area{padding:10px;width:min-content;display:grid;grid-template-columns:auto auto auto;grid-gap:10px;overflow:hidden}.n2_color_picker__picker_canvas{align-self:stretch;position:relative;width:140px;background-color:red;background-image:linear-gradient(to top,#000,rgba(204,154,129,0)),linear-gradient(to right,#fff,rgba(204,154,129,0));box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_canvas_dot{position:absolute;left:-5px;top:-5px;width:10px;height:10px;border-radius:10px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_color_picker__picker_hue{align-self:stretch;position:relative;width:20px;background:linear-gradient(to bottom,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_hue_dot{position:absolute;left:-3px;top:-3px;width:calc(100% + 6px);height:6px;border-radius:5px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_color_picker__picker_opacity{align-self:stretch;display:none;width:20px}.n2_color_picker--has-opacity .n2_color_picker__picker_opacity{display:block}.n2_color_picker__picker_opacity_inner{position:relative;width:100%;height:100%;box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_opacity_dot{position:absolute;left:-3px;top:-3px;width:calc(100% + 6px);height:6px;border-radius:5px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_checker_box{background-image:linear-gradient(45deg,gray 25%,transparent 25%),linear-gradient(-45deg,gray 25%,transparent 25%),linear-gradient(45deg,transparent 75%,gray 75%),linear-gradient(-45deg,transparent 75%,gray 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}#dolly{display:none!important}.toplevel_page_smart-slider3 #wpbody-content{padding-bottom:0!important}.toplevel_page_smart-slider3 #wpfooter{display:none}#wpbody-content #n2-admin{margin:10px 20px 20px 0}html[dir=rtl] #wpbody-content #n2-admin{margin:10px 0 0 20px}#wpbody-content #n2-admin a:focus{box-shadow:none}.n2 input{min-height:initial;border-radius:0}.n2 select{background:0 0;max-width:initial;min-height:26px;height:26px;font-size:12px;-webkit-appearance:menulist;-moz-appearance:menulist}.n2 select[multiple]{height:auto;-webkit-appearance:none;-moz-appearance:none}.n2_admin .n2_field_select select{background:#fff}html.n2_html--application-only{background:#fff}html.n2_html--application-only #wpbody{padding:0!important}html.n2_html--application-only.wp-toolbar{padding:0}html.n2_html--application-only,html.n2_html--application-only body{position:relative;height:auto;min-height:100vh;background:#fff}html.n2_html--application-only #wpadminbar,html.n2_html--application-only #adminmenuwrap,html.n2_html--application-only #adminmenuback,html.n2_html--application-only .update-nag{display:none!important}html.n2_html--application-only #wpcontent{margin:0!important;padding-left:0;padding-right:0}html.n2_html--application-only .updated,html.n2_html--application-only .error,html.n2_html--application-only .notice-error,html.n2_html--application-only .notice-success,html.n2_html--application-only .notice-warning,html.n2_html--application-only .notice-info,html.n2_html--application-only .notice,html.n2_html--application-only .wpuf-review-notice,html.n2_html--application-only .analytify-review-notice,html.n2_html--application-only .prompt-box+.overlay{display:none!important}.wp-block-nextend-smartslider3{position:relative;z-index:1;min-height:100px}.wp-block-nextend-smartslider3 iframe{pointer-events:none}.wp-block-nextend-smartslider3__button-container{display:inline-grid;grid-template-columns:auto auto;grid-gap:10px}.wp-customizer .n2_modal{z-index:1000030}.wp-customizer a.n2_button,.wp-customizer a.n2_button:HOVER,.wp-customizer a.n2_button:FOCUS{color:#fff}#gslogo-dummy-data-install--notice,.gslogo-admin-notice,.gslogo-review-notice{display:none!important}#a2020-admin-bar-app{z-index:100000}.a2020_admin_theme #wpwrap{display:block;vertical-align:top}.a2020_admin_theme #wpbody-content #n2-admin{margin:10px 20px 20px 20px}.n2_html--application-only .a2020_admin_theme #a2020-admin-bar-app{display:none!important}#uip-toolbar{display:none}html.wp-toolbar[uip-toolbar=true]{padding-top:0}.n2_admin{position:relative;min-width:980px}.n2_admin__header{position:relative;z-index:2000;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased}.n2_admin__header a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_admin__content{border-radius:0 0 3px 3px;border-left:1px solid #94b2c1;border-right:1px solid #94b2c1;border-bottom:1px solid #94b2c1;background-color:#f0f4f7;padding-bottom:40px;min-height:calc(100vh - 180px)}.n2_admin_ui{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased}.n2_admin_ui a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_admin_ui a:ACTIVE,.n2_admin_ui a:VISITED,.n2_admin_ui a:FOCUS,.n2_admin_ui a:LINK{text-decoration:none}.n2_admin_ui iframe{border:0}.n2_admin_ui [contenteditable=true]{-webkit-user-select:text;user-select:text}.n2_admin--empty{margin:0!important}.n2_admin--empty.n2_admin{min-width:0}.n2_nav_bar{position:relative;z-index:11;min-height:70px;display:flex;background-color:#1375e9;border-top-left-radius:3px;border-top-right-radius:3px}.n2_nav_bar__logo{flex:0 1 auto;display:flex;justify-content:center}.n2_nav_bar__logo a{display:inline-flex;align-items:center;justify-content:center}.n2_nav_bar__logo svg{max-width:none}.n2_nav_bar__menu{position:relative;z-index:2;flex:1 1 auto;padding:0 10px;width:100%;box-sizing:border-box;display:flex;justify-content:flex-end;align-items:center;margin-left:auto}@media only screen and (max-width:1600px){.n2_nav_bar__menu{width:auto}}.n2_nav_bar__menuitem{margin:10px}.n2_nav_bar__menuitem>a{display:block;padding:0 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:150px}.n2_nav_bar__menuitem a{font-size:14px;line-height:2}.n2_nav_bar__menuitem a,.n2_nav_bar__menuitem a:HOVER,.n2_nav_bar__menuitem a:FOCUS{color:#d0e3fb}.n2_breadcrumbs{padding:0 10px;white-space:nowrap;flex:1 1 auto;width:100%;box-sizing:border-box;position:relative;z-index:2;display:flex;align-items:center}@media only screen and (max-width:1600px){.n2_breadcrumbs{width:auto}}.n2_breadcrumbs__breadcrumb_button{display:flex;align-items:center;padding:0 8px;font-size:14px;line-height:2;text-transform:capitalize;font-weight:700}.n2_breadcrumbs__breadcrumb_button,.n2_breadcrumbs__breadcrumb_button:HOVER,.n2_breadcrumbs__breadcrumb_button:FOCUS{color:#d0e3fb}.n2_breadcrumbs__breadcrumb_button>*{margin:0 2px}.n2_breadcrumbs__breadcrumb_button>span{max-width:150px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_breadcrumbs__breadcrumb_button>.ssi_16{margin:0 3px}.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button,.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button:HOVER,.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button:FOCUS{color:#fff}.n2_breadcrumbs__arrow{font-size:16px;color:#d0e3fb}.n2_breadcrumbs__arrow .ssi_16{display:block}html[dir=rtl] .n2_breadcrumbs__arrow{transform:rotateZ(180deg)}.n2-admin-content-with-sidebar{display:flex}.n2-admin-content-with-sidebar__sidebar{flex:0 0 auto;width:340px;margin-left:-1px;background-color:#4d5d70;border-bottom-left-radius:3px;border-right:1px solid #212d3a;box-sizing:border-box}.n2-admin-content-with-sidebar__content{position:relative;min-height:1000px}.n2_top_bar_main{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:1020;margin-left:-1px;margin-right:-1px;position:-webkit-sticky;position:sticky;top:0;display:flex;flex-flow:row-reverse;background-color:#0c1924;padding:12px 10px}.n2_top_bar_main a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_top_bar_main .n2_top_bar_button_icon{font-size:24px;width:24px;height:24px}.n2_top_bar_main .n2_top_bar_button_icon,.n2_top_bar_main .n2_top_bar_button_icon:HOVER,.n2_top_bar_main .n2_top_bar_button_icon:FOCUS{color:#94b2c1}.n2_top_bar_main__primary{display:flex;flex-flow:row-reverse;align-items:center}.n2_top_bar_main__primary>*{margin:0 10px}.n2_top_bar_main__primary .n2_button_spacer{margin:0 10px;width:2px;height:32px}.n2_top_bar_main__primary .n2_button_spacer--visible{height:24px;background-color:#3a4956;border-radius:1px}.n2_top_bar_main__secondary{display:flex;align-items:center;margin-right:auto;padding-left:5px}.n2_top_bar_main__secondary>*{margin:0 5px}.n2_top_bar_group--narrow .n2_top_bar_group__inner{display:flex;flex-flow:row-reverse;margin:0 -5px;direction:ltr}.n2_top_bar_group--narrow .n2_top_bar_group__inner>*{margin:0 5px}.n2_header{position:relative;z-index:990;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;background-color:#fff;padding:30px 28px}.n2_header a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_header.n2_header--has-menu-items{padding-top:50px;padding-bottom:0}.n2_header__heading_container{margin:0 12px}.n2_header__content{display:flex;align-items:center}.n2_header__heading{display:flex;align-items:center}.n2_header__heading_primary{font-size:32px;line-height:1.25em;color:#283f4d}.n2_header__heading_after{font-size:24px;line-height:1em;color:#94b2c1;margin:0 15px}.n2_header__actions{margin-left:auto;display:flex}.n2_header__actions>*{margin:0 12px}html[dir=rtl] .n2_header__actions{margin-left:0;margin-right:auto}.n2_header__menu{margin:0 -8px;display:flex}.n2_header__menu_item{margin:0 20px;line-height:50px;font-size:16px;font-weight:700;text-transform:capitalize;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_header__menu_item,.n2_header__menu_item:ACTIVE,.n2_header__menu_item:VISITED,.n2_header__menu_item:FOCUS,.n2_header__menu_item:LINK{color:#325c77}.n2_header__menu_item--active,.n2_header__menu_item--active:ACTIVE,.n2_header__menu_item--active:VISITED,.n2_header__menu_item--active:FOCUS,.n2_header__menu_item--active:LINK{box-shadow:inset 0 -3px 0 0 #1375e9!important;color:#1375e9}.n2_notification_center{z-index:9999999999999;position:fixed;right:10px;bottom:0;display:flex;flex-flow:column;align-items:flex-end;width:auto;max-height:310px;padding:10px;overflow-y:auto;overflow-x:hidden}html[dir=rtl] .n2_notification_center{left:10px;right:auto}.n2_notification_center__message{max-width:500px;margin:10px;display:flex;align-items:center;background-color:#0c1924;border-radius:5px;padding:20px;transition:transform .5s ease-in-out .3s;transform:translateX(150%)}html[dir=rtl] .n2_notification_center__message{transform:translateX(-150%)}.n2_notification_center__message--animate{transform:translateX(0%)}html[dir=rtl] .n2_notification_center__message--animate{transform:translateX(0%)}.n2_notification_center__message--success{min-width:250px}.n2_notification_center__message_icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:100%;color:#fff}.n2_notification_center__message--success .n2_notification_center__message_icon{background-color:#04c018}.n2_notification_center__message--success .n2_notification_center__message_icon .ssi_24::before{content:"\E14C"}.n2_notification_center__message--notice .n2_notification_center__message_icon{background-color:#1d81f9}.n2_notification_center__message--notice .n2_notification_center__message_icon .ssi_24::before{content:"\E14D"}.n2_notification_center__message_content{flex:1 1 auto;padding:0 10px}.n2_notification_center__message_content_label{color:#fff;font-size:14px;line-height:20px;text-transform:uppercase}.n2_notification_center__message_content_description{font-size:14px;line-height:20px;color:#94b2c1}.n2_notification_center__message_action{flex:0 0 auto;margin:0 10px;background-color:#1d81f9;border-radius:3px;padding:0 10px;white-space:nowrap;font-size:11px;color:#fff;line-height:30px;cursor:pointer;text-transform:uppercase}.n2_notification_center__message_action:HOVER{background-color:#338ef9}.n2_body--fullscreen-editor-visible{overflow:hidden}.n2_fullscreen_editor{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100002;position:fixed;left:0;top:0;display:none;box-sizing:border-box;width:100%;height:100%;padding:20px;background:rgba(28,41,51,.8)}.n2_fullscreen_editor a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_fullscreen_editor--visible{display:block}.n2_fullscreen_editor__overlay{z-index:1;position:absolute;left:0;top:0;width:100%;height:100%;cursor:pointer}.n2_fullscreen_editor__window{z-index:2;position:relative;flex:1 1 auto;height:100%;display:flex;flex-flow:column;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_fullscreen_editor__window>iframe{display:block;width:100%;height:100%}.n2_fullscreen_editor__nav_bar{position:relative;z-index:2;display:flex;flex:0 0 auto;background-color:#0c1924}.n2_fullscreen_editor__nav_bar_label{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center;text-transform:capitalize}.n2_fullscreen_editor__nav_bar_actions{position:relative;z-index:2;flex:1 1 auto;display:flex;justify-content:flex-end;padding:12px 10px}.n2_fullscreen_editor__nav_bar_actions>*{margin:0 10px}.n2_fullscreen_editor__content{flex:1 1 auto;display:flex;overflow:hidden}.n2_fullscreen_editor__content_sidebar{position:relative;flex:0 0 340px;width:340px;overflow:auto;background-color:#3a4956}.n2_fullscreen_editor__content_sidebar_top_bar{position:-webkit-sticky;position:sticky;top:0}.n2_fullscreen_editor__save_as_new_container{padding:12px 20px}.n2_fullscreen_editor__save_as_new_container .n2_button{text-align:center;display:block}.n2_fullscreen_editor__visual{display:flex;align-items:center;padding:0 10px;background-color:#2c3a45;border-bottom:1px solid #1e2830}.n2_fullscreen_editor__visual--active{background-color:#1375e9;border-bottom:1px solid #1375e9}.n2_fullscreen_editor__visual_select_tick{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;border:2px solid #131c23;border-radius:3px;background-color:#2c3a45;cursor:pointer}.n2_fullscreen_editor__visual_select_tick .ssi_16{display:none;color:#fff}.n2_fullscreen_editor__visual--selected .n2_fullscreen_editor__visual_select_tick{background-color:#04c018;border-color:#04c018}.n2_fullscreen_editor__visual--selected .n2_fullscreen_editor__visual_select_tick .ssi_16{display:inline-block}.n2_fullscreen_editor__visual_label{flex:1 1 auto;padding:0 10px;color:#94b2c1;font-size:12px;line-height:44px;cursor:pointer}.n2_fullscreen_editor__visual--active .n2_fullscreen_editor__visual_label{color:#fff}.n2_fullscreen_editor__visual_action{display:inline-flex;align-items:center;justify-content:center;padding:5px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_fullscreen_editor__visual--active .n2_fullscreen_editor__visual_action{color:#fff}.n2_fullscreen_editor__content_content{position:relative;flex:1 1 auto;overflow:auto;background-color:#f0f4f7}.n2_iframe_application{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;display:flex;flex-flow:column;margin:0!important;min-width:0;height:100vh;overflow:hidden}.n2_iframe_application a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_iframe_application__nav_bar{position:relative;z-index:2;display:flex;flex:0 0 auto;height:60px;background-color:#0c1924}.n2_iframe_application__nav_bar_label{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center}.n2_iframe_application__nav_bar_actions{position:relative;z-index:2;flex:1 1 auto;display:flex;justify-content:flex-end;padding:12px 10px}.n2_iframe_application__nav_bar_actions>*{margin:0 10px}.n2_iframe_application__nav_bar_actions .n2_button_spacer{margin:0 10px;width:2px;height:32px}.n2_iframe_application__nav_bar_actions .n2_button_spacer--visible{height:24px;background-color:#3a4956;border-radius:1px}.n2_iframe_application__nav_bar_actions .n2_button_plain_icon{margin:0 5px}.n2_iframe_application__nav_bar_actions .n2_button_plain_icon,.n2_iframe_application__nav_bar_actions .n2_button_plain_icon:HOVER,.n2_iframe_application__nav_bar_actions .n2_button_plain_icon:FOCUS{color:#94b2c1}.n2_iframe_application__content{position:relative;flex:1 1 auto;overflow:auto;background-color:#f0f4f7}.n2_iframe_application__content .n2_form__table[data-field=table-shapedivider] .n2_field__label .ssi_16--minidesktopportrait{color:#325c77}.n2_admin_editor{margin:0!important;min-width:0}.n2_admin_editor_overlay{z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;display:flex;flex-flow:column;visibility:hidden}.n2_admin_editor_overlay__top{position:relative;z-index:10;flex:0 0 auto}.n2_admin_editor_overlay__top_bar_main{position:static;visibility:visible}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs{margin:0 -8px;padding:0}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button{color:#94b2c1}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button,.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button:HOVER,.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button:FOCUS{color:#94b2c1}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__arrow{color:#94b2c1}.n2_admin_editor__ui_slide_manager.n2_slide_manager{visibility:visible;position:absolute;left:0;top:60px;width:100%;height:calc(100vh - 60px)}.n2_admin_editor__ui_slide_manager.n2_slide_manager .n2_slide_manager__inner{overflow:auto;max-height:100%}.n2_admin_editor__content{display:flex;position:relative;box-sizing:border-box;width:100%;height:100vh;padding-top:75px;padding-left:65px;background:#f0f4f7}.n2_body--show-add-more .n2_admin_editor__content,.n2_body--attached-layer-list .n2_admin_editor__content{padding-bottom:0!important}.n2_admin_editor__content_inner{position:relative;flex:1 1 auto;background-color:#f0f4f7;overflow:auto}.n2_admin_editor_overlay--show-layer-navigation:not(.n2_admin_editor_overlay--show-add-more):not(.n2_admin_editor_overlay--attached-layer-list) .n2_slide_editor_timeline_toggle--show{display:none}.n2_admin_editor_overlay--show-layer-navigation.n2_admin_editor_overlay--attached-layer-list .n2_slide_editor_timeline_toggle--show{pointer-events:none}.n2_admin_editor_overlay--show-slides .n2_admin_editor_overlay__top_bar_main .n2_top_bar_main__primary{opacity:.5;pointer-events:none}.n2_top_bar_main__logo{flex:1 1 auto;overflow:hidden;display:flex;align-items:center;justify-content:center}.n2_top_bar_main__logo a{display:inline-block;padding:0 10px}.n2_top_bar_main__logo svg{vertical-align:top;display:inline-block}.n2_admin__banner{background-color:#1c2933;z-index:2;position:relative;color:#fff;align-items:center}.n2_admin__banner .n2_admin__banner_inner{max-width:500px;text-align:center;margin:0 auto;padding:40px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_title{font-size:22px;line-height:32px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_description{font-size:14px;color:#94b2c1;line-height:24px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_button{margin-top:20px}.n2_admin__banner .n2_admin__banner_close{margin:10px;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background-color:#6b7986;border-radius:100%;color:#fff;font-size:16px;cursor:pointer;position:absolute;top:0;right:0}.n2_admin__banner .n2_admin__banner_close:HOVER{background-color:#8694a2}.n2_free_need_more{padding:40px 0;display:flex;flex-flow:column;align-items:center;text-align:center}.n2_free_need_more__logo img{display:block;width:64px}.n2_free_need_more__title{margin-top:10px;font-size:16px;line-height:28px;font-weight:700;color:#fff}.n2_modal .n2_free_need_more__title{color:#283f4d}.n2_free_need_more__paragraph{max-width:270px;line-height:24px;font-size:14px;color:#bdcfd9}.n2_modal .n2_free_need_more__paragraph{color:#325c77}.n2_free_need_more__button{margin-top:10px;padding:0 25px;background-color:#1d81f9;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-transform:uppercase}.n2_free_need_more__button,.n2_free_need_more__button:HOVER,.n2_free_need_more__button:FOCUS{color:#fff}.n2_free_need_more__button:HOVER{background-color:#338ef9}.n2_body--inherit-cursor *{cursor:inherit!important}.n2_modal{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100003;position:fixed;left:0;top:0;display:none;box-sizing:border-box;width:100%;height:100%;padding:20px;background:rgba(28,41,51,.8);align-items:center;justify-content:center}.n2_modal a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_modal--visible{display:flex}.n2_modal__overlay{z-index:1;position:absolute;width:100%;height:100%;cursor:pointer}.n2_modal__window{position:relative;z-index:2;display:flex;flex-flow:column;width:100%;max-height:100%;border-radius:3px;box-shadow:0 2px 20px 0 rgba(0,0,0,.2)}.n2_modal--simple .n2_modal__window{border-radius:3px;overflow:hidden}.n2_modal--simple .n2_modal__body_outer{flex:1 1 auto;position:relative;background:#fff;border-radius:3px 3px 0 0;overflow:auto}.n2_modal--simple .n2_modal__body{padding:20px 40px 10px}.n2_modal--simple .n2_modal__close_wrap{position:sticky;top:0;height:0;display:flex;justify-content:flex-end}.n2_modal--simple .n2_modal__close{margin:10px;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background-color:#f0f4f7;border-radius:100%;color:#283f4d;font-size:16px;cursor:pointer}.n2_modal--simple .n2_modal__buttons{display:flex;flex:0 0 auto;background-color:#f0f4f7;height:56px;border-radius:0 0 3px 3px;border-top:1px solid #e4e9ec}.n2_modal--simple .n2_modal__buttons[data-buttons="0"]{display:none}.n2_modal--simple .n2_modal__buttons[data-buttons="1"] .n2_modal__button{width:100%;align-items:center;justify-content:center}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button{width:50%;align-items:center}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button:first-child{justify-content:flex-end;padding-right:10px}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button:last-child{justify-content:flex-start;padding-left:10px}.n2_modal--simple .n2_modal__button{display:flex}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables{display:flex;flex-wrap:wrap;padding:3px;background-color:#f0f4f7;border-radius:3px;max-height:130px;overflow-y:auto}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable{margin:3px;padding:0 10px;background-color:#94b2c1;border-radius:3px;color:#fff;font-size:11px;line-height:30px;cursor:pointer}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable:HOVER{background-color:#7f9caa}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable--selected{background-color:#1d81f9;color:#fff}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable--selected:HOVER{background-color:#1d81f9}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_result{padding:0 8px;background-color:#f0f4f7;border-radius:3px;height:80px;overflow-y:scroll;font-size:12px;line-height:30px;color:#325c77}.n2_modal--lightbox .n2_modal__window{height:100%}.n2_modal--lightbox .n2_modal__top_bar{position:relative;border-radius:3px 3px 0 0;background-color:#0c1924}.n2_modal--lightbox .n2_modal__top_bar_title{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center;text-transform:capitalize}.n2_modal--lightbox .n2_modal__top_bar_buttons{position:relative;z-index:2;display:flex;justify-content:flex-end;padding:12px 10px}.n2_modal--lightbox .n2_modal__top_bar_buttons>*{margin:0 10px}.n2_modal--lightbox .n2_modal__body{flex:1 1 auto;overflow:auto;background:#f0f4f7;border-radius:0 0 3px 3px}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__body{display:flex;overflow:hidden}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__sidebar{position:relative;flex:0 0 340px;width:340px;background-color:#3a4956}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__sidebar_inner{height:100%;overflow:auto}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__content{position:relative;flex:1 1 auto;background-color:#f0f4f7}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__content_inner{height:100%;overflow:auto}.n2_modal_icons__search_area{padding:10px 20px;background-color:#3a4956;border-bottom:1px solid #1e2830}.n2_modal_icons__search_area .n2_field__label{display:none}.n2_modal_icons__search_area .n2_field_text{display:flex}.n2_modal_icons__search_area .n2_field_text input{width:100%}.n2_modal_icons__list_item{background-color:#2c3a45;padding:0 10px;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:44px;cursor:pointer}.n2_modal_icons__list_item--active{background-color:#1d81f9;color:#fff}.n2_modal_icons__icon{display:inline-block;margin:5px;width:32px;height:32px;cursor:pointer;font-size:24px;line-height:32px;text-align:center;color:#000}.n2_modal_filesystem__content{display:flex;flex-wrap:wrap;padding:10px}.n2_modal_filesystem__content[data-mode=single] .n2_modal_filesystem_box--file,.n2_modal_filesystem__content[data-mode=multiple] .n2_modal_filesystem_box--file{cursor:pointer}.n2_modal_filesystem__current_path{width:100%;margin:0 10px;font-size:14px;line-height:30px;color:#325c77}.n2_modal_filesystem_box{position:relative;display:flex;flex-flow:column;justify-content:flex-end;margin:10px;width:160px;height:140px;border-radius:3px}.n2_modal_filesystem_box .n2-button{display:none}.n2_modal_filesystem_box--active{box-shadow:0 0 0 3px #1d81f9}.n2_modal_filesystem_box__image{height:100px;background-repeat:no-repeat;background-size:cover}.n2_modal_filesystem_box__icon{height:100px;display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_modal_filesystem_box__label{padding:0 15px;background-color:#fff;color:#325c77;font-size:12px;line-height:40px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.n2_modal_filesystem_box--upload{border:2px dashed #bdcfd9}.n2_modal_filesystem_box--upload .n2_modal_filesystem_box__icon{height:84px}.n2_modal_filesystem_box--upload .n2_modal_filesystem_box__label{line-height:20px;white-space:normal;overflow:visible;text-overflow:initial}.n2_modal_filesystem_box--directory-up{cursor:pointer}.n2_modal_filesystem_box--directory{cursor:pointer}.n2_modal_select_slider{position:relative;display:flex;flex-wrap:wrap;margin:0 auto;padding:24px}.n2_modal_select_slider__box{position:relative;flex:0 0 auto;width:270px;height:180px;border-radius:3px;margin:16px;background:#fff;cursor:pointer}.n2_modal[data-modal-type=select-slider] .n2_modal__window{max-width:980px;max-height:744px}.n2_modal--iframe .n2_modal__window{height:100%}.n2_modal--iframe iframe{width:100%;height:100%;border:0}.n2_modal__hotkey{display:flex;flex-wrap:wrap}.n2_modal__hotkey_column{flex:0 0 50%;padding:10px;box-sizing:border-box}.n2_modal__hotkey_group{padding:10px}.n2_modal__hotkey_row{display:flex;justify-content:space-between;margin:5px 0}.n2_modal__hotkey_text{font-size:12px;line-height:28px;color:#325c77}.n2_modal__hotkey_key{font-size:11px;font-weight:700;line-height:30px;text-transform:uppercase;color:#fff;background:#94b2c1;border-radius:3px;padding:0 10px;min-width:11px;text-align:center;margin-left:5px}.n2_modal__hotkey_key:last-child{background:#1d81f9}.n2_modal__hotkey_keys{display:flex}.n2_modal__hotkey_title{text-transform:uppercase;font-size:14px;line-height:26px;color:#325c77;font-weight:700}.n2_modal__icon{margin:0 auto 10px;flex:0 0 auto;width:99px;height:99px;border-radius:100%;display:flex;align-items:center;justify-content:center;font-size:48px}.n2_modal__icon--green{background:#e5f8e7;color:#04c018}.n2_modal__icon--purple{background:#efebf8;color:#5f39c2}.n2_modal__icon--red{background:#f9ebe9;color:#be331f}.n2_modal__icon--blue{background:#e8f2fe;color:#1d81f9}.n2_modal__heading{line-height:28px;font-size:18px;color:#283f4d;font-weight:700;text-transform:capitalize;text-align:center}.n2_modal__subheading{font-size:18px;line-height:30px;color:#283f4d}.n2_modal__paragraph{color:#325c77;font-size:14px;line-height:26px;text-align:center;margin-bottom:20px}input.n2_modal__input{box-sizing:initial;width:100%;max-width:240px;border:2px solid #94b2c1;border-radius:3px;height:32px;line-height:32px;font-size:14px;color:#325c77;text-align:center;margin-bottom:22px}input.n2_modal__input:FOCUS{box-shadow:none;border-color:#1375e9}.n2_modal__form_row{margin:0 -10px}.n2_modal__form_row .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;margin-bottom:15px;padding:5px 10px}.n2_modal__form_row .n2_field .n2_field__label{display:flex;align-items:center}.n2_modal__form_row .n2_field .n2_field__label label{line-height:20px;color:#325c77;font-size:12px;text-transform:capitalize}.n2_modal__form_row .n2_field .n2_field__label .ssi_16--info{margin:0 5px;font-size:16px;color:#94b2c1}.n2_modal__form_row .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_modal__form_row .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_modal__form_row .n2_field__grouping>.n2_field__element,.n2_modal__form_row .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_modal__form_row--fullwidth{display:flex}.n2_modal__form_row--fullwidth .n2_field{display:flex;width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field__element{display:flex}.n2_modal__form_row--fullwidth .n2_field .n2_field__element>*{flex:1 1 auto}.n2_modal__form_row--fullwidth .n2_field .n2_field_text{display:flex}.n2_modal__form_row--fullwidth .n2_field .n2_field_text input{width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field_textarea textarea{width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field_select select{box-sizing:border-box;width:100%;height:30px;line-height:30px}.n2_modal__form_row--fullwidth .n2_field .n2_field_select select[multiple]{height:auto}.n2_modal__container_hidden{display:none}.n2_modal__container_hidden--visible{display:block}.n2_modal__form_row--large .n2_field .n2_field__label label{font-size:18px;line-height:50px;color:#283f4d}.n2_form_element--hidden{display:none!important}.n2_field__label label{display:block;margin:0;white-space:nowrap}.n2_button{display:inline-flex;align-items:center;border-radius:3px;padding:0 18px;font-size:12px;line-height:32px;font-weight:700;text-transform:uppercase;white-space:nowrap}.n2_button .n2_button__label{max-width:150px;text-overflow:ellipsis;overflow:hidden}.n2_button,.n2_button:HOVER,.n2_button:FOCUS{color:#fff}.n2_button .ssi_16,.n2_button .ssi_24,.n2_button .ssi_32{margin-left:5px;margin-right:-5px}html[dir=rtl] .n2_button .ssi_16,html[dir=rtl] .n2_button .ssi_24,html[dir=rtl] .n2_button .ssi_32{margin-left:-5px;margin-right:5px}.n2_button--inactive{opacity:.5}.n2_button--big{padding:0 30px;font-size:12px;line-height:36px}.n2_button--small{padding:0 10px;font-size:11px;line-height:30px}.n2_button--small .ssi_16,.n2_button--small .ssi_24,.n2_button--small .ssi_32{margin-right:0}.n2_button--blue{background-color:#1d81f9}.n2_button--blue:HOVER{background-color:#338ef9}.n2_button--green{background-color:#04c018}.n2_button--green:HOVER{background-color:#07ca1c}.n2_button--red{background-color:#c43e2a}.n2_button--red:HOVER{background-color:#d23923}.n2_button--grey{background-color:#94b2c1}.n2_button--grey:HOVER{background-color:#7f9caa}.n2_button--grey-dark{background-color:#6b7986}.n2_button--grey-dark:HOVER{background-color:#8694a2}.n2_button--purple{background-color:#5f39c2}.n2_button--inactive{opacity:.5}.n2_button_plain{display:inline-flex;align-items:center;padding:0 5px;font-size:16px;line-height:32px;text-transform:capitalize}.n2_button_plain,.n2_button_plain:HOVER,.n2_button_plain:FOCUS{color:#325c77}.n2_button_plain .ssi_16,.n2_button_plain .ssi_24,.n2_button_plain .ssi_32{margin:0 5px}.n2_button_plain--small{font-size:14px;line-height:30px}.n2_button_plain--color-blue:HOVER{color:#005bc6}.n2_button_plain--color-blue,.n2_button_plain--color-blue:FOCUS{color:#1375e9}.n2_button_plain_icon{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:3px;font-size:16px}.n2_button_plain_icon,.n2_button_plain_icon:HOVER,.n2_button_plain_icon:FOCUS{color:#325c77}.n2_button_plain_icon--active{background:#1d81f9}.n2_button_plain_icon--active,.n2_button_plain_icon--active:HOVER,.n2_button_plain_icon--active:FOCUS{color:#fff}.n2_button_plain_icon--big{font-size:32px;width:36px;height:36px}.n2_button_icon{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:3px;font-size:16px}.n2_button_icon,.n2_button_icon:HOVER,.n2_button_icon:FOCUS{color:#fff}.n2_button_icon--small{width:24px;height:24px}.n2_button_icon--blue{background-color:#1d81f9}.n2_button_icon--blue:HOVER{background-color:#338ef9}.n2_button_icon--green{background-color:#04c018}.n2_button_icon--green:HOVER{background-color:#07ca1c}.n2_button_icon--red{background-color:#c43e2a}.n2_button_icon--red:HOVER{background-color:#d23923}.n2_button_icon--grey{background-color:#94b2c1}.n2_button_icon--grey:HOVER{background-color:#7f9caa}.n2_button_icon--grey-dark{background-color:#6b7986}.n2_button_icon--grey-dark:HOVER{background-color:#8694a2}.n2_popover{position:relative}.n2_popover_content{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;display:none;z-index:200000;position:fixed;left:0;top:0}.n2_popover_content a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_popover_content--visible{display:flex;flex-flow:column}.n2_popover_content_exit{cursor:pointer;order:1}.n2_popover_content_inner{order:2;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_floating_menu{display:inline-block}.n2_floating_menu__button{vertical-align:top}.n2_floating_menu__button.n2_button{padding:0 20px 0 16px}.n2_floating_menu__items{display:flex;flex-flow:column;padding:8px 0}.n2_floating_menu__item{display:inline-flex;align-items:center;white-space:nowrap;font-size:12px;line-height:28px;padding:0 10px;text-transform:capitalize}.n2_floating_menu__item .ssi_16{color:#94b2c1;padding:0 5px}.n2_floating_menu__item,.n2_floating_menu__item:FOCUS{color:#325c77}.n2_floating_menu__item:HOVER{background-color:#1d81f9;color:#fff}.n2_floating_menu__item:HOVER .ssi_16{color:#fff}.n2_floating_menu__item[data-state]{display:none}.n2_floating_menu__item--has-state[data-state]{display:block}.n2_floating_menu__item--active,.n2_floating_menu__item--active:FOCUS,.n2_floating_menu__item--active .ssi_16{color:#1375e9}.n2_floating_menu__item--active:HOVER{color:#fff}.n2_floating_menu__item--red,.n2_floating_menu__item--red:FOCUS,.n2_floating_menu__item--red .ssi_16{color:#c43e2a}.n2_floating_menu__item--red:HOVER{color:#fff}.n2_floating_menu__item--red:HOVER .ssi_16{color:#fff}.n2_floating_menu__item_label{padding:0 5px}.n2_floating_menu__item_separator{margin:8px 0;border-top:2px solid rgba(55,77,88,.2)}.n2_form__tab[data-tab]{display:none}.n2_form__tab--active[data-tab]{display:block}.n2_header__menu_item.n2_form__tab_button--active,.n2_header__menu_item.n2_form__tab_button--active:ACTIVE,.n2_header__menu_item.n2_form__tab_button--active:VISITED,.n2_header__menu_item.n2_form__tab_button--active:FOCUS,.n2_header__menu_item.n2_form__tab_button--active:LINK{box-shadow:inset 0 -3px 0 0 #1375e9!important;color:#1375e9}.n2_form__table{margin:20px;background-color:#fff;border-radius:3px}.n2_form__table_label{display:flex;padding:15px 20px}.n2_form__table_label_title{line-height:42px;font-size:22px;color:#283f4d;text-transform:capitalize}.n2_form__table_label_fields{flex:1 1 auto;display:flex;align-items:center;padding:0 5px}.n2_form__table_label_fields--end{justify-content:flex-end}.n2_form__table_label_field{margin:0 5px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__preview{height:38px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__arrow{line-height:38px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__popover{top:42px}.n2_form__table_label_field .n2_field_onoff__labels{display:none}.n2_form__table_preview{border-top:1px solid #e4e9ec;padding:20px}.n2_form__table_row_group_label{color:#283f4d;border-top:1px solid #e4e9ec;padding:20px;font-size:18px;text-transform:capitalize}.n2_form__table_row{display:flex;flex-wrap:wrap;padding:10px;border-top:1px solid #e4e9ec}.n2_form__table_row .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;padding:5px 10px}.n2_form__table_row .n2_field.n2_field--raw{padding:0 10px}.n2_form__table_row .n2_field .n2_field__label{display:flex;align-items:center}.n2_form__table_row .n2_field .n2_field__label label{line-height:20px;color:#325c77;font-size:12px;text-transform:capitalize}.n2_form__table_row .n2_field .n2_field__label .ssi_16--info{margin:0 5px 2px;font-size:16px;color:#94b2c1}.n2_form__table_row .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_form__table_row .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_form__table_row .n2_field__grouping>.n2_field__element,.n2_form__table_row .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_form__table_row--hidden{display:none}.n2_form__table_row_plain{border-top:1px solid #e4e9ec}.n2_fields_layer_window__title{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_fields_layer_window__label{flex:1 1 auto;color:#94b2c1;font-size:12px;line-height:30px;font-weight:700;text-transform:uppercase;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_fields_layer_window__title_fields{display:flex}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_select select{background-color:#2c3a45;border-color:#2c3a45}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_select select:FOCUS{border:2px solid #1d81f9}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_icon_tab{background-color:#2c3a45}.n2_fields_layer_window__fields{display:flex;flex-wrap:wrap;padding:5px 0}.n2_fields_layer_window__fields .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;padding:5px 10px}.n2_fields_layer_window__fields .n2_field .n2_field__label{display:flex;align-items:center;max-width:160px}.n2_fields_layer_window__fields .n2_field .n2_field__label label{line-height:20px;font-size:12px;color:#325c77;text-transform:capitalize;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_form--dark .n2_fields_layer_window__fields .n2_field .n2_field__label label{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--info{margin:0 5px;font-size:16px;color:#94b2c1}.n2_form--dark .n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--info{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--minidesktopportrait{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_fields_layer_window__fields .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_fields_layer_window__fields .n2_field__grouping>.n2_field__element,.n2_fields_layer_window__fields .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_layer_window_notice{line-height:20px;font-size:12px;color:#bdcfd9;padding:10px}body[data-device=desktopPortrait] .n2_layer_window_notice__device_icon{display:none}.n2_form__visual_set{display:flex;background-color:#1c2933;padding:12px 20px}.n2_form__visual_set_label{flex:1 1 auto;line-height:30px;font-size:12px;color:#94b2c1;text-transform:uppercase}.n2_field_text{position:relative;display:inline-flex;vertical-align:top;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_text{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_text.n2_field_text--focus{border-color:#1d81f9}.n2_field_text input{background:initial;padding:0;margin:0 6px;height:26px;line-height:1;font-size:12px;color:#325c77}.n2_field_text input::placeholder{color:#325c77;opacity:1}.n2_form--dark .n2_field_text input{color:#bdcfd9}.n2_form--dark .n2_field_text input::placeholder{color:#bdcfd9;opacity:1}.n2_field_text input,.n2_field_text input:FOCUS{border:0;box-shadow:none;outline:0}.n2_field_text input::-ms-clear{display:none}.n2_field_text .n2_field_number__slider{display:none;position:absolute;top:26px;margin:0 -2px;width:100%;min-width:70px;z-index:2;padding-top:7px}.n2_field_text:HOVER .n2_field_number__slider,.n2_field_text.n2_field_text--focus .n2_field_number__slider{display:block}.n2_field_text .n2_field_number__slider_inner{overflow:hidden;height:30px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_text .nui-slider{position:relative;background-color:#94b2c1;height:6px;margin:12px 10px;border-radius:10px}.n2_field_text .nui-slider .nui-slider-handle{position:absolute;top:0;z-index:2;width:10px;height:10px;background-color:#fff;border:2px solid #94b2c1;margin:-4px -7px 0;border-radius:50px;cursor:ew-resize;-ms-touch-action:none;touch-action:none}.n2_field_text__pre_label{padding:0 6px;line-height:26px;background-color:#94b2c1;font-size:11px;color:#fff;text-align:center;text-transform:uppercase}.n2_form--dark .n2_field_text__pre_label{background-color:#1c2933;color:#94b2c1}.n2_field_text--focus .n2_field_text__pre_label{background-color:#1d81f9}.n2_form--dark .n2_field_text--focus .n2_field_text__pre_label{color:#fff}.n2_field_text__clear{display:flex;line-height:26px;width:26px;justify-content:center;align-items:center}.n2_field_text__clear,.n2_field_text__clear:HOVER,.n2_field_text__clear:FOCUS{color:#94b2c1}.n2_field_text--empty .n2_field_text__clear{visibility:hidden}.n2_field_text__choose{display:inline-flex;align-items:center;justify-content:center;margin:-2px -2px -2px 0;background-color:#04c018;width:30px;line-height:30px;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_text__choose:HOVER{background-color:#07ca1c}.n2_field_text__choose,.n2_field_text__choose:HOVER,.n2_field_text__choose:FOCUS{color:#fff}.n2_field_text--empty .n2_field_text__choose{background-color:#94b2c1}.n2_form--dark .n2_field_text--empty .n2_field_text__choose{background-color:#1c2933}.n2_form--dark .n2_field_text--empty .n2_field_text__choose,.n2_form--dark .n2_field_text--empty .n2_field_text__choose:HOVER,.n2_form--dark .n2_field_text--empty .n2_field_text__choose:FOCUS{color:#94b2c1}html[dir=rtl] .n2_field_text__choose{border-radius:3px 0 0 3px;margin:-2px 0 -2px -2px}.n2_field_text__choose_text{margin:-2px -2px -2px 0;padding:0 10px;background-color:#04c018;font-size:11px;line-height:30px;text-transform:uppercase;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_text__choose_text,.n2_field_text__choose_text:HOVER,.n2_field_text__choose_text:FOCUS{color:#fff}.n2_field_text__post .n2_field_unit__current_unit{padding:0 6px;border-radius:0;line-height:26px}.n2_field_text__post .n2_field_unit__units{top:26px;right:-2px}.n2_field_text_image__preview{width:26px;height:26px;background-color:#fff;background-size:cover;background-position:50% 50%;border-right:2px solid #94b2c1}html[dir=rtl] .n2_field_text_image__preview{border-right:0;border-left:2px solid #94b2c1}.n2_form--dark .n2_field_text_image__preview{border-right-color:#1c2933;background-color:#2c3a45}html[dir=rtl] .n2_form--dark .n2_field_text_image__preview{border-left-color:#1c2933}.n2_field_text--focus .n2_field_text_image__preview{border-right-color:#1d81f9}.n2_field_text_image__size_label{display:none;position:absolute;right:28px;top:-20px;color:#325c77;line-height:16px;font-size:11px;background-color:#fff;border:2px solid #94b2c1;border-bottom:0;padding:0 5px;border-radius:2px 2px 0 0}.n2_form--dark .n2_field_text_image__size_label{color:#bdcfd9;background-color:#2c3a45;border-color:#1c2933}html[dir=rtl] .n2_field_text_image__size_label{left:28px;right:unset}.n2_field_text_image__size_label--visible{display:block}.n2_field_text_image__button{margin-left:10px}html[dir=rtl] .n2_field_text_image__button{margin-left:0;margin-right:10px}.n2_field_number input{text-align:center}.n2_field_text__unit,.n2_field_number__unit{padding:0 6px;background-color:#94b2c1;font-size:11px;color:#fff;line-height:26px;text-transform:uppercase}.n2_form--dark .n2_field_text__unit,.n2_form--dark .n2_field_number__unit{background-color:#1c2933;color:#94b2c1}.n2_field_text--focus .n2_field_text__unit,.n2_field_text--focus .n2_field_number__unit{background-color:#1d81f9}.n2_form--dark .n2_field_text--focus .n2_field_text__unit,.n2_form--dark .n2_field_text--focus .n2_field_number__unit{color:#fff}.n2_field_upload{cursor:pointer}.n2_field_upload .n2_field_chooser__label{width:150px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.n2_field_upload input[type=file]{position:absolute;top:0;left:0;width:100%;height:0;opacity:0;font-size:0;padding:15px 0}.n2_field_upload input[type=file]::-webkit-file-upload-button{cursor:pointer}.n2_field_table__content{display:grid;grid-gap:2px;width:100%}.n2_field_table__cell{padding:5px 10px;background-color:#f0f4f7;font-size:12px;line-height:22px;color:#325c77}.n2_field_tab{display:inline-flex;background-color:#94b2c1;border-radius:2px;overflow:hidden}.n2_field_tab__option--selected{background-color:#1d81f9}.n2_field_tab__option{padding:0 15px;line-height:30px;font-size:12px;color:#fff;cursor:pointer;white-space:nowrap}.n2_modal_tab__tabs{text-align:center;background-color:#f0f4f7;margin:0 -40px 16px -40px}.n2_modal_tab__tabs_button{display:inline-block;font-size:16px;color:#325c77;font-family:inherit;font-weight:500;padding:20px 0 17px 0;margin:0 20px;cursor:pointer;border-bottom:3px solid transparent}.n2_modal_tab__tabs_button--active{border-bottom:3px solid #1375e9;color:#1375e9;box-sizing:border-box}.n2_modal_tab__tabs_content{display:none}.n2_modal_tab__tabs_content--active{display:block}.n2_field_textarea{position:relative;display:inline-block;vertical-align:top;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_textarea{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_textarea.n2_field_text--focus{border-color:#1d81f9}.n2_field_textarea textarea{padding:0 6px;margin:0;background:initial;box-sizing:border-box;min-height:44px;vertical-align:top;line-height:20px;font-size:12px;color:#325c77}.n2_form--dark .n2_field_textarea textarea{color:#bdcfd9}.n2_field_textarea textarea,.n2_field_textarea textarea:FOCUS{border:0;outline:0;box-shadow:none}.n2_field_textarea--inline textarea{min-height:26px}.n2_field_textarea_rich{position:relative;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_textarea_rich{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_textarea_rich.n2_field_text--focus{border-color:#1d81f9}.n2_field_textarea_rich textarea{display:block;padding:0 6px;margin:0;box-sizing:border-box;min-height:44px;vertical-align:top;line-height:20px;font-size:12px;color:#325c77}.n2_form--dark .n2_field_textarea_rich textarea{background-color:#2c3a45;color:#bdcfd9}.n2_field_textarea_rich textarea,.n2_field_textarea_rich textarea:FOCUS{border:0;outline:0;box-shadow:none}.n2_field_textarea_rich__buttons{display:flex}.n2_form--dark .n2_field_textarea_rich__buttons{background-color:#2c3a45;border-bottom:2px solid #1c2933}.n2_field_textarea_rich__button{display:flex;align-items:center;justify-content:center;width:30px;height:30px;font-size:16px;color:#94b2c1;border-right:2px solid #1c2933;cursor:pointer}.n2_field_select select{margin:0;padding:0 6px;border-radius:3px;max-width:280px;width:auto;line-height:26px;height:26px;box-sizing:content-box;font-size:12px;color:#325c77;background-color:#fff;border:2px solid #94b2c1}.n2_field_select select[multiple]{padding:0;height:auto}.n2_field_select select[multiple] option{padding:6px 6px;font-size:12px;color:#325c77}.n2_form--dark .n2_field_select select{background-color:#2c3a45;border:2px solid #1c2933;color:#bdcfd9}.n2_field_select select,.n2_field_select select:FOCUS{box-shadow:none;outline:0}.n2_field_select select:FOCUS{border:2px solid #1d81f9}.n2_field_onoff{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:3px 0;display:flex;cursor:pointer}.n2_field_onoff__slider{flex:0 0 auto;border-radius:12px;background-color:#94b2c1;padding:3px;width:38px}.n2_field_onoff--on .n2_field_onoff__slider{background-color:#04c018}.n2_field_onoff__slider_bullet{width:18px;height:18px;border-radius:20px;background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.1);transition:transform .25s}.n2_field_onoff--on .n2_field_onoff__slider_bullet{transform:translateX(20px)}html[dir=rtl] .n2_field_onoff--on .n2_field_onoff__slider_bullet{transform:translateX(-20px)}.n2_field_onoff__labels{margin:0 3px;position:relative;overflow:hidden;height:24px}.n2_field_onoff__label{font-size:12px;line-height:24px;font-weight:700;text-transform:uppercase;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_field_onoff__label_off{color:#94b2c1}.n2_field_onoff--on .n2_field_onoff__label_off{margin-top:-24px}.n2_field_onoff__label_on{color:#40bb22}.n2_field_unit{position:relative;display:inline-block;vertical-align:top}.n2_field_unit__current_unit{line-height:30px;padding:0 6px;border-radius:3px;font-size:11px;text-transform:uppercase;background-color:#94b2c1;color:#fff}.n2_form--dark .n2_field_unit__current_unit{background-color:#1c2933;color:#94b2c1}.n2_field_unit__units{display:none;z-index:2;position:absolute;top:30px;right:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;background:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_unit:HOVER .n2_field_unit__units{display:block}.n2_field_unit__unit{padding:0 5px;line-height:24px;cursor:pointer;color:#325c77;font-size:11px;text-transform:uppercase}.n2_field_unit__unit:HOVER{background:#1d81f9;color:#fff}.n2_field_margin_padding{display:inline-flex;vertical-align:top}.n2_field_margin_padding .n2_field_text{position:relative;border-radius:0;margin-left:-2px}.n2_field_margin_padding .n2_field_text.n2_field_text--focus{z-index:2}.n2_field_margin_padding .n2_field_unit{margin-left:-2px}.n2_field_margin_padding .n2_field_unit__current_unit{border-top-left-radius:0;border-bottom-left-radius:0}html[dir=rtl] .n2_field_margin_padding .n2_field_unit__current_unit{border-radius:3px 0 0 3px}.n2_field_margin_padding__pre_label{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;font-size:16px;color:#fff;text-align:center;border-top-left-radius:3px;border-bottom-left-radius:3px;cursor:pointer}.n2_form--dark .n2_field_margin_padding__pre_label{background-color:#1c2933;color:#94b2c1}html[dir=rtl] .n2_field_margin_padding__pre_label{border-radius:0 3px 3px 0}.n2_field_margin_padding--linked-values .n2_field_margin_padding__pre_label .ssi_16::before{content:"\E64D"}.n2_field_margin_padding--linked-values .n2_field_text+.n2_field_text{display:none}.n2_field_radio{display:inline-flex;vertical-align:top;margin:0 -5px}.n2_field_radio .n2_field_radio__option{display:flex;align-items:center;cursor:pointer;margin:0 5px}.n2_field_radio .n2_field_radio__option_marker{display:flex;justify-content:center;align-items:center;width:14px;height:14px;line-height:14px;background-color:#fff;border:2px solid #94b2c1;border-radius:10px}.n2_field_radio .n2_field_radio__option_marker .ssi_16{display:none;color:#fff}.n2_field_radio .n2_field_radio__option--selected .n2_field_radio__option_marker{background-color:#04c018;border-color:#04c018}.n2_field_radio .n2_field_radio__option--selected .n2_field_radio__option_marker .ssi_16{display:block}.n2_field_radio .n2_field_radio__option_label{margin:0 5px;font-size:12px;line-height:30px;color:#325c77}.n2_field_radio_icon{display:inline-flex;vertical-align:top;overflow:hidden;border-radius:3px}.n2_field_radio_icon .n2_field_radio__option{display:flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;color:#fff;font-size:16px;cursor:pointer}.n2_form--dark .n2_field_radio_icon .n2_field_radio__option{background-color:#1c2933;color:#94b2c1}.n2_field_radio_icon .n2_field_radio__option--selected{background-color:#1d81f9}.n2_form--dark .n2_field_radio_icon .n2_field_radio__option--selected{background-color:#1d81f9;color:#fff}.n2_field_color .n2-field-color-preview{border-right:2px solid #94b2c1}html[dir=rtl] .n2_field_color .n2-field-color-preview{border-right:0;border-left:2px solid #94b2c1}.n2_form--dark .n2_field_color .n2-field-color-preview{border-right-color:#1c2933}html[dir=rtl] .n2_form--dark .n2_field_color .n2-field-color-preview{border-left-color:#1c2933}.n2_field_color.n2_field_text--focus .n2-field-color-preview{border-right-color:#1d81f9}html[dir=rtl] .n2_field_color.n2_field_text--focus .n2-field-color-preview{border-left-color:#1d81f9}.n2_field_color .n2-field-color-preview-inner{width:26px;height:26px;cursor:pointer}.n2_field_color input{text-transform:uppercase;width:50px;text-align:center}.n2_field_color--alpha input{width:65px}.n2_field_image_list{position:relative;display:inline-flex;vertical-align:top;align-items:center;border-radius:3px;border:2px solid #94b2c1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_image_list>.n2_field_image_list__fields{display:none}.n2_field_image_list--focus{border-color:#1d81f9;z-index:99}.n2_field_image_list__preview{display:inline-flex;background-color:#fff;height:26px;cursor:pointer}.n2_field_image_list__preview img{height:100%;width:auto}.n2_field_image_list__preview_label{padding:0 6px;background:#fff;line-height:26px;font-size:12px;color:#325c77}.n2_field_image_list__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_image_list__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_image_list--focus .n2_field_image_list__popover{display:block}.n2_field_image_list__popover_items{max-width:50vw;display:inline-flex;flex-wrap:wrap}.n2_field_image_list__popover_item{margin:10px;background-color:#fff;cursor:pointer}.n2_field_image_list__popover_item_image{border:2px solid #94b2c1;border-radius:3px;padding:3px}.n2_field_image_list__popover_item_image img{display:block;width:100%}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_image{border-color:#1d81f9}.n2_field_image_list__popover_item_disabled{display:inline-flex;align-items:center;min-height:100%;border:2px dashed #94b2c1;border-radius:3px;padding:0 10px;box-sizing:border-box;color:#325c77;font-size:14px;line-height:30px;text-transform:capitalize}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_disabled{border-color:#1d81f9}.n2_field_image_list__popover_item_label{color:#325c77;background:#fff;font-size:12px;text-align:center;line-height:30px}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_label{color:#1d81f9}.n2_field_checkbox_onoff{display:inline-flex;vertical-align:top;width:30px;height:30px;align-items:center;justify-content:center;background-color:#94b2c1;border-radius:3px;font-size:16px;color:#fff;cursor:pointer}.n2_field_checkbox_onoff--active{background-color:#1d81f9}.n2_field_group_checkbox_onoff{border-radius:3px;overflow:hidden;margin:5px 10px}.n2_field_group_checkbox_onoff .n2_field{padding:0}.n2_field_group_checkbox_onoff .n2_field_checkbox_onoff{border-radius:0}.n2_field_widget_position{position:relative;display:inline-flex;vertical-align:top;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_widget_position--focus{border-color:#1d81f9;z-index:99}.n2_field_widget_position__label{display:inline-block;vertical-align:top;padding:0 6px;line-height:26px;font-size:12px;color:#325c77;cursor:pointer}.n2_field_widget_position__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_widget_position__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_widget_position--focus .n2_field_widget_position__popover{display:flex}.n2_field_widget_position__popover .n2_field__element{flex-wrap:nowrap!important}.n2_field_control_type_picker{display:flex;flex-wrap:wrap;margin:-10px -5px}.n2_field_control_type_picker__item{margin:10px;position:relative;display:inline-block;border:0;border-radius:1px;height:auto;cursor:pointer}.n2_field_control_type_picker__item img{display:block}.n2_field_control_type_picker__item:hover{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_control_type_picker__item.n2_field_control_type_picker__item--selected{box-shadow:0 0 0 3px #1375e9}.n2_field_control_type_picker__selected_marker{display:none;position:absolute;top:10px;right:10px;background-color:#1375e9;border-radius:10px;width:16px;height:16px}.n2_field_control_type_picker__item--selected .n2_field_control_type_picker__selected_marker{display:block}.n2_field_control_type_picker__selected_marker .ssi_16{color:#fff}.n2_field_message{border-radius:3px;padding:5px 10px;font-size:12px;line-height:20px}.n2_field_message--notice{background-color:#f0f4f7;color:#325c77}.n2_field_message--notice a:HOVER{color:#005bc6}.n2_field_message--notice a,.n2_field_message--notice a:FOCUS{color:#1375e9}.n2_field_message--warning{background-color:#f5e293;color:#325c77}.n2_field_message--warning a:HOVER{color:#005bc6}.n2_field_message--warning a,.n2_field_message--warning a:FOCUS{color:#1375e9}.n2_ss_layer_window .n2_field_message--warning{width:298px}.n2_field_autocomplete{position:relative}.n2_field_decoration{display:inline-flex;vertical-align:top;margin:0 -3px}.n2_field_decoration__option{margin:0 3px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;border-radius:3px;color:#fff;font-size:16px;cursor:pointer}.n2_form--dark .n2_field_decoration__option{background-color:#1c2933;color:#94b2c1}.n2_field_decoration__option--selected{background-color:#1d81f9}.n2_form--dark .n2_field_decoration__option--selected{background-color:#1d81f9;color:#fff}.n2_field_icon__preview{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px}.n2_field_icon__preview .n2i{color:#fff;font-size:24px!important;vertical-align:top}.n2_field_icon_tab{background-color:#1c2933;border-radius:2px;overflow:hidden;white-space:nowrap}.n2_field_icon_tab__option{display:inline-flex;padding:7px;color:#fff;cursor:pointer}.n2_field_icon_tab__option i{color:#94b2c1}.n2_field_icon_tab__option--selected{background-color:#1d81f9}.n2_field_icon_tab__option--selected i{color:#fff}.n2_field_mixed_font_size__container>.n2_field_text{border-top-right-radius:0;border-bottom-right-radius:0}html[dir=rtl] .n2_field_mixed_font_size__container>.n2_field_text{border-radius:0 3px 3px 0}.n2_field_mixed_font_size__container>.n2_field_unit>.n2_field_unit__current_unit{border-top-left-radius:0;border-bottom-left-radius:0}html[dir=rtl] .n2_field_mixed_font_size__container>.n2_field_unit>.n2_field_unit__current_unit{border-radius:3px 0 0 3px}.n2_field_mixed_box_shadow__container>.n2_field_text{margin-left:-2px;border-radius:0}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text{margin-left:0;margin-right:-2px}.n2_field_mixed_box_shadow__container>.n2_field_text:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text:first-child{margin-right:0;border-radius:0 3px 3px 0}.n2_field_mixed_box_shadow__container>.n2_field_text:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text:last-of-type{border-radius:3px 0 0 3px}.n2_field_mixed_box_shadow__container>.n2_field_text--focus{z-index:2}.n2_field_mixed_text_shadow__container>.n2_field_text{margin-left:-2px}.n2_field_mixed_text_shadow__container>.n2_field_text:first-child{margin-left:0;border-radius:3px 0 0 3px}html[dir=rtl] .n2_field_mixed_text_shadow__container>.n2_field_text:first-child{margin-left:-2px;border-radius:0 3px 3px 0}.n2_field_mixed_text_shadow__container>.n2_field_text:last-child{border-radius:0 3px 3px 0}html[dir=rtl] .n2_field_mixed_text_shadow__container>.n2_field_text:last-child{border-radius:3px 0 0 3px}.n2_field_mixed_text_shadow__container>.n2_field_text--focus{z-index:2}.n2_field_mixed_border__container{display:inline-flex;vertical-align:top;margin:0 -5px}.n2_field_mixed_border__container>*{margin:0 5px}.n2_form__table_row .n2_field.n2_field_mixed_generator_order{padding:0}.n2_field_button{display:inline-block;text-align:center;padding:0 10px;background-color:#94b2c1;font-size:11px;line-height:30px;text-transform:uppercase;border-radius:3px;max-width:150px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_field_button:HOVER{background-color:#7f9caa}.n2_field_button,.n2_field_button:HOVER,.n2_field_button:FOCUS{color:#fff}.n2_form--dark .n2_field_button{background-color:#6b7986}.n2_form--dark .n2_field_button:HOVER{background-color:#8694a2}.n2_form--dark .n2_field_button,.n2_form--dark .n2_field_button:HOVER,.n2_form--dark .n2_field_button:FOCUS{color:#fff}.n2_field_button--icon{display:inline-flex;align-items:center;justify-content:center;padding:0;width:30px;height:30px;font-size:16px}.n2_field_button--blue{background-color:#1d81f9}.n2_field_button--blue:HOVER{background-color:#338ef9}.n2_field_widget_area{width:80px;height:80px;position:relative;margin:0 10px}.n2_field_widget_area__inner{position:absolute;top:14px;left:14px;width:46px;height:46px;border:3px solid #94b2c1;border-radius:3px}.n2_field_widget_area__area{position:absolute;background-color:#94b2c1;border-radius:2px;cursor:pointer;width:10px;height:10px;left:0;top:0}.n2_field_widget_area__area[data-area="1"]{left:35px}.n2_field_widget_area__area[data-area="2"]{left:21px;top:21px}.n2_field_widget_area__area[data-area="3"]{left:35px;top:21px}.n2_field_widget_area__area[data-area="4"]{left:49px;top:21px}.n2_field_widget_area__area[data-area="5"]{top:35px}.n2_field_widget_area__area[data-area="6"]{left:21px;top:35px}.n2_field_widget_area__area[data-area="7"]{left:49px;top:35px}.n2_field_widget_area__area[data-area="8"]{left:70px;top:35px}.n2_field_widget_area__area[data-area="9"]{left:21px;top:49px}.n2_field_widget_area__area[data-area="10"]{left:35px;top:49px}.n2_field_widget_area__area[data-area="11"]{left:49px;top:49px}.n2_field_widget_area__area[data-area="12"]{left:35px;top:70px}.n2_field_widget_area__area--selected{background-color:#1d81f9;cursor:default}.n2_field_columns{display:grid;grid-gap:10px;grid-template-columns:280px 30px;width:310px}.n2_field_columns__content{position:relative;display:flex;overflow:hidden}.n2_field_columns__column{flex:0 0 auto;overflow:hidden;background-color:#04c018;border-radius:2px;font-size:12px;line-height:30px;text-align:center;color:#fff;cursor:ew-resize}.n2_field_columns__handle{display:inline-flex;justify-content:center;align-items:center;width:16px;height:30px;cursor:ew-resize;color:#bdcfd9}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__column{margin-right:16px}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__column:last-child{margin-right:0}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__handle{display:none}.n2_field_columns__add{flex:0 0 auto;display:inline-flex;justify-content:center;align-items:center;width:30px;height:30px;background-color:#04c018;border-radius:2px;color:#fff;cursor:pointer}.n2_field_columns__add:HOVER{background-color:#07ca1c}.n2_field_select_list{height:120px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;overflow-y:scroll}.n2_field_select_list__option{display:flex;cursor:pointer;line-height:30px;font-size:12px;color:#325c77}.n2_field_select_list__option:nth-child(even){background-color:#f0f4f7}.n2_field_select_list__option.n2_field_select_list__option--selected{background-color:#1d81f9;color:#fff}.n2_field_select_list__option_primary{flex:1 1 auto;padding:0 8px}.n2_field_select_list__option_secondary{padding:0 8px}.n2_field_chooser{position:relative;display:inline-flex;vertical-align:top;border-radius:3px;background-color:#f0f4f7;height:30px}.n2_form--dark .n2_field_chooser{background-color:#2c3a45}.n2_field_chooser__label{min-width:100px;padding:0 8px;font-size:12px;line-height:30px;color:#325c77;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_form--dark .n2_field_chooser__label{color:#bdcfd9}.n2_field_chooser__clear{display:flex;line-height:30px;width:30px;justify-content:center;align-items:center}.n2_field_chooser__clear,.n2_field_chooser__clear:HOVER,.n2_field_chooser__clear:FOCUS{color:#94b2c1}.n2_field_chooser--empty .n2_field_chooser__clear{visibility:hidden}.n2_field_chooser__choose{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;width:30px;line-height:30px;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_chooser__choose:HOVER{background-color:#07ca1c}.n2_field_chooser__choose,.n2_field_chooser__choose:HOVER,.n2_field_chooser__choose:FOCUS{color:#fff}.n2_field_chooser--empty .n2_field_chooser__choose{background-color:#94b2c1}.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose{background-color:#1c2933}.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose,.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose:HOVER,.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose:FOCUS{color:#94b2c1}html[dir=rtl] .n2_field_chooser__choose{border-radius:3px 0 0 3px}.n2_field_select_icon{display:flex;flex-wrap:wrap;margin:-10px -20px}.n2_field_select_icon__option{position:relative;display:flex;flex-flow:column;margin:20px;width:130px;padding:15px 10px;cursor:pointer;border-radius:3px}.n2_field_select_icon__option:HOVER{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_select_icon__option--selected{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_select_icon__option_icon{display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_field_select_icon__option--selected .n2_field_select_icon__option_icon{color:#1375e9}.n2_field_select_icon__option_label{font-size:14px;line-height:30px;color:#325c77;text-align:center;font-weight:700}.n2_field_select_icon__option--selected .n2_field_select_icon__option_label{color:#1375e9}.n2_field_select_icon__selected_marker{display:none;position:absolute;top:10px;right:10px;background-color:#1375e9;border-radius:10px;width:16px;height:16px;color:#fff}.n2_field_select_icon__option--selected .n2_field_select_icon__selected_marker{display:block}.n2_field_font{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;min-width:30px;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;cursor:pointer}.n2_field_font:HOVER{background-color:#07ca1c}.n2_field_font,.n2_field_font:HOVER,.n2_field_font:FOCUS{color:#fff}.n2_field_style{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;min-width:30px;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;cursor:pointer}.n2_field_style:HOVER{background-color:#07ca1c}.n2_field_style,.n2_field_style:HOVER,.n2_field_style:FOCUS{color:#fff}.n2_field_subform_icon{margin:-8px;display:flex;flex-wrap:wrap}.n2_field_subform_icon__option{margin:8px;display:flex;flex-flow:column;align-items:center;min-width:120px;border:3px solid #fff;border-radius:3px;cursor:pointer}.n2_field_subform_icon__option_icon{display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_field_subform_icon__option_label{margin-top:-13px;line-height:28px;font-size:12px;color:#325c77;font-weight:700;padding:0 10px}.n2_field_subform_icon__option--selected{border-color:#1375e9}.n2_field_subform_icon__option--selected .n2_field_subform_icon__option_icon,.n2_field_subform_icon__option--selected .n2_field_subform_icon__option_label{color:#1375e9}.n2_field_autoplaypicker{position:relative;display:inline-flex;vertical-align:top;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_autoplaypicker--focus{border-color:#1d81f9;z-index:99}.n2_field_autoplaypicker__label{display:inline-block;vertical-align:top;padding:0 6px;width:230px;line-height:26px;font-size:12px;color:#325c77;cursor:pointer}.n2_field_autoplaypicker__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_autoplaypicker__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_autoplaypicker--focus .n2_field_autoplaypicker__popover{display:flex}.n2_field_autoplaypicker__popover .n2_field__element{flex-wrap:nowrap!important}.n2_field_layer_window_focus{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;cursor:pointer;background:#1c2933;border:2px solid #1c2933;border-radius:3px}.n2_field_layer_window_focus__image{display:block;width:100%;height:auto;border-radius:2px}.n2_field_layer_window_focus__dot{position:absolute;left:50%;top:50%;width:12px;height:12px;margin-top:-8px;margin-left:-8px;border:2px solid #fff;border-radius:16px;background:#04c018}.n2_field_breakpoint{display:flex;flex-wrap:wrap}.n2_field_breakpoint__breakpoint_container{position:relative;margin:25px 10px 5px;height:30px;display:flex;align-items:center;background-color:#94b2c1;border-radius:3px}.n2_field_breakpoint__breakpoint_container[data-orientation=portrait] [data-orientation=landscape]{display:none!important}.n2_field_breakpoint__breakpoint_container[data-orientation=landscape] [data-orientation=portrait]{display:none!important}.n2_field_breakpoint__device{position:relative;flex:0 0 auto;width:130px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_breakpoint__device_enable{display:inline-flex;align-items:center;justify-content:center;width:100%;height:30px;color:#fff}.n2_field_breakpoint__device_disable{position:absolute;right:5px;top:0;color:#fff;height:30px;display:none;align-items:center;opacity:.5;cursor:pointer}.n2_field_breakpoint__device_disable:HOVER{opacity:1}.n2_field_breakpoint__device--enabled .n2_field_breakpoint__device_disable{display:flex}.n2_field_breakpoint__breakpoint{position:relative;flex:0 0 auto;height:30px}.n2_field_breakpoint__breakpoint_divider{margin:5px 0;width:0;height:20px;box-shadow:0 0 0 1px #fff}.n2_field_breakpoint__breakpoint_label_container{display:flex;align-items:center;justify-content:center;position:absolute;margin-left:-32px;top:-26px;width:50px}html[dir=rtl] .n2_field_breakpoint__breakpoint_label_container{margin-left:0;margin-right:-32px}.n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label_container{margin-left:0;justify-content:flex-start}html[dir=rtl] .n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label_container{margin-right:0}.n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label_container{margin-left:-50px;justify-content:flex-end}html[dir=rtl] .n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label_container{margin-left:0;margin-right:-50px}.n2_field_breakpoint__breakpoint_label_rename{display:flex;align-items:center;justify-content:center;width:12px;cursor:pointer;color:#94b2c1;opacity:.7}.n2_field_breakpoint__breakpoint_label_rename:HOVER{opacity:1}.n2_field_breakpoint__breakpoint_label_container--disable-edit .n2_field_breakpoint__breakpoint_label_rename{visibility:hidden;pointer-events:none}.n2_field_breakpoint__breakpoint_label{color:#325c77;font-size:12px;line-height:26px}.n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label,.n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label{cursor:default}.n2_field_breakpoint__breakpoint .n2_field_breakpoint__breakpoint_label{cursor:default}.n2_field_breakpoint__breakpoint .n2_field_breakpoint__breakpoint_label[contenteditable=true]{cursor:text;outline:0}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device .n2_field_breakpoint__device_enable{cursor:pointer;opacity:.5}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device--enabled .n2_field_breakpoint__device_enable{opacity:1}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=desktopportrait] .n2_field_breakpoint__device_enable,.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=tabletportrait] .n2_field_breakpoint__device_enable,.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=mobileportrait] .n2_field_breakpoint__device_enable{cursor:default;opacity:1}.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint{display:none}.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint--enabled,.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=desktopportrait],.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=tabletportrait],.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=mobileportrait]{display:block}body[data-desktoplandscape="0"] .n2-slider-settings-require--desktoplandscape,body[data-tabletlandscape="0"] .n2-slider-settings-require--tabletlandscape,body[data-mobilelandscape="0"] .n2-slider-settings-require--mobilelandscape{display:none!important}.n2_autocomplete_options{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;position:absolute;top:0;z-index:100003;overflow:auto;max-height:300px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;background:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_autocomplete_options a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_autocomplete_option{padding:0 5px;line-height:24px;cursor:pointer;color:#325c77;font-size:11px}.n2_autocomplete_option:HOVER{background:#1d81f9;color:#fff}.n2_tooltip{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;visibility:visible;z-index:100000;position:fixed;left:-10000px;top:-10000px;margin-top:-9000000px;opacity:0;border-radius:3px;font-size:12px;line-height:16px;font-weight:700;padding:4px 6px;color:#94b2c1;background:#0c1924;white-space:nowrap}.n2_tooltip a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_tooltip--active{opacity:1;margin:10px}.n2_tooltip--active.n2_tooltip_position{margin:0}.n2_body--tooltip-position-active .n2_tooltip:not(.n2_tooltip_position){display:none}.n2_form_tip{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100000;position:fixed;display:none;max-width:360px;padding:5px 0}.n2_form_tip a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_form_tip--visible{display:block}.n2_form_tip__overlay{position:absolute;width:20px;height:20px}.n2_form_tip[data-position-horizontal=left] .n2_form_tip__overlay{left:0}.n2_form_tip[data-position-horizontal=right] .n2_form_tip__overlay{right:0}.n2_form_tip[data-position-vertical=bottom] .n2_form_tip__overlay{top:100%}.n2_form_tip[data-position-vertical=top] .n2_form_tip__overlay{bottom:100%}.n2_form_tip__content{background-color:rgba(12,25,36,.95);border-radius:5px;padding:20px}.n2_form_tip__label{color:#fff;font-size:14px;line-height:20px;text-transform:capitalize;margin-bottom:10px}.n2_form_tip__description{color:#94b2c1;font-size:14px;line-height:20px}.n2_form_tip__description a,.n2_form_tip__description a:HOVER,.n2_form_tip__description a:FOCUS{color:#1d81f9}.n2_form_tip__link{margin-top:10px;display:inline-block;line-height:30px;background-color:#1d81f9;border-radius:3px;padding:0 10px;font-size:11px;text-transform:capitalize;text-decoration:none}.n2_form_tip__link,.n2_form_tip__link:HOVER,.n2_form_tip__link:FOCUS{color:#fff}.n2_dashboard_info{position:relative}.n2_dashboard_info .n2_button_plain_icon{position:relative}.n2_dashboard_info--visible .n2_button_plain_icon,.n2_dashboard_info--visible .n2_button_plain_icon:HOVER,.n2_dashboard_info--visible .n2_button_plain_icon:FOCUS{color:#fff}.n2_dashboard_info__marker{display:none;position:absolute;top:7px;right:8px;width:8px;height:8px;background-color:#f69300;border-radius:100%;border:2px solid #fff}html[data-ss3-activated="0"] .n2_dashboard_info__marker{display:block}.n2_dashboard_info__content{display:none;position:absolute;right:0;top:45px;padding:24px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);white-space:nowrap}.n2_dashboard_info--visible .n2_dashboard_info__content{display:grid;grid-template-columns:24px 1fr auto;grid-gap:15px}html[dir=rtl] .n2_dashboard_info__content{left:0;right:auto}.n2_dashboard_info__row_icon .ssi_24{display:block;font-size:24px;line-height:30px}.n2_dashboard_info__row_content{color:#325c77;line-height:30px;font-size:14px}.n2_dashboard_info__row_action{text-align:right}.n2_dashboard_info__row_action a,.n2_dashboard_info__row_action a:HOVER,.n2_dashboard_info__row_action a:FOCUS{line-height:30px;font-size:14px}.n2_dashboard_info__row_action a,.n2_dashboard_info__row_action a:FOCUS{color:#1375e9}.n2_dashboard_info__row_action a:HOVER{color:#005bc6}html[dir=rtl] .n2_dashboard_info__row_action{text-align:left}html[data-ss3-activated="0"] .n2_dashboard_info__row_icon_activated,html[data-ss3-activated="0"] .n2_dashboard_info__row_content_activated,html[data-ss3-activated="0"] .n2_dashboard_info__row_action_activated{display:none}html[data-ss3-activated="1"] .n2_dashboard_info__row_icon_activate,html[data-ss3-activated="1"] .n2_dashboard_info__row_content_activate,html[data-ss3-activated="1"] .n2_dashboard_info__row_action_activate,html[data-ss3-activated="1"] #n2-ss-activate-license-banner{display:none}.n2_dashboard_info__row_icon_version .ssi_24{color:#94b2c1}.n2_dashboard_info__row_icon_check_update .ssi_24{color:#1d81f9}.n2_dashboard_info__row_icon_activate .ssi_24{color:#c43e2a}.n2_dashboard_info__row_icon_activated .ssi_24{color:#04c018}.n2_dashboard_manager{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;padding:0 40px}.n2_dashboard_manager__content{position:relative;display:flex;flex-wrap:wrap;margin:0 -16px}.n2_dashboard_manager__content>*{margin:16px;flex:0 0 auto}.n2_dashboard_manager_upgrade_pro{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;min-height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_upgrade_pro:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_upgrade_pro__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(29,129,249,.1);border-radius:50px;color:#1d81f9}.n2_dashboard_manager_upgrade_pro__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_manager_upgrade_pro__details{margin-top:8px;display:grid;grid-template-columns:1fr 1fr;grid-gap:14px;width:100%;padding:0 30px 14px;box-sizing:border-box}.n2_dashboard_manager_upgrade_pro__details_option{display:flex;align-items:center}.n2_dashboard_manager_upgrade_pro__details_option,.n2_dashboard_manager_upgrade_pro__details_option:HOVER,.n2_dashboard_manager_upgrade_pro__details_option:FOCUS{color:#1375e9}.n2_dashboard_manager_upgrade_pro__details_option_label{margin:0 10px;font-size:14px;line-height:16px;text-transform:capitalize;padding:5px 0}.n2_dashboard_manager_upgrade_pro__button{margin-top:4px;margin-bottom:20px;padding:0 20px;min-width:260px;background-color:#1d81f9;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700}.n2_dashboard_manager_upgrade_pro__button,.n2_dashboard_manager_upgrade_pro__button:HOVER,.n2_dashboard_manager_upgrade_pro__button:FOCUS{color:#fff}.n2_dashboard_manager_upgrade_pro__button:HOVER{background-color:#338ef9}.n2_dashboard_manager_upgrade_pro__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}.n2_dashboard_manager_upgrade_pro:HOVER .n2_dashboard_manager_upgrade_pro__close{opacity:1}.n2_dashboard_manager_review{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_review:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_review__logo{display:flex;align-items:center;justify-content:center;margin-top:44px;width:100px;height:100px;background-color:rgba(246,183,0,.1);border-radius:50px;overflow:hidden;color:#f6b700}.n2_dashboard_manager_review__logo>*{display:none}.n2_dashboard_manager_review[data-star="0"] .ssi_48--review0,.n2_dashboard_manager_review[data-star="1"] .ssi_48--review1,.n2_dashboard_manager_review[data-star="2"] .ssi_48--review2,.n2_dashboard_manager_review[data-star="3"] .ssi_48--review3,.n2_dashboard_manager_review[data-star="4"] .ssi_48--review4,.n2_dashboard_manager_review[data-star="5"] .ssi_48--review5{display:block}.n2_dashboard_manager_review__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_manager_review__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_dashboard_manager_review__star_selector{margin-top:25px;display:flex}.n2_dashboard_manager_review__star{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;color:#94b2c1;cursor:pointer}.n2_dashboard_manager_review[data-star="1"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="5"]{color:#f6b700}.n2_dashboard_manager_review__label{display:none;margin-top:4px;font-size:16px;line-height:28px;color:#283f4d;text-align:center;font-weight:700}.n2_dashboard_manager_review[data-star="0"] .n2_dashboard_manager_review__label[data-star="0"],.n2_dashboard_manager_review[data-star="1"] .n2_dashboard_manager_review__label[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__label[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__label[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__label[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__label[data-star="5"]{display:block}.n2_dashboard_manager_review__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}html[dir=rtl] .n2_dashboard_manager_review__close{right:auto;left:10px}.n2_dashboard_manager_review:HOVER .n2_dashboard_manager_review__close{opacity:1}.n2_dashboard_manager_newsletter{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_newsletter:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_newsletter__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(95,57,194,.1);border-radius:50px;color:#5f39c2}.n2_dashboard_manager_newsletter__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_newsletter__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_dashboard_newsletter__form{margin-top:10px;display:block}.n2_dashboard_newsletter__form input[type=email]{width:300px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;color:#325c77;font-size:14px;line-height:36px;text-align:center;box-shadow:none}.n2_dashboard_newsletter__form input[type=email]:FOCUS{border-color:#5f39c2}.n2_dashboard_manager_newsletter__button{margin-top:10px;padding:0 20px;min-width:260px;background-color:#5f39c2;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700;cursor:pointer}.n2_dashboard_manager_newsletter__button,.n2_dashboard_manager_newsletter__button:HOVER,.n2_dashboard_manager_newsletter__button:FOCUS{color:#fff}.n2_dashboard_manager_newsletter__button:HOVER{background-color:#683fd4}.n2_dashboard_manager_newsletter__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}html[dir=rtl] .n2_dashboard_manager_newsletter__close{right:auto;left:10px}.n2_dashboard_manager_newsletter:HOVER .n2_dashboard_manager_newsletter__close{opacity:1}.n2_device_changer{display:inline-flex;align-items:center;position:relative;direction:ltr}.n2_device_changer__button{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;font-size:24px;color:#94b2c1}.n2_device_changer__button--marked:after{position:absolute;top:-3px;right:-3px;display:block;content:'';width:8px;height:8px;border-radius:20px;border:2px solid #fff;background-color:#f69300}.n2_device_tester{display:none;position:absolute;top:100%;left:12px;transform:translateX(-50%);padding:10px 10px 0;width:260px;background-color:#0c1924}.n2_device_changer--active .n2_device_tester{display:block}.n2_device_tester_devices{display:flex;justify-content:space-around}.n2_device_tester_devices__device{display:inline-flex;align-items:center;justify-content:center;padding:6px 10px;width:24px;height:24px;color:#94b2c1;font-size:24px;cursor:pointer}.n2_device_tester_devices__device--active{color:#1d81f9}.n2_device_tester_zoom{display:flex;align-items:center;padding:10px 0;background-color:#0c1924;border-radius:0 0 3px 3px;text-align:center}.n2_device_tester_zoom__min_label,.n2_device_tester_zoom__max_label{width:30px;padding:0 10px;color:#94b2c1;font-size:10px}.n2_device_tester_zoom__min_label{text-align:right}.n2_device_tester_zoom__max_label{text-align:left}.n2_device_tester_zoom__inner{position:relative;margin:0 0;width:160px;height:34px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_device_tester_zoom__trail{position:absolute;left:0;top:50%;margin:-3px 0;width:160px;background-color:#3a4956;height:6px;border-radius:3px}.n2_device_tester_zoom__editor_size{position:absolute;left:0;top:9px;margin-left:-2px;width:2px;height:16px;background-color:#3a4956}.n2_device_tester_zoom__handle{position:absolute;top:9px;display:block;width:16px;height:16px;margin-left:-8px;background-color:#fff;border-radius:16px;z-index:2;cursor:ew-resize}.n2_device_tester_zoom__handle_label{position:absolute;left:-22px;top:-18px;width:60px;color:#94b2c1;font-size:10px;line-height:16px;text-align:center}.n2_slider_manager{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;padding:0 40px}.n2_slider_manager__search{position:relative}.n2_slider_manager__search_label{display:none}.n2_slider_manager__search_label_item{font-size:14px;line-height:28px;color:#325c77}.n2_slider_manager__search_label_keyword{font-weight:700}.n2_slider_manager__search_form input{position:relative;padding-left:26px;border-radius:3px;border:2px solid #94b2c1;width:200px;font-size:14px;line-height:28px;color:#325c77}html[dir=rtl] .n2_slider_manager__search_form input{padding-left:0;padding-right:26px}.n2_slider_manager__search_form input::placeholder{color:#325c77}.n2_slider_manager__search_form input:focus{outline:0;border:2px solid #94b2c1;box-shadow:none}.n2_slider_manager__search_icon{position:absolute;top:0;left:0;padding-left:10px;bottom:-2px;align-items:center;justify-content:center;color:#94b2c1;z-index:2}html[dir=rtl] .n2_slider_manager__search_icon{padding-left:0;padding-right:10px;left:unset;right:0}.n2_slider_manager__search_icon--magnifier{display:flex}.n2_slider_manager__search_icon--abort{display:none;cursor:pointer}.n2_slider_manager__search_icon--abort i{font-size:14px!important}.n2_slider_manager__search_icon--abort:hover{color:#325c77}.n2_slider_manager--search .n2_slider_manager__new_slider{display:none}.n2_slider_manager--search .n2_slider_manager__paginator{display:none}.n2_slider_manager--search .n2_button_disabled{opacity:.5;pointer-events:none}.n2_slider_manager--search .n2_slider_manager__search_label{display:block}.n2_slider_manager--search .n2_slider_manager__search_icon--magnifier{display:none}.n2_slider_manager--search .n2_slider_manager__search_icon--abort{display:flex}.n2_slider_manager--noresult .n2_slider_manager__search_label{display:none}.n2_slider_manager--noresult .n2_slider_manager__content .n2_slider_manager__content--empty{display:flex}.n2_slider_manager__action_bar{display:flex;padding:16px 0 0;height:30px}.n2_slider_manager__action_bar_left{flex:1 1 auto;display:flex;justify-content:flex-start;align-items:center;margin:0 -5px}.n2_slider_manager__action_bar_left .n2_slider_icon--blue{color:#94b2c1}.n2_slider_manager__action_bar_right{flex:1 1 auto;display:flex;justify-content:flex-end}.n2_slider_manager__content{position:relative;display:flex;flex-wrap:wrap;margin:0 -16px}.n2_slider_manager__content .n2_slider_manager__content--empty{padding-top:80px;margin:auto;width:500px;flex-flow:column;align-items:center;justify-content:center;height:216px;display:none}.n2_slider_manager__content .n2_slider_manager__content--empty__logo{display:flex;align-items:center;justify-content:center;margin-top:44px;width:100px;height:100px;border-radius:50px;overflow:hidden;color:#89a9b9}.n2_slider_manager__content .n2_slider_manager__content--empty__heading{margin-top:10px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_slider_manager__content .n2_slider_manager__content--empty__paragraph{width:360px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_slider_manager__box{position:relative;flex:0 0 auto;width:270px;height:180px;border-radius:3px;margin:16px;background:#fff}.n2_slider_manager__sortable_placeholder{height:200px;margin:5px 0;width:0;box-shadow:0 0 0 2px #1d81f9}.n2_slider_manager__new_slider{background-color:#04c018;color:#fff;display:flex;flex-flow:column;justify-content:center;align-items:center;cursor:pointer}.n2_slider_manager__new_slider:HOVER{background-color:#07ca1c}.n2_slider_manager__new_slider_icon{margin:5px 0 25px}.n2_slider_manager__new_slider_label{font-size:16px;line-height:16px;text-transform:uppercase;font-weight:700;max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slider_box{position:relative;display:flex;flex-flow:column;border-radius:3px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1);overflow:hidden;transition:transform .2s,box-shadow .5s}.n2_slider_box:HOVER,.n2_slider_box.n2_slider_box--context-menu{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_slider_box.n2_slider_box--selected{box-shadow:0 0 0 5px #1d81f9;transition:box-shadow 0s}.n2_slider_box.n2-ui-sortable-helper{opacity:.8}.n2_slider_box__content{position:relative;height:100%;background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slider_box__content .n2_slider_box__icon{background:#1375e9;height:100%;width:100%;position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;flex-flow:column}.n2_slider_box__content .n2_slider_box__icon.n2_slider_box__icon_grey{background:#6b7986}.n2_slider_box__content .n2_slider_box__icon .n2_slider_box__icon_container{color:#fff}.n2_slider_box__content .n2_slider_box__icon .n2_slider_box__icon_text{color:#fff;text-transform:uppercase;font-weight:700;margin-top:12px}.n2_slider_box--group .n2_slider_box__icon{background:#94b2c1}.n2_slider_box--slider{background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slider_box__footer{flex:0 0 auto;padding:15px 10px;background-color:#fff;border-bottom-left-radius:3px;border-bottom-right-radius:3px;display:flex;align-items:center}.n2_slider_box__footer_title{display:block;padding:0 5px;box-sizing:border-box;width:100%;min-height:20px;max-height:60px;overflow:hidden;word-wrap:break-word;cursor:text;font-size:14px;line-height:20px;font-weight:700;color:#325c77}.n2_slider_box__footer_icon{color:#94b2c1;height:16px;margin:0 5px}.n2_slider_box__footer_children_count{flex:0 0 auto;margin-left:auto;height:24px;width:24px;border-radius:12px;background-color:#94b2c1;font-size:12px;line-height:24px;color:#fff;font-weight:700;text-align:center}.n2_slider_box__slider_overlay{display:none;z-index:10;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(32,41,52,.9);border-top-left-radius:3px;border-top-right-radius:3px;justify-content:center;align-items:center}.n2_slider_box:HOVER .n2_slider_box__slider_overlay,.n2_slider_box--context-menu .n2_slider_box__slider_overlay{display:flex}.n2_slider_box__slider_overlay_link{z-index:1;position:absolute;display:block;width:100%;height:100%}.n2_slider_box__slider_overlay .n2_button{display:inline-block;position:relative;z-index:2;max-width:120px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slider_box__slider_select_tick{z-index:2;position:absolute;left:8px;top:8px;box-sizing:border-box;width:20px;height:20px;border-radius:3px;border:2px solid #6b7986;cursor:pointer;font-size:16px;line-height:16px;color:#fff}.n2_slider_box__slider_select_tick .ssi_16{display:none}.n2_slider_box__slider_identifiers{z-index:9;position:absolute;left:2px;bottom:2px;display:flex}.n2_slider_box__slider_identifier{margin:3px;padding:0 5px;background-color:#6b7986;border-radius:3px;font-size:12px;line-height:2em;color:#fff;text-transform:uppercase}.n2_slider_box__slider_actions{display:none;position:absolute;right:8px;top:8px;z-index:12}.n2_slider_box:HOVER .n2_slider_box__slider_actions,.n2_slider_box--context-menu .n2_slider_box__slider_actions{display:block}.n2_slide_box__screen_reader{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.n2_slider_manager__action_bar_bulk_actions{display:none}.n2_body--bulk-select .n2_slider_manager__action_bar_bulk_actions,.n2_slider_manager__action_bar_bulk_actions.n2_slider_manager__action_bar_bulk_actions--popover-visible{display:block}.n2_body--bulk-select .n2_header__actions{visibility:hidden}.n2_body--bulk-select .n2_slider_box{opacity:.5}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected{opacity:1}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected .n2_slider_box__slider_select_tick{background-color:#1d81f9;border-color:#1d81f9}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected .n2_slider_box__slider_select_tick .ssi_16{display:block}.n2_body--bulk-select .n2_slider_box__slider_overlay{display:flex}.n2_body--bulk-select .n2_slider_box__slider_overlay_link,.n2_body--bulk-select .n2_slider_box__slider_overlay_edit_button,.n2_body--bulk-select .n2_slider_box__slider_actions{display:none!important}.n2_slider_manager__paginator{align-items:center;opacity:1;display:grid;grid-template-columns:1fr 1fr 1fr}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item{font-size:14px;color:#325c77}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item--active{display:block}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item--empty{display:none}.n2_slider_manager__paginator .n2_slider_manager__paginator_label--nosliders .n2_slider_manager__paginator_label_item--active{display:none}.n2_slider_manager__paginator .n2_slider_manager__paginator_label--nosliders .n2_slider_manager__paginator_label_item--empty{display:block}.n2_slider_manager__paginator .n2_slider_manager__paginator_buttons{display:flex;justify-content:center}.n2_slider_manager__paginator .n2_slider_manager__paginator_item{color:#325c77;font-weight:700;display:inline-flex;align-items:center;font-size:14px;line-height:28px;justify-content:center;margin:0 5px}.n2_slider_manager__paginator .n2_slider_manager__paginator_item--active{color:#1375e9}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow{margin:0}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow i{font-size:10px!important}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--prev{transform:rotate(180deg)}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--prev{transform:none}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--next{transform:rotate(180deg)}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--disabled{visibility:hidden}.n2_slider_manager__paginator .n2_slider_manager__paginator_limiter{text-align:right}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_limiter{text-align:left}.n2_new_project{min-height:100%;display:flex;flex-flow:column;justify-content:center}.n2_new_project__heading{margin-top:30px;color:#283f4d;font-size:32px;line-height:40px;text-align:center}.n2_new_project__sub_heading{color:#325c77;font-size:14px;line-height:30px;text-align:center}.n2_new_project__boxes{display:flex;justify-content:space-between;margin:40px -30px}.n2_new_project__box{flex:1 1 50%;margin:0 30px;padding:30px 40px;background-color:#fff;border-radius:10px;text-align:center;cursor:pointer}.n2_new_project__box:HOVER{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_new_project__box_heading{color:#283f4d;font-size:22px;line-height:40px}.n2_new_project__box_sub_heading{color:#325c77;font-size:14px;line-height:24px}.n2_new_project__import{display:block;margin:0 auto 20px;font-size:14px;line-height:30px;text-transform:capitalize}.n2_new_project__import:HOVER{color:#005bc6}.n2_new_project__import,.n2_new_project__import:FOCUS{color:#1375e9}.n2_create_new_project{display:flex;flex-flow:column;max-width:840px;margin:0 auto;box-sizing:border-box;min-height:100%;padding:30px 20px}.n2_create_new_project__heading{color:#283f4d;font-size:32px;line-height:40px;text-align:center}.n2_ss_slider_publish{display:flex}.n2_ss_slider_publish__option{padding:40px 20px;flex:1;display:flex;flex-flow:column;align-items:center}.n2_ss_slider_publish__option img{margin-top:15px;max-width:100%}.n2_ss_slider_publish__option .n2_button{margin-top:15px}.n2_ss_slider_publish__option+.n2_ss_slider_publish__option{border-left:1px solid #e4e9ec}html[dir=rtl] .n2_ss_slider_publish__option+.n2_ss_slider_publish__option{border-left:0;border-right:1px solid #e4e9ec}.n2_ss_slider_publish__option_label{line-height:28px;font-size:18px;color:#283f4d}.n2_ss_slider_publish__option_description{text-align:center;line-height:28px;font-size:14px;color:#325c77}.n2_ss_slider_publish__option_code{margin-top:15px;padding:15px 20px;background-color:#f5e293;border-radius:2px;line-height:20px;font-size:13px;color:#325c77}.n2_ss_slider_publish__related_modules{display:flex;flex-wrap:wrap;margin-top:10px}.n2_ss_slider_publish__related_modules .n2_button{margin:3px}.n2_slider_trash{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;position:relative;display:flex;flex-wrap:wrap;margin-left:5px}html[dir=rtl] .n2_slider_trash{margin-left:0;margin-right:5px}.n2_slider_manager__dummy_slider{display:none;background:#f0f4f7;border:2px dashed #94b2c1;flex-flow:column;justify-content:center;align-items:center;box-sizing:border-box}.n2_slider_trash--empty .n2_slider_manager__dummy_slider{display:flex}.n2_slider_manager__dummy_slider_icon{margin:16px 0;color:#94b2c1}.n2_slider_manager__dummy_slider_label{font-size:14px;line-height:22px;color:#325c77;font-weight:700}.n2_slide_manager{position:relative;z-index:1100;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:0 -1px}.n2_slide_manager[data-breadcrumbopener="1"]{display:none}.n2_admin_editor_overlay--show-slides .n2_slide_manager[data-breadcrumbopener="1"]{display:flex;flex-flow:column}.n2_slide_manager__inner{background-color:#2c3a45}.n2_slide_manager__exit{flex:1 1 auto;background:rgba(28,41,51,.5);cursor:pointer}.n2_slide_manager__action_bar{position:relative;z-index:3;padding:5px 35px;height:30px;margin-bottom:-40px}.n2_slide_manager__content{position:relative;display:flex;flex-wrap:wrap;padding:30px 30px}.n2_slide_manager__box{position:relative;box-sizing:border-box;flex:0 0 auto;width:200px;height:135px;border-radius:3px;margin:10px;background:#0c1924}.n2_slide_manager__sortable_placeholder{height:135px;margin:5px 0;width:0;box-shadow:0 0 0 2px #1d81f9}.n2_slide_manager__action_bar .n2_button_plain,.n2_slide_manager__action_bar .n2_button_plain:HOVER,.n2_slide_manager__action_bar .n2_button_plain:FOCUS{color:#bdcfd9}.n2_slide_manager__action_bar_bulk_actions{display:none}.n2_slide_manager--bulk-select .n2_slide_manager__action_bar_bulk_actions,.n2_slide_manager__action_bar_bulk_actions .n2_slide_manager__action_bar_bulk_actions--popover-visible{display:block}.n2_slide_manager--bulk-select .n2_slide_box{opacity:.5}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected{opacity:1}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected .n2_slide_box__slide_select_tick{background-color:#1d81f9;border-color:#1d81f9}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected .n2_slide_box__slide_select_tick .ssi_16{display:block}.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay{display:flex}.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay_link,.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay_edit_button,.n2_slide_manager--bulk-select .n2_slide_box__slide_actions{display:none!important}.n2_slide_manager__add_slide{background-color:#04c018;padding:16px 0;display:flex;flex-flow:column;justify-content:center;align-items:center;color:#fff;cursor:pointer}.n2_slide_manager__add_slide:HOVER{background-color:#07ca1c}.n2_slide_manager__add_slide_icon{font-size:48px;margin:16px 0}.n2_slide_manager__add_slide_label{font-size:14px;line-height:22px;font-weight:700;text-transform:uppercase;max-width:160px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_manager__add_slide_label--close{display:none}.n2_slide_manager--add-slide .n2_slide_manager__add_slide{background-color:#6b7986}.n2_slide_manager--add-slide .n2_slide_manager__add_slide:HOVER{background-color:#8694a2}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_icon{transform:rotateZ(45deg)}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_label--add-slide{display:none}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_label--close{display:block}.n2_slide_manager__add_slide_actions{overflow:hidden;height:0;transition:height .4s}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_actions{height:150px}.n2_slide_manager__add_slide_actions_inner{display:flex;padding:10px 30px}.n2_slide_manager__add_slide_action{display:flex;flex-flow:column;align-items:center;justify-content:center;margin:10px;width:140px;height:110px;box-sizing:border-box;padding:14px 0;border-radius:3px}.n2_slide_manager__add_slide_action,.n2_slide_manager__add_slide_action:HOVER,.n2_slide_manager__add_slide_action:FOCUS{color:#bdcfd9}.n2_slide_manager__add_slide_action:not(:first-child):HOVER{color:#fff}.n2_slide_manager__add_slide_action--image{background-color:#04c018}.n2_slide_manager__add_slide_action--image:HOVER{background-color:#07ca1c}.n2_slide_manager__add_slide_action--image,.n2_slide_manager__add_slide_action--image:HOVER,.n2_slide_manager__add_slide_action--image:FOCUS{color:#fff}.n2_slide_manager__add_slide_action_icon{padding:4px 0;font-size:48px;display:flex}.n2_slide_manager__add_slide_action_label{font-size:14px;line-height:26px;font-weight:700;text-transform:capitalize;max-width:120px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_manager__dummy_slide{display:none;background-color:#2c3a45;border:2px dashed #bdcfd9;padding:16px 0;flex-flow:column;justify-content:center;align-items:center;color:#bdcfd9;cursor:pointer}html[data-slides="0"] .n2_slide_manager__dummy_slide{display:flex}.n2_slide_manager__dummy_slide_icon{margin:16px 0}.n2_slide_manager__dummy_slide_label{font-size:14px;line-height:22px}.n2_slide_box{position:relative;opacity:.5;display:flex;flex-flow:column;transition:opacity .6s}.n2_slide_box.n2_slide_box--published{opacity:1}.n2_slide_box--currently-edited{box-shadow:0 0 0 3px #1d81f9}.n2_slide_box--just-added{opacity:0}.n2_slide_box__content{position:relative;height:100%;border-top-left-radius:3px;border-top-right-radius:3px;background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slide_box__footer{flex:0 0 auto;padding:9px 10px;background-color:#0c1924;border-bottom-left-radius:3px;border-bottom-right-radius:3px;display:flex;align-items:center}.n2_slide_box__footer_title{display:block;padding:0 5px;box-sizing:border-box;width:100%;min-height:20px;max-height:60px;overflow:hidden;word-wrap:break-word;cursor:text;font-size:14px;line-height:20px;font-weight:700;color:#bdcfd9}.n2_slide_box__footer_status{margin-left:auto;display:flex;align-items:center}.n2_slide_box__footer_status>*{display:flex;padding:3px}.n2_slide_box__footer_status_first_slide{display:none;color:#e19f21}.n2_slide_box--first-slide .n2_slide_box__footer_status_first_slide{display:flex}.n2_slide_box__footer_status_published{display:none}.n2_slide_box--published .n2_slide_box__footer_status_published{display:flex}.n2_slide_box__footer_status_published,.n2_slide_box__footer_status_published:HOVER,.n2_slide_box__footer_status_published:FOCUS{color:#04c018}.n2_slide_box--published .n2_slide_box__footer_status_unpublished{display:none}.n2_slide_box__footer_status_unpublished,.n2_slide_box__footer_status_unpublished:HOVER,.n2_slide_box__footer_status_unpublished:FOCUS{color:#bdcfd9}.n2_slide_box__footer_status_hidden{display:none}.n2_slide_box__footer_status_hidden:not([data-n2tip=""]){display:flex}.n2_slide_box__footer_status_hidden,.n2_slide_box__footer_status_hidden:HOVER,.n2_slide_box__footer_status_hidden:FOCUS{color:#bdcfd9}.n2_slide_box__slide_overlay{display:none;z-index:2;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(32,41,52,.9);border-top-left-radius:3px;border-top-right-radius:3px;justify-content:center;align-items:center}.n2_slide_box:HOVER .n2_slide_box__slide_overlay,.n2_slide_box--context-menu .n2_slide_box__slide_overlay{display:flex}.n2_slide_box__slide_overlay_link{z-index:1;position:absolute;display:block;width:100%;height:100%}.n2_slide_box__slide_overlay_edit_button{position:relative;z-index:2;padding:0 10px;line-height:28px;border-radius:2px;background-color:#04c018;font-size:11px;text-transform:uppercase;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_box__slide_overlay_edit_button:HOVER{background-color:#07ca1c}.n2_slide_box__slide_overlay_edit_button,.n2_slide_box__slide_overlay_edit_button:HOVER,.n2_slide_box__slide_overlay_edit_button:FOCUS{color:#fff}.n2_slide_box--currently-edited .n2_slide_box__slide_overlay_link,.n2_slide_box--currently-edited .n2_slide_box__slide_overlay_edit_button{display:none}.n2_slide_box__slide_select_tick{z-index:2;position:absolute;left:8px;top:8px;box-sizing:border-box;width:20px;height:20px;border-radius:3px;border:2px solid #6b7986;cursor:pointer;font-size:16px;line-height:16px;color:#fff}.n2_slide_box__slide_select_tick .ssi_16{display:none}html[dir=rtl] .n2_slide_box__slide_select_tick{right:8px;left:auto}.n2_slide_box__slide_actions{display:none;position:absolute;right:8px;top:8px;z-index:12}.n2_slide_box:HOVER .n2_slide_box__slide_actions,.n2_slide_box--context-menu .n2_slide_box__slide_actions{display:block}html[dir=rtl] .n2_slide_box__slide_actions{left:8px;right:auto}.n2_slide_box__details{z-index:1;position:absolute;left:5px;bottom:5px;display:flex;flex-flow:column}.n2_slide_box__details>*{margin:5px;padding:0 3px;background-color:#6b7986;border-radius:3px;font-size:11px;line-height:2em;color:#fff}.n2_slide_box__details_static_slide{text-transform:uppercase}.n2_slide_manager__block_notice{background-color:#0c1924;display:flex;align-items:center;justify-content:center;text-align:center;flex-flow:column}html[data-slides="0"] .n2_slide_manager__block_notice,html[data-slides="1"] .n2_slide_manager__block_notice{display:none}.n2_slide_manager__block_notice_description{margin-bottom:10px}.n2_slide_manager__block_notice_button{background:#1375e9;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;font-weight:700;cursor:pointer}.n2_slide_manager__block_notice_button:HOVER{background-color:#005bc6}.n2_slide_manager__block_notice_button,.n2_slide_manager__block_notice_button:HOVER,.n2_slide_manager__block_notice_button:FOCUS{color:#fff}.n2_nav_bar__breadcrumb_button_slides{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.n2_nav_bar__breadcrumb_button_slides .ssi_16{display:inline-block;vertical-align:middle}.n2_admin_editor_overlay--show-slides .n2_nav_bar__breadcrumb_button_slides span .ssi_16{transform:rotateZ(180deg)}.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides,.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:HOVER,.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:FOCUS{color:#94b2c1}.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides,.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:HOVER,.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:FOCUS{color:#fff}.n2_ss_history_action{opacity:.5}.n2_ss_history_action--allowed{opacity:1}#n2-admin[data-slide-background-type=image] .n2_form__table_row[data-field=table-row-background-video]{display:none}#n2-admin[data-slide-background-type=color] .n2_form__table_row[data-field=table-row-background-video],#n2-admin[data-slide-background-type=color] .n2_form__table_row[data-field=table-row-background-image],#n2-admin[data-slide-background-type=color] .n2_field[data-field=slidebackgroundColorOverlay]{display:none}.n2_admin_editor_overlay__middle{flex:1 1 auto;display:flex}[dir=rtl] .n2_admin_editor_overlay__middle{flex-flow:row-reverse}.n2_admin_editor_overlay__middle_center{position:relative;flex:1 1 auto;overflow:hidden}.n2_add_layer{visibility:visible;flex:0 0 auto;position:relative;display:flex;width:50px;z-index:10}.n2_add_layer__bar{position:relative;width:100%;height:100%;background-color:#0c1924;overflow:hidden}.n2_add_layer__bar .n2_button_plain_icon,.n2_add_layer__bar .n2_button_plain_icon:HOVER,.n2_add_layer__bar .n2_button_plain_icon:FOCUS{color:#94b2c1}.n2_add_layer__bar .n2_button_plain_icon--active{background:#1d81f9}.n2_add_layer__bar .n2_button_plain_icon--active,.n2_add_layer__bar .n2_button_plain_icon--active:HOVER,.n2_add_layer__bar .n2_button_plain_icon--active:FOCUS{color:#fff}.n2_add_layer__bar .n2_timeline_control_play_pause--playing{background:#1d81f9}.n2_add_layer__bar .n2_timeline_control_play_pause--playing,.n2_add_layer__bar .n2_timeline_control_play_pause--playing:HOVER,.n2_add_layer__bar .n2_timeline_control_play_pause--playing:FOCUS{color:#fff}.n2_add_layer__bar .n2_timeline_control_play_pause--playing .ssi_24::before{content:"\E16D"}.n2_add_layer__bar_top,.n2_add_layer__bar_bottom{background-color:#0c1924;position:absolute;left:0;display:flex;flex-flow:column;align-items:center;padding:0 10px}.n2_add_layer__bar_top{top:0}.n2_add_layer__bar_top>*{margin-bottom:14px}.n2_add_layer__bar_bottom{bottom:0}.n2_add_layer__bar_bottom>*{margin-bottom:14px}.n2_add_layer__bar_button{flex:0 0 auto;border-radius:2px}.n2_add_layer__more{display:none;flex-flow:column;position:absolute;left:0;top:0;width:330px;height:100%;background-color:#2c3a45}.n2_admin_editor_overlay--show-add-more .n2_add_layer__more{display:flex}.n2_add_layer__more_tab_buttons{flex:0 0 auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer__more_tab_button{flex:1 1 0;display:flex;align-items:center;flex-flow:column;padding:14px 0 6px;text-align:center;cursor:pointer;background-color:#0c1924;color:#94b2c1}.n2_add_layer__more_tab_button--active{background-color:#1d81f9;color:#fff}.n2_add_layer__more_tab_button_icon{display:flex;align-items:center;justify-content:center}.n2_add_layer__more_tab_button_label{font-size:11px;line-height:26px;text-transform:uppercase;font-weight:700;max-width:145px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer__more_tab{display:none;flex-flow:column;flex:1 1 auto;overflow:hidden}.n2_add_layer__more_tab--active{display:flex}.n2_add_layer__more_layers{flex:1 1 auto;overflow-y:auto}.n2_add_layer_group{margin-bottom:10px}.n2_add_layer_group__label{padding:8px 20px;background-color:#1c2933;border-bottom:1px solid #131c23;color:#94b2c1;font-size:12px;line-height:28px;font-weight:700;text-transform:uppercase;margin-bottom:10px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer_group__content{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px;padding:0 10px}.n2_add_layer_box{padding:6px 8px;background-color:#6b7986;border-radius:2px;text-align:center;cursor:pointer}.n2_add_layer_box.n2-ss-layer--drag{pointer-events:none;width:90px;opacity:.8;z-index:9999;margin:0}.n2_add_layer_box__icon{display:flex;align-items:center;justify-content:center;margin-top:4px;color:#fff}.n2_add_layer_box__label_wrap{display:flex;flex-flow:column;justify-content:center;min-height:32px}.n2_add_layer_box__label{font-size:12px;line-height:14px;color:#fff;font-weight:700;text-transform:capitalize}.n2_add_layer__more_position{flex:0 0 auto;display:flex;align-items:center;height:50px;background-color:#0c1924;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer_position__label{flex:1 1 50%;padding:0 5px;color:#94b2c1;font-size:12px;line-height:24px;font-weight:700;text-transform:uppercase;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer_position__default_label{text-align:right}.n2_add_layer_position[data-position=default] .n2_add_layer_position__default_label{color:#fff;cursor:initial}html[dir=rtl] .n2_add_layer_position__default_label{text-align:left}.n2_add_layer_position__absolute_label{text-align:left}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__absolute_label{color:#fff;cursor:initial}html[dir=rtl] .n2_add_layer_position__absolute_label{text-align:right}.n2_add_layer_position__switch{padding:3px;width:44px;height:24px;box-sizing:border-box;background-color:#1d81f9;border-radius:12px;cursor:pointer;transition:background-color .3s}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch{background-color:#5f39c2}.n2_add_layer_position__switch_dot{width:18px;height:18px;background-color:#fff;border-radius:18px;box-shadow:0 0 0 1px rgba(0,0,0,.1);transition:transform .3s}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch_dot{transform:translateX(20px)}html[dir=rtl] .n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch_dot{transform:translateX(-20px)}.n2_add_layer_library__title,.n2_add_layer_library_tag__title{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_add_layer_library__title_label,.n2_add_layer_library_tag__title_label{padding:0 10px;flex:1 1 auto;color:#94b2c1;font-size:12px;line-height:30px;font-weight:700;text-transform:uppercase}.n2_add_layer_library__theme{display:none;position:relative;overflow-y:scroll;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer_library__theme--active{display:block}.n2_add_layer_library_tag__title{cursor:pointer}.n2_add_layer_library_tag__title_opener{display:flex;align-items:center;justify-content:center;width:30px;color:#94b2c1}.n2_add_layer_library_tag--active .n2_add_layer_library_tag__title_opener{transform:rotateZ(180deg)}.n2_add_layer_library_tag__sections{flex-flow:column;align-items:center;padding:10px 0}.n2_add_layer_library_tag .n2_add_layer_library_tag__sections{display:none}.n2_add_layer_library_tag--active .n2_add_layer_library_tag__sections{display:flex}.n2_add_layer_library_tag__section{position:relative;margin:10px 0;width:270px;border-radius:3px;overflow:hidden}.n2_add_layer_library_tag__section img{display:block;width:100%}.n2_add_layer_library_tag__section--available{cursor:pointer}.n2_add_layer_library_tag__section_pro{z-index:10;position:absolute;top:5px;right:5px;padding:0 5px;background-color:#6b7986;border-radius:3px;font-size:12px;line-height:2em;color:#fff}.n2_add_layer_library_tag__section_overlay{display:none;z-index:9;position:absolute;left:0;top:0;width:100%;height:100%;padding:0 40px;box-sizing:border-box;background:rgba(12,25,36,.9);align-items:center;color:#94b2c1;font-size:14px;line-height:22px;text-align:center}.n2_add_layer_library_tag__section_overlay a,.n2_add_layer_library_tag__section_overlay a:HOVER,.n2_add_layer_library_tag__section_overlay a:FOCUS{color:#1d81f9}.n2_add_layer_library_tag__section:HOVER .n2_add_layer_library_tag__section_overlay{display:flex}.n2_ss_layer_window{visibility:visible;z-index:5;position:absolute!important;left:100px;top:100px;display:none;flex-flow:column;width:355px}.n2_body--layer-window-visible .n2_ss_layer_window{display:flex}.n2_body--show-add-more .n2_ss_layer_window,.n2_body--drag-layer .n2_ss_layer_window,.n2_body--resize-absolute .n2_ss_layer_window,.n2_body--resize-editor .n2_ss_layer_window{display:none}.n2_ss_layer_window__resize{flex:0 0 auto;position:static!important;height:7px;width:100%;cursor:ns-resize;background-color:#0c1924;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.n2_ss_layer_window__crop{flex:1 1 auto;display:flex;flex-flow:column;position:relative;width:100%;border-top-left-radius:3px;border-top-right-radius:3px;box-shadow:0 1px 10px 0 rgba(0,0,0,.3);overflow:hidden;background-color:#0c1924;z-index:2}.n2_ss_layer_window__title{flex:0 0 auto;display:flex;position:relative;line-height:36px;height:36px;overflow:hidden;background-color:#0c1924;font-size:14px;color:#94b2c1;cursor:move;border-top-left-radius:5px;border-top-right-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_ss_layer_window__title_nav a{display:block;width:36px;height:36px;text-align:center}.n2_ss_layer_window__title_nav_button{margin:6px;display:inline-flex;width:24px;height:24px;align-items:center;justify-content:center;border-radius:2px;cursor:pointer;color:#94b2c1}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__title_nav_button_layer_list{background-color:#1d81f9;color:#fff}.n2_ss_layer_window__title_inner{flex:1 1 auto;padding:0 20px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700}.n2_ss_layer_window__tab_buttons{flex:0 0 auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_ss_layer_window__tab_buttons[data-visible-tabs="1"]{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__tab_buttons{display:none}.n2_ss_layer_window__tab_button{display:none;flex:1 1 0;width:33%;flex-flow:column;align-items:center;padding:11px 0 2px;cursor:pointer;background-color:#0c1924;color:#94b2c1}.n2_ss_layer_window__tab_button_icon{display:flex;align-items:center;justify-content:center}.n2_ss_layer_window__tab_button_label{font-size:11px;line-height:23px;text-transform:uppercase;font-weight:700;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_ss_layer_window__tab_button--allowed{display:flex}.n2_ss_layer_window__tab_button--allowed.n2_ss_layer_window__tab_button--active{background-color:#1d81f9;color:#fff}.n2_ss_layer_window__tab_container{position:relative;flex:1 1 auto;overflow-x:hidden;overflow-y:scroll;background-color:#3a4956}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__tab_container{display:none}.n2_ss_layer_window__tab{display:none;color:#fff}.n2_ss_layer_window__tab[data-tab=item]>*{display:none}.n2_ss_layer_window__tab--allowed.n2_ss_layer_window__tab--active{display:block}.n2_ss_layer_window__tab_panel{display:none}.n2_ss_layer_window__tab_panel--active{display:block}.n2_ss_layer_window [data-generator-related="1"]{display:none}.n2_ss_body--dynamic-slide .n2_ss_layer_window [data-generator-related="1"]{display:block}body[data-device=desktopPortrait] .n2_field[data-field=layer-clear-device-specific-changes],body[data-device=desktopPortrait] .n2_field[data-field=layer-slide-clear-device-specific-changes]{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_title{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation{flex:1 1 auto;width:100%!important;height:auto!important;max-height:none;overflow:auto}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list{width:100%;overflow-y:auto!important}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_layers{padding-bottom:0!important}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_layer__title{border-right:0}.n2_admin_editor_overlay--attached-layer-list .n2_timeline{width:0;overflow:hidden}.n2_fields_layer_window__title_fields .n2_form__table_label_field:last-child{margin-right:0}.n2_fields_layer_window[data-fieldset-type=style-mode][data-state=""] .n2_form__table_label_field[data-style-mode-feature=reset-to-normal]{display:none}.n2_ss_design_layer_window_design{display:none}.n2_ss_design_layer_window_design--visible{display:block}.n2_layer_window_design_preset{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_layer_window_design_preset__label_container{flex:1 1 auto;display:inline-flex;align-items:center;height:30px}.n2_layer_window_design_preset__label_container .ssi_16--info{margin:0 5px;color:#94b2c1}.n2_layer_window_design_preset__label{font-size:12px;font-weight:700;text-transform:uppercase;color:#94b2c1;max-width:160px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_design_preset__fields{display:flex}.n2_layer_window_design_preset__presets{display:none}.n2_layer_window_design_preset__button_choose{display:inline-flex;vertical-align:top;width:30px;height:30px;background-color:#04c018;border-radius:2px;align-items:center;justify-content:center;font-size:16px}.n2_layer_window_design_preset__button_choose:HOVER{background-color:#07ca1c}.n2_layer_window_design_preset__button_choose,.n2_layer_window_design_preset__button_choose:HOVER,.n2_layer_window_design_preset__button_choose:FOCUS{color:#fff}.n2_layer_window_design_preset__button_back{display:none;vertical-align:top;width:30px;height:30px;background-color:#6b7986;border-radius:2px;align-items:center;justify-content:center;font-size:16px}.n2_layer_window_design_preset__button_back:HOVER{background-color:#8694a2}.n2_layer_window_design_preset__button_back,.n2_layer_window_design_preset__button_back:HOVER,.n2_layer_window_design_preset__button_back:FOCUS{color:#fff}.n2_layer_window_design_preset__fields_secondary{display:inline-flex;vertical-align:top;margin:0 10px}.n2_layer_window_design_preset__button_secondary{display:inline-flex;vertical-align:top;width:30px;height:30px;font-size:16px;align-items:center;justify-content:center}.n2_layer_window_design_preset__button_secondary,.n2_layer_window_design_preset__button_secondary:HOVER,.n2_layer_window_design_preset__button_secondary:FOCUS{color:#94b2c1}.n2_ss_layer_window--show-presets .n2_ss_layer_window__tab_panel:not([data-panel=item]){display:none}.n2_ss_layer_window--show-presets .n2_ss_design_layer_window_design .n2_fields_layer_window{display:none}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__fields_secondary,.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__button_choose{display:none}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__button_back{display:inline-flex}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset{position:-webkit-sticky;position:sticky;top:0}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__presets{display:block}.n2_fields_layer_window[data-fieldset-type=design][data-state="0"] .n2_form__table_label_field[data-design-feature=reset-to-normal]{display:none}.n2_fields_layer_window[data-fieldset-type=design][data-elements="0"]{display:none}.n2_fields_layer_window[data-fieldset-type=design][data-elements="1"] [data-design-feature=element]{display:none}.n2_layer_window_design_preset__preset_list_preset{display:flex;padding:5px 10px;background-color:#2c3a45;border-bottom:1px solid #131c23;cursor:pointer}.n2_layer_window_design_preset__preset_list_preset span{font-size:12px;line-height:30px;margin-right:auto;color:#bdcfd9}html[dir=rtl] .n2_layer_window_design_preset__preset_list_preset span{margin-right:0;margin-left:auto}.n2_layer_window_design_preset__preset_list_preset_buttons{display:inline-flex}.n2_layer_window_design_preset__preset_list_preset_button{display:inline-flex;vertical-align:top;width:30px;height:30px;font-size:16px;align-items:center;justify-content:center;cursor:pointer;color:#94b2c1}.n2_container_animation__buttons{display:flex;align-items:center;padding:8px 10px;background-color:#0c1924}.n2_container_animation__button{flex:1 1 0;padding:6px 5px;color:#94b2c1;font-size:12px;line-height:16px;border-radius:14px;text-align:center;text-transform:uppercase;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_container_animation__button--active{background-color:#1d81f9;color:#fff}.n2_container_animation__tab{display:none}.n2_container_animation__tab--active{display:block}.n2_layer_window_animations_presets__buttons{display:grid;grid-template-columns:repeat(4,1fr);grid-gap:10px;padding:10px;background-color:#3a4956}.n2_layer_window_animations_presets__button{padding:10px 8px 5px;border-radius:3px;background-color:#6b7986;color:#fff;text-align:center;cursor:pointer}.n2_layer_window_animations_presets__button .ssi_24{margin-bottom:5px;display:block}.n2_layer_window_animations_presets__button--active{background-color:#1d81f9}.n2_layer_window_animations_presets__button_label{font-size:12px;line-height:20px;max-width:56px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_animations_presets__presets{display:none}.n2_layer_window_animations_presets__presets--active{display:block}.n2_layer_window_animations_presets__preset{padding:10px 20px;background-color:#2c3a45;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:20px;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-in],.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-loop],.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-out]{display:none}.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-in],.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-loop],.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-out]{display:block}.n2_layer_window_animations_editor__title{display:flex;padding:7px 0;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_layer_window_animations_editor__label{flex:1 1 auto;font-size:12px;line-height:30px;color:#94b2c1}.n2_layer_window_animations_editor__title_left{padding:0 10px}.n2_layer_window_animations_editor__button_play{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;background-color:#6b7986;font-size:16px;color:#fff;cursor:pointer}.n2_layer_window_animations_editor__button_play--active{background-color:#1d81f9}.n2_layer_window_animations_editor__button_play--active .ssi_16::before{content:"\E607"}.n2_layer_window_animations_editor__title_right{padding:0 5px}.n2_layer_window_animations_editor__button_settings{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor__button_settings--active{background-color:#1d81f9;color:#fff}.n2_layer_window_animations_editor__button_delete{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor_basic{position:relative}.n2_layer_window_animations_editor_basic__keyframe.n2-ui-sortable-helper{width:100%;opacity:.5}.n2_layer_window_animations_editor_basic__keyframe--sort .n2_fields_layer_window{display:none}.n2_layer_window_animations_editor_basic__keyframe_title{display:flex;padding:5px 0;background-color:#2c3a45;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:30px;cursor:pointer}.n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_title{background-color:#1d81f9;color:#fff}.n2_layer_window_animations_editor_basic--single-keyframe .n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_title{background-color:#2c3a45;color:#94b2c1;cursor:initial}.n2_layer_window_animations_editor_basic__keyframe_label{flex:1 1 auto;padding:0 20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.n2_layer_window_animations_editor_basic__keyframe_delete{margin:0 5px;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_delete{color:#fff}.n2_layer_window_animations_editor_basic--single-keyframe .n2_layer_window_animations_editor_basic__keyframe_delete{display:none}.n2_layer_window_animations_editor_basic__add_keyframe{display:flex;justify-content:center;padding:10px 0}.n2_layer_window_animations_editor_basic__button_add_keyframe{padding:0 10px;background-color:#6b7986;border-radius:3px;font-size:11px;line-height:30px;text-transform:uppercase;color:#fff;cursor:pointer}.n2_layer_window_animations_editor_basic__button_add_keyframe:HOVER{background-color:#8694a2}[data-devicespecific]{position:relative}#n2-ss-devicespecific-settings{position:absolute;bottom:40px;left:0;margin:0 10px;white-space:nowrap;z-index:2;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:0;border-radius:3px;overflow:hidden;background:#a1aeb5}html[dir=rtl] #n2-ss-devicespecific-settings{left:auto;right:0}#n2-ss-devicespecific-settings *{cursor:pointer;background:#a1aeb5;display:inline-block;width:20px;height:20px;padding:5px;line-height:20px;text-align:center;font-size:16px;color:#fff}body[data-device=desktopPortrait] #n2-ss-devicespecific-settings .ssi_16--desktopportrait,body[data-device=desktopLandscape] #n2-ss-devicespecific-settings .ssi_16--desktoplandscape,body[data-device=tabletPortrait] #n2-ss-devicespecific-settings .ssi_16--tabletportrait,body[data-device=tabletLandscape] #n2-ss-devicespecific-settings .ssi_16--tabletportraitlarge,body[data-device=mobilePortrait] #n2-ss-devicespecific-settings .ssi_16--mobileportrait,body[data-device=mobileLandscape] #n2-ss-devicespecific-settings .ssi_16--mobileportraitlarge{background:#1d81f9}[data-placement=absolute] [data-placement]:not([data-placement=absolute]):not([data-placement=all]),[data-placement=content] [data-placement]:not([data-placement=content]):not([data-placement=all]),[data-placement=normal] [data-placement]:not([data-placement=normal]):not([data-placement=all]),[data-placement=default] [data-placement]:not([data-placement=default]):not([data-placement=all]),[data-placement=""] [data-placement]{display:none!important}.n2_layer_navigation{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;visibility:visible;display:flex;overflow:hidden;max-height:0;z-index:2}.n2_admin_editor_overlay--show-layer-navigation:not(.n2_admin_editor_overlay--show-add-more) .n2_layer_navigation{max-height:none;overflow:auto}.n2_layer_navigation_list{position:relative;width:340px;flex:0 0 auto;overflow-y:auto;overflow-x:hidden;background-color:#1c2933}.n2_layer_navigation--has_timeline .n2_layer_navigation_list{overflow:hidden}.n2_layer_navigation_list_title{position:-webkit-sticky;position:sticky;top:0;z-index:2;display:flex;align-items:center;background-color:#0c1924;height:48px}.n2_layer_navigation_list_title__hide{position:relative;z-index:2;margin:10px;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#1d81f9;border-radius:2px;cursor:pointer;color:#fff;font-size:16px}.n2_layer_navigation_list_title__label{z-index:1;position:absolute;left:0;top:0;width:100%;text-align:center;cursor:ns-resize;font-size:18px;line-height:48px;color:#fff}.n2_layer_navigation_list_layers{position:relative}.n2_layer_navigation_list_layers__sortable_placeholder{position:relative;height:0;z-index:1001;box-shadow:0 0 0 2px #1d81f9}.n2_layer_navigation_list_layer{position:relative}.n2_layer_navigation_list_layer__title{position:relative;display:flex;height:32px;background-color:#1c2933;border-right:1px solid #0c1924;border-bottom:1px solid #0c1924;color:#94b2c1;cursor:pointer}.n2_layer_navigation_list_layer__title[data-rows="2"]{height:64px}.n2_layer_navigation_list_layer__title:HOVER{background-color:#0c1924;border-bottom:1px solid #0c1924}.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title{background-color:#1d81f9;border-color:#1d81f9;color:#fff}.n2_layer_navigation_list_layer--absolute.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title{background-color:#5f39c2;border-color:#5f39c2;color:#fff}.n2_layer_navigation_list_layer--absolute.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title .n2_layer_navigation_list_layer__title_label_icon{color:#fff}.n2_layer_navigation_list_layer--drop>.n2_layer_navigation_list_layer__title{background:#0c1924;border-color:#0c1924}.n2_layer_navigation_list_layer__title_label{flex:1 1 auto;display:flex;align-items:center;line-height:32px;padding-left:10px;overflow:hidden}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:20px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:30px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:30px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:40px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:40px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:50px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:50px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:60px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:60px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:70px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:70px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:80px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:80px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:90px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:90px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:100px}.n2_layer_navigation_list_layer__title_label_icon{display:inline-flex;align-items:center;justify-content:center;margin:0 3px;width:20px;height:20px;font-size:16px}.n2_layer_navigation_list_layer__title_label_icon[data-action=hide-show]:HOVER .ssi_16::before{content:"\E60F"}.n2_layer_navigation_list_layer__title--hidden>.n2_layer_navigation_list_layer__title_label .n2_layer_navigation_list_layer__title_label_icon .ssi_16::before{content:"\E923"}.n2_layer_navigation_list_layer__title_label_folder{display:inline-flex;align-items:center;justify-content:center;width:12px;height:12px;font-size:16px;cursor:pointer;opacity:.5}.n2_layer_navigation_list_layer__title_label_folder .ssi_16::before{content:"\E19E"}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label_folder{margin-left:-12px}.n2_layer_navigation_list_layer__title_label_folder:HOVER{opacity:1}.n2_layer_navigation_list_layer--closed .n2_layer_navigation_list_layer__title_label_folder .ssi_16::before{content:"\E19D"}.n2_layer_navigation_list_layer__title_label_text{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px;text-transform:capitalize;font-weight:700}.n2_layer_navigation_list_layer__title_label_text[contenteditable=true]:focus{text-overflow:initial;cursor:initial}.n2_layer_navigation_list_layer__title_label_text::selection{background:rgba(255,255,255,.99);color:#1d81f9}.n2_layer_navigation_list_layer__title_actions{display:flex;align-items:center;padding:0 5px}.n2_layer_navigation_list_layer__title_action{margin:3px;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:16px;cursor:pointer}.n2_layer_navigation_list_layer__title_label_rename{display:inline-flex;align-items:center;justify-content:center;width:12px;height:32px;opacity:.5;cursor:pointer}.n2_layer_navigation_list_layer__title_label_rename:HOVER{opacity:1}.n2_layer_navigation_list_layer__title--hidden .n2_layer_navigation_list_layer__title_action_hide .ssi_16::before{content:"\E923"}.n2_ss_layer_window .n2_layer_navigation_list_layer__title_action--add-animation,.n2_layer_navigation_list_layer__title--has-animations .n2_layer_navigation_list_layer__title_action--add-animation{display:none}.n2_ss_layer_window .n2_layer_navigation_list_layer__title_action--remove-animation,.n2_layer_navigation_list_layer__title:not(.n2_layer_navigation_list_layer__title--has-animations) .n2_layer_navigation_list_layer__title_action--remove-animation{display:none}.n2_layer_navigation_list_layer__title_absolute_marker{margin:2px;width:16px;height:16px;background-color:#5f39c2;border-radius:2px;text-align:center;font-size:12px;line-height:16px;color:#fff;font-weight:700}.n2_layer_navigation_list_layer--sorted{position:absolute;left:0;width:100%;overflow:hidden;opacity:.7}.n2_timeline{position:relative;flex:1 1 auto;overflow:scroll;background:#1c2933}.n2_timeline__inner_pane{display:flex;flex-flow:column}.n2_timeline__inner_pane--calculate-duration{width:auto!important}.n2_timeline__time_frames{position:-webkit-sticky;position:sticky;top:0;z-index:100000;display:flex;height:48px;background-color:#0c1924;padding-left:21px}.n2_timeline__inner_pane--calculate-duration .n2_timeline__time_frames{width:0;overflow:hidden}.n2_timeline__cti{position:absolute;left:-10px;top:3px;z-index:100001;width:0;height:1000%;border-left:1px solid RGBA(230,182,37,.5);margin-left:21px;cursor:ew-resize}.n2_timeline__cti_dot{position:relative;left:-6px;top:0;width:11px;height:11px;border-radius:0 50% 50% 50%;transform:rotate(-135deg);background-color:#e6b625}.n2_timeline__time_frames_overlay{position:absolute;left:0;top:0;width:100%;height:100%;z-index:2;display:flex}.n2_timeline__time_frames_overlay svg{flex:1 1 auto;margin-left:19px;height:48px;color:#3a454e}.n2_timeline__one_second{flex:0 0 auto;position:relative;width:195px;height:100%;padding-left:5px;font-size:12px;line-height:48px;color:#94b2c1}.n2_timeline_layer__animations{display:flex;height:32px;padding-left:20px;background-color:#1c2933;border-bottom:1px solid rgba(0,0,0,.2)}.n2_timeline_layer__animations[data-rows="2"]{height:64px}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation{padding-left:0}.n2_timeline_layer__animations--active{background-color:#0c1924}.n2_timeline_animation_repeat{position:relative;display:none;align-items:center;justify-content:flex-end;line-height:32px;font-size:12px;color:#fff;cursor:ew-resize;padding:0 5px}.n2_timeline_animation_repeat:after{position:absolute;top:50%;margin-top:-5px;display:block;content:'';width:10px;height:10px;border-radius:10px;background-color:rgba(255,255,255,.3)}.n2_timeline_animation_repeat--start{margin-left:-20px;padding:0 20px}.n2_timeline_animation_repeat--start:after{right:5px}.n2_timeline_animation_repeat--end{margin-left:-10px}.n2_timeline_animation_repeat--end:after{right:-15px}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_repeat{display:flex;flex-shrink:0}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_group,.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_repeat--end{background-color:#3a4956}.n2_timeline_animation_group__row{display:flex}.nui_resize_bar__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:90;position:absolute;top:0;width:18px}.nui_resize_bar__handle:after{margin:4px;display:block;content:'';width:10px;height:10px;border-radius:10px;background-color:RGBA(0,0,0,.5)}.nui_resize_bar__handle--e{cursor:e-resize;right:0}.nui_resize_bar__handle--w{cursor:w-resize;left:0}.n2_timeline_animation_bar{position:relative;height:18px;margin:7px 0;border-radius:10px;cursor:ew-resize;z-index:90}.n2_timeline_animation_bar:HOVER{z-index:90}.n2_timeline_animation_bar--in{background-color:#1d81f9}.n2_timeline_animation_bar--loop{background-color:#04c018}.n2_timeline_animation_bar--out{background-color:#6b7986}.n2_timeline_animation_bar--extra{background-color:#6b7986}.n2_timeline_animation_bar__delay{position:absolute;line-height:18px;text-align:right;right:100%;margin-right:5px;font-size:11px;color:#fff}.n2_timeline_animation_bar__delay--small{display:none}.n2_timeline_animation_bar__duration{margin:0 7px;line-height:18px;text-align:center;cursor:ew-resize;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:#fff;text-transform:uppercase}.n2_timeline_layer--closed .n2_timeline_layer__children{display:none}.n2_timeline_overlay_playing{display:none;position:fixed;width:100%;height:100%;left:0;top:0;z-index:9999;cursor:pointer}.n2_body--timeline-preview .n2_timeline_overlay_playing{display:block}.n2_body--timeline-preview .n2_ss_layer_window{display:none!important}.n2_body--timeline-preview #n2-ss-0 .n2-ss-layer{cursor:default}.n2_body--timeline-preview #n2-ss-slide-canvas-container #n2-ss-0 .n2-ss-layer .nui_resize_normal__handle{display:none!important}#n2-ss-0[data-responsive=fullpage]{min-height:0!important}#n2-ss-0{box-shadow:0 3px 10px 0 rgba(0,0,0,.1)}#n2-ss-0 .n2-ss-widget{pointer-events:none;opacity:.5!important}#n2-ss-0-align{margin:0!important}body:not(.n2-ss-slider-visible) #n2-ss-0 .n2-ss-layer{opacity:0!important}.n2_slide_editor_slider{position:relative;z-index:1;display:inline-flex;align-items:flex-start;min-width:100%;min-height:calc(100vh - 60px);padding-bottom:100px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_slide_editor_slider__editor{position:relative}.n2_slide_editor_slider__editor_inner{position:relative;background:#f0f4f7;box-shadow:0 2px 20px rgba(0,0,0,.2)}div#n2-ss-0:HOVER .n2-ss-static-slide:not(.n2-ss-currently-edited-slide){visibility:hidden;z-index:-1}div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=slide],div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=content],div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=content] div.n2-ss-section-main-content{visibility:visible}.n2_ruler{display:none;z-index:1;position:absolute;left:0;top:0;height:100%;width:100%;direction:ltr;overflow:hidden;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html[dir=rtl] .n2_ruler{left:auto;right:0}.n2_body--ruler .n2_ruler{display:block}.n2_ruler_mark{flex:0 0 auto;position:relative;vertical-align:top}.n2_ruler_mark__label{position:absolute;display:block;font-size:9px;color:#325c77;line-height:12px}.n2_ruler--vertical{top:14px;height:calc(100% - 14px)}.n2_ruler--vertical .n2_ruler__inner{width:14px;visibility:visible;position:relative;background:#fff;border-right:1px solid #94b2c1}.n2_ruler--vertical .n2_ruler_mark{width:3px;height:9px;border-top:1px solid #94b2c1}.n2_ruler--vertical .n2_ruler_mark--small{left:11px}.n2_ruler--vertical .n2_ruler_mark--large{width:100%}.n2_ruler--vertical .n2_ruler_mark__label{left:0;top:2px;writing-mode:vertical-rl;-ms-writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;-webkit-text-orientation:upright;text-orientation:upright}.n2_ruler--horizontal{left:14px;width:calc(100% - 14px)}.n2_ruler--horizontal .n2_ruler__inner{visibility:visible;height:14px;position:relative;display:inline-flex;vertical-align:top;flex-wrap:nowrap;direction:ltr;background:#fff;border-bottom:1px solid #94b2c1}.n2_ruler--horizontal .n2_ruler_mark{width:9px;height:3px;border-left:1px solid #94b2c1}.n2_ruler--horizontal .n2_ruler_mark--small{top:11px}.n2_ruler--horizontal .n2_ruler_mark--large{height:100%}.n2_ruler--horizontal .n2_ruler_mark__label{left:2px;top:0}.n2_ruler__guide{visibility:hidden;position:absolute;left:0;top:0;z-index:2}.n2_ruler--vertical .n2_ruler__guide{width:100%;height:0}.n2_ruler--horizontal .n2_ruler__guide{width:0;height:100%}.n2_ruler__guide--measure{z-index:1}.n2_ruler__guide_border{visibility:visible;pointer-events:none}.n2_ruler--vertical .n2_ruler__guide_border{border-bottom:1px solid #ccaa2b;width:100%}.n2_ruler--horizontal .n2_ruler__guide_border{border-right:1px solid #ccaa2b;height:100%}.n2_ruler__guide--measure .n2_ruler__guide_border{border-color:red}.n2_ruler__guide_handle{visibility:visible;position:absolute;left:0;top:0;background:#e6b625;width:9px;height:9px;color:#fff;font-size:9px;line-height:9px;cursor:pointer;display:flex;justify-content:center;align-items:center}.n2_ruler__guide_handle .ssi_16{font-size:9px!important}.n2_ruler--vertical .n2_ruler__guide_handle{top:-4px}.n2_ruler--horizontal .n2_ruler__guide_handle{left:-4px}.n2_ruler_corner{display:block;position:absolute;left:0;top:0;width:14px;height:14px;border-right:1px solid #94b2c1;border-bottom:1px solid #94b2c1;visibility:visible;background:#fff;cursor:pointer}.n2_layer_contextual_hover_layer::after,.n2_layer_context_menu_target::after,.n2_layer_col_highlight::after,.n2_layer_highlight_row_structure::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #6b7986;pointer-events:none}.n2_layer_contextual_hover_layer[data-pm=absolute]::after,.n2_layer_context_menu_target[data-pm=absolute]::after,.n2_layer_col_highlight[data-pm=absolute]::after,.n2_layer_highlight_row_structure[data-pm=absolute]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #5f39c2;pointer-events:none}.n2_layer_contextual_active_layer::after,.nui_resize_absolute--resizing::after,.n2_layer_resize_snap_to::after,.n2_layer_drag__dragging::after,.n2_layer_drag_snap_to::after,.n2_layer_parent_highlight::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #1d81f9;pointer-events:none}.n2_layer_contextual_active_layer[data-pm=absolute]::after,.nui_resize_absolute--resizing[data-pm=absolute]::after,.n2_layer_resize_snap_to[data-pm=absolute]::after,.n2_layer_drag__dragging[data-pm=absolute]::after,.n2_layer_drag_snap_to[data-pm=absolute]::after,.n2_layer_parent_highlight[data-pm=absolute]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #5f39c2;pointer-events:none}.n2_layer_drag__dragging{opacity:.5}.n2_layer_drag_target_groups[data-sstype=content]::after,.n2_layer_drag_target_groups[data-sstype=col]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #6b7986;pointer-events:none}.n2_layer--creation-in-progress,.n2_layer--creation-in-progress *{visibility:hidden!important}.n2_admin_editor__content--hover .n2-ss-layer-content .n2-ss-layer.n2-active{z-index:10}.n2_admin_editor__content--hover .n2-ss-layer.n2-active{overflow:visible!important}.n2-ss-section-main-content{min-height:20px}.n2-ss-layer-row .n2-ss-layer-content{min-height:20px}[data-visibility=hidden],[data-visibility=hidden] *{visibility:hidden!important;transition:none!important}.n2_admin_editor__content--hover .n2-ss-layer.n2-active{z-index:9999999!important}.n2_layer_layer_list_hover--force-zindex{z-index:9999999!important}.n2-ss-layer-placeholder{display:block;position:relative;width:100%;height:0;z-index:11}.n2-ss-layer-placeholder::after{display:block!important;content:'';position:absolute;left:0;top:-3px;box-sizing:border-box!important;width:100%;border:3px solid #1d81f9}.n2_smartguide{background:#4affff;position:absolute;left:0;top:0;z-index:1000000;display:none}.n2_smartguide--horizontal{width:100%;height:1px}.n2_smartguide--vertical{height:100%;width:1px}.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col],.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col] .n2-ss-layer{cursor:pointer}.ui-column-width-handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;position:absolute;top:25%;height:50%;cursor:ew-resize;width:5px;background:#1d81f9;z-index:88;opacity:.5;box-sizing:border-box!important;border-radius:5px}.ui-column-width-handle--visible{display:block}.n2-ss-layer:not(.n2-ss-layer--block)>.n2-ss-layer-row>.ui-column-width-handle,.n2-ss-layer-row[data-row-wrapped="1"]>.ui-column-width-handle{display:none!important}#n2-ss-0 .n2-ss-layer{cursor:not-allowed}#n2-ss-0 .n2-ss-currently-edited-slide .n2-ss-layer{cursor:pointer}div#n2-ss-0 .n2-ss-layer[data-sstype=content] .n2-ss-layer.nui-draggable-dragging,div#n2-ss-0 .n2-ss-layer[data-sstype=col] .n2-ss-layer.nui-draggable-dragging{z-index:100000;outline:0!important}#n2-ss-0 .n2-ss-slide:not(.n2-ss-currently-edited-slide){opacity:.3}.nui_resize_normal__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;z-index:90;display:none;border:2px solid #1d81f9;height:6px;width:6px;background:#fff;border-radius:50px;transform-origin:50% 50%}.nui_resize_normal__handle:HOVER{transform:scale(1.5)}.nui_resize_normal__handle.nui-enabled{display:block}.nui_resize_normal__handle--none{border-color:#6b7986}.nui_resize_normal__handle--e{cursor:e-resize;right:-4px;top:50%;margin-top:-4px}.nui_resize_normal__handle--w{cursor:w-resize;left:-4px;top:50%;margin-top:-4px}.nui_resize_normal__handle--s{cursor:s-resize;bottom:-4px;left:50%;margin-left:-4px}.nui_spacing__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;display:block;z-index:89;background:#1d81f9;overflow:hidden;opacity:0}.nui_spacing__handle.nui-enabled{opacity:.5}.nui_spacing__handle--zero{background:#6b7986}.nui_spacing__handle--negative{background:#be331f}.nui_spacing__handle:HOVER.nui-enabled,.nui_spacing__handle--spacing.nui-enabled{opacity:.8}.nui_spacing__handle--n.nui_spacing__handle.nui-enabled{min-height:5px;cursor:s-resize}.nui_spacing__handle--n.nui_spacing__handle--padding{top:0;margin-left:0;left:25%;width:50%}.nui_spacing__handle--n.nui_spacing__handle--margin{left:0;bottom:100%;width:100%}.nui_spacing__handle--e.nui_spacing__handle.nui-enabled{min-width:5px;cursor:w-resize}.nui_spacing__handle--e.nui_spacing__handle--padding{top:25%;margin-top:0;right:0;height:50%}.nui_spacing__handle--e.nui_spacing__handle--margin{top:0;left:100%;height:100%}.nui_spacing__handle--s.nui_spacing__handle.nui-enabled{min-height:5px;cursor:n-resize}.nui_spacing__handle--s.nui_spacing__handle--padding{bottom:0;margin-left:0;left:25%;width:50%}.nui_spacing__handle--s.nui_spacing__handle--margin{bottom:auto;top:100%;left:0;width:100%}.nui_spacing__handle--w.nui_spacing__handle.nui-enabled{min-width:5px;cursor:e-resize}.nui_spacing__handle--w.nui_spacing__handle--padding{top:25%;margin-top:0;left:0;height:50%}.nui_spacing__handle--w.nui_spacing__handle--margin{left:auto;right:100%;top:0;height:100%}.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>.nui_spacing__handle--margin,.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>.nui_spacing__handle--padding,.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>div>.nui_spacing__handle--padding{display:block;min-width:0;min-height:0;background:#6b7986;opacity:.5}#n2-ss-0 .n2-ss-layer{cursor:not-allowed}#n2-ss-0 .n2-ss-currently-edited-slide .n2-ss-layer{cursor:pointer}div#n2-ss-0 .n2-ss-layer[data-sstype=content] .n2-ss-layer.nui-draggable-dragging,div#n2-ss-0 .n2-ss-layer[data-sstype=col] .n2-ss-layer.nui-draggable-dragging{z-index:100000;outline:0!important}.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col],.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col] .n2-ss-layer{cursor:pointer}.ui-column-width-handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;position:absolute;top:25%;height:50%;cursor:ew-resize;width:5px;background:#1d81f9;z-index:88;opacity:.5;box-sizing:border-box!important;border-radius:5px}.ui-column-width-handle--visible{display:block}.n2-ss-layer:not(.n2-ss-layer--block)>.n2-ss-layer-row>.ui-column-width-handle,.n2-ss-layer-row[data-row-wrapped="1"]>.ui-column-width-handle{display:none!important}.n2-ss-layer-cc,.nui_resize_absolute__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;z-index:90;display:none;border:2px solid #5f39c2;height:6px;width:6px;background:#fff;border-radius:50px;transform-origin:50% 50%}.n2-ss-layer-cc:HOVER,.nui_resize_absolute__handle:HOVER{transform:scale(1.5)}.n2-ss-layer-cc.nui-enabled,.nui_resize_absolute__handle.nui-enabled{display:block}.n2-ss-layer-cc{opacity:0;left:50%;top:50%;margin-top:-5px;margin-left:-5px}.n2-ss-layer-cc:HOVER{opacity:1}.n2-ss-layer[data-align=left][data-valign=top] .nui_resize_absolute__handle--nw,.n2-ss-layer[data-align=left][data-valign=middle] .nui_resize_absolute__handle--w,.n2-ss-layer[data-align=left][data-valign=bottom] .nui_resize_absolute__handle--sw,.n2-ss-layer[data-align=center][data-valign=top] .nui_resize_absolute__handle--n,.n2-ss-layer[data-align=center][data-valign=middle] .n2-ss-layer-cc,.n2-ss-layer[data-align=center][data-valign=bottom] .nui_resize_absolute__handle--s,.n2-ss-layer[data-align=right][data-valign=top] .nui_resize_absolute__handle--ne,.n2-ss-layer[data-align=right][data-valign=middle] .nui_resize_absolute__handle--e,.n2-ss-layer[data-align=right][data-valign=bottom] .nui_resize_absolute__handle--se{background:#5f39c2;opacity:1;border:2px solid #fff}.nui_resize_absolute__handle--e{cursor:e-resize;right:-4px;top:50%;margin-top:-5px}.nui_resize_absolute__handle--w{cursor:w-resize;left:-4px;top:50%;margin-top:-5px}.nui_resize_absolute__handle--n{cursor:n-resize;left:50%;top:-4px;margin-left:-5px}.nui_resize_absolute__handle--ne{cursor:ne-resize;right:-4px;top:-4px}.nui_resize_absolute__handle--nw{cursor:nw-resize;left:-4px;top:-4px}.nui_resize_absolute__handle--s{cursor:s-resize;bottom:-4px;left:50%;margin-left:-5px}.nui_resize_absolute__handle--se{cursor:se-resize;right:-4px;bottom:-4px}.nui_resize_absolute__handle--sw{cursor:sw-resize;left:-4px;bottom:-4px}.n2-ss-item-overlay{display:none;position:absolute;top:0;left:0;width:100%;height:100%}.n2-ss-item-html .n2-ss-item-overlay,.n2-ss-item-iframe .n2-ss-item-overlay{display:block}.n2-ss-item{position:relative;float:left;width:100%}.n2-ss-item-video,.n2-ss-item-youtube,.n2-ss-item-vimeo,.n2-ss-item-area,.n2-ss-item-imagearea{height:100%}.n2_ss_absolute_parent_picker{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background:#6b7986;border-radius:3px;cursor:pointer;line-height:30px;color:#fff}.n2_ss_absolute_parent_picker .ssi_16::before{content:"\E64D"}.n2_ss_absolute_parent_picker:HOVER{background-color:#8694a2}.n2_ss_absolute_parent_picker--active{background:#1d81f9}.n2_ss_absolute_parent_picker--active .ssi_16::before{content:"\E64B"}.n2_ss_absolute_parent_picker--active:HOVER{background-color:#338ef9}.n2_ss_absolute_parent_picker__overlay{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1000000;box-shadow:inset 0 0 0 1px rgba(0,0,0,.8);cursor:pointer;background:#5f39c2;opacity:.5}.n2_ss_absolute_parent_picker__overlay--tile{width:33%;height:33%}.n2_ss_absolute_parent_picker__overlay:HOVER,.n2_ss_absolute_parent_picker__overlay--selected{opacity:1}.n2_ss_absolute_parent_picker__component--focused{z-index:2147483647!important}.n2_field_generator_data_button{position:absolute;right:-2px;top:-26px;z-index:10;display:inline-flex;align-items:center;padding:0 5px;background-color:#1d81f9;border-radius:3px;color:#fff;cursor:pointer}.n2_field_generator_data_button:HOVER{background-color:#338ef9}.n2_field_generator_data_button_icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center}.n2_field_generator_data_button_label{padding:0 2px;font-size:10px;line-height:22px;font-weight:700;text-transform:uppercase}.n2_layer_contextual{display:none;position:absolute;z-index:8;height:28px;margin-top:-28px}.n2_layer_contextual--hover-section{z-index:7;opacity:.7}.n2_layer_contextual--hover{z-index:9}.n2_layer_contextual--hover.n2_layer_contextual--hover-active{visibility:hidden;pointer-events:none}.n2_layer_contextual--visible{display:inline-flex}.n2_layer_contextual__inner{display:inline-flex;background-color:#1d81f9;border-top-left-radius:3px;border-top-right-radius:3px;line-height:30px;overflow:hidden}.n2_layer_contextual--invert .n2_layer_contextual__inner{border-radius:0 0 3px 3px}.n2_layer_contextual__label{padding:0 6px;font-size:12px;line-height:30px;text-transform:uppercase;color:#fff;cursor:pointer;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_contextual__button{height:28px;padding:0 6px;display:inline-flex;align-items:center;justify-content:center;color:#fff;cursor:pointer}.n2_layer_contextual__button--active{background:#1167cd}.n2_layer_contextual[data-color=purple] .n2_layer_contextual__inner{background-color:#5f39c2}.n2_layer_contextual[data-color=purple] .n2_layer_contextual__button--active{background-color:#4c2d9b}.n2_layer_contextual[data-color=grey] .n2_layer_contextual__inner{background-color:#6b7986}.n2_layer_contextual__button--responsive-tools{display:none}body:not([data-device=desktopPortrait]) .n2_layer_contextual--has-responsive-tools .n2_layer_contextual__button--responsive-tools{display:inline-flex}.n2_layer_contextual_responsive_tools{display:flex;height:30px}.n2_layer_contextual_responsive_tools .ssi_16{display:block;padding:0 5px;color:#94b2c1}.n2_layer_contextual_responsive_tools__hide{padding:7px 0;cursor:pointer}.n2_layer_contextual_responsive_tools__hide .ssi_16::before{content:"\E60F"}.n2_layer_contextual_responsive_tools__hide--hidden .ssi_16::before{content:"\E923"}.n2_layer_contextual_responsive_tools__text_scale{display:flex}.n2_layer_contextual_responsive_tools__text_scale input{margin:0;padding:0;height:30px;line-height:30px;font-size:12px;color:#325c77;text-align:right}.n2_layer_contextual_responsive_tools__text_scale input,.n2_layer_contextual_responsive_tools__text_scale input:FOCUS{box-shadow:none;outline:0;border:0}.n2_layer_contextual_responsive_tools__text_scale input::-webkit-inner-spin-button,.n2_layer_contextual_responsive_tools__text_scale input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.n2_layer_contextual_responsive_tools__text_scale input[type=number]{-moz-appearance:textfield}.n2_layer_contextual_responsive_tools__text_scale .nui-slider{position:relative;background-color:#94b2c1;height:6px;margin:12px 10px;border-radius:10px}.n2_layer_contextual_responsive_tools__text_scale .nui-slider .nui-slider-handle{position:absolute;top:0;z-index:2;width:10px;height:10px;background-color:#fff;border:2px solid #94b2c1;margin:-4px -7px 0;border-radius:50px;cursor:ew-resize;box-sizing:content-box;-ms-touch-action:none;touch-action:none}.n2_layer_contextual_responsive_tools__text_scale_percent{line-height:30px;font-size:12px;color:#325c77}.n2_context_menu{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1000000;position:fixed;left:0;top:0}.n2_context_menu a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_context_menu__inner{background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_context_menu__item{display:flex;align-items:center;padding:0 10px;height:36px;cursor:default}.n2_context_menu__item--has-action{cursor:pointer}.n2_context_menu__item--has-action:HOVER,.n2_context_menu__item--active{background-color:#1d81f9}.n2_context_menu__item_icon{padding:0 5px;color:#94b2c1}.n2_context_menu__item--color-red .n2_context_menu__item_icon{color:#c43e2a}.n2_context_menu__item--has-action:HOVER .n2_context_menu__item_icon,.n2_context_menu__item--active .n2_context_menu__item_icon{color:#fff}.n2_context_menu__item_onoff .n2_context_menu__item_icon::before{content:"\E19A"}.n2_context_menu__item_onoff--on .n2_context_menu__item_icon::before{content:"\E199"}.n2_context_menu__item_label{padding:0 5px;font-size:12px;color:#325c77;white-space:nowrap;text-transform:capitalize}.n2_context_menu__item--color-red .n2_context_menu__item_label{color:#c43e2a}.n2_context_menu__item--has-action:HOVER .n2_context_menu__item_label,.n2_context_menu__item--active .n2_context_menu__item_label{color:#fff}.n2_context_menu__sub_menu{display:none;z-index:2;position:absolute;left:0;top:0;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_context_menu__sub_menu--active{display:block}html[data-component=layer][data-component-sub=image] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=transition] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=youtube] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=vimeo] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=video] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=audio] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=imagearea] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=area] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=iframe] .n2_field[data-field=layerfont-size]{display:none}html[data-component=layer][data-component-sub=animatedHeading] .n2_field .n2_field_decoration__option[data-value=underline],html[data-component=layer][data-component-sub=highlightedHeading] .n2_field .n2_field_decoration__option[data-value=underline]{display:none}.n2_slide_generator_box{position:relative;width:270px;height:180px;border-radius:3px;overflow:hidden;display:flex;flex-flow:column;justify-content:flex-end;background-color:#dce2e5;background-position:left top}.n2_slide_generator_box__title{display:flex;align-items:center;padding:10px;background-color:#0c1924}.n2_slide_generator_box__title_label{flex:1 1 auto;padding:0 5px;font-size:14px;line-height:20px;color:#bdcfd9;display:flex;align-items:center}.n2_slide_generator_box__title_label_inner{margin-right:5px}html[dir=rtl] .n2_slide_generator_box__title_label_inner{margin-right:0;margin-left:5px}.n2_slide_generator_box__title_button{padding:0 10px;background-color:#1d81f9;border-radius:3px;font-size:11px;line-height:30px;text-align:center;text-transform:uppercase}.n2_slide_generator_box__title_button:HOVER{background-color:#338ef9}.n2_slide_generator_box__title_button,.n2_slide_generator_box__title_button:HOVER,.n2_slide_generator_box__title_button:FOCUS{color:#fff}.n2_slide_generator_step1__installed_generators{padding:40px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_slide_generator_step1__not_installed{padding:10px 40px 40px 40px}.n2_slide_generator_step1__not_installed_label{font-size:22px;line-height:32px;color:#283f4d}.n2_slide_generator_step1__not_installed_generators{padding-top:20px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_slide_generator_step3{padding:40px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_generator_records_table{margin:20px 0;display:grid;overflow:auto;background:#fff;grid-gap:2px}.n2_generator_records_table__heading{padding:0 10px;background-color:#f0f4f7;color:#325c77;font-size:12px;line-height:30px;font-weight:700}.n2_generator_records_table__cell{padding:0 10px;background-color:#f0f4f7;color:#325c77;font-size:12px;line-height:30px;max-height:100px;min-width:150px;overflow:auto}.n2_slider_preview_area{margin-top:20px;display:flex;justify-content:center;min-height:150vh}.n2_slider_preview_area__inner{position:relative;background-color:#fff;box-shadow:0 2px 20px 0 rgba(0,0,0,.2)}.n2_preview{display:flex;flex-flow:column;align-items:center;height:calc(100vh - 60px)}.n2_preview__ruler{width:100%;position:relative;flex:0 0 auto;height:20px;background-color:#94b2c1;overflow:hidden}.n2_preview__ruler_device{position:absolute;left:50%;top:0;height:100%;cursor:pointer}.n2_preview__ruler_device div{border-left:1px solid #fff;border-right:1px solid #fff;padding:0 5px;height:100%}.n2_preview__ruler_device:HOVER div{background-color:#1d81f9}.n2_preview__ruler--ready .n2_preview__ruler_device{transition:width .5s,margin-left .5s}.n2_preview__ruler_label{position:absolute;left:50%;top:0;z-index:10;width:200px;margin-left:-100px;pointer-events:none;text-align:center;font-size:12px;line-height:20px;color:#fff}.n2_preview__device_screen{position:relative;flex:1 1 auto;width:100%;height:100%;display:flex;justify-content:center;padding:0 20px 20px;box-sizing:border-box;overflow:hidden}.n2_preview__device_info{margin-top:13px;position:relative;flex:0 0 auto;width:100%;height:26px;display:flex;align-items:center;justify-content:center;font-size:13px;line-height:26px;color:#325c77}.n2_preview__device_info .ssi_16{margin:0 5px;color:#94b2c1}.n2_preview__device_info_state{font-weight:700}.n2_preview__notification_scale{pointer-events:none;position:absolute;left:50%;top:30px;z-index:10;background:RGBA(0,0,0,.5);width:90px;margin-left:-45px;color:#fff;text-align:center;border-radius:5px;line-height:48px;font-size:16px;transition:opacity .5s ease 0s;opacity:0}.n2_preview__notification_scale--visible{opacity:1}.n2_preview__device_screen_inner{position:relative;flex:1 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.n2_preview__device_screen_inner iframe{border:0;max-width:none;width:100%;height:100%;box-shadow:0 2px 20px rgba(0,0,0,.2);transform-origin:50% 0;transition:transform .5s}.n2_preview__frame_overlay{display:none;position:absolute;left:0;top:0;width:100%;height:100%}.n2_body--resize-horizontal .n2_preview__frame_overlay,.n2_body--resize-vertical .n2_preview__frame_overlay{display:block}.n2_preview__resize_width{position:absolute;top:0;right:-8px;width:8px;height:100%;background:#1d81f9;opacity:0;cursor:ew-resize;transition:opacity .3s}.n2_preview__device_screen:HOVER .n2_preview__resize_width{opacity:.5}.n2_preview__device_screen .n2_preview__resize_width:HOVER,.n2_body--resize-horizontal .n2_preview__device_screen .n2_preview__resize_width{opacity:1}.n2_body--scale-preview .n2_preview__resize_width{opacity:0!important}.n2_preview__resize_height{position:absolute;left:0;bottom:-8px;width:100%;flex:0 0 auto;height:8px;background:#1d81f9;opacity:0;cursor:ns-resize;transition:opacity .3s}.n2_preview__device_screen:HOVER .n2_preview__resize_height{opacity:.5}.n2_preview__device_screen .n2_preview__resize_height:HOVER,.n2_body--resize-vertical .n2_preview__device_screen .n2_preview__resize_height{opacity:1}.n2_body--scale-preview .n2_preview__resize_height{opacity:0!important}#n2_preview_frame{display:block;width:100%;height:100%}.n2_preview_toolbar{display:flex;align-items:center}.n2_preview_toolbar__size{margin:0 10px;display:flex}.n2_preview_toolbar__editable{width:46px;height:28px;background-color:#2c3a45;border-radius:3px;font-size:12px;line-height:28px;color:#bdcfd9;text-align:center}.n2_preview_toolbar__x{margin:0 10px;font-size:12px;line-height:28px;color:#94b2c1}select.n2_preview_toolbar__scale{margin:0;padding:0 10px;max-width:initial;width:auto;height:28px;min-height:28px;font-family:inherit;-webkit-appearance:menulist;-moz-appearance:menulist;background:#2c3a45;font-size:12px;line-height:28px}select.n2_preview_toolbar__scale,select.n2_preview_toolbar__scale:FOCUS,select.n2_preview_toolbar__scale:HOVER{color:#bdcfd9;box-shadow:none;border:0}.n2_html--slider-preview{background:#fff}.n2_html--slider-preview body{width:100%;overflow-x:hidden;overflow-y:scroll;background:#fff}@media only screen and (max-width:700px){.n2_html--slider-preview::-webkit-scrollbar{width:0}.n2_html--slider-preview{-ms-overflow-style:none;scrollbar-width:none}}.n2_getting_started{display:flex;flex-flow:column;align-items:center;padding:60px 0 120px}.n2_getting_started__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_getting_started__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_getting_started__video{margin-top:20px;position:relative;width:100%;max-width:calc(100vh - 100px)}.n2_getting_started__video .n2_getting_started__video_placeholder{padding-top:56.25%;height:0}.n2_getting_started__video iframe,.n2_getting_started__video img{position:absolute;left:0;top:0;width:100%;height:100%;border:0}.n2_getting_started__buttons{margin-top:20px;display:flex;width:100%}.n2_getting_started__buttons>div{width:50%}.n2_getting_started__button_dont_show{text-align:right;padding:0 10px}.n2_getting_started__button_dont_show a{display:inline-block;padding:0 20px;font-size:14px;line-height:36px}.n2_getting_started__button_dont_show a,.n2_getting_started__button_dont_show a:HOVER,.n2_getting_started__button_dont_show a:FOCUS{color:#1375e9}html[dir=rtl] .n2_getting_started__button_dont_show{text-align:left}.n2_getting_started__button_dashboard{text-align:left;padding:0 10px}.n2_getting_started__button_dashboard a{display:inline-block;padding:0 20px;background-color:#04c018;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-align:center;text-transform:uppercase}.n2_getting_started__button_dashboard a:HOVER{background-color:#07ca1c}.n2_getting_started__button_dashboard a,.n2_getting_started__button_dashboard a:HOVER,.n2_getting_started__button_dashboard a:FOCUS{color:#fff}html[dir=rtl] .n2_getting_started__button_dashboard{text-align:right}.n2_page_activate{display:flex;flex-flow:column;align-items:center;padding:60px 0 120px}.n2_page_activate__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_page_activate__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_page_activate__video{margin-top:20px;position:relative;width:100%;max-width:calc(100vh - 100px)}.n2_page_activate__video .n2_page_activate__video_placeholder{padding-top:56.25%;height:0}.n2_page_activate__video iframe{position:absolute;left:0;top:0;width:100%;height:100%}.n2_page_activate__buttons{margin-top:20px;display:flex;width:100%}.n2_page_activate__buttons>div{width:50%}.n2_page_activate__button_dont_show{text-align:right;padding:0 10px}.n2_page_activate__button_dont_show a{display:inline-block;padding:0 20px;font-size:14px;line-height:36px}.n2_page_activate__button_dont_show a,.n2_page_activate__button_dont_show a:HOVER,.n2_page_activate__button_dont_show a:FOCUS{color:#1375e9}.n2_page_activate__button_dashboard{text-align:left;padding:0 10px}.n2_page_activate__button_dashboard a{display:inline-block;padding:0 20px;background-color:#04c018;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-align:center;text-transform:uppercase}.n2_page_activate__button_dashboard a:HOVER{background-color:#07ca1c}.n2_page_activate__button_dashboard a,.n2_page_activate__button_dashboard a:HOVER,.n2_page_activate__button_dashboard a:FOCUS{color:#fff}.n2_page_free_go_pro{display:flex;padding:30px 0 90px;flex-wrap:wrap;justify-content:center}.n2_page_free_go_pro__col{display:flex;flex-flow:column;align-items:center;padding:30px}.n2_page_free_go_pro__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_page_free_go_pro__subheading{margin-bottom:20px;font-size:14px;line-height:28px;color:#325c77}.n2_page_free_go_pro_already_purchased{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_page_free_go_pro_already_purchased:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_page_free_go_pro_already_purchased__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(4,192,24,.1);border-radius:50px;color:#04c018}.n2_page_free_go_pro_already_purchased__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_page_free_go_pro_already_purchased__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_page_free_go_pro_already_purchased__paragraph a,.n2_page_free_go_pro_already_purchased__paragraph a:HOVER,.n2_page_free_go_pro_already_purchased__paragraph a:FOCUS{color:#1375e9}.n2_page_free_go_pro_already_purchased__button{margin:20px 0 10px;padding:0 20px;min-width:260px;background-color:#04c018;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700}.n2_page_free_go_pro_already_purchased__button,.n2_page_free_go_pro_already_purchased__button:HOVER,.n2_page_free_go_pro_already_purchased__button:FOCUS{color:#fff}.n2_page_free_go_pro_already_purchased__button:HOVER{background-color:#07ca1c}.n2_help_center{display:flex;flex-flow:column;align-items:center;background-color:#f0f4f7;text-align:center;padding:0 40px}.n2_help_center a:HOVER{color:#005bc6}.n2_help_center a,.n2_help_center a:FOCUS{color:#1375e9}.n2_help_center__getting_started{width:100%;max-width:1140px;margin-top:44px}.n2_help_center__getting_started__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_help_center__getting_started__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_help_center__getting_started__video{margin-top:20px;position:relative;width:100%;max-width:1140px}.n2_help_center__getting_started__video .n2_help_center__getting_started__video_placeholder{padding-top:56.25%;height:0}.n2_help_center__getting_started__video iframe,.n2_help_center__getting_started__video img{position:absolute;left:0;top:0;width:100%;height:100%}.n2_help_center__conflicts{max-width:1140px;width:100%;box-sizing:border-box;border-radius:3px 3px 0 0;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);padding:48px 20px 25px;margin-top:60px}.n2_help_center__conflicts_test_api{margin-bottom:20px}.n2_help_center__search{width:100%;box-sizing:border-box;padding:60px 20px 0}.n2_help_center__search_heading{color:#283f4d;font-size:22px;line-height:32px}.n2_help_center__search_field{margin-top:20px}.n2_help_center__search_field form{display:inline-flex;width:100%;max-width:600px}.n2_help_center__search_field form input{flex:1 1 auto;margin:0;padding:0 20px;border:2px solid #94b2c1;border-right:0;border-radius:3px 0 0 3px;background-color:#fff;color:#325c77;font-size:14px;line-height:46px;height:auto}.n2_help_center__search_field form input,.n2_help_center__search_field form input:FOCUS{box-shadow:none;outline:0}.n2_help_center__search_field form input:FOCUS{border-color:#1d81f9}html[dir=rtl] .n2_help_center__search_field form input{border:2px solid #94b2c1;border-left:0;border-radius:0 3px 3px 0}.n2_help_center__search_field form button{padding:0 35px;background-color:#1d81f9;border:0;border-top-right-radius:3px;border-bottom-right-radius:3px;color:#fff;font-size:12px;line-height:50px;text-transform:uppercase}.n2_help_center__search_field form button:HOVER{background-color:#338ef9}.n2_help_center__search_field form button,.n2_help_center__search_field form button:FOCUS{box-shadow:none;outline:0}html[dir=rtl] .n2_help_center__search_field form button{border-radius:3px 0 0 3px}.n2_help_center__actions{margin-top:60px;max-width:1140px;width:100%;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px 60px}.n2_help_center__action{position:relative;padding:20px;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);text-align:center}.n2_help_center__action_link{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%}.n2_help_center__action_icon{margin-top:30px;text-align:center;color:#1375e9}.n2_help_center__conflicts_icon{color:#1375e9}.n2_help_center__action_label,.n2_help_center__conflicts_label{margin-top:16px;color:#283f4d;font-size:18px;line-height:28px}.n2_help_center__conflicts_description,.n2_help_center__action_description{margin:5px 0 15px;color:#325c77;font-size:14px;line-height:24px}.n2_help_center__articles{margin-top:20px;max-width:1140px;width:100%;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px 60px}.n2_help_center__articles_heading{color:#283f4d;font-size:22px;line-height:32px;margin-top:60px;max-width:1140px;width:100%}.n2_help_center__article{position:relative;padding:20px 20px;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);display:flex;align-items:center;color:#325c77;font-size:14px;line-height:20px}.n2_help_center__article:HOVER{color:#1375e9}.n2_help_center__article_link{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%}.n2_help_center__article_label{flex:1 1 auto;text-align:left}html[dir=rtl] .n2_help_center__article_label{text-align:right}.n2_help_center__article_icon{font-size:16px}html[dir=rtl] .n2_help_center__article_icon{transform:rotate(180deg)}.n2_help_center__system_information{margin-top:60px;max-width:1140px;width:100%}.n2_help_center__system_information_label,.n2_help_center__articles_label{color:#283f4d;font-size:22px;line-height:32px}.n2_help_center__system_information_form textarea{display:block;margin-top:30px;height:300px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;padding:15px 20px;color:#325c77;font-size:14px;line-height:24px}.n2_loading_screen{display:none;position:fixed;z-index:2147483647;width:100%;height:100%;left:0;top:0;background:RGBA(32,41,52,.95)}.n2_loading_screen--visible{display:flex;align-items:center;justify-content:center}.n2_loading_screen__circle{border:10px solid #6b7986;border-left-color:#fff;border-radius:50%;width:40px;height:40px;animation:n2_loading_screen__circle_animation 1.1s infinite linear}@keyframes n2_loading_screen__circle_animation{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}.n2_ss_background_animation_preview{overflow:hidden}.n2_ss_background_animation_preview .n2-bganim-side{position:absolute;left:0;top:0;overflow:hidden}.n2_ss_background_animation_preview .n2-bganim-tile-overlay-colored{z-index:100000}.n2_ss_background_animation_preview__slider{position:relative;width:800px;height:500px;margin:20px;z-index:3}.n2_ss_background_animation_preview__animation_container,.n2_ss_background_animation_preview__slide{position:absolute;left:0;top:0;width:800px;height:500px}.n2_ss_background_animation_preview__slide{z-index:2}.n2_ss_background_animation_preview__slide_background{height:100%}.n2_ss_background_animation_preview__slide_background_image{height:100%;background-size:cover;background-position:50% 50%}
1
+ @font-face{font-family:'Inter-Nextend';font-style:normal;font-weight:400;src:url(../fonts/Inter-Medium.woff2) format("woff2");font-display:block}@font-face{font-family:'Inter-Nextend';font-style:normal;font-weight:700;src:url(../fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:'SmartSliderIcons';src:url(../fonts/SmartSliderIcons.woff2?JC0JNU) format("woff2");font-weight:400;font-style:normal}.ssi_16,.ssi_24,.ssi_32,.ssi_48,.ssi_64{font-family:'SmartSliderIcons'!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ssi_16{font-size:16px!important}.ssi_24{font-size:24px!important}.ssi_32{font-size:32px!important}.ssi_48{font-size:48px!important}.ssi_64{font-size:64px!important}.ssi_16--animation::before{content:"\E91F"}.ssi_16--arrowdown::before{content:"\E14B"}.ssi_16--arrowright::before{content:"\E15E"}.ssi_16--bold::before{content:"\E601"}.ssi_16--breadcrumb::before{content:"\E91E"}.ssi_16--bringforward::before{content:"\E15F"}.ssi_16--bringfront::before{content:"\E143"}.ssi_16--buttonarrow::before{content:"\E155"}.ssi_16--check::before{content:"\E600"}.ssi_16--circularremove::before{content:"\E62C"}.ssi_16--clearanimation::before{content:"\E948"}.ssi_16--cog::before{content:"\E934"}.ssi_16--color::before{content:"\E144"}.ssi_16--column::before{content:"\E145"}.ssi_16--content::before{content:"\E146"}.ssi_16--copy::before{content:"\E907"}.ssi_16--crop::before{content:"\E161"}.ssi_16--dashboard::before{content:"\E149"}.ssi_16--data::before{content:"\E152"}.ssi_16--delete::before{content:"\E612"}.ssi_16--desktoplandscape::before{content:"\E95a"}.ssi_16--desktopportrait::before{content:"\E925"}.ssi_16--divide::before{content:"\E639"}.ssi_16--download::before{content:"\E162"}.ssi_16--dummy::before{content:"\E15D"}.ssi_16--duplicate::before{content:"\E611"}.ssi_16--edit::before{content:"\E154"}.ssi_16--eye::before{content:"\E60F"}.ssi_16--filledcheck::before{content:"\E60C"}.ssi_16--filledremove::before{content:"\E62D"}.ssi_16--folderclosed::before{content:"\E921"}.ssi_16--folderopened::before{content:"\E922"}.ssi_16--fontresize::before{content:"\E650"}.ssi_16--fullscreen::before{content:"\E163"}.ssi_16--grid::before{content:"\E164"}.ssi_16--group::before{content:"\E1B6"}.ssi_16--hide::before{content:"\E923"}.ssi_16--horizontalcenter::before{content:"\E646"}.ssi_16--horizontalleft::before{content:"\E647"}.ssi_16--horizontalright::before{content:"\E645"}.ssi_16--image::before{content:"\E14A"}.ssi_16--info::before{content:"\E620"}.ssi_16--italic::before{content:"\E615"}.ssi_16--keyboard::before{content:"\E165"}.ssi_16--layer::before{content:"\E935"}.ssi_16--link::before{content:"\E64D"}.ssi_16--magnifier::before{content:"\E1B9"}.ssi_16--miniarrowdown::before{content:"\E19E"}.ssi_16--miniarrowright::before{content:"\E19D"}.ssi_16--minidesktopportrait::before{content:"\E980"}.ssi_16--mobilelandscape::before{content:"\E929"}.ssi_16--mobileportrait::before{content:"\E92A"}.ssi_16--mobileportraitlarge::before{content:"\E1AB"}.ssi_16--more::before{content:"\E911"}.ssi_16--none::before{content:"\E971"}.ssi_16--off::before{content:"\E19A"}.ssi_16--on::before{content:"\E199"}.ssi_16--order::before{content:"\E1B7"}.ssi_16--paginatiorarrow::before{content:"\E1B8"}.ssi_16--paste::before{content:"\E908"}.ssi_16--pause::before{content:"\E606"}.ssi_16--play::before{content:"\E605"}.ssi_16--plus::before{content:"\E92F"}.ssi_16--position::before{content:"\E14E"}.ssi_16--remove::before{content:"\E90A"}.ssi_16--rename::before{content:"\E19C"}.ssi_16--reset::before{content:"\E946"}.ssi_16--resize::before{content:"\E19F"}.ssi_16--row::before{content:"\E14F"}.ssi_16--save::before{content:"\E947"}.ssi_16--selectarrow::before{content:"\E638"}.ssi_16--sendback::before{content:"\E166"}.ssi_16--sendbackward::before{content:"\E167"}.ssi_16--shrink::before{content:"\E196"}.ssi_16--slides::before{content:"\E151"}.ssi_16--smart::before{content:"\E147"}.ssi_16--star::before{content:"\E603"}.ssi_16--stop::before{content:"\E607"}.ssi_16--style::before{content:"\E169"}.ssi_16--tabletlandscape::before{content:"\E927"}.ssi_16--tabletportrait::before{content:"\E928"}.ssi_16--tabletportraitlarge::before{content:"\E1AC"}.ssi_16--textcenter::before{content:"\E614"}.ssi_16--textjustify::before{content:"\E60B"}.ssi_16--textleft::before{content:"\E60A"}.ssi_16--textright::before{content:"\E604"}.ssi_16--underline::before{content:"\E602"}.ssi_16--unlink::before{content:"\E64B"}.ssi_16--up::before{content:"\E16A"}.ssi_16--verticalaround::before{content:"\E97B"}.ssi_16--verticalbetween::before{content:"\E97A"}.ssi_16--verticalbottom::before{content:"\E97F"}.ssi_16--verticalcenter::before{content:"\E97E"}.ssi_16--verticaltop::before{content:"\E97C"}.ssi_16--video::before{content:"\E153"}.ssi_16--wordpress::before{content:"\E197"}.ssi_24--active::before{content:"\D7FD"}.ssi_24--animation::before{content:"\E115"}.ssi_24--attention::before{content:"\E195"}.ssi_24--bounce::before{content:"\E998"}.ssi_24--button::before{content:"\E192"}.ssi_24--check::before{content:"\E14C"}.ssi_24--circularcheck::before{content:"\E129"}.ssi_24--circularinfo::before{content:"\E11B"}.ssi_24--close::before{content:"\E116"}.ssi_24--cog::before{content:"\E15C"}.ssi_24--col2::before{content:"\E193"}.ssi_24--desktop::before{content:"\E11A"}.ssi_24--desktoplandscape::before{content:"\E119"}.ssi_24--dummy::before{content:"\E17B"}.ssi_24--edit::before{content:"\E117"}.ssi_24--fade::before{content:"\E993"}.ssi_24--flip::before{content:"\E996"}.ssi_24--heading::before{content:"\E17E"}.ssi_24--image::before{content:"\E191"}.ssi_24--info::before{content:"\E14D"}.ssi_24--layers::before{content:"\E11C"}.ssi_24--mobilelandscape::before{content:"\E11D"}.ssi_24--mobileportrait::before{content:"\E11E"}.ssi_24--mobileportraitlarge::before{content:"\E1AD"}.ssi_24--more::before{content:"\E17D"}.ssi_24--move::before{content:"\E995"}.ssi_24--newwindow::before{content:"\E1A2"}.ssi_24--notification::before{content:"\E99F"}.ssi_24--orientation::before{content:"\E1A1"}.ssi_24--play::before{content:"\E11F"}.ssi_24--preview::before{content:"\E121"}.ssi_24--redo::before{content:"\E122"}.ssi_24--refresh::before{content:"\E194"}.ssi_24--remove::before{content:"\E16B"}.ssi_24--reveal::before{content:"\E992"}.ssi_24--rotate::before{content:"\E999"}.ssi_24--scale::before{content:"\E994"}.ssi_24--smart::before{content:"\E16C"}.ssi_24--special::before{content:"\E997"}.ssi_24--star::before{content:"\E1A4"}.ssi_24--stop::before{content:"\E16D"}.ssi_24--style::before{content:"\E123"}.ssi_24--tabletlandscape::before{content:"\E124"}.ssi_24--tabletportrait::before{content:"\E125"}.ssi_24--tabletportraitlarge::before{content:"\E1AE"}.ssi_24--text::before{content:"\E17F"}.ssi_24--timeline::before{content:"\E126"}.ssi_24--undo::before{content:"\E127"}.ssi_32--animatedheading::before{content:"\E991"}.ssi_32--area::before{content:"\E937"}.ssi_32--audio::before{content:"\E986"}.ssi_32--beforeafter::before{content:"\E1B4"}.ssi_32--button::before{content:"\E942"}.ssi_32--circlecounter::before{content:"\E985"}.ssi_32--col1::before{content:"\E112"}.ssi_32--col2::before{content:"\E113"}.ssi_32--col3::before{content:"\E157"}.ssi_32--countdown::before{content:"\E1B5"}.ssi_32--counter::before{content:"\E984"}.ssi_32--dummy::before{content:"\E15B"}.ssi_32--heading::before{content:"\E945"}.ssi_32--highlightheading::before{content:"\E990"}.ssi_32--html::before{content:"\E93A"}.ssi_32--icon::before{content:"\E941"}.ssi_32--iframe::before{content:"\E938"}.ssi_32--image::before{content:"\E943"}.ssi_32--imagearea::before{content:"\E950"}.ssi_32--imagebox::before{content:"\E983"}.ssi_32--imagecaption::before{content:"\E940"}.ssi_32--input::before{content:"\E939"}.ssi_32--joomla::before{content:"\E19B"}.ssi_32--list::before{content:"\E93E"}.ssi_32--plus::before{content:"\E114"}.ssi_32--progressbar::before{content:"\E982"}.ssi_32--smart::before{content:"\E16E"}.ssi_32--text::before{content:"\E944"}.ssi_32--transition::before{content:"\E93F"}.ssi_32--video::before{content:"\E93B"}.ssi_32--vimeo::before{content:"\E93C"}.ssi_32--youtube::before{content:"\E93D"}.ssi_48--bug::before{content:"\E17C"}.ssi_48--camera::before{content:"\E141"}.ssi_48--convert::before{content:"\E134"}.ssi_48--data::before{content:"\E13E"}.ssi_48--delete::before{content:"\E135"}.ssi_48--doc::before{content:"\E13B"}.ssi_48--drop::before{content:"\E136"}.ssi_48--dummy::before{content:"\E159"}.ssi_48--dynamic::before{content:"\E98F"}.ssi_48--empty::before{content:"\E98E"}.ssi_48--error::before{content:"\E137"}.ssi_48--grid::before{content:"\E16F"}.ssi_48--group::before{content:"\E139"}.ssi_48--help::before{content:"\E13A"}.ssi_48--image::before{content:"\E98D"}.ssi_48--keyboard::before{content:"\E171"}.ssi_48--link::before{content:"\E13C"}.ssi_48--newsletter::before{content:"\E13D"}.ssi_48--plus::before{content:"\D7FE"}.ssi_48--post::before{content:"\E98B"}.ssi_48--protect::before{content:"\E133"}.ssi_48--remove::before{content:"\E156"}.ssi_48--review0::before{content:"\E13F"}.ssi_48--review1::before{content:"\E1A5"}.ssi_48--review2::before{content:"\E1A6"}.ssi_48--review3::before{content:"\E1A7"}.ssi_48--review4::before{content:"\E1A9"}.ssi_48--review5::before{content:"\E1AA"}.ssi_48--static::before{content:"\E98A"}.ssi_48--upgrade::before{content:"\E1A3"}.ssi_48--video::before{content:"\E989"}.ssi_64--accordionslider::before{content:"\E12A"}.ssi_64--auto::before{content:"\E17A"}.ssi_64--block::before{content:"\E12B"}.ssi_64--blurfit::before{content:"\E172"}.ssi_64--carousel::before{content:"\E12C"}.ssi_64--center::before{content:"\E173"}.ssi_64--drop::before{content:"\E12D"}.ssi_64--dummy::before{content:"\E15A"}.ssi_64--fill::before{content:"\E174"}.ssi_64--fit::before{content:"\E175"}.ssi_64--folder::before{content:"\E957"}.ssi_64--folderup::before{content:"\E63E"}.ssi_64--fullwidthslider::before{content:"\E132"}.ssi_64--image::before{content:"\E176"}.ssi_64--page::before{content:"\E12E"}.ssi_64--showcase::before{content:"\E12F"}.ssi_64--slider::before{content:"\E131"}.ssi_64--stretch::before{content:"\E177"}.ssi_64--tile::before{content:"\E179"}.n2_color_picker{position:fixed;top:0;left:0;z-index:10000000;border:2px solid #b9c3c9;border-radius:3px;background-color:#fff;width:min-content;display:grid;grid-gap:10px;grid-template-columns:auto auto auto auto;padding:10px;user-select:none}.n2_color_picker.n2_color_picker--has-opacity{grid-template-columns:auto auto auto auto auto}.n2_color_picker__palette{width:min-content;display:grid;grid-gap:8px;grid-template-columns:1fr 1fr 1fr 1fr}.n2_color_picker__palette_item{width:20px;height:20px;overflow:hidden;border-radius:3px;cursor:pointer}.n2_color_picker__palette_item_color{width:100%;height:100%;background-color:var(--palette-item-color);box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset;border-radius:3px}.n2_color_picker__palette_item_alpha{display:none}.n2_color_picker--has-opacity .n2_color_picker__palette_item_alpha{display:block}.n2_color_picker__palette_history{width:min-content;display:grid;grid-gap:8px;grid-template-columns:1fr;border-left:1px solid rgba(0,0,0,.2);border-right:1px solid rgba(0,0,0,.2);padding:0 10px}.n2_color_picker__palette_history .n2_color_picker__palette_item:last-child{display:none}.n2_color_picker--has-opacity .n2_color_picker__palette_history .n2_color_picker__palette_item:last-child{display:block}.n2_color_picker__picker_area{padding:10px;width:min-content;display:grid;grid-template-columns:auto auto auto;grid-gap:10px;overflow:hidden}.n2_color_picker__picker_canvas{align-self:stretch;position:relative;width:140px;background-color:red;background-image:linear-gradient(to top,#000,rgba(204,154,129,0)),linear-gradient(to right,#fff,rgba(204,154,129,0));box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_canvas_dot{position:absolute;left:-5px;top:-5px;width:10px;height:10px;border-radius:10px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_color_picker__picker_hue{align-self:stretch;position:relative;width:20px;background:linear-gradient(to bottom,red 0%,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_hue_dot{position:absolute;left:-3px;top:-3px;width:calc(100% + 6px);height:6px;border-radius:5px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_color_picker__picker_opacity{align-self:stretch;display:none;width:20px}.n2_color_picker--has-opacity .n2_color_picker__picker_opacity{display:block}.n2_color_picker__picker_opacity_inner{position:relative;width:100%;height:100%;box-shadow:0 0 1px 1px rgba(0,0,0,.2) inset}.n2_color_picker__picker_opacity_dot{position:absolute;left:-3px;top:-3px;width:calc(100% + 6px);height:6px;border-radius:5px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.4)}.n2_checker_box{background-image:linear-gradient(45deg,gray 25%,transparent 25%),linear-gradient(-45deg,gray 25%,transparent 25%),linear-gradient(45deg,transparent 75%,gray 75%),linear-gradient(-45deg,transparent 75%,gray 75%);background-size:10px 10px;background-position:0 0,0 5px,5px -5px,-5px 0}#dolly{display:none!important}.toplevel_page_smart-slider3 #wpbody-content{padding-bottom:0!important}.toplevel_page_smart-slider3 #wpfooter{display:none}#wpbody-content #n2-admin{margin:10px 20px 20px 0}html[dir=rtl] #wpbody-content #n2-admin{margin:10px 0 0 20px}#wpbody-content #n2-admin a:focus{box-shadow:none}.n2 input{min-height:initial;border-radius:0}.n2 select{background:0 0;max-width:initial;min-height:26px;height:26px;font-size:12px;-webkit-appearance:menulist;-moz-appearance:menulist}.n2 select[multiple]{height:auto;-webkit-appearance:none;-moz-appearance:none}.n2_admin .n2_field_select select{background:#fff}html.n2_html--application-only{background:#fff}html.n2_html--application-only #wpbody{padding:0!important}html.n2_html--application-only.wp-toolbar{padding:0}html.n2_html--application-only,html.n2_html--application-only body{position:relative;height:auto;min-height:100vh;background:#fff}html.n2_html--application-only #wpadminbar,html.n2_html--application-only #adminmenuwrap,html.n2_html--application-only #adminmenuback,html.n2_html--application-only .update-nag{display:none!important}html.n2_html--application-only #wpcontent{margin:0!important;padding-left:0;padding-right:0}html.n2_html--application-only .updated,html.n2_html--application-only .error,html.n2_html--application-only .notice-error,html.n2_html--application-only .notice-success,html.n2_html--application-only .notice-warning,html.n2_html--application-only .notice-info,html.n2_html--application-only .notice,html.n2_html--application-only .wpuf-review-notice,html.n2_html--application-only .analytify-review-notice,html.n2_html--application-only .prompt-box+.overlay{display:none!important}.wp-block-nextend-smartslider3{position:relative;z-index:1;min-height:100px}.wp-block-nextend-smartslider3 iframe{pointer-events:none}.wp-block-nextend-smartslider3__button-container{display:inline-grid;grid-template-columns:auto auto;grid-gap:10px}.wp-customizer .n2_modal{z-index:1000030}.wp-customizer a.n2_button,.wp-customizer a.n2_button:HOVER,.wp-customizer a.n2_button:FOCUS{color:#fff}#gslogo-dummy-data-install--notice,.gslogo-admin-notice,.gslogo-review-notice{display:none!important}#a2020-admin-bar-app{z-index:100000}.a2020_admin_theme #wpwrap{display:block;vertical-align:top}.a2020_admin_theme #wpbody-content #n2-admin{margin:10px 20px 20px 20px}.n2_html--application-only .a2020_admin_theme #a2020-admin-bar-app{display:none!important}#uip-toolbar{display:none}html.wp-toolbar[uip-toolbar=true]{padding-top:0}.n2_admin{position:relative;min-width:980px}.n2_admin__header{position:relative;z-index:2000;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased}.n2_admin__header a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_admin__content{border-radius:0 0 3px 3px;border-left:1px solid #94b2c1;border-right:1px solid #94b2c1;border-bottom:1px solid #94b2c1;background-color:#f0f4f7;padding-bottom:40px;min-height:calc(100vh - 180px)}.n2_admin_ui{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased}.n2_admin_ui a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_admin_ui a:ACTIVE,.n2_admin_ui a:VISITED,.n2_admin_ui a:FOCUS,.n2_admin_ui a:LINK{text-decoration:none}.n2_admin_ui iframe{border:0}.n2_admin_ui [contenteditable=true]{-webkit-user-select:text;user-select:text}.n2_admin--empty{margin:0!important}.n2_admin--empty.n2_admin{min-width:0}.n2_nav_bar{position:relative;z-index:11;min-height:70px;display:flex;background-color:#1375e9;border-top-left-radius:3px;border-top-right-radius:3px}.n2_nav_bar__logo{flex:0 1 auto;display:flex;justify-content:center}.n2_nav_bar__logo a{display:inline-flex;align-items:center;justify-content:center}.n2_nav_bar__logo svg{max-width:none}.n2_nav_bar__menu{position:relative;z-index:2;flex:1 1 auto;padding:0 10px;width:100%;box-sizing:border-box;display:flex;justify-content:flex-end;align-items:center;margin-left:auto}@media only screen and (max-width:1600px){.n2_nav_bar__menu{width:auto}}.n2_nav_bar__menuitem{margin:10px}.n2_nav_bar__menuitem>a{display:block;padding:0 5px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:150px}.n2_nav_bar__menuitem a{font-size:14px;line-height:2}.n2_nav_bar__menuitem a,.n2_nav_bar__menuitem a:HOVER,.n2_nav_bar__menuitem a:FOCUS{color:#d0e3fb}.n2_breadcrumbs{padding:0 10px;white-space:nowrap;flex:1 1 auto;width:100%;box-sizing:border-box;position:relative;z-index:2;display:flex;align-items:center}@media only screen and (max-width:1600px){.n2_breadcrumbs{width:auto}}.n2_breadcrumbs__breadcrumb_button{display:flex;align-items:center;padding:0 8px;font-size:14px;line-height:2;text-transform:capitalize;font-weight:700}.n2_breadcrumbs__breadcrumb_button,.n2_breadcrumbs__breadcrumb_button:HOVER,.n2_breadcrumbs__breadcrumb_button:FOCUS{color:#d0e3fb}.n2_breadcrumbs__breadcrumb_button>*{margin:0 2px}.n2_breadcrumbs__breadcrumb_button>span{max-width:150px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_breadcrumbs__breadcrumb_button>.ssi_16{margin:0 3px}.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button,.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button:HOVER,.n2_breadcrumbs__breadcrumb--active .n2_breadcrumbs__breadcrumb_button:FOCUS{color:#fff}.n2_breadcrumbs__arrow{font-size:16px;color:#d0e3fb}.n2_breadcrumbs__arrow .ssi_16{display:block}html[dir=rtl] .n2_breadcrumbs__arrow{transform:rotateZ(180deg)}.n2-admin-content-with-sidebar{display:flex}.n2-admin-content-with-sidebar__sidebar{flex:0 0 auto;width:340px;margin-left:-1px;background-color:#4d5d70;border-bottom-left-radius:3px;border-right:1px solid #212d3a;box-sizing:border-box}.n2-admin-content-with-sidebar__content{position:relative;min-height:1000px}.n2_top_bar_main{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:1020;margin-left:-1px;margin-right:-1px;position:-webkit-sticky;position:sticky;top:0;display:flex;flex-flow:row-reverse;background-color:#0c1924;padding:12px 10px}.n2_top_bar_main a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_top_bar_main .n2_top_bar_button_icon{font-size:24px;width:24px;height:24px}.n2_top_bar_main .n2_top_bar_button_icon,.n2_top_bar_main .n2_top_bar_button_icon:HOVER,.n2_top_bar_main .n2_top_bar_button_icon:FOCUS{color:#94b2c1}.n2_top_bar_main__primary{display:flex;flex-flow:row-reverse;align-items:center}.n2_top_bar_main__primary>*{margin:0 10px}.n2_top_bar_main__primary .n2_button_spacer{margin:0 10px;width:2px;height:32px}.n2_top_bar_main__primary .n2_button_spacer--visible{height:24px;background-color:#3a4956;border-radius:1px}.n2_top_bar_main__secondary{display:flex;align-items:center;margin-right:auto;padding-left:5px}.n2_top_bar_main__secondary>*{margin:0 5px}.n2_top_bar_group--narrow .n2_top_bar_group__inner{display:flex;flex-flow:row-reverse;margin:0 -5px;direction:ltr}.n2_top_bar_group--narrow .n2_top_bar_group__inner>*{margin:0 5px}.n2_header{position:relative;z-index:990;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;background-color:#fff;padding:30px 28px}.n2_header a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_header.n2_header--has-menu-items{padding-top:50px;padding-bottom:0}.n2_header__heading_container{margin:0 12px}.n2_header__content{display:flex;align-items:center}.n2_header__heading{display:flex;align-items:center}.n2_header__heading_primary{font-size:32px;line-height:1.25em;color:#283f4d}.n2_header__heading_after{font-size:24px;line-height:1em;color:#94b2c1;margin:0 15px}.n2_header__actions{margin-left:auto;display:flex}.n2_header__actions>*{margin:0 12px}html[dir=rtl] .n2_header__actions{margin-left:0;margin-right:auto}.n2_header__menu{margin:0 -8px;display:flex}.n2_header__menu_item{margin:0 20px;line-height:50px;font-size:16px;font-weight:700;text-transform:capitalize;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_header__menu_item,.n2_header__menu_item:ACTIVE,.n2_header__menu_item:VISITED,.n2_header__menu_item:FOCUS,.n2_header__menu_item:LINK{color:#325c77}.n2_header__menu_item--active,.n2_header__menu_item--active:ACTIVE,.n2_header__menu_item--active:VISITED,.n2_header__menu_item--active:FOCUS,.n2_header__menu_item--active:LINK{box-shadow:inset 0 -3px 0 0 #1375e9!important;color:#1375e9}.n2_notification_center{z-index:9999999999999;position:fixed;right:10px;bottom:0;display:flex;flex-flow:column;align-items:flex-end;width:auto;max-height:310px;padding:10px;overflow-y:auto;overflow-x:hidden}html[dir=rtl] .n2_notification_center{left:10px;right:auto}.n2_notification_center__message{max-width:500px;margin:10px;display:flex;align-items:center;background-color:#0c1924;border-radius:5px;padding:20px;transition:transform .5s ease-in-out .3s;transform:translateX(150%)}html[dir=rtl] .n2_notification_center__message{transform:translateX(-150%)}.n2_notification_center__message--animate{transform:translateX(0%)}html[dir=rtl] .n2_notification_center__message--animate{transform:translateX(0%)}.n2_notification_center__message--success{min-width:250px}.n2_notification_center__message_icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:100%;color:#fff}.n2_notification_center__message--success .n2_notification_center__message_icon{background-color:#04c018}.n2_notification_center__message--success .n2_notification_center__message_icon .ssi_24::before{content:"\E14C"}.n2_notification_center__message--notice .n2_notification_center__message_icon{background-color:#1d81f9}.n2_notification_center__message--notice .n2_notification_center__message_icon .ssi_24::before{content:"\E14D"}.n2_notification_center__message_content{flex:1 1 auto;padding:0 10px}.n2_notification_center__message_content_label{color:#fff;font-size:14px;line-height:20px;text-transform:uppercase}.n2_notification_center__message_content_description{font-size:14px;line-height:20px;color:#94b2c1}.n2_notification_center__message_action{flex:0 0 auto;margin:0 10px;background-color:#1d81f9;border-radius:3px;padding:0 10px;white-space:nowrap;font-size:11px;color:#fff;line-height:30px;cursor:pointer;text-transform:uppercase}.n2_notification_center__message_action:HOVER{background-color:#338ef9}.n2_body--fullscreen-editor-visible{overflow:hidden}.n2_fullscreen_editor{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100002;position:fixed;left:0;top:0;display:none;box-sizing:border-box;width:100%;height:100%;padding:20px;background:rgba(28,41,51,.8)}.n2_fullscreen_editor a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_fullscreen_editor--visible{display:block}.n2_fullscreen_editor__overlay{z-index:1;position:absolute;left:0;top:0;width:100%;height:100%;cursor:pointer}.n2_fullscreen_editor__window{z-index:2;position:relative;flex:1 1 auto;height:100%;display:flex;flex-flow:column;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_fullscreen_editor__window>iframe{display:block;width:100%;height:100%}.n2_fullscreen_editor__nav_bar{position:relative;z-index:2;display:flex;flex:0 0 auto;background-color:#0c1924}.n2_fullscreen_editor__nav_bar_label{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center;text-transform:capitalize}.n2_fullscreen_editor__nav_bar_actions{position:relative;z-index:2;flex:1 1 auto;display:flex;justify-content:flex-end;padding:12px 10px}.n2_fullscreen_editor__nav_bar_actions>*{margin:0 10px}.n2_fullscreen_editor__content{flex:1 1 auto;display:flex;overflow:hidden}.n2_fullscreen_editor__content_sidebar{position:relative;flex:0 0 340px;width:340px;overflow:auto;background-color:#3a4956}.n2_fullscreen_editor__content_sidebar_top_bar{position:-webkit-sticky;position:sticky;top:0}.n2_fullscreen_editor__save_as_new_container{padding:12px 20px}.n2_fullscreen_editor__save_as_new_container .n2_button{text-align:center;display:block}.n2_fullscreen_editor__visual{display:flex;align-items:center;padding:0 10px;background-color:#2c3a45;border-bottom:1px solid #1e2830}.n2_fullscreen_editor__visual--active{background-color:#1375e9;border-bottom:1px solid #1375e9}.n2_fullscreen_editor__visual_select_tick{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;border:2px solid #131c23;border-radius:3px;background-color:#2c3a45;cursor:pointer}.n2_fullscreen_editor__visual_select_tick .ssi_16{display:none;color:#fff}.n2_fullscreen_editor__visual--selected .n2_fullscreen_editor__visual_select_tick{background-color:#04c018;border-color:#04c018}.n2_fullscreen_editor__visual--selected .n2_fullscreen_editor__visual_select_tick .ssi_16{display:inline-block}.n2_fullscreen_editor__visual_label{flex:1 1 auto;padding:0 10px;color:#94b2c1;font-size:12px;line-height:44px;cursor:pointer}.n2_fullscreen_editor__visual--active .n2_fullscreen_editor__visual_label{color:#fff}.n2_fullscreen_editor__visual_action{display:inline-flex;align-items:center;justify-content:center;padding:5px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_fullscreen_editor__visual--active .n2_fullscreen_editor__visual_action{color:#fff}.n2_fullscreen_editor__content_content{position:relative;flex:1 1 auto;overflow:auto;background-color:#f0f4f7}.n2_iframe_application{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;display:flex;flex-flow:column;margin:0!important;min-width:0;height:100vh;overflow:hidden}.n2_iframe_application a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_iframe_application__nav_bar{position:relative;z-index:2;display:flex;flex:0 0 auto;height:60px;background-color:#0c1924}.n2_iframe_application__nav_bar_label{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center}.n2_iframe_application__nav_bar_actions{position:relative;z-index:2;flex:1 1 auto;display:flex;justify-content:flex-end;padding:12px 10px}.n2_iframe_application__nav_bar_actions>*{margin:0 10px}.n2_iframe_application__nav_bar_actions .n2_button_spacer{margin:0 10px;width:2px;height:32px}.n2_iframe_application__nav_bar_actions .n2_button_spacer--visible{height:24px;background-color:#3a4956;border-radius:1px}.n2_iframe_application__nav_bar_actions .n2_button_plain_icon{margin:0 5px}.n2_iframe_application__nav_bar_actions .n2_button_plain_icon,.n2_iframe_application__nav_bar_actions .n2_button_plain_icon:HOVER,.n2_iframe_application__nav_bar_actions .n2_button_plain_icon:FOCUS{color:#94b2c1}.n2_iframe_application__content{position:relative;flex:1 1 auto;overflow:auto;background-color:#f0f4f7}.n2_iframe_application__content .n2_form__table[data-field=table-shapedivider] .n2_field__label .ssi_16--minidesktopportrait{color:#325c77}.n2_admin_editor{margin:0!important;min-width:0}.n2_admin_editor_overlay{z-index:10;position:fixed;left:0;top:0;width:100%;height:100%;display:flex;flex-flow:column;visibility:hidden}.n2_admin_editor_overlay__top{position:relative;z-index:10;flex:0 0 auto}.n2_admin_editor_overlay__top_bar_main{position:static;visibility:visible}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs{margin:0 -8px;padding:0}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button{color:#94b2c1}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button,.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button:HOVER,.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__breadcrumb_button:FOCUS{color:#94b2c1}.n2_admin_editor_overlay__top_bar_main .n2_breadcrumbs__arrow{color:#94b2c1}.n2_admin_editor__ui_slide_manager.n2_slide_manager{visibility:visible;position:absolute;left:0;top:60px;width:100%;height:calc(100vh - 60px)}.n2_admin_editor__ui_slide_manager.n2_slide_manager .n2_slide_manager__inner{overflow:auto;max-height:100%}.n2_admin_editor__content{display:flex;position:relative;box-sizing:border-box;width:100%;height:100vh;padding-top:75px;padding-left:65px;background:#f0f4f7}.n2_body--show-add-more .n2_admin_editor__content,.n2_body--attached-layer-list .n2_admin_editor__content{padding-bottom:0!important}.n2_admin_editor__content_inner{position:relative;flex:1 1 auto;background-color:#f0f4f7;overflow:auto}.n2_admin_editor_overlay--show-layer-navigation:not(.n2_admin_editor_overlay--show-add-more):not(.n2_admin_editor_overlay--attached-layer-list) .n2_slide_editor_timeline_toggle--show{display:none}.n2_admin_editor_overlay--show-layer-navigation.n2_admin_editor_overlay--attached-layer-list .n2_slide_editor_timeline_toggle--show{pointer-events:none}.n2_admin_editor_overlay--show-slides .n2_admin_editor_overlay__top_bar_main .n2_top_bar_main__primary{opacity:.5;pointer-events:none}.n2_top_bar_main__logo{flex:1 1 auto;overflow:hidden;display:flex;align-items:center;justify-content:center}.n2_top_bar_main__logo a{display:inline-block;padding:0 10px}.n2_top_bar_main__logo svg{vertical-align:top;display:inline-block}.n2_admin__banner{background-color:#1c2933;z-index:2;position:relative;color:#fff;align-items:center}.n2_admin__banner .n2_admin__banner_inner{max-width:500px;text-align:center;margin:0 auto;padding:40px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_title{font-size:22px;line-height:32px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_description{font-size:14px;color:#94b2c1;line-height:24px}.n2_admin__banner .n2_admin__banner_inner .n2_admin__banner_inner_button{margin-top:20px}.n2_admin__banner .n2_admin__banner_close{margin:10px;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background-color:#6b7986;border-radius:100%;color:#fff;font-size:16px;cursor:pointer;position:absolute;top:0;right:0}.n2_admin__banner .n2_admin__banner_close:HOVER{background-color:#8694a2}.n2_free_need_more{padding:40px 0;display:flex;flex-flow:column;align-items:center;text-align:center}.n2_free_need_more__logo img{display:block;width:64px}.n2_free_need_more__title{margin-top:10px;font-size:16px;line-height:28px;font-weight:700;color:#fff}.n2_modal .n2_free_need_more__title{color:#283f4d}.n2_free_need_more__paragraph{max-width:270px;line-height:24px;font-size:14px;color:#bdcfd9}.n2_modal .n2_free_need_more__paragraph{color:#325c77}.n2_free_need_more__button{margin-top:10px;padding:0 25px;background-color:#1d81f9;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-transform:uppercase}.n2_free_need_more__button,.n2_free_need_more__button:HOVER,.n2_free_need_more__button:FOCUS{color:#fff}.n2_free_need_more__button:HOVER{background-color:#338ef9}.n2_body--inherit-cursor *{cursor:inherit!important}.n2_modal{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100003;position:fixed;left:0;top:0;display:none;box-sizing:border-box;width:100%;height:100%;padding:20px;background:rgba(28,41,51,.8);align-items:center;justify-content:center}.n2_modal a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_modal--visible{display:flex}.n2_modal__overlay{z-index:1;position:absolute;width:100%;height:100%;cursor:pointer}.n2_modal__window{position:relative;z-index:2;display:flex;flex-flow:column;width:100%;max-height:100%;border-radius:3px;box-shadow:0 2px 20px 0 rgba(0,0,0,.2)}.n2_modal--simple .n2_modal__window{border-radius:3px;overflow:hidden}.n2_modal--simple .n2_modal__body_outer{flex:1 1 auto;position:relative;background:#fff;border-radius:3px 3px 0 0;overflow:auto}.n2_modal--simple .n2_modal__body{padding:20px 40px 10px}.n2_modal--simple .n2_modal__close_wrap{position:sticky;top:0;height:0;display:flex;justify-content:flex-end}.n2_modal--simple .n2_modal__close{margin:10px;width:36px;height:36px;display:flex;align-items:center;justify-content:center;background-color:#f0f4f7;border-radius:100%;color:#283f4d;font-size:16px;cursor:pointer}.n2_modal--simple .n2_modal__buttons{display:flex;flex:0 0 auto;background-color:#f0f4f7;height:56px;border-radius:0 0 3px 3px;border-top:1px solid #e4e9ec}.n2_modal--simple .n2_modal__buttons[data-buttons="0"]{display:none}.n2_modal--simple .n2_modal__buttons[data-buttons="1"] .n2_modal__button{width:100%;align-items:center;justify-content:center}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button{width:50%;align-items:center}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button:first-child{justify-content:flex-end;padding-right:10px}.n2_modal--simple .n2_modal__buttons[data-buttons="2"] .n2_modal__button:last-child{justify-content:flex-start;padding-left:10px}.n2_modal--simple .n2_modal__button{display:flex}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables{display:flex;flex-wrap:wrap;padding:3px;background-color:#f0f4f7;border-radius:3px;max-height:130px;overflow-y:auto}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable{margin:3px;padding:0 10px;background-color:#94b2c1;border-radius:3px;color:#fff;font-size:11px;line-height:30px;cursor:pointer}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable:HOVER{background-color:#7f9caa}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable--selected{background-color:#1d81f9;color:#fff}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_variables__variable--selected:HOVER{background-color:#1d81f9}.n2_modal[data-modal-type=generator-insert-variable] .n2_generator_result{padding:0 8px;background-color:#f0f4f7;border-radius:3px;height:80px;overflow-y:scroll;font-size:12px;line-height:30px;color:#325c77}.n2_modal--lightbox .n2_modal__window{height:100%}.n2_modal--lightbox .n2_modal__top_bar{position:relative;border-radius:3px 3px 0 0;background-color:#0c1924}.n2_modal--lightbox .n2_modal__top_bar_title{position:absolute;width:100%;z-index:1;line-height:60px;color:#fff;font-size:22px;text-align:center;text-transform:capitalize}.n2_modal--lightbox .n2_modal__top_bar_buttons{position:relative;z-index:2;display:flex;justify-content:flex-end;padding:12px 10px}.n2_modal--lightbox .n2_modal__top_bar_buttons>*{margin:0 10px}.n2_modal--lightbox .n2_modal__body{flex:1 1 auto;overflow:auto;background:#f0f4f7;border-radius:0 0 3px 3px}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__body{display:flex;overflow:hidden}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__sidebar{position:relative;flex:0 0 340px;width:340px;background-color:#3a4956}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__sidebar_inner{height:100%;overflow:auto}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__content{position:relative;flex:1 1 auto;background-color:#f0f4f7}.n2_modal--lightbox[data-modal-type=icons] .n2_modal__content_inner{height:100%;overflow:auto}.n2_modal_icons__search_area{padding:10px 20px;background-color:#3a4956;border-bottom:1px solid #1e2830}.n2_modal_icons__search_area .n2_field__label{display:none}.n2_modal_icons__search_area .n2_field_text{display:flex}.n2_modal_icons__search_area .n2_field_text input{width:100%}.n2_modal_icons__list_item{background-color:#2c3a45;padding:0 10px;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:44px;cursor:pointer}.n2_modal_icons__list_item--active{background-color:#1d81f9;color:#fff}.n2_modal_icons__icon{display:inline-block;margin:5px;width:32px;height:32px;cursor:pointer;font-size:24px;line-height:32px;text-align:center;color:#000}.n2_modal_filesystem__content{display:flex;flex-wrap:wrap;padding:10px}.n2_modal_filesystem__content[data-mode=single] .n2_modal_filesystem_box--file,.n2_modal_filesystem__content[data-mode=multiple] .n2_modal_filesystem_box--file{cursor:pointer}.n2_modal_filesystem__current_path{width:100%;margin:0 10px;font-size:14px;line-height:30px;color:#325c77}.n2_modal_filesystem_box{position:relative;display:flex;flex-flow:column;justify-content:flex-end;margin:10px;width:160px;height:140px;border-radius:3px}.n2_modal_filesystem_box .n2-button{display:none}.n2_modal_filesystem_box--active{box-shadow:0 0 0 3px #1d81f9}.n2_modal_filesystem_box__image{height:100px;background-repeat:no-repeat;background-size:cover}.n2_modal_filesystem_box__icon{height:100px;display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_modal_filesystem_box__label{padding:0 15px;background-color:#fff;color:#325c77;font-size:12px;line-height:40px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.n2_modal_filesystem_box--upload{border:2px dashed #bdcfd9}.n2_modal_filesystem_box--upload .n2_modal_filesystem_box__icon{height:84px}.n2_modal_filesystem_box--upload .n2_modal_filesystem_box__label{line-height:20px;white-space:normal;overflow:visible;text-overflow:initial}.n2_modal_filesystem_box--directory-up{cursor:pointer}.n2_modal_filesystem_box--directory{cursor:pointer}.n2_modal_select_slider{position:relative;display:flex;flex-wrap:wrap;margin:0 auto;padding:24px}.n2_modal_select_slider__box{position:relative;flex:0 0 auto;width:270px;height:180px;border-radius:3px;margin:16px;background:#fff;cursor:pointer}.n2_modal[data-modal-type=select-slider] .n2_modal__window{max-width:980px;max-height:744px}.n2_modal--iframe .n2_modal__window{height:100%}.n2_modal--iframe iframe{width:100%;height:100%;border:0}.n2_modal__hotkey{display:flex;flex-wrap:wrap}.n2_modal__hotkey_column{flex:0 0 50%;padding:10px;box-sizing:border-box}.n2_modal__hotkey_group{padding:10px}.n2_modal__hotkey_row{display:flex;justify-content:space-between;margin:5px 0}.n2_modal__hotkey_text{font-size:12px;line-height:28px;color:#325c77}.n2_modal__hotkey_key{font-size:11px;font-weight:700;line-height:30px;text-transform:uppercase;color:#fff;background:#94b2c1;border-radius:3px;padding:0 10px;min-width:11px;text-align:center;margin-left:5px}.n2_modal__hotkey_key:last-child{background:#1d81f9}.n2_modal__hotkey_keys{display:flex}.n2_modal__hotkey_title{text-transform:uppercase;font-size:14px;line-height:26px;color:#325c77;font-weight:700}.n2_modal__icon{margin:0 auto 10px;flex:0 0 auto;width:99px;height:99px;border-radius:100%;display:flex;align-items:center;justify-content:center;font-size:48px}.n2_modal__icon--green{background:#e5f8e7;color:#04c018}.n2_modal__icon--purple{background:#efebf8;color:#5f39c2}.n2_modal__icon--red{background:#f9ebe9;color:#be331f}.n2_modal__icon--blue{background:#e8f2fe;color:#1d81f9}.n2_modal__heading{line-height:28px;font-size:18px;color:#283f4d;font-weight:700;text-transform:capitalize;text-align:center}.n2_modal__subheading{font-size:18px;line-height:30px;color:#283f4d}.n2_modal__paragraph{color:#325c77;font-size:14px;line-height:26px;text-align:center;margin-bottom:20px}input.n2_modal__input{box-sizing:initial;width:100%;max-width:240px;border:2px solid #94b2c1;border-radius:3px;height:32px;line-height:32px;font-size:14px;color:#325c77;text-align:center;margin-bottom:22px}input.n2_modal__input:FOCUS{box-shadow:none;border-color:#1375e9}.n2_modal__form_row{margin:0 -10px}.n2_modal__form_row .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;margin-bottom:15px;padding:5px 10px}.n2_modal__form_row .n2_field .n2_field__label{display:flex;align-items:center}.n2_modal__form_row .n2_field .n2_field__label label{line-height:20px;color:#325c77;font-size:12px;text-transform:capitalize}.n2_modal__form_row .n2_field .n2_field__label .ssi_16--info{margin:0 5px;font-size:16px;color:#94b2c1}.n2_modal__form_row .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_modal__form_row .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_modal__form_row .n2_field__grouping>.n2_field__element,.n2_modal__form_row .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_modal__form_row--fullwidth{display:flex}.n2_modal__form_row--fullwidth .n2_field{display:flex;width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field__element{display:flex}.n2_modal__form_row--fullwidth .n2_field .n2_field__element>*{flex:1 1 auto}.n2_modal__form_row--fullwidth .n2_field .n2_field_text{display:flex}.n2_modal__form_row--fullwidth .n2_field .n2_field_text input{width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field_textarea textarea{width:100%}.n2_modal__form_row--fullwidth .n2_field .n2_field_select select{box-sizing:border-box;width:100%;height:30px;line-height:30px}.n2_modal__form_row--fullwidth .n2_field .n2_field_select select[multiple]{height:auto}.n2_modal__container_hidden{display:none}.n2_modal__container_hidden--visible{display:block}.n2_modal__form_row--large .n2_field .n2_field__label label{font-size:18px;line-height:50px;color:#283f4d}.n2_form_element--hidden{display:none!important}.n2_field__label label{display:block;margin:0;white-space:nowrap}.n2_button{display:inline-flex;align-items:center;border-radius:3px;padding:0 18px;font-size:12px;line-height:32px;font-weight:700;text-transform:uppercase;white-space:nowrap}.n2_button .n2_button__label{max-width:150px;text-overflow:ellipsis;overflow:hidden}.n2_button,.n2_button:HOVER,.n2_button:FOCUS{color:#fff}.n2_button .ssi_16,.n2_button .ssi_24,.n2_button .ssi_32{margin-left:5px;margin-right:-5px}html[dir=rtl] .n2_button .ssi_16,html[dir=rtl] .n2_button .ssi_24,html[dir=rtl] .n2_button .ssi_32{margin-left:-5px;margin-right:5px}.n2_button--inactive{opacity:.5}.n2_button--big{padding:0 30px;font-size:12px;line-height:36px}.n2_button--small{padding:0 10px;font-size:11px;line-height:30px}.n2_button--small .ssi_16,.n2_button--small .ssi_24,.n2_button--small .ssi_32{margin-right:0}.n2_button--blue{background-color:#1d81f9}.n2_button--blue:HOVER{background-color:#338ef9}.n2_button--green{background-color:#04c018}.n2_button--green:HOVER{background-color:#07ca1c}.n2_button--red{background-color:#c43e2a}.n2_button--red:HOVER{background-color:#d23923}.n2_button--grey{background-color:#94b2c1}.n2_button--grey:HOVER{background-color:#7f9caa}.n2_button--grey-dark{background-color:#6b7986}.n2_button--grey-dark:HOVER{background-color:#8694a2}.n2_button--purple{background-color:#5f39c2}.n2_button--inactive{opacity:.5}.n2_button_plain{display:inline-flex;align-items:center;padding:0 5px;font-size:16px;line-height:32px;text-transform:capitalize}.n2_button_plain,.n2_button_plain:HOVER,.n2_button_plain:FOCUS{color:#325c77}.n2_button_plain .ssi_16,.n2_button_plain .ssi_24,.n2_button_plain .ssi_32{margin:0 5px}.n2_button_plain--small{font-size:14px;line-height:30px}.n2_button_plain--color-blue:HOVER{color:#005bc6}.n2_button_plain--color-blue,.n2_button_plain--color-blue:FOCUS{color:#1375e9}.n2_button_plain_icon{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:3px;font-size:16px}.n2_button_plain_icon,.n2_button_plain_icon:HOVER,.n2_button_plain_icon:FOCUS{color:#325c77}.n2_button_plain_icon--active{background:#1d81f9}.n2_button_plain_icon--active,.n2_button_plain_icon--active:HOVER,.n2_button_plain_icon--active:FOCUS{color:#fff}.n2_button_plain_icon--big{font-size:32px;width:36px;height:36px}.n2_button_icon{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border-radius:3px;font-size:16px}.n2_button_icon,.n2_button_icon:HOVER,.n2_button_icon:FOCUS{color:#fff}.n2_button_icon--small{width:24px;height:24px}.n2_button_icon--blue{background-color:#1d81f9}.n2_button_icon--blue:HOVER{background-color:#338ef9}.n2_button_icon--green{background-color:#04c018}.n2_button_icon--green:HOVER{background-color:#07ca1c}.n2_button_icon--red{background-color:#c43e2a}.n2_button_icon--red:HOVER{background-color:#d23923}.n2_button_icon--grey{background-color:#94b2c1}.n2_button_icon--grey:HOVER{background-color:#7f9caa}.n2_button_icon--grey-dark{background-color:#6b7986}.n2_button_icon--grey-dark:HOVER{background-color:#8694a2}.n2_popover{position:relative}.n2_popover_content{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;display:none;z-index:200000;position:fixed;left:0;top:0}.n2_popover_content a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_popover_content--visible{display:flex;flex-flow:column}.n2_popover_content_exit{cursor:pointer;order:1}.n2_popover_content_inner{order:2;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_floating_menu{display:inline-block}.n2_floating_menu__button{vertical-align:top}.n2_floating_menu__button.n2_button{padding:0 20px 0 16px}.n2_floating_menu__items{display:flex;flex-flow:column;padding:8px 0}.n2_floating_menu__item{display:inline-flex;align-items:center;white-space:nowrap;font-size:12px;line-height:28px;padding:0 10px;text-transform:capitalize}.n2_floating_menu__item .ssi_16{color:#94b2c1;padding:0 5px}.n2_floating_menu__item,.n2_floating_menu__item:FOCUS{color:#325c77}.n2_floating_menu__item:HOVER{background-color:#1d81f9;color:#fff}.n2_floating_menu__item:HOVER .ssi_16{color:#fff}.n2_floating_menu__item[data-state]{display:none}.n2_floating_menu__item--has-state[data-state]{display:block}.n2_floating_menu__item--active,.n2_floating_menu__item--active:FOCUS,.n2_floating_menu__item--active .ssi_16{color:#1375e9}.n2_floating_menu__item--active:HOVER{color:#fff}.n2_floating_menu__item--red,.n2_floating_menu__item--red:FOCUS,.n2_floating_menu__item--red .ssi_16{color:#c43e2a}.n2_floating_menu__item--red:HOVER{color:#fff}.n2_floating_menu__item--red:HOVER .ssi_16{color:#fff}.n2_floating_menu__item_label{padding:0 5px}.n2_floating_menu__item_separator{margin:8px 0;border-top:2px solid rgba(55,77,88,.2)}.n2_form__tab[data-tab]{display:none}.n2_form__tab--active[data-tab]{display:block}.n2_header__menu_item.n2_form__tab_button--active,.n2_header__menu_item.n2_form__tab_button--active:ACTIVE,.n2_header__menu_item.n2_form__tab_button--active:VISITED,.n2_header__menu_item.n2_form__tab_button--active:FOCUS,.n2_header__menu_item.n2_form__tab_button--active:LINK{box-shadow:inset 0 -3px 0 0 #1375e9!important;color:#1375e9}.n2_form__table{margin:20px;background-color:#fff;border-radius:3px}.n2_form__table_label{display:flex;padding:15px 20px}.n2_form__table_label_title{line-height:42px;font-size:22px;color:#283f4d;text-transform:capitalize}.n2_form__table_label_fields{flex:1 1 auto;display:flex;align-items:center;padding:0 5px}.n2_form__table_label_fields--end{justify-content:flex-end}.n2_form__table_label_field{margin:0 5px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__preview{height:38px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__arrow{line-height:38px}.n2_form__table_label_field .n2_field_image_list .n2_field_image_list__popover{top:42px}.n2_form__table_label_field .n2_field_onoff__labels{display:none}.n2_form__table_preview{border-top:1px solid #e4e9ec;padding:20px}.n2_form__table_row_group_label{color:#283f4d;border-top:1px solid #e4e9ec;padding:20px;font-size:18px;text-transform:capitalize}.n2_form__table_row{display:flex;flex-wrap:wrap;padding:10px;border-top:1px solid #e4e9ec}.n2_form__table_row .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;padding:5px 10px}.n2_form__table_row .n2_field.n2_field--raw{padding:0 10px}.n2_form__table_row .n2_field .n2_field__label{display:flex;align-items:center}.n2_form__table_row .n2_field .n2_field__label label{line-height:20px;color:#325c77;font-size:12px;text-transform:capitalize}.n2_form__table_row .n2_field .n2_field__label .ssi_16--info{margin:0 5px 2px;font-size:16px;color:#94b2c1}.n2_form__table_row .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_form__table_row .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_form__table_row .n2_field__grouping>.n2_field__element,.n2_form__table_row .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_form__table_row--hidden{display:none}.n2_form__table_row_plain{border-top:1px solid #e4e9ec}.n2_fields_layer_window__title{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_fields_layer_window__label{flex:1 1 auto;color:#94b2c1;font-size:12px;line-height:30px;font-weight:700;text-transform:uppercase;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_fields_layer_window__title_fields{display:flex}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_select select{background-color:#2c3a45;border-color:#2c3a45}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_select select:FOCUS{border:2px solid #1d81f9}.n2_form--dark .n2_fields_layer_window__title_fields .n2_field_icon_tab{background-color:#2c3a45}.n2_fields_layer_window__fields{display:flex;flex-wrap:wrap;padding:5px 0}.n2_fields_layer_window__fields .n2_field{display:inline-flex;flex-flow:column;vertical-align:top;padding:5px 10px}.n2_fields_layer_window__fields .n2_field .n2_field__label{display:flex;align-items:center;max-width:160px}.n2_fields_layer_window__fields .n2_field .n2_field__label label{line-height:20px;font-size:12px;color:#325c77;text-transform:capitalize;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_form--dark .n2_fields_layer_window__fields .n2_field .n2_field__label label{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--info{margin:0 5px;font-size:16px;color:#94b2c1}.n2_form--dark .n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--info{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field .n2_field__label .ssi_16--minidesktopportrait{color:#bdcfd9}.n2_fields_layer_window__fields .n2_field.n2_field--label-none>.n2_field__element{display:flex;flex-wrap:wrap}.n2_fields_layer_window__fields .n2_field.n2_field--label-placeholder{padding-top:25px}.n2_fields_layer_window__fields .n2_field__grouping>.n2_field__element,.n2_fields_layer_window__fields .n2_field_mixed>.n2_field__element{margin:-5px -10px}.n2_layer_window_notice{line-height:20px;font-size:12px;color:#bdcfd9;padding:10px}body[data-device=desktopPortrait] .n2_layer_window_notice__device_icon{display:none}.n2_form__visual_set{display:flex;background-color:#1c2933;padding:12px 20px}.n2_form__visual_set_label{flex:1 1 auto;line-height:30px;font-size:12px;color:#94b2c1;text-transform:uppercase}.n2_field_text{position:relative;display:inline-flex;vertical-align:top;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_text{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_text.n2_field_text--focus{border-color:#1d81f9}.n2_field_text input{background:initial;padding:0;margin:0 6px;height:26px;line-height:1;font-size:12px;color:#325c77}.n2_field_text input::placeholder{color:#325c77;opacity:1}.n2_form--dark .n2_field_text input{color:#bdcfd9}.n2_form--dark .n2_field_text input::placeholder{color:#bdcfd9;opacity:1}.n2_field_text input,.n2_field_text input:FOCUS{border:0;box-shadow:none;outline:0}.n2_field_text input::-ms-clear{display:none}.n2_field_text .n2_field_number__slider{display:none;position:absolute;top:26px;margin:0 -2px;width:100%;min-width:70px;z-index:2;padding-top:7px}.n2_field_text:HOVER .n2_field_number__slider,.n2_field_text.n2_field_text--focus .n2_field_number__slider{display:block}.n2_field_text .n2_field_number__slider_inner{overflow:hidden;height:30px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_text .nui-slider{position:relative;background-color:#94b2c1;height:6px;margin:12px 10px;border-radius:10px}.n2_field_text .nui-slider .nui-slider-handle{position:absolute;top:0;z-index:2;width:10px;height:10px;background-color:#fff;border:2px solid #94b2c1;margin:-4px -7px 0;border-radius:50px;cursor:ew-resize;-ms-touch-action:none;touch-action:none}.n2_field_text__pre_label{padding:0 6px;line-height:26px;background-color:#94b2c1;font-size:11px;color:#fff;text-align:center;text-transform:uppercase}.n2_form--dark .n2_field_text__pre_label{background-color:#1c2933;color:#94b2c1}.n2_field_text--focus .n2_field_text__pre_label{background-color:#1d81f9}.n2_form--dark .n2_field_text--focus .n2_field_text__pre_label{color:#fff}.n2_field_text__clear{display:flex;line-height:26px;width:26px;justify-content:center;align-items:center}.n2_field_text__clear,.n2_field_text__clear:HOVER,.n2_field_text__clear:FOCUS{color:#94b2c1}.n2_field_text--empty .n2_field_text__clear{visibility:hidden}.n2_field_text__choose{display:inline-flex;align-items:center;justify-content:center;margin:-2px -2px -2px 0;background-color:#04c018;width:30px;line-height:30px;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_text__choose:HOVER{background-color:#07ca1c}.n2_field_text__choose,.n2_field_text__choose:HOVER,.n2_field_text__choose:FOCUS{color:#fff}.n2_field_text--empty .n2_field_text__choose{background-color:#94b2c1}.n2_form--dark .n2_field_text--empty .n2_field_text__choose{background-color:#1c2933}.n2_form--dark .n2_field_text--empty .n2_field_text__choose,.n2_form--dark .n2_field_text--empty .n2_field_text__choose:HOVER,.n2_form--dark .n2_field_text--empty .n2_field_text__choose:FOCUS{color:#94b2c1}html[dir=rtl] .n2_field_text__choose{border-radius:3px 0 0 3px;margin:-2px 0 -2px -2px}.n2_field_text__choose_text{margin:-2px -2px -2px 0;padding:0 10px;background-color:#04c018;font-size:11px;line-height:30px;text-transform:uppercase;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_text__choose_text,.n2_field_text__choose_text:HOVER,.n2_field_text__choose_text:FOCUS{color:#fff}.n2_field_text__post .n2_field_unit__current_unit{padding:0 6px;border-radius:0;line-height:26px}.n2_field_text__post .n2_field_unit__units{top:26px;right:-2px}.n2_field_text_image__preview{width:26px;height:26px;background-color:#fff;background-size:cover;background-position:50% 50%;border-right:2px solid #94b2c1}html[dir=rtl] .n2_field_text_image__preview{border-right:0;border-left:2px solid #94b2c1}.n2_form--dark .n2_field_text_image__preview{border-right-color:#1c2933;background-color:#2c3a45}html[dir=rtl] .n2_form--dark .n2_field_text_image__preview{border-left-color:#1c2933}.n2_field_text--focus .n2_field_text_image__preview{border-right-color:#1d81f9}.n2_field_text_image__size_label{display:none;position:absolute;right:28px;top:-20px;color:#325c77;line-height:16px;font-size:11px;background-color:#fff;border:2px solid #94b2c1;border-bottom:0;padding:0 5px;border-radius:2px 2px 0 0}.n2_form--dark .n2_field_text_image__size_label{color:#bdcfd9;background-color:#2c3a45;border-color:#1c2933}html[dir=rtl] .n2_field_text_image__size_label{left:28px;right:unset}.n2_field_text_image__size_label--visible{display:block}.n2_field_text_image__button{margin-left:10px}html[dir=rtl] .n2_field_text_image__button{margin-left:0;margin-right:10px}.n2_field_number input{text-align:center}.n2_field_text__unit,.n2_field_number__unit{padding:0 6px;background-color:#94b2c1;font-size:11px;color:#fff;line-height:26px;text-transform:uppercase}.n2_form--dark .n2_field_text__unit,.n2_form--dark .n2_field_number__unit{background-color:#1c2933;color:#94b2c1}.n2_field_text--focus .n2_field_text__unit,.n2_field_text--focus .n2_field_number__unit{background-color:#1d81f9}.n2_form--dark .n2_field_text--focus .n2_field_text__unit,.n2_form--dark .n2_field_text--focus .n2_field_number__unit{color:#fff}.n2_field_upload{cursor:pointer}.n2_field_upload .n2_field_chooser__label{width:150px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.n2_field_upload input[type=file]{position:absolute;top:0;left:0;width:100%;height:0;opacity:0;font-size:0;padding:15px 0}.n2_field_upload input[type=file]::-webkit-file-upload-button{cursor:pointer}.n2_field_table__content{display:grid;grid-gap:2px;width:100%}.n2_field_table__cell{padding:5px 10px;background-color:#f0f4f7;font-size:12px;line-height:22px;color:#325c77}.n2_field_tab{display:inline-flex;background-color:#94b2c1;border-radius:2px;overflow:hidden}.n2_field_tab__option--selected{background-color:#1d81f9}.n2_field_tab__option{padding:0 15px;line-height:30px;font-size:12px;color:#fff;cursor:pointer;white-space:nowrap}.n2_modal_tab__tabs{text-align:center;background-color:#f0f4f7;margin:0 -40px 16px -40px}.n2_modal_tab__tabs_button{display:inline-block;font-size:16px;color:#325c77;font-family:inherit;font-weight:500;padding:20px 0 17px 0;margin:0 20px;cursor:pointer;border-bottom:3px solid transparent}.n2_modal_tab__tabs_button--active{border-bottom:3px solid #1375e9;color:#1375e9;box-sizing:border-box}.n2_modal_tab__tabs_content{display:none}.n2_modal_tab__tabs_content--active{display:block}.n2_field_textarea{position:relative;display:inline-block;vertical-align:top;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_textarea{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_textarea.n2_field_text--focus{border-color:#1d81f9}.n2_field_textarea textarea{padding:0 6px;margin:0;background:initial;box-sizing:border-box;min-height:44px;vertical-align:top;line-height:20px;font-size:12px;color:#325c77;resize:both}.n2_form--dark .n2_field_textarea textarea{color:#bdcfd9}.n2_field_textarea textarea,.n2_field_textarea textarea:FOCUS{border:0;outline:0;box-shadow:none}.n2_field_textarea--inline textarea{min-height:26px}#n2-ss-layer-window textarea{resize:vertical}.n2_field_textarea_rich{position:relative;border-radius:3px;background-color:#fff;border:2px solid #94b2c1}.n2_form--dark .n2_field_textarea_rich{background-color:#2c3a45;border:2px solid #1c2933}.n2_field_textarea_rich.n2_field_text--focus{border-color:#1d81f9}.n2_field_textarea_rich textarea{display:block;padding:0 6px;margin:0;box-sizing:border-box;min-height:44px;vertical-align:top;line-height:20px;font-size:12px;color:#325c77;resize:vertical}.n2_form--dark .n2_field_textarea_rich textarea{background-color:#2c3a45;color:#bdcfd9}.n2_field_textarea_rich textarea,.n2_field_textarea_rich textarea:FOCUS{border:0;outline:0;box-shadow:none}.n2_field_textarea_rich__buttons{display:flex}.n2_form--dark .n2_field_textarea_rich__buttons{background-color:#2c3a45;border-bottom:2px solid #1c2933}.n2_field_textarea_rich__button{display:flex;align-items:center;justify-content:center;width:30px;height:30px;font-size:16px;color:#94b2c1;border-right:2px solid #1c2933;cursor:pointer}.n2_field_select select{margin:0;padding:0 6px;border-radius:3px;max-width:280px;width:auto;line-height:26px;height:26px;box-sizing:content-box;font-size:12px;color:#325c77;background-color:#fff;border:2px solid #94b2c1}.n2_field_select select[multiple]{padding:0;height:auto}.n2_field_select select[multiple] option{padding:6px 6px;font-size:12px;color:#325c77}.n2_form--dark .n2_field_select select{background-color:#2c3a45;border:2px solid #1c2933;color:#bdcfd9}.n2_field_select select,.n2_field_select select:FOCUS{box-shadow:none;outline:0}.n2_field_select select:FOCUS{border:2px solid #1d81f9}.n2_field_onoff{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:3px 0;display:flex;cursor:pointer}.n2_field_onoff__slider{flex:0 0 auto;border-radius:12px;background-color:#94b2c1;padding:3px;width:38px}.n2_field_onoff--on .n2_field_onoff__slider{background-color:#04c018}.n2_field_onoff__slider_bullet{width:18px;height:18px;border-radius:20px;background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.1);transition:transform .25s}.n2_field_onoff--on .n2_field_onoff__slider_bullet{transform:translateX(20px)}html[dir=rtl] .n2_field_onoff--on .n2_field_onoff__slider_bullet{transform:translateX(-20px)}.n2_field_onoff__labels{margin:0 3px;position:relative;overflow:hidden;height:24px}.n2_field_onoff__label{font-size:12px;line-height:24px;font-weight:700;text-transform:uppercase;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_field_onoff__label_off{color:#94b2c1}.n2_field_onoff--on .n2_field_onoff__label_off{margin-top:-24px}.n2_field_onoff__label_on{color:#40bb22}.n2_field_unit{position:relative;display:inline-block;vertical-align:top}.n2_field_unit__current_unit{line-height:30px;padding:0 6px;border-radius:3px;font-size:11px;text-transform:uppercase;background-color:#94b2c1;color:#fff}.n2_form--dark .n2_field_unit__current_unit{background-color:#1c2933;color:#94b2c1}.n2_field_unit__units{display:none;z-index:2;position:absolute;top:30px;right:0;border-bottom-left-radius:3px;border-bottom-right-radius:3px;background:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_unit:HOVER .n2_field_unit__units{display:block}.n2_field_unit__unit{padding:0 5px;line-height:24px;cursor:pointer;color:#325c77;font-size:11px;text-transform:uppercase}.n2_field_unit__unit:HOVER{background:#1d81f9;color:#fff}.n2_field_margin_padding{display:inline-flex;vertical-align:top}.n2_field_margin_padding .n2_field_text{position:relative;border-radius:0;margin-left:-2px}.n2_field_margin_padding .n2_field_text.n2_field_text--focus{z-index:2}.n2_field_margin_padding .n2_field_unit{margin-left:-2px}.n2_field_margin_padding .n2_field_unit__current_unit{border-top-left-radius:0;border-bottom-left-radius:0}html[dir=rtl] .n2_field_margin_padding .n2_field_unit__current_unit{border-radius:3px 0 0 3px}.n2_field_margin_padding__pre_label{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;font-size:16px;color:#fff;text-align:center;border-top-left-radius:3px;border-bottom-left-radius:3px;cursor:pointer}.n2_form--dark .n2_field_margin_padding__pre_label{background-color:#1c2933;color:#94b2c1}html[dir=rtl] .n2_field_margin_padding__pre_label{border-radius:0 3px 3px 0}.n2_field_margin_padding--linked-values .n2_field_margin_padding__pre_label .ssi_16::before{content:"\E64D"}.n2_field_margin_padding--linked-values .n2_field_text+.n2_field_text{display:none}.n2_field_radio{display:inline-flex;vertical-align:top;margin:0 -5px}.n2_field_radio .n2_field_radio__option{display:flex;align-items:center;cursor:pointer;margin:0 5px}.n2_field_radio .n2_field_radio__option_marker{display:flex;justify-content:center;align-items:center;width:14px;height:14px;line-height:14px;background-color:#fff;border:2px solid #94b2c1;border-radius:10px}.n2_field_radio .n2_field_radio__option_marker .ssi_16{display:none;color:#fff}.n2_field_radio .n2_field_radio__option--selected .n2_field_radio__option_marker{background-color:#04c018;border-color:#04c018}.n2_field_radio .n2_field_radio__option--selected .n2_field_radio__option_marker .ssi_16{display:block}.n2_field_radio .n2_field_radio__option_label{margin:0 5px;font-size:12px;line-height:30px;color:#325c77}.n2_field_radio_icon{display:inline-flex;vertical-align:top;overflow:hidden;border-radius:3px}.n2_field_radio_icon .n2_field_radio__option{display:flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;color:#fff;font-size:16px;cursor:pointer}.n2_form--dark .n2_field_radio_icon .n2_field_radio__option{background-color:#1c2933;color:#94b2c1}.n2_field_radio_icon .n2_field_radio__option--selected{background-color:#1d81f9}.n2_form--dark .n2_field_radio_icon .n2_field_radio__option--selected{background-color:#1d81f9;color:#fff}.n2_field_color .n2-field-color-preview{border-right:2px solid #94b2c1}html[dir=rtl] .n2_field_color .n2-field-color-preview{border-right:0;border-left:2px solid #94b2c1}.n2_form--dark .n2_field_color .n2-field-color-preview{border-right-color:#1c2933}html[dir=rtl] .n2_form--dark .n2_field_color .n2-field-color-preview{border-left-color:#1c2933}.n2_field_color.n2_field_text--focus .n2-field-color-preview{border-right-color:#1d81f9}html[dir=rtl] .n2_field_color.n2_field_text--focus .n2-field-color-preview{border-left-color:#1d81f9}.n2_field_color .n2-field-color-preview-inner{width:26px;height:26px;cursor:pointer}.n2_field_color input{text-transform:uppercase;width:50px;text-align:center}.n2_field_color--alpha input{width:65px}.n2_field_image_list{position:relative;display:inline-flex;vertical-align:top;align-items:center;border-radius:3px;border:2px solid #94b2c1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_image_list>.n2_field_image_list__fields{display:none}.n2_field_image_list--focus{border-color:#1d81f9;z-index:99}.n2_field_image_list__preview{display:inline-flex;background-color:#fff;height:26px;cursor:pointer}.n2_field_image_list__preview img{height:100%;width:auto}.n2_field_image_list__preview_label{padding:0 6px;background:#fff;line-height:26px;font-size:12px;color:#325c77}.n2_field_image_list__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_image_list__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_image_list--focus .n2_field_image_list__popover{display:block}.n2_field_image_list__popover_items{max-width:50vw;display:inline-flex;flex-wrap:wrap}.n2_field_image_list__popover_item{margin:10px;background-color:#fff;cursor:pointer}.n2_field_image_list__popover_item_image{border:2px solid #94b2c1;border-radius:3px;padding:3px}.n2_field_image_list__popover_item_image img{display:block;width:100%}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_image{border-color:#1d81f9}.n2_field_image_list__popover_item_disabled{display:inline-flex;align-items:center;min-height:100%;border:2px dashed #94b2c1;border-radius:3px;padding:0 10px;box-sizing:border-box;color:#325c77;font-size:14px;line-height:30px;text-transform:capitalize}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_disabled{border-color:#1d81f9}.n2_field_image_list__popover_item_label{color:#325c77;background:#fff;font-size:12px;text-align:center;line-height:30px}.n2_field_image_list__popover_item--selected .n2_field_image_list__popover_item_label{color:#1d81f9}.n2_field_checkbox_onoff{display:inline-flex;vertical-align:top;width:30px;height:30px;align-items:center;justify-content:center;background-color:#94b2c1;border-radius:3px;font-size:16px;color:#fff;cursor:pointer}.n2_field_checkbox_onoff--active{background-color:#1d81f9}.n2_field_group_checkbox_onoff{border-radius:3px;overflow:hidden;margin:5px 10px}.n2_field_group_checkbox_onoff .n2_field{padding:0}.n2_field_group_checkbox_onoff .n2_field_checkbox_onoff{border-radius:0}.n2_field_widget_position{position:relative;display:inline-flex;vertical-align:top;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_widget_position--focus{border-color:#1d81f9;z-index:99}.n2_field_widget_position__label{display:inline-block;vertical-align:top;padding:0 6px;line-height:26px;font-size:12px;color:#325c77;cursor:pointer}.n2_field_widget_position__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_widget_position__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_widget_position--focus .n2_field_widget_position__popover{display:flex}.n2_field_widget_position__popover .n2_field__element{flex-wrap:nowrap!important}.n2_field_control_type_picker{display:flex;flex-wrap:wrap;margin:-10px -5px}.n2_field_control_type_picker__item{margin:10px;position:relative;display:inline-block;border:0;border-radius:1px;height:auto;cursor:pointer}.n2_field_control_type_picker__item img{display:block}.n2_field_control_type_picker__item:hover{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_control_type_picker__item.n2_field_control_type_picker__item--selected{box-shadow:0 0 0 3px #1375e9}.n2_field_control_type_picker__selected_marker{display:none;position:absolute;top:10px;right:10px;background-color:#1375e9;border-radius:10px;width:16px;height:16px}.n2_field_control_type_picker__item--selected .n2_field_control_type_picker__selected_marker{display:block}.n2_field_control_type_picker__selected_marker .ssi_16{color:#fff}.n2_field_message{border-radius:3px;padding:5px 10px;font-size:12px;line-height:20px}.n2_field_message--notice{background-color:#f0f4f7;color:#325c77}.n2_field_message--notice a:HOVER{color:#005bc6}.n2_field_message--notice a,.n2_field_message--notice a:FOCUS{color:#1375e9}.n2_field_message--warning{background-color:#f5e293;color:#325c77}.n2_field_message--warning a:HOVER{color:#005bc6}.n2_field_message--warning a,.n2_field_message--warning a:FOCUS{color:#1375e9}.n2_ss_layer_window .n2_field_message--warning{width:298px}.n2_field_autocomplete{position:relative}.n2_field_decoration{display:inline-flex;vertical-align:top;margin:0 -3px}.n2_field_decoration__option{margin:0 3px;display:flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#94b2c1;border-radius:3px;color:#fff;font-size:16px;cursor:pointer}.n2_form--dark .n2_field_decoration__option{background-color:#1c2933;color:#94b2c1}.n2_field_decoration__option--selected{background-color:#1d81f9}.n2_form--dark .n2_field_decoration__option--selected{background-color:#1d81f9;color:#fff}.n2_field_icon__preview{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px}.n2_field_icon__preview .n2i{color:#fff;font-size:24px!important;vertical-align:top}.n2_field_icon_tab{background-color:#1c2933;border-radius:2px;overflow:hidden;white-space:nowrap}.n2_field_icon_tab__option{display:inline-flex;padding:7px;color:#fff;cursor:pointer}.n2_field_icon_tab__option i{color:#94b2c1}.n2_field_icon_tab__option--selected{background-color:#1d81f9}.n2_field_icon_tab__option--selected i{color:#fff}.n2_field_mixed_font_size__container>.n2_field_text{border-top-right-radius:0;border-bottom-right-radius:0}html[dir=rtl] .n2_field_mixed_font_size__container>.n2_field_text{border-radius:0 3px 3px 0}.n2_field_mixed_font_size__container>.n2_field_unit>.n2_field_unit__current_unit{border-top-left-radius:0;border-bottom-left-radius:0}html[dir=rtl] .n2_field_mixed_font_size__container>.n2_field_unit>.n2_field_unit__current_unit{border-radius:3px 0 0 3px}.n2_field_mixed_box_shadow__container>.n2_field_text{margin-left:-2px;border-radius:0}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text{margin-left:0;margin-right:-2px}.n2_field_mixed_box_shadow__container>.n2_field_text:first-child{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text:first-child{margin-right:0;border-radius:0 3px 3px 0}.n2_field_mixed_box_shadow__container>.n2_field_text:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px}html[dir=rtl] .n2_field_mixed_box_shadow__container>.n2_field_text:last-of-type{border-radius:3px 0 0 3px}.n2_field_mixed_box_shadow__container>.n2_field_text--focus{z-index:2}.n2_field_mixed_text_shadow__container>.n2_field_text{margin-left:-2px}.n2_field_mixed_text_shadow__container>.n2_field_text:first-child{margin-left:0;border-radius:3px 0 0 3px}html[dir=rtl] .n2_field_mixed_text_shadow__container>.n2_field_text:first-child{margin-left:-2px;border-radius:0 3px 3px 0}.n2_field_mixed_text_shadow__container>.n2_field_text:last-child{border-radius:0 3px 3px 0}html[dir=rtl] .n2_field_mixed_text_shadow__container>.n2_field_text:last-child{border-radius:3px 0 0 3px}.n2_field_mixed_text_shadow__container>.n2_field_text--focus{z-index:2}.n2_field_mixed_border__container{display:inline-flex;vertical-align:top;margin:0 -5px}.n2_field_mixed_border__container>*{margin:0 5px}.n2_form__table_row .n2_field.n2_field_mixed_generator_order{padding:0}.n2_field_button{display:inline-block;text-align:center;padding:0 10px;background-color:#94b2c1;font-size:11px;line-height:30px;text-transform:uppercase;border-radius:3px;max-width:150px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_field_button:HOVER{background-color:#7f9caa}.n2_field_button,.n2_field_button:HOVER,.n2_field_button:FOCUS{color:#fff}.n2_form--dark .n2_field_button{background-color:#6b7986}.n2_form--dark .n2_field_button:HOVER{background-color:#8694a2}.n2_form--dark .n2_field_button,.n2_form--dark .n2_field_button:HOVER,.n2_form--dark .n2_field_button:FOCUS{color:#fff}.n2_field_button--icon{display:inline-flex;align-items:center;justify-content:center;padding:0;width:30px;height:30px;font-size:16px}.n2_field_button--blue{background-color:#1d81f9}.n2_field_button--blue:HOVER{background-color:#338ef9}.n2_field_widget_area{width:80px;height:80px;position:relative;margin:0 10px}.n2_field_widget_area__inner{position:absolute;top:14px;left:14px;width:46px;height:46px;border:3px solid #94b2c1;border-radius:3px}.n2_field_widget_area__area{position:absolute;background-color:#94b2c1;border-radius:2px;cursor:pointer;width:10px;height:10px;left:0;top:0}.n2_field_widget_area__area[data-area="1"]{left:35px}.n2_field_widget_area__area[data-area="2"]{left:21px;top:21px}.n2_field_widget_area__area[data-area="3"]{left:35px;top:21px}.n2_field_widget_area__area[data-area="4"]{left:49px;top:21px}.n2_field_widget_area__area[data-area="5"]{top:35px}.n2_field_widget_area__area[data-area="6"]{left:21px;top:35px}.n2_field_widget_area__area[data-area="7"]{left:49px;top:35px}.n2_field_widget_area__area[data-area="8"]{left:70px;top:35px}.n2_field_widget_area__area[data-area="9"]{left:21px;top:49px}.n2_field_widget_area__area[data-area="10"]{left:35px;top:49px}.n2_field_widget_area__area[data-area="11"]{left:49px;top:49px}.n2_field_widget_area__area[data-area="12"]{left:35px;top:70px}.n2_field_widget_area__area--selected{background-color:#1d81f9;cursor:default}.n2_field_columns{display:grid;grid-gap:10px;grid-template-columns:280px 30px;width:310px}.n2_field_columns__content{position:relative;display:flex;overflow:hidden}.n2_field_columns__column{flex:0 0 auto;overflow:hidden;background-color:#04c018;border-radius:2px;font-size:12px;line-height:30px;text-align:center;color:#fff;cursor:ew-resize}.n2_field_columns__handle{display:inline-flex;justify-content:center;align-items:center;width:16px;height:30px;cursor:ew-resize;color:#bdcfd9}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__column{margin-right:16px}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__column:last-child{margin-right:0}.n2_field_columns__content.n2-sortable-currently-sorted .n2_field_columns__handle{display:none}.n2_field_columns__add{flex:0 0 auto;display:inline-flex;justify-content:center;align-items:center;width:30px;height:30px;background-color:#04c018;border-radius:2px;color:#fff;cursor:pointer}.n2_field_columns__add:HOVER{background-color:#07ca1c}.n2_field_select_list{height:120px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;overflow-y:scroll}.n2_field_select_list__option{display:flex;cursor:pointer;line-height:30px;font-size:12px;color:#325c77}.n2_field_select_list__option:nth-child(even){background-color:#f0f4f7}.n2_field_select_list__option.n2_field_select_list__option--selected{background-color:#1d81f9;color:#fff}.n2_field_select_list__option_primary{flex:1 1 auto;padding:0 8px}.n2_field_select_list__option_secondary{padding:0 8px}.n2_field_chooser{position:relative;display:inline-flex;vertical-align:top;border-radius:3px;background-color:#f0f4f7;height:30px}.n2_form--dark .n2_field_chooser{background-color:#2c3a45}.n2_field_chooser__label{min-width:100px;padding:0 8px;font-size:12px;line-height:30px;color:#325c77;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_form--dark .n2_field_chooser__label{color:#bdcfd9}.n2_field_chooser__clear{display:flex;line-height:30px;width:30px;justify-content:center;align-items:center}.n2_field_chooser__clear,.n2_field_chooser__clear:HOVER,.n2_field_chooser__clear:FOCUS{color:#94b2c1}.n2_field_chooser--empty .n2_field_chooser__clear{visibility:hidden}.n2_field_chooser__choose{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;width:30px;line-height:30px;border-top-right-radius:3px;border-bottom-right-radius:3px}.n2_field_chooser__choose:HOVER{background-color:#07ca1c}.n2_field_chooser__choose,.n2_field_chooser__choose:HOVER,.n2_field_chooser__choose:FOCUS{color:#fff}.n2_field_chooser--empty .n2_field_chooser__choose{background-color:#94b2c1}.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose{background-color:#1c2933}.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose,.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose:HOVER,.n2_form--dark .n2_field_chooser--empty .n2_field_chooser__choose:FOCUS{color:#94b2c1}html[dir=rtl] .n2_field_chooser__choose{border-radius:3px 0 0 3px}.n2_field_select_icon{display:flex;flex-wrap:wrap;margin:-10px -20px}.n2_field_select_icon__option{position:relative;display:flex;flex-flow:column;margin:20px;width:130px;padding:15px 10px;cursor:pointer;border-radius:3px}.n2_field_select_icon__option:HOVER{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_select_icon__option--selected{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_field_select_icon__option_icon{display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_field_select_icon__option--selected .n2_field_select_icon__option_icon{color:#1375e9}.n2_field_select_icon__option_label{font-size:14px;line-height:30px;color:#325c77;text-align:center;font-weight:700}.n2_field_select_icon__option--selected .n2_field_select_icon__option_label{color:#1375e9}.n2_field_select_icon__selected_marker{display:none;position:absolute;top:10px;right:10px;background-color:#1375e9;border-radius:10px;width:16px;height:16px;color:#fff}.n2_field_select_icon__option--selected .n2_field_select_icon__selected_marker{display:block}.n2_field_font{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;min-width:30px;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;cursor:pointer}.n2_field_font:HOVER{background-color:#07ca1c}.n2_field_font,.n2_field_font:HOVER,.n2_field_font:FOCUS{color:#fff}.n2_field_style{display:inline-flex;align-items:center;justify-content:center;background-color:#04c018;min-width:30px;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;cursor:pointer}.n2_field_style:HOVER{background-color:#07ca1c}.n2_field_style,.n2_field_style:HOVER,.n2_field_style:FOCUS{color:#fff}.n2_field_subform_icon{margin:-8px;display:flex;flex-wrap:wrap}.n2_field_subform_icon__option{margin:8px;display:flex;flex-flow:column;align-items:center;min-width:120px;border:3px solid #fff;border-radius:3px;cursor:pointer}.n2_field_subform_icon__option_icon{display:flex;align-items:center;justify-content:center;color:#94b2c1}.n2_field_subform_icon__option_label{margin-top:-13px;line-height:28px;font-size:12px;color:#325c77;font-weight:700;padding:0 10px}.n2_field_subform_icon__option--selected{border-color:#1375e9}.n2_field_subform_icon__option--selected .n2_field_subform_icon__option_icon,.n2_field_subform_icon__option--selected .n2_field_subform_icon__option_label{color:#1375e9}.n2_field_autoplaypicker{position:relative;display:inline-flex;vertical-align:top;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_autoplaypicker--focus{border-color:#1d81f9;z-index:99}.n2_field_autoplaypicker__label{display:inline-block;vertical-align:top;padding:0 6px;width:230px;line-height:26px;font-size:12px;color:#325c77;cursor:pointer}.n2_field_autoplaypicker__arrow{width:18px;line-height:26px;font-size:12px;color:#325c77;text-align:center;cursor:pointer}.n2_field_autoplaypicker__popover{display:none;position:absolute;top:30px;padding:10px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_field_autoplaypicker--focus .n2_field_autoplaypicker__popover{display:flex}.n2_field_autoplaypicker__popover .n2_field__element{flex-wrap:nowrap!important}.n2_field_layer_window_focus{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;cursor:pointer;background:#1c2933;border:2px solid #1c2933;border-radius:3px}.n2_field_layer_window_focus__image{display:block;width:100%;height:auto;border-radius:2px}.n2_field_layer_window_focus__dot{position:absolute;left:50%;top:50%;width:12px;height:12px;margin-top:-8px;margin-left:-8px;border:2px solid #fff;border-radius:16px;background:#04c018}.n2_field_breakpoint{display:flex;flex-wrap:wrap}.n2_field_breakpoint__breakpoint_container{position:relative;margin:25px 10px 5px;height:30px;display:flex;align-items:center;background-color:#94b2c1;border-radius:3px}.n2_field_breakpoint__breakpoint_container[data-orientation=portrait] [data-orientation=landscape]{display:none!important}.n2_field_breakpoint__breakpoint_container[data-orientation=landscape] [data-orientation=portrait]{display:none!important}.n2_field_breakpoint__device{position:relative;flex:0 0 auto;width:130px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_field_breakpoint__device_enable{display:inline-flex;align-items:center;justify-content:center;width:100%;height:30px;color:#fff}.n2_field_breakpoint__device_disable{position:absolute;right:5px;top:0;color:#fff;height:30px;display:none;align-items:center;opacity:.5;cursor:pointer}.n2_field_breakpoint__device_disable:HOVER{opacity:1}.n2_field_breakpoint__device--enabled .n2_field_breakpoint__device_disable{display:flex}.n2_field_breakpoint__breakpoint{position:relative;flex:0 0 auto;height:30px}.n2_field_breakpoint__breakpoint_divider{margin:5px 0;width:0;height:20px;box-shadow:0 0 0 1px #fff}.n2_field_breakpoint__breakpoint_label_container{display:flex;align-items:center;justify-content:center;position:absolute;margin-left:-32px;top:-26px;width:50px}html[dir=rtl] .n2_field_breakpoint__breakpoint_label_container{margin-left:0;margin-right:-32px}.n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label_container{margin-left:0;justify-content:flex-start}html[dir=rtl] .n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label_container{margin-right:0}.n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label_container{margin-left:-50px;justify-content:flex-end}html[dir=rtl] .n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label_container{margin-left:0;margin-right:-50px}.n2_field_breakpoint__breakpoint_label_rename{display:flex;align-items:center;justify-content:center;width:12px;cursor:pointer;color:#94b2c1;opacity:.7}.n2_field_breakpoint__breakpoint_label_rename:HOVER{opacity:1}.n2_field_breakpoint__breakpoint_label_container--disable-edit .n2_field_breakpoint__breakpoint_label_rename{visibility:hidden;pointer-events:none}.n2_field_breakpoint__breakpoint_label{color:#325c77;font-size:12px;line-height:26px}.n2_field_breakpoint__breakpoint_start .n2_field_breakpoint__breakpoint_label,.n2_field_breakpoint__breakpoint_end .n2_field_breakpoint__breakpoint_label{cursor:default}.n2_field_breakpoint__breakpoint .n2_field_breakpoint__breakpoint_label{cursor:default}.n2_field_breakpoint__breakpoint .n2_field_breakpoint__breakpoint_label[contenteditable=true]{cursor:text;outline:0}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device .n2_field_breakpoint__device_enable{cursor:pointer;opacity:.5}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device--enabled .n2_field_breakpoint__device_enable{opacity:1}.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=desktopportrait] .n2_field_breakpoint__device_enable,.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=tabletportrait] .n2_field_breakpoint__device_enable,.n2_field_breakpoint--with-enables .n2_field_breakpoint__device[data-id=mobileportrait] .n2_field_breakpoint__device_enable{cursor:default;opacity:1}.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint{display:none}.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint--enabled,.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=desktopportrait],.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=tabletportrait],.n2_field_breakpoint--with-enables .n2_field_breakpoint__breakpoint[data-id=mobileportrait]{display:block}body[data-desktoplandscape="0"] .n2-slider-settings-require--desktoplandscape,body[data-tabletlandscape="0"] .n2-slider-settings-require--tabletlandscape,body[data-mobilelandscape="0"] .n2-slider-settings-require--mobilelandscape{display:none!important}.n2_autocomplete_options{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;position:absolute;top:0;z-index:100003;overflow:auto;max-height:300px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;background:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2)}.n2_autocomplete_options a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_autocomplete_option{padding:0 5px;line-height:24px;cursor:pointer;color:#325c77;font-size:11px}.n2_autocomplete_option:HOVER{background:#1d81f9;color:#fff}.n2_tooltip{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;visibility:visible;z-index:100000;position:fixed;left:-10000px;top:-10000px;margin-top:-9000000px;opacity:0;border-radius:3px;font-size:12px;line-height:16px;font-weight:700;padding:4px 6px;color:#94b2c1;background:#0c1924;white-space:nowrap}.n2_tooltip a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_tooltip--active{opacity:1;margin:10px}.n2_tooltip--active.n2_tooltip_position{margin:0}.n2_body--tooltip-position-active .n2_tooltip:not(.n2_tooltip_position){display:none}.n2_form_tip{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;z-index:100000;position:fixed;display:none;max-width:360px;padding:5px 0}.n2_form_tip a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_form_tip--visible{display:block}.n2_form_tip__overlay{position:absolute;width:20px;height:20px}.n2_form_tip[data-position-horizontal=left] .n2_form_tip__overlay{left:0}.n2_form_tip[data-position-horizontal=right] .n2_form_tip__overlay{right:0}.n2_form_tip[data-position-vertical=bottom] .n2_form_tip__overlay{top:100%}.n2_form_tip[data-position-vertical=top] .n2_form_tip__overlay{bottom:100%}.n2_form_tip__content{background-color:rgba(12,25,36,.95);border-radius:5px;padding:20px}.n2_form_tip__label{color:#fff;font-size:14px;line-height:20px;text-transform:capitalize;margin-bottom:10px}.n2_form_tip__description{color:#94b2c1;font-size:14px;line-height:20px}.n2_form_tip__description a,.n2_form_tip__description a:HOVER,.n2_form_tip__description a:FOCUS{color:#1d81f9}.n2_form_tip__link{margin-top:10px;display:inline-block;line-height:30px;background-color:#1d81f9;border-radius:3px;padding:0 10px;font-size:11px;text-transform:capitalize;text-decoration:none}.n2_form_tip__link,.n2_form_tip__link:HOVER,.n2_form_tip__link:FOCUS{color:#fff}.n2_dashboard_info{position:relative}.n2_dashboard_info .n2_button_plain_icon{position:relative}.n2_dashboard_info--visible .n2_button_plain_icon,.n2_dashboard_info--visible .n2_button_plain_icon:HOVER,.n2_dashboard_info--visible .n2_button_plain_icon:FOCUS{color:#fff}.n2_dashboard_info__marker{display:none;position:absolute;top:7px;right:8px;width:8px;height:8px;background-color:#f69300;border-radius:100%;border:2px solid #fff}html[data-ss3-activated="0"] .n2_dashboard_info__marker{display:block}.n2_dashboard_info__content{display:none;position:absolute;right:0;top:45px;padding:24px;border-radius:3px;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);white-space:nowrap}.n2_dashboard_info--visible .n2_dashboard_info__content{display:grid;grid-template-columns:24px 1fr auto;grid-gap:15px}html[dir=rtl] .n2_dashboard_info__content{left:0;right:auto}.n2_dashboard_info__row_icon .ssi_24{display:block;font-size:24px;line-height:30px}.n2_dashboard_info__row_content{color:#325c77;line-height:30px;font-size:14px}.n2_dashboard_info__row_action{text-align:right}.n2_dashboard_info__row_action a,.n2_dashboard_info__row_action a:HOVER,.n2_dashboard_info__row_action a:FOCUS{line-height:30px;font-size:14px}.n2_dashboard_info__row_action a,.n2_dashboard_info__row_action a:FOCUS{color:#1375e9}.n2_dashboard_info__row_action a:HOVER{color:#005bc6}html[dir=rtl] .n2_dashboard_info__row_action{text-align:left}html[data-ss3-activated="0"] .n2_dashboard_info__row_icon_activated,html[data-ss3-activated="0"] .n2_dashboard_info__row_content_activated,html[data-ss3-activated="0"] .n2_dashboard_info__row_action_activated{display:none}html[data-ss3-activated="1"] .n2_dashboard_info__row_icon_activate,html[data-ss3-activated="1"] .n2_dashboard_info__row_content_activate,html[data-ss3-activated="1"] .n2_dashboard_info__row_action_activate,html[data-ss3-activated="1"] #n2-ss-activate-license-banner{display:none}.n2_dashboard_info__row_icon_version .ssi_24{color:#94b2c1}.n2_dashboard_info__row_icon_check_update .ssi_24{color:#1d81f9}.n2_dashboard_info__row_icon_activate .ssi_24{color:#c43e2a}.n2_dashboard_info__row_icon_activated .ssi_24{color:#04c018}.n2_dashboard_manager{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;padding:0 40px}.n2_dashboard_manager__content{position:relative;display:flex;flex-wrap:wrap;margin:0 -16px}.n2_dashboard_manager__content>*{margin:16px;flex:0 0 auto}.n2_dashboard_manager_upgrade_pro{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;min-height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_upgrade_pro:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_upgrade_pro__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(29,129,249,.1);border-radius:50px;color:#1d81f9}.n2_dashboard_manager_upgrade_pro__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_manager_upgrade_pro__details{margin-top:8px;display:grid;grid-template-columns:1fr 1fr;grid-gap:14px;width:100%;padding:0 30px 14px;box-sizing:border-box}.n2_dashboard_manager_upgrade_pro__details_option{display:flex;align-items:center}.n2_dashboard_manager_upgrade_pro__details_option,.n2_dashboard_manager_upgrade_pro__details_option:HOVER,.n2_dashboard_manager_upgrade_pro__details_option:FOCUS{color:#1375e9}.n2_dashboard_manager_upgrade_pro__details_option_label{margin:0 10px;font-size:14px;line-height:16px;text-transform:capitalize;padding:5px 0}.n2_dashboard_manager_upgrade_pro__button{margin-top:4px;margin-bottom:20px;padding:0 20px;min-width:260px;background-color:#1d81f9;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700}.n2_dashboard_manager_upgrade_pro__button,.n2_dashboard_manager_upgrade_pro__button:HOVER,.n2_dashboard_manager_upgrade_pro__button:FOCUS{color:#fff}.n2_dashboard_manager_upgrade_pro__button:HOVER{background-color:#338ef9}.n2_dashboard_manager_upgrade_pro__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}.n2_dashboard_manager_upgrade_pro:HOVER .n2_dashboard_manager_upgrade_pro__close{opacity:1}.n2_dashboard_manager_review{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_review:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_review__logo{display:flex;align-items:center;justify-content:center;margin-top:44px;width:100px;height:100px;background-color:rgba(246,183,0,.1);border-radius:50px;overflow:hidden;color:#f6b700}.n2_dashboard_manager_review__logo>*{display:none}.n2_dashboard_manager_review[data-star="0"] .ssi_48--review0,.n2_dashboard_manager_review[data-star="1"] .ssi_48--review1,.n2_dashboard_manager_review[data-star="2"] .ssi_48--review2,.n2_dashboard_manager_review[data-star="3"] .ssi_48--review3,.n2_dashboard_manager_review[data-star="4"] .ssi_48--review4,.n2_dashboard_manager_review[data-star="5"] .ssi_48--review5{display:block}.n2_dashboard_manager_review__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_manager_review__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_dashboard_manager_review__star_selector{margin-top:25px;display:flex}.n2_dashboard_manager_review__star{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;color:#94b2c1;cursor:pointer}.n2_dashboard_manager_review[data-star="1"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__star[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="1"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="2"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="3"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__star[data-star="5"]{color:#f6b700}.n2_dashboard_manager_review__label{display:none;margin-top:4px;font-size:16px;line-height:28px;color:#283f4d;text-align:center;font-weight:700}.n2_dashboard_manager_review[data-star="0"] .n2_dashboard_manager_review__label[data-star="0"],.n2_dashboard_manager_review[data-star="1"] .n2_dashboard_manager_review__label[data-star="1"],.n2_dashboard_manager_review[data-star="2"] .n2_dashboard_manager_review__label[data-star="2"],.n2_dashboard_manager_review[data-star="3"] .n2_dashboard_manager_review__label[data-star="3"],.n2_dashboard_manager_review[data-star="4"] .n2_dashboard_manager_review__label[data-star="4"],.n2_dashboard_manager_review[data-star="5"] .n2_dashboard_manager_review__label[data-star="5"]{display:block}.n2_dashboard_manager_review__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}html[dir=rtl] .n2_dashboard_manager_review__close{right:auto;left:10px}.n2_dashboard_manager_review:HOVER .n2_dashboard_manager_review__close{opacity:1}.n2_dashboard_manager_newsletter{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_dashboard_manager_newsletter:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_dashboard_manager_newsletter__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(95,57,194,.1);border-radius:50px;color:#5f39c2}.n2_dashboard_manager_newsletter__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_dashboard_newsletter__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_dashboard_newsletter__form{margin-top:10px;display:block}.n2_dashboard_newsletter__form input[type=email]{width:300px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;color:#325c77;font-size:14px;line-height:36px;text-align:center;box-shadow:none}.n2_dashboard_newsletter__form input[type=email]:FOCUS{border-color:#5f39c2}.n2_dashboard_manager_newsletter__button{margin-top:10px;padding:0 20px;min-width:260px;background-color:#5f39c2;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700;cursor:pointer}.n2_dashboard_manager_newsletter__button,.n2_dashboard_manager_newsletter__button:HOVER,.n2_dashboard_manager_newsletter__button:FOCUS{color:#fff}.n2_dashboard_manager_newsletter__button:HOVER{background-color:#683fd4}.n2_dashboard_manager_newsletter__close{display:flex;position:absolute;top:10px;right:10px;width:36px;height:36px;justify-content:center;align-items:center;background-color:#f0f4f7;border-radius:50px;color:#325c77;cursor:pointer;opacity:0;transition:opacity .3s .5s}html[dir=rtl] .n2_dashboard_manager_newsletter__close{right:auto;left:10px}.n2_dashboard_manager_newsletter:HOVER .n2_dashboard_manager_newsletter__close{opacity:1}.n2_device_changer{display:inline-flex;align-items:center;position:relative;direction:ltr}.n2_device_changer__button{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;font-size:24px;color:#94b2c1}.n2_device_changer__button--marked:after{position:absolute;top:-3px;right:-3px;display:block;content:'';width:8px;height:8px;border-radius:20px;border:2px solid #fff;background-color:#f69300}.n2_device_tester{display:none;position:absolute;top:100%;left:12px;transform:translateX(-50%);padding:10px 10px 0;width:260px;background-color:#0c1924}.n2_device_changer--active .n2_device_tester{display:block}.n2_device_tester_devices{display:flex;justify-content:space-around}.n2_device_tester_devices__device{display:inline-flex;align-items:center;justify-content:center;padding:6px 10px;width:24px;height:24px;color:#94b2c1;font-size:24px;cursor:pointer}.n2_device_tester_devices__device--active{color:#1d81f9}.n2_device_tester_zoom{display:flex;align-items:center;padding:10px 0;background-color:#0c1924;border-radius:0 0 3px 3px;text-align:center}.n2_device_tester_zoom__min_label,.n2_device_tester_zoom__max_label{width:30px;padding:0 10px;color:#94b2c1;font-size:10px}.n2_device_tester_zoom__min_label{text-align:right}.n2_device_tester_zoom__max_label{text-align:left}.n2_device_tester_zoom__inner{position:relative;margin:0 0;width:160px;height:34px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_device_tester_zoom__trail{position:absolute;left:0;top:50%;margin:-3px 0;width:160px;background-color:#3a4956;height:6px;border-radius:3px}.n2_device_tester_zoom__editor_size{position:absolute;left:0;top:9px;margin-left:-2px;width:2px;height:16px;background-color:#3a4956}.n2_device_tester_zoom__handle{position:absolute;top:9px;display:block;width:16px;height:16px;margin-left:-8px;background-color:#fff;border-radius:16px;z-index:2;cursor:ew-resize}.n2_device_tester_zoom__handle_label{position:absolute;left:-22px;top:-18px;width:60px;color:#94b2c1;font-size:10px;line-height:16px;text-align:center}.n2_slider_manager{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;padding:0 40px}.n2_slider_manager__search{position:relative}.n2_slider_manager__search_label{display:none}.n2_slider_manager__search_label_item{font-size:14px;line-height:28px;color:#325c77}.n2_slider_manager__search_label_keyword{font-weight:700}.n2_slider_manager__search_form input{position:relative;padding-left:26px;border-radius:3px;border:2px solid #94b2c1;width:200px;font-size:14px;line-height:28px;color:#325c77}html[dir=rtl] .n2_slider_manager__search_form input{padding-left:0;padding-right:26px}.n2_slider_manager__search_form input::placeholder{color:#325c77}.n2_slider_manager__search_form input:focus{outline:0;border:2px solid #94b2c1;box-shadow:none}.n2_slider_manager__search_icon{position:absolute;top:0;left:0;padding-left:10px;bottom:-2px;align-items:center;justify-content:center;color:#94b2c1;z-index:2}html[dir=rtl] .n2_slider_manager__search_icon{padding-left:0;padding-right:10px;left:unset;right:0}.n2_slider_manager__search_icon--magnifier{display:flex}.n2_slider_manager__search_icon--abort{display:none;cursor:pointer}.n2_slider_manager__search_icon--abort i{font-size:14px!important}.n2_slider_manager__search_icon--abort:hover{color:#325c77}.n2_slider_manager--search .n2_slider_manager__new_slider{display:none}.n2_slider_manager--search .n2_slider_manager__paginator{display:none}.n2_slider_manager--search .n2_button_disabled{opacity:.5;pointer-events:none}.n2_slider_manager--search .n2_slider_manager__search_label{display:block}.n2_slider_manager--search .n2_slider_manager__search_icon--magnifier{display:none}.n2_slider_manager--search .n2_slider_manager__search_icon--abort{display:flex}.n2_slider_manager--noresult .n2_slider_manager__search_label{display:none}.n2_slider_manager--noresult .n2_slider_manager__content .n2_slider_manager__content--empty{display:flex}.n2_slider_manager__action_bar{display:flex;padding:16px 0 0;height:30px}.n2_slider_manager__action_bar_left{flex:1 1 auto;display:flex;justify-content:flex-start;align-items:center;margin:0 -5px}.n2_slider_manager__action_bar_left .n2_slider_icon--blue{color:#94b2c1}.n2_slider_manager__action_bar_right{flex:1 1 auto;display:flex;justify-content:flex-end}.n2_slider_manager__content{position:relative;display:flex;flex-wrap:wrap;margin:0 -16px}.n2_slider_manager__content .n2_slider_manager__content--empty{padding-top:80px;margin:auto;width:500px;flex-flow:column;align-items:center;justify-content:center;height:216px;display:none}.n2_slider_manager__content .n2_slider_manager__content--empty__logo{display:flex;align-items:center;justify-content:center;margin-top:44px;width:100px;height:100px;border-radius:50px;overflow:hidden;color:#89a9b9}.n2_slider_manager__content .n2_slider_manager__content--empty__heading{margin-top:10px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_slider_manager__content .n2_slider_manager__content--empty__paragraph{width:360px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_slider_manager__box{position:relative;flex:0 0 auto;width:270px;height:180px;border-radius:3px;margin:16px;background:#fff}.n2_slider_manager__sortable_placeholder{height:200px;margin:5px 0;width:0;box-shadow:0 0 0 2px #1d81f9}.n2_slider_manager__new_slider{background-color:#04c018;color:#fff;display:flex;flex-flow:column;justify-content:center;align-items:center;cursor:pointer}.n2_slider_manager__new_slider:HOVER{background-color:#07ca1c}.n2_slider_manager__new_slider_icon{margin:5px 0 25px}.n2_slider_manager__new_slider_label{font-size:16px;line-height:16px;text-transform:uppercase;font-weight:700;max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slider_box{position:relative;display:flex;flex-flow:column;border-radius:3px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1);overflow:hidden;transition:transform .2s,box-shadow .5s}.n2_slider_box:HOVER,.n2_slider_box.n2_slider_box--context-menu{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_slider_box.n2_slider_box--selected{box-shadow:0 0 0 5px #1d81f9;transition:box-shadow 0s}.n2_slider_box.n2-ui-sortable-helper{opacity:.8}.n2_slider_box__content{position:relative;height:100%;background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slider_box__content .n2_slider_box__icon{background:#1375e9;height:100%;width:100%;position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;flex-flow:column}.n2_slider_box__content .n2_slider_box__icon.n2_slider_box__icon_grey{background:#6b7986}.n2_slider_box__content .n2_slider_box__icon .n2_slider_box__icon_container{color:#fff}.n2_slider_box__content .n2_slider_box__icon .n2_slider_box__icon_text{color:#fff;text-transform:uppercase;font-weight:700;margin-top:12px}.n2_slider_box--group .n2_slider_box__icon{background:#94b2c1}.n2_slider_box--slider{background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slider_box__footer{flex:0 0 auto;padding:15px 10px;background-color:#fff;border-bottom-left-radius:3px;border-bottom-right-radius:3px;display:flex;align-items:center}.n2_slider_box__footer_title{display:block;padding:0 5px;box-sizing:border-box;width:100%;min-height:20px;max-height:60px;overflow:hidden;word-wrap:break-word;cursor:text;font-size:14px;line-height:20px;font-weight:700;color:#325c77}.n2_slider_box__footer_icon{color:#94b2c1;height:16px;margin:0 5px}.n2_slider_box__footer_children_count{flex:0 0 auto;margin-left:auto;height:24px;width:24px;border-radius:12px;background-color:#94b2c1;font-size:12px;line-height:24px;color:#fff;font-weight:700;text-align:center}.n2_slider_box__slider_overlay{display:none;z-index:10;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(32,41,52,.9);border-top-left-radius:3px;border-top-right-radius:3px;justify-content:center;align-items:center}.n2_slider_box:HOVER .n2_slider_box__slider_overlay,.n2_slider_box--context-menu .n2_slider_box__slider_overlay{display:flex}.n2_slider_box__slider_overlay_link{z-index:1;position:absolute;display:block;width:100%;height:100%}.n2_slider_box__slider_overlay .n2_button{display:inline-block;position:relative;z-index:2;max-width:120px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slider_box__slider_select_tick{z-index:2;position:absolute;left:8px;top:8px;box-sizing:border-box;width:20px;height:20px;border-radius:3px;border:2px solid #6b7986;cursor:pointer;font-size:16px;line-height:16px;color:#fff}.n2_slider_box__slider_select_tick .ssi_16{display:none}.n2_slider_box__slider_identifiers{z-index:9;position:absolute;left:2px;bottom:2px;display:flex}.n2_slider_box__slider_identifier{margin:3px;padding:0 5px;background-color:#6b7986;border-radius:3px;font-size:12px;line-height:2em;color:#fff;text-transform:uppercase}.n2_slider_box__slider_actions{display:none;position:absolute;right:8px;top:8px;z-index:12}.n2_slider_box:HOVER .n2_slider_box__slider_actions,.n2_slider_box--context-menu .n2_slider_box__slider_actions{display:block}.n2_slide_box__screen_reader{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.n2_slider_manager__action_bar_bulk_actions{display:none}.n2_body--bulk-select .n2_slider_manager__action_bar_bulk_actions,.n2_slider_manager__action_bar_bulk_actions.n2_slider_manager__action_bar_bulk_actions--popover-visible{display:block}.n2_body--bulk-select .n2_header__actions{visibility:hidden}.n2_body--bulk-select .n2_slider_box{opacity:.5}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected{opacity:1}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected .n2_slider_box__slider_select_tick{background-color:#1d81f9;border-color:#1d81f9}.n2_body--bulk-select .n2_slider_box.n2_slider_box--bulk-selected .n2_slider_box__slider_select_tick .ssi_16{display:block}.n2_body--bulk-select .n2_slider_box__slider_overlay{display:flex}.n2_body--bulk-select .n2_slider_box__slider_overlay_link,.n2_body--bulk-select .n2_slider_box__slider_overlay_edit_button,.n2_body--bulk-select .n2_slider_box__slider_actions{display:none!important}.n2_slider_manager__paginator{align-items:center;opacity:1;display:grid;grid-template-columns:1fr 1fr 1fr}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item{font-size:14px;color:#325c77}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item--active{display:block}.n2_slider_manager__paginator .n2_slider_manager__paginator_label_item--empty{display:none}.n2_slider_manager__paginator .n2_slider_manager__paginator_label--nosliders .n2_slider_manager__paginator_label_item--active{display:none}.n2_slider_manager__paginator .n2_slider_manager__paginator_label--nosliders .n2_slider_manager__paginator_label_item--empty{display:block}.n2_slider_manager__paginator .n2_slider_manager__paginator_buttons{display:flex;justify-content:center}.n2_slider_manager__paginator .n2_slider_manager__paginator_item{color:#325c77;font-weight:700;display:inline-flex;align-items:center;font-size:14px;line-height:28px;justify-content:center;margin:0 5px}.n2_slider_manager__paginator .n2_slider_manager__paginator_item--active{color:#1375e9}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow{margin:0}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow i{font-size:10px!important}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--prev{transform:rotate(180deg)}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--prev{transform:none}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--next{transform:rotate(180deg)}.n2_slider_manager__paginator .n2_slider_manager__paginator_item_arrow--disabled{visibility:hidden}.n2_slider_manager__paginator .n2_slider_manager__paginator_limiter{text-align:right}html[dir=rtl] .n2_slider_manager__paginator .n2_slider_manager__paginator_limiter{text-align:left}.n2_new_project{min-height:100%;display:flex;flex-flow:column;justify-content:center}.n2_new_project__heading{margin-top:30px;color:#283f4d;font-size:32px;line-height:40px;text-align:center}.n2_new_project__sub_heading{color:#325c77;font-size:14px;line-height:30px;text-align:center}.n2_new_project__boxes{display:flex;justify-content:space-between;margin:40px -30px}.n2_new_project__box{flex:1 1 50%;margin:0 30px;padding:30px 40px;background-color:#fff;border-radius:10px;text-align:center;cursor:pointer}.n2_new_project__box:HOVER{box-shadow:0 2px 10px 0 rgba(0,0,0,.1)}.n2_new_project__box_heading{color:#283f4d;font-size:22px;line-height:40px}.n2_new_project__box_sub_heading{color:#325c77;font-size:14px;line-height:24px}.n2_new_project__import{display:block;margin:0 auto 20px;font-size:14px;line-height:30px;text-transform:capitalize}.n2_new_project__import:HOVER{color:#005bc6}.n2_new_project__import,.n2_new_project__import:FOCUS{color:#1375e9}.n2_create_new_project{display:flex;flex-flow:column;max-width:840px;margin:0 auto;box-sizing:border-box;min-height:100%;padding:30px 20px}.n2_create_new_project__heading{color:#283f4d;font-size:32px;line-height:40px;text-align:center}.n2_ss_slider_publish{display:flex}.n2_ss_slider_publish__option{padding:40px 20px;flex:1;display:flex;flex-flow:column;align-items:center}.n2_ss_slider_publish__option img{margin-top:15px;max-width:100%}.n2_ss_slider_publish__option .n2_button{margin-top:15px}.n2_ss_slider_publish__option+.n2_ss_slider_publish__option{border-left:1px solid #e4e9ec}html[dir=rtl] .n2_ss_slider_publish__option+.n2_ss_slider_publish__option{border-left:0;border-right:1px solid #e4e9ec}.n2_ss_slider_publish__option_label{line-height:28px;font-size:18px;color:#283f4d}.n2_ss_slider_publish__option_description{text-align:center;line-height:28px;font-size:14px;color:#325c77}.n2_ss_slider_publish__option_code{margin-top:15px;padding:15px 20px;background-color:#f5e293;border-radius:2px;line-height:20px;font-size:13px;color:#325c77}.n2_ss_slider_publish__related_modules{display:flex;flex-wrap:wrap;margin-top:10px}.n2_ss_slider_publish__related_modules .n2_button{margin:3px}.n2_slider_trash{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;position:relative;display:flex;flex-wrap:wrap;margin-left:5px}html[dir=rtl] .n2_slider_trash{margin-left:0;margin-right:5px}.n2_slider_manager__dummy_slider{display:none;background:#f0f4f7;border:2px dashed #94b2c1;flex-flow:column;justify-content:center;align-items:center;box-sizing:border-box}.n2_slider_trash--empty .n2_slider_manager__dummy_slider{display:flex}.n2_slider_manager__dummy_slider_icon{margin:16px 0;color:#94b2c1}.n2_slider_manager__dummy_slider_label{font-size:14px;line-height:22px;color:#325c77;font-weight:700}.n2_slide_manager{position:relative;z-index:1100;font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;margin:0 -1px}.n2_slide_manager[data-breadcrumbopener="1"]{display:none}.n2_admin_editor_overlay--show-slides .n2_slide_manager[data-breadcrumbopener="1"]{display:flex;flex-flow:column}.n2_slide_manager__inner{background-color:#2c3a45}.n2_slide_manager__exit{flex:1 1 auto;background:rgba(28,41,51,.5);cursor:pointer}.n2_slide_manager__action_bar{position:relative;z-index:3;padding:5px 35px;height:30px;margin-bottom:-40px}.n2_slide_manager__content{position:relative;display:flex;flex-wrap:wrap;padding:30px 30px}.n2_slide_manager__box{position:relative;box-sizing:border-box;flex:0 0 auto;width:200px;height:135px;border-radius:3px;margin:10px;background:#0c1924}.n2_slide_manager__sortable_placeholder{height:135px;margin:5px 0;width:0;box-shadow:0 0 0 2px #1d81f9}.n2_slide_manager__action_bar .n2_button_plain,.n2_slide_manager__action_bar .n2_button_plain:HOVER,.n2_slide_manager__action_bar .n2_button_plain:FOCUS{color:#bdcfd9}.n2_slide_manager__action_bar_bulk_actions{display:none}.n2_slide_manager--bulk-select .n2_slide_manager__action_bar_bulk_actions,.n2_slide_manager__action_bar_bulk_actions .n2_slide_manager__action_bar_bulk_actions--popover-visible{display:block}.n2_slide_manager--bulk-select .n2_slide_box{opacity:.5}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected{opacity:1}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected .n2_slide_box__slide_select_tick{background-color:#1d81f9;border-color:#1d81f9}.n2_slide_manager--bulk-select .n2_slide_box.n2_slide_box--bulk-selected .n2_slide_box__slide_select_tick .ssi_16{display:block}.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay{display:flex}.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay_link,.n2_slide_manager--bulk-select .n2_slide_box__slide_overlay_edit_button,.n2_slide_manager--bulk-select .n2_slide_box__slide_actions{display:none!important}.n2_slide_manager__add_slide{background-color:#04c018;padding:16px 0;display:flex;flex-flow:column;justify-content:center;align-items:center;color:#fff;cursor:pointer}.n2_slide_manager__add_slide:HOVER{background-color:#07ca1c}.n2_slide_manager__add_slide_icon{font-size:48px;margin:16px 0}.n2_slide_manager__add_slide_label{font-size:14px;line-height:22px;font-weight:700;text-transform:uppercase;max-width:160px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_manager__add_slide_label--close{display:none}.n2_slide_manager--add-slide .n2_slide_manager__add_slide{background-color:#6b7986}.n2_slide_manager--add-slide .n2_slide_manager__add_slide:HOVER{background-color:#8694a2}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_icon{transform:rotateZ(45deg)}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_label--add-slide{display:none}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_label--close{display:block}.n2_slide_manager__add_slide_actions{overflow:hidden;height:0;transition:height .4s}.n2_slide_manager--add-slide .n2_slide_manager__add_slide_actions{height:150px}.n2_slide_manager__add_slide_actions_inner{display:flex;padding:10px 30px}.n2_slide_manager__add_slide_action{display:flex;flex-flow:column;align-items:center;justify-content:center;margin:10px;width:140px;height:110px;box-sizing:border-box;padding:14px 0;border-radius:3px}.n2_slide_manager__add_slide_action,.n2_slide_manager__add_slide_action:HOVER,.n2_slide_manager__add_slide_action:FOCUS{color:#bdcfd9}.n2_slide_manager__add_slide_action:not(:first-child):HOVER{color:#fff}.n2_slide_manager__add_slide_action--image{background-color:#04c018}.n2_slide_manager__add_slide_action--image:HOVER{background-color:#07ca1c}.n2_slide_manager__add_slide_action--image,.n2_slide_manager__add_slide_action--image:HOVER,.n2_slide_manager__add_slide_action--image:FOCUS{color:#fff}.n2_slide_manager__add_slide_action_icon{padding:4px 0;font-size:48px;display:flex}.n2_slide_manager__add_slide_action_label{font-size:14px;line-height:26px;font-weight:700;text-transform:capitalize;max-width:120px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_manager__dummy_slide{display:none;background-color:#2c3a45;border:2px dashed #bdcfd9;padding:16px 0;flex-flow:column;justify-content:center;align-items:center;color:#bdcfd9;cursor:pointer}html[data-slides="0"] .n2_slide_manager__dummy_slide{display:flex}.n2_slide_manager__dummy_slide_icon{margin:16px 0}.n2_slide_manager__dummy_slide_label{font-size:14px;line-height:22px}.n2_slide_box{position:relative;opacity:.5;display:flex;flex-flow:column;transition:opacity .6s}.n2_slide_box.n2_slide_box--published{opacity:1}.n2_slide_box--currently-edited{box-shadow:0 0 0 3px #1d81f9}.n2_slide_box--just-added{opacity:0}.n2_slide_box__content{position:relative;height:100%;border-top-left-radius:3px;border-top-right-radius:3px;background-size:cover;background-position:50% 0;background-repeat:no-repeat}.n2_slide_box__footer{flex:0 0 auto;padding:9px 10px;background-color:#0c1924;border-bottom-left-radius:3px;border-bottom-right-radius:3px;display:flex;align-items:center}.n2_slide_box__footer_title{display:block;padding:0 5px;box-sizing:border-box;width:100%;min-height:20px;max-height:60px;overflow:hidden;word-wrap:break-word;cursor:text;font-size:14px;line-height:20px;font-weight:700;color:#bdcfd9}.n2_slide_box__footer_status{margin-left:auto;display:flex;align-items:center}.n2_slide_box__footer_status>*{display:flex;padding:3px}.n2_slide_box__footer_status_first_slide{display:none;color:#e19f21}.n2_slide_box--first-slide .n2_slide_box__footer_status_first_slide{display:flex}.n2_slide_box__footer_status_published{display:none}.n2_slide_box--published .n2_slide_box__footer_status_published{display:flex}.n2_slide_box__footer_status_published,.n2_slide_box__footer_status_published:HOVER,.n2_slide_box__footer_status_published:FOCUS{color:#04c018}.n2_slide_box--published .n2_slide_box__footer_status_unpublished{display:none}.n2_slide_box__footer_status_unpublished,.n2_slide_box__footer_status_unpublished:HOVER,.n2_slide_box__footer_status_unpublished:FOCUS{color:#bdcfd9}.n2_slide_box__footer_status_hidden{display:none}.n2_slide_box__footer_status_hidden:not([data-n2tip=""]){display:flex}.n2_slide_box__footer_status_hidden,.n2_slide_box__footer_status_hidden:HOVER,.n2_slide_box__footer_status_hidden:FOCUS{color:#bdcfd9}.n2_slide_box__slide_overlay{display:none;z-index:2;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(32,41,52,.9);border-top-left-radius:3px;border-top-right-radius:3px;justify-content:center;align-items:center}.n2_slide_box:HOVER .n2_slide_box__slide_overlay,.n2_slide_box--context-menu .n2_slide_box__slide_overlay{display:flex}.n2_slide_box__slide_overlay_link{z-index:1;position:absolute;display:block;width:100%;height:100%}.n2_slide_box__slide_overlay_edit_button{position:relative;z-index:2;padding:0 10px;line-height:28px;border-radius:2px;background-color:#04c018;font-size:11px;text-transform:uppercase;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_slide_box__slide_overlay_edit_button:HOVER{background-color:#07ca1c}.n2_slide_box__slide_overlay_edit_button,.n2_slide_box__slide_overlay_edit_button:HOVER,.n2_slide_box__slide_overlay_edit_button:FOCUS{color:#fff}.n2_slide_box--currently-edited .n2_slide_box__slide_overlay_link,.n2_slide_box--currently-edited .n2_slide_box__slide_overlay_edit_button{display:none}.n2_slide_box__slide_select_tick{z-index:2;position:absolute;left:8px;top:8px;box-sizing:border-box;width:20px;height:20px;border-radius:3px;border:2px solid #6b7986;cursor:pointer;font-size:16px;line-height:16px;color:#fff}.n2_slide_box__slide_select_tick .ssi_16{display:none}html[dir=rtl] .n2_slide_box__slide_select_tick{right:8px;left:auto}.n2_slide_box__slide_actions{display:none;position:absolute;right:8px;top:8px;z-index:12}.n2_slide_box:HOVER .n2_slide_box__slide_actions,.n2_slide_box--context-menu .n2_slide_box__slide_actions{display:block}html[dir=rtl] .n2_slide_box__slide_actions{left:8px;right:auto}.n2_slide_box__details{z-index:1;position:absolute;left:5px;bottom:5px;display:flex;flex-flow:column}.n2_slide_box__details>*{margin:5px;padding:0 3px;background-color:#6b7986;border-radius:3px;font-size:11px;line-height:2em;color:#fff}.n2_slide_box__details_static_slide{text-transform:uppercase}.n2_slide_manager__block_notice{background-color:#0c1924;display:flex;align-items:center;justify-content:center;text-align:center;flex-flow:column}html[data-slides="0"] .n2_slide_manager__block_notice,html[data-slides="1"] .n2_slide_manager__block_notice{display:none}.n2_slide_manager__block_notice_description{margin-bottom:10px}.n2_slide_manager__block_notice_button{background:#1375e9;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;font-weight:700;cursor:pointer}.n2_slide_manager__block_notice_button:HOVER{background-color:#005bc6}.n2_slide_manager__block_notice_button,.n2_slide_manager__block_notice_button:HOVER,.n2_slide_manager__block_notice_button:FOCUS{color:#fff}.n2_slide_manager__autoplay_notice{background-color:#0c1924;align-items:center;justify-content:center;text-align:center;flex-flow:column;display:none}html[data-published-regular-slides="1"] .n2_slide_manager__autoplay_notice{display:flex}.n2_slide_manager__autoplay_notice_description{margin-bottom:10px}.n2_slide_manager__autoplay_notice_button{background:#1375e9;line-height:30px;border-radius:3px;padding:0 10px;font-size:11px;text-transform:uppercase;font-weight:700;cursor:pointer}.n2_slide_manager__autoplay_notice_button:HOVER{background-color:#005bc6}.n2_slide_manager__autoplay_notice_button,.n2_slide_manager__autoplay_notice_button:HOVER,.n2_slide_manager__autoplay_notice_button:FOCUS{color:#fff}.n2_nav_bar__breadcrumb_button_slides{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.n2_nav_bar__breadcrumb_button_slides .ssi_16{display:inline-block;vertical-align:middle}.n2_admin_editor_overlay--show-slides .n2_nav_bar__breadcrumb_button_slides span .ssi_16{transform:rotateZ(180deg)}.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides,.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:HOVER,.n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:FOCUS{color:#94b2c1}.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides,.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:HOVER,.n2_admin_editor_overlay--show-slides .n2_breadcrumbs__breadcrumb--active .n2_nav_bar__breadcrumb_button_slides:FOCUS{color:#fff}.n2_ss_history_action{opacity:.5}.n2_ss_history_action--allowed{opacity:1}#n2-admin[data-slide-background-type=image] .n2_form__table_row[data-field=table-row-background-video]{display:none}#n2-admin[data-slide-background-type=color] .n2_form__table_row[data-field=table-row-background-video],#n2-admin[data-slide-background-type=color] .n2_form__table_row[data-field=table-row-background-image],#n2-admin[data-slide-background-type=color] .n2_field[data-field=slidebackgroundColorOverlay]{display:none}.n2_admin_editor_overlay__middle{flex:1 1 auto;display:flex}[dir=rtl] .n2_admin_editor_overlay__middle{flex-flow:row-reverse}.n2_admin_editor_overlay__middle_center{position:relative;flex:1 1 auto;overflow:hidden}.n2_add_layer{visibility:visible;flex:0 0 auto;position:relative;display:flex;width:50px;z-index:10}.n2_add_layer__bar{position:relative;width:100%;height:100%;background-color:#0c1924;overflow:hidden}.n2_add_layer__bar .n2_button_plain_icon,.n2_add_layer__bar .n2_button_plain_icon:HOVER,.n2_add_layer__bar .n2_button_plain_icon:FOCUS{color:#94b2c1}.n2_add_layer__bar .n2_button_plain_icon--active{background:#1d81f9}.n2_add_layer__bar .n2_button_plain_icon--active,.n2_add_layer__bar .n2_button_plain_icon--active:HOVER,.n2_add_layer__bar .n2_button_plain_icon--active:FOCUS{color:#fff}.n2_add_layer__bar .n2_timeline_control_play_pause--playing{background:#1d81f9}.n2_add_layer__bar .n2_timeline_control_play_pause--playing,.n2_add_layer__bar .n2_timeline_control_play_pause--playing:HOVER,.n2_add_layer__bar .n2_timeline_control_play_pause--playing:FOCUS{color:#fff}.n2_add_layer__bar .n2_timeline_control_play_pause--playing .ssi_24::before{content:"\E16D"}.n2_add_layer__bar_top,.n2_add_layer__bar_bottom{background-color:#0c1924;position:absolute;left:0;display:flex;flex-flow:column;align-items:center;padding:0 10px}.n2_add_layer__bar_top{top:0}.n2_add_layer__bar_top>*{margin-bottom:14px}.n2_add_layer__bar_bottom{bottom:0}.n2_add_layer__bar_bottom>*{margin-bottom:14px}.n2_add_layer__bar_button{flex:0 0 auto;border-radius:2px}.n2_add_layer__more{display:none;flex-flow:column;position:absolute;left:0;top:0;width:330px;height:100%;background-color:#2c3a45}.n2_admin_editor_overlay--show-add-more .n2_add_layer__more{display:flex}.n2_add_layer__more_tab_buttons{flex:0 0 auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer__more_tab_button{flex:1 1 0;display:flex;align-items:center;flex-flow:column;padding:14px 0 6px;text-align:center;cursor:pointer;background-color:#0c1924;color:#94b2c1}.n2_add_layer__more_tab_button--active{background-color:#1d81f9;color:#fff}.n2_add_layer__more_tab_button_icon{display:flex;align-items:center;justify-content:center}.n2_add_layer__more_tab_button_label{font-size:11px;line-height:26px;text-transform:uppercase;font-weight:700;max-width:145px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer__more_tab{display:none;flex-flow:column;flex:1 1 auto;overflow:hidden}.n2_add_layer__more_tab--active{display:flex}.n2_add_layer__more_layers{flex:1 1 auto;overflow-y:auto}.n2_add_layer_group{margin-bottom:10px}.n2_add_layer_group__label{padding:8px 20px;background-color:#1c2933;border-bottom:1px solid #131c23;color:#94b2c1;font-size:12px;line-height:28px;font-weight:700;text-transform:uppercase;margin-bottom:10px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer_group__content{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px;padding:0 10px}.n2_add_layer_box{padding:6px 8px;background-color:#6b7986;border-radius:2px;text-align:center;cursor:pointer}.n2_add_layer_box.n2-ss-layer--drag{pointer-events:none;width:90px;opacity:.8;z-index:9999;margin:0}.n2_add_layer_box__icon{display:flex;align-items:center;justify-content:center;margin-top:4px;color:#fff}.n2_add_layer_box__label_wrap{display:flex;flex-flow:column;justify-content:center;min-height:32px}.n2_add_layer_box__label{font-size:12px;line-height:14px;color:#fff;font-weight:700;text-transform:capitalize}.n2_add_layer__more_position{flex:0 0 auto;display:flex;align-items:center;height:50px;background-color:#0c1924;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer_position__label{flex:1 1 50%;padding:0 5px;color:#94b2c1;font-size:12px;line-height:24px;font-weight:700;text-transform:uppercase;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_add_layer_position__default_label{text-align:right}.n2_add_layer_position[data-position=default] .n2_add_layer_position__default_label{color:#fff;cursor:initial}html[dir=rtl] .n2_add_layer_position__default_label{text-align:left}.n2_add_layer_position__absolute_label{text-align:left}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__absolute_label{color:#fff;cursor:initial}html[dir=rtl] .n2_add_layer_position__absolute_label{text-align:right}.n2_add_layer_position__switch{padding:3px;width:44px;height:24px;box-sizing:border-box;background-color:#1d81f9;border-radius:12px;cursor:pointer;transition:background-color .3s}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch{background-color:#5f39c2}.n2_add_layer_position__switch_dot{width:18px;height:18px;background-color:#fff;border-radius:18px;box-shadow:0 0 0 1px rgba(0,0,0,.1);transition:transform .3s}.n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch_dot{transform:translateX(20px)}html[dir=rtl] .n2_add_layer_position[data-position=absolute] .n2_add_layer_position__switch_dot{transform:translateX(-20px)}.n2_add_layer_library__title,.n2_add_layer_library_tag__title{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_add_layer_library__title_label,.n2_add_layer_library_tag__title_label{padding:0 10px;flex:1 1 auto;color:#94b2c1;font-size:12px;line-height:30px;font-weight:700;text-transform:uppercase}.n2_add_layer_library__theme{display:none;position:relative;overflow-y:scroll;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_add_layer_library__theme--active{display:block}.n2_add_layer_library_tag__title{cursor:pointer}.n2_add_layer_library_tag__title_opener{display:flex;align-items:center;justify-content:center;width:30px;color:#94b2c1}.n2_add_layer_library_tag--active .n2_add_layer_library_tag__title_opener{transform:rotateZ(180deg)}.n2_add_layer_library_tag__sections{flex-flow:column;align-items:center;padding:10px 0}.n2_add_layer_library_tag .n2_add_layer_library_tag__sections{display:none}.n2_add_layer_library_tag--active .n2_add_layer_library_tag__sections{display:flex}.n2_add_layer_library_tag__section{position:relative;margin:10px 0;width:270px;border-radius:3px;overflow:hidden}.n2_add_layer_library_tag__section img{display:block;width:100%}.n2_add_layer_library_tag__section--available{cursor:pointer}.n2_add_layer_library_tag__section_pro{z-index:10;position:absolute;top:5px;right:5px;padding:0 5px;background-color:#6b7986;border-radius:3px;font-size:12px;line-height:2em;color:#fff}.n2_add_layer_library_tag__section_overlay{display:none;z-index:9;position:absolute;left:0;top:0;width:100%;height:100%;padding:0 40px;box-sizing:border-box;background:rgba(12,25,36,.9);align-items:center;color:#94b2c1;font-size:14px;line-height:22px;text-align:center}.n2_add_layer_library_tag__section_overlay a,.n2_add_layer_library_tag__section_overlay a:HOVER,.n2_add_layer_library_tag__section_overlay a:FOCUS{color:#1d81f9}.n2_add_layer_library_tag__section:HOVER .n2_add_layer_library_tag__section_overlay{display:flex}.n2_ss_layer_window{visibility:visible;z-index:5;position:absolute!important;left:100px;top:100px;display:none;flex-flow:column;width:355px}.n2_body--layer-window-visible .n2_ss_layer_window{display:flex}.n2_body--show-add-more .n2_ss_layer_window,.n2_body--drag-layer .n2_ss_layer_window,.n2_body--resize-absolute .n2_ss_layer_window,.n2_body--resize-editor .n2_ss_layer_window{display:none}.n2_ss_layer_window__resize{flex:0 0 auto;position:static!important;height:7px;width:100%;cursor:ns-resize;background-color:#0c1924;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.n2_ss_layer_window__crop{flex:1 1 auto;display:flex;flex-flow:column;position:relative;width:100%;border-top-left-radius:3px;border-top-right-radius:3px;box-shadow:0 1px 10px 0 rgba(0,0,0,.3);overflow:hidden;background-color:#0c1924;z-index:2}.n2_ss_layer_window__title{flex:0 0 auto;display:flex;position:relative;line-height:36px;height:36px;overflow:hidden;background-color:#0c1924;font-size:14px;color:#94b2c1;cursor:move;border-top-left-radius:5px;border-top-right-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_ss_layer_window__title_nav a{display:block;width:36px;height:36px;text-align:center}.n2_ss_layer_window__title_nav_button{margin:6px;display:inline-flex;width:24px;height:24px;align-items:center;justify-content:center;border-radius:2px;cursor:pointer;color:#94b2c1}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__title_nav_button_layer_list{background-color:#1d81f9;color:#fff}.n2_ss_layer_window__title_inner{flex:1 1 auto;padding:0 20px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700}.n2_ss_layer_window__tab_buttons{flex:0 0 auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_ss_layer_window__tab_buttons[data-visible-tabs="1"]{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__tab_buttons{display:none}.n2_ss_layer_window__tab_button{display:none;flex:1 1 0;width:33%;flex-flow:column;align-items:center;padding:11px 0 2px;cursor:pointer;background-color:#0c1924;color:#94b2c1}.n2_ss_layer_window__tab_button_icon{display:flex;align-items:center;justify-content:center}.n2_ss_layer_window__tab_button_label{font-size:11px;line-height:23px;text-transform:uppercase;font-weight:700;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_ss_layer_window__tab_button--allowed{display:flex}.n2_ss_layer_window__tab_button--allowed.n2_ss_layer_window__tab_button--active{background-color:#1d81f9;color:#fff}.n2_ss_layer_window__tab_container{position:relative;flex:1 1 auto;overflow-x:hidden;overflow-y:scroll;background-color:#3a4956}.n2_admin_editor_overlay--attached-layer-list .n2_ss_layer_window__tab_container{display:none}.n2_ss_layer_window__tab{display:none;color:#fff}.n2_ss_layer_window__tab[data-tab=item]>*{display:none}.n2_ss_layer_window__tab--allowed.n2_ss_layer_window__tab--active{display:block}.n2_ss_layer_window__tab_panel{display:none}.n2_ss_layer_window__tab_panel--active{display:block}.n2_ss_layer_window [data-generator-related="1"]{display:none}.n2_ss_body--dynamic-slide .n2_ss_layer_window [data-generator-related="1"]{display:block}body[data-device=desktopPortrait] .n2_field[data-field=layer-clear-device-specific-changes],body[data-device=desktopPortrait] .n2_field[data-field=layer-slide-clear-device-specific-changes]{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_title{display:none}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation{flex:1 1 auto;width:100%!important;height:auto!important;max-height:none;overflow:auto}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list{width:100%;overflow-y:auto!important}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_layers{padding-bottom:0!important}.n2_admin_editor_overlay--attached-layer-list .n2_layer_navigation_list_layer__title{border-right:0}.n2_admin_editor_overlay--attached-layer-list .n2_timeline{width:0;overflow:hidden}.n2_fields_layer_window__title_fields .n2_form__table_label_field:last-child{margin-right:0}.n2_fields_layer_window[data-fieldset-type=style-mode][data-state=""] .n2_form__table_label_field[data-style-mode-feature=reset-to-normal]{display:none}.n2_ss_design_layer_window_design{display:none}.n2_ss_design_layer_window_design--visible{display:block}.n2_layer_window_design_preset{display:flex;padding:7px 10px;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_layer_window_design_preset__label_container{flex:1 1 auto;display:inline-flex;align-items:center;height:30px}.n2_layer_window_design_preset__label_container .ssi_16--info{margin:0 5px;color:#94b2c1}.n2_layer_window_design_preset__label{font-size:12px;font-weight:700;text-transform:uppercase;color:#94b2c1;max-width:160px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_design_preset__fields{display:flex}.n2_layer_window_design_preset__presets{display:none}.n2_layer_window_design_preset__button_choose{display:inline-flex;vertical-align:top;width:30px;height:30px;background-color:#04c018;border-radius:2px;align-items:center;justify-content:center;font-size:16px}.n2_layer_window_design_preset__button_choose:HOVER{background-color:#07ca1c}.n2_layer_window_design_preset__button_choose,.n2_layer_window_design_preset__button_choose:HOVER,.n2_layer_window_design_preset__button_choose:FOCUS{color:#fff}.n2_layer_window_design_preset__button_back{display:none;vertical-align:top;width:30px;height:30px;background-color:#6b7986;border-radius:2px;align-items:center;justify-content:center;font-size:16px}.n2_layer_window_design_preset__button_back:HOVER{background-color:#8694a2}.n2_layer_window_design_preset__button_back,.n2_layer_window_design_preset__button_back:HOVER,.n2_layer_window_design_preset__button_back:FOCUS{color:#fff}.n2_layer_window_design_preset__fields_secondary{display:inline-flex;vertical-align:top;margin:0 10px}.n2_layer_window_design_preset__button_secondary{display:inline-flex;vertical-align:top;width:30px;height:30px;font-size:16px;align-items:center;justify-content:center}.n2_layer_window_design_preset__button_secondary,.n2_layer_window_design_preset__button_secondary:HOVER,.n2_layer_window_design_preset__button_secondary:FOCUS{color:#94b2c1}.n2_ss_layer_window--show-presets .n2_ss_layer_window__tab_panel:not([data-panel=item]){display:none}.n2_ss_layer_window--show-presets .n2_ss_design_layer_window_design .n2_fields_layer_window{display:none}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__fields_secondary,.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__button_choose{display:none}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__button_back{display:inline-flex}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset{position:-webkit-sticky;position:sticky;top:0}.n2_ss_layer_window--show-presets .n2_layer_window_design_preset__presets{display:block}.n2_fields_layer_window[data-fieldset-type=design][data-state="0"] .n2_form__table_label_field[data-design-feature=reset-to-normal]{display:none}.n2_fields_layer_window[data-fieldset-type=design][data-elements="0"]{display:none}.n2_fields_layer_window[data-fieldset-type=design][data-elements="1"] [data-design-feature=element]{display:none}.n2_layer_window_design_preset__preset_list_preset{display:flex;padding:5px 10px;background-color:#2c3a45;border-bottom:1px solid #131c23;cursor:pointer}.n2_layer_window_design_preset__preset_list_preset span{font-size:12px;line-height:30px;margin-right:auto;color:#bdcfd9}html[dir=rtl] .n2_layer_window_design_preset__preset_list_preset span{margin-right:0;margin-left:auto}.n2_layer_window_design_preset__preset_list_preset_buttons{display:inline-flex}.n2_layer_window_design_preset__preset_list_preset_button{display:inline-flex;vertical-align:top;width:30px;height:30px;font-size:16px;align-items:center;justify-content:center;cursor:pointer;color:#94b2c1}.n2_container_animation__buttons{display:flex;align-items:center;padding:8px 10px;background-color:#0c1924}.n2_container_animation__button{flex:1 1 0;padding:6px 5px;color:#94b2c1;font-size:12px;line-height:16px;border-radius:14px;text-align:center;text-transform:uppercase;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_container_animation__button--active{background-color:#1d81f9;color:#fff}.n2_container_animation__tab{display:none}.n2_container_animation__tab--active{display:block}.n2_layer_window_animations_presets__buttons{display:grid;grid-template-columns:repeat(4,1fr);grid-gap:10px;padding:10px;background-color:#3a4956}.n2_layer_window_animations_presets__button{padding:10px 8px 5px;border-radius:3px;background-color:#6b7986;color:#fff;text-align:center;cursor:pointer}.n2_layer_window_animations_presets__button .ssi_24{margin-bottom:5px;display:block}.n2_layer_window_animations_presets__button--active{background-color:#1d81f9}.n2_layer_window_animations_presets__button_label{font-size:12px;line-height:20px;max-width:56px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_animations_presets__presets{display:none}.n2_layer_window_animations_presets__presets--active{display:block}.n2_layer_window_animations_presets__preset{padding:10px 20px;background-color:#2c3a45;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:20px;cursor:pointer;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-in],.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-loop],.n2_layer_window_animations_editor .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-out]{display:none}.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-in],.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-loop],.n2_layer_window_animations_editor--settings .n2_fields_layer_window[data-field=fieldset-layer-window-layer-animation-basic-form-out]{display:block}.n2_layer_window_animations_editor__title{display:flex;padding:7px 0;background-color:#1c2933;border-bottom:1px solid #131c23}.n2_layer_window_animations_editor__label{flex:1 1 auto;font-size:12px;line-height:30px;color:#94b2c1}.n2_layer_window_animations_editor__title_left{padding:0 10px}.n2_layer_window_animations_editor__button_play{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;background-color:#6b7986;font-size:16px;color:#fff;cursor:pointer}.n2_layer_window_animations_editor__button_play--active{background-color:#1d81f9}.n2_layer_window_animations_editor__button_play--active .ssi_16::before{content:"\E607"}.n2_layer_window_animations_editor__title_right{padding:0 5px}.n2_layer_window_animations_editor__button_settings{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor__button_settings--active{background-color:#1d81f9;color:#fff}.n2_layer_window_animations_editor__button_delete{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor_basic{position:relative}.n2_layer_window_animations_editor_basic__keyframe.n2-ui-sortable-helper{width:100%;opacity:.5}.n2_layer_window_animations_editor_basic__keyframe--sort .n2_fields_layer_window{display:none}.n2_layer_window_animations_editor_basic__keyframe_title{display:flex;padding:5px 0;background-color:#2c3a45;border-bottom:1px solid #1e2830;color:#94b2c1;font-size:12px;line-height:30px;cursor:pointer}.n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_title{background-color:#1d81f9;color:#fff}.n2_layer_window_animations_editor_basic--single-keyframe .n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_title{background-color:#2c3a45;color:#94b2c1;cursor:initial}.n2_layer_window_animations_editor_basic__keyframe_label{flex:1 1 auto;padding:0 20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.n2_layer_window_animations_editor_basic__keyframe_delete{margin:0 5px;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:2px;font-size:16px;color:#94b2c1;cursor:pointer}.n2_layer_window_animations_editor_basic__keyframe--active .n2_layer_window_animations_editor_basic__keyframe_delete{color:#fff}.n2_layer_window_animations_editor_basic--single-keyframe .n2_layer_window_animations_editor_basic__keyframe_delete{display:none}.n2_layer_window_animations_editor_basic__add_keyframe{display:flex;justify-content:center;padding:10px 0}.n2_layer_window_animations_editor_basic__button_add_keyframe{padding:0 10px;background-color:#6b7986;border-radius:3px;font-size:11px;line-height:30px;text-transform:uppercase;color:#fff;cursor:pointer}.n2_layer_window_animations_editor_basic__button_add_keyframe:HOVER{background-color:#8694a2}[data-devicespecific]{position:relative}#n2-ss-devicespecific-settings{position:absolute;bottom:40px;left:0;margin:0 10px;white-space:nowrap;z-index:2;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:0;border-radius:3px;overflow:hidden;background:#a1aeb5}html[dir=rtl] #n2-ss-devicespecific-settings{left:auto;right:0}#n2-ss-devicespecific-settings *{cursor:pointer;background:#a1aeb5;display:inline-block;width:20px;height:20px;padding:5px;line-height:20px;text-align:center;font-size:16px;color:#fff}body[data-device=desktopPortrait] #n2-ss-devicespecific-settings .ssi_16--desktopportrait,body[data-device=desktopLandscape] #n2-ss-devicespecific-settings .ssi_16--desktoplandscape,body[data-device=tabletPortrait] #n2-ss-devicespecific-settings .ssi_16--tabletportrait,body[data-device=tabletLandscape] #n2-ss-devicespecific-settings .ssi_16--tabletportraitlarge,body[data-device=mobilePortrait] #n2-ss-devicespecific-settings .ssi_16--mobileportrait,body[data-device=mobileLandscape] #n2-ss-devicespecific-settings .ssi_16--mobileportraitlarge{background:#1d81f9}[data-placement=absolute] [data-placement]:not([data-placement=absolute]):not([data-placement=all]),[data-placement=content] [data-placement]:not([data-placement=content]):not([data-placement=all]),[data-placement=normal] [data-placement]:not([data-placement=normal]):not([data-placement=all]),[data-placement=default] [data-placement]:not([data-placement=default]):not([data-placement=all]),[data-placement=""] [data-placement]{display:none!important}.n2_layer_navigation{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;visibility:visible;display:flex;overflow:hidden;max-height:0;z-index:2}.n2_admin_editor_overlay--show-layer-navigation:not(.n2_admin_editor_overlay--show-add-more) .n2_layer_navigation{max-height:none;overflow:auto}.n2_layer_navigation_list{position:relative;width:340px;flex:0 0 auto;overflow-y:auto;overflow-x:hidden;background-color:#1c2933}.n2_layer_navigation--has_timeline .n2_layer_navigation_list{overflow:hidden}.n2_layer_navigation_list_title{position:-webkit-sticky;position:sticky;top:0;z-index:2;display:flex;align-items:center;background-color:#0c1924;height:48px}.n2_layer_navigation_list_title__hide{position:relative;z-index:2;margin:10px;display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background-color:#1d81f9;border-radius:2px;cursor:pointer;color:#fff;font-size:16px}.n2_layer_navigation_list_title__label{z-index:1;position:absolute;left:0;top:0;width:100%;text-align:center;cursor:ns-resize;font-size:18px;line-height:48px;color:#fff}.n2_layer_navigation_list_layers{position:relative}.n2_layer_navigation_list_layers__sortable_placeholder{position:relative;height:0;z-index:1001;box-shadow:0 0 0 2px #1d81f9}.n2_layer_navigation_list_layer{position:relative}.n2_layer_navigation_list_layer__title{position:relative;display:flex;height:32px;background-color:#1c2933;border-right:1px solid #0c1924;border-bottom:1px solid #0c1924;color:#94b2c1;cursor:pointer}.n2_layer_navigation_list_layer__title[data-rows="2"]{height:64px}.n2_layer_navigation_list_layer__title:HOVER{background-color:#0c1924;border-bottom:1px solid #0c1924}.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title{background-color:#1d81f9;border-color:#1d81f9;color:#fff}.n2_layer_navigation_list_layer--absolute.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title{background-color:#5f39c2;border-color:#5f39c2;color:#fff}.n2_layer_navigation_list_layer--absolute.n2_layer_navigation_list_layer--active>.n2_layer_navigation_list_layer__title .n2_layer_navigation_list_layer__title_label_icon{color:#fff}.n2_layer_navigation_list_layer--drop>.n2_layer_navigation_list_layer__title{background:#0c1924;border-color:#0c1924}.n2_layer_navigation_list_layer__title_label{flex:1 1 auto;display:flex;align-items:center;line-height:32px;padding-left:10px;overflow:hidden}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:20px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:30px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:30px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:40px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:40px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:50px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:50px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:60px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:60px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:70px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:70px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:80px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:80px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:90px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label{padding-left:90px}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layers__sortable_placeholder{margin-left:100px}.n2_layer_navigation_list_layer__title_label_icon{display:inline-flex;align-items:center;justify-content:center;margin:0 3px;width:20px;height:20px;font-size:16px}.n2_layer_navigation_list_layer__title_label_icon[data-action=hide-show]:HOVER .ssi_16::before{content:"\E60F"}.n2_layer_navigation_list_layer__title--hidden>.n2_layer_navigation_list_layer__title_label .n2_layer_navigation_list_layer__title_label_icon .ssi_16::before{content:"\E923"}.n2_layer_navigation_list_layer__title_label_folder{display:inline-flex;align-items:center;justify-content:center;width:12px;height:12px;font-size:16px;cursor:pointer;opacity:.5}.n2_layer_navigation_list_layer__title_label_folder .ssi_16::before{content:"\E19E"}.n2_layer_navigation_list_layer__children .n2_layer_navigation_list_layer__title_label_folder{margin-left:-12px}.n2_layer_navigation_list_layer__title_label_folder:HOVER{opacity:1}.n2_layer_navigation_list_layer--closed .n2_layer_navigation_list_layer__title_label_folder .ssi_16::before{content:"\E19D"}.n2_layer_navigation_list_layer__title_label_text{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px;text-transform:capitalize;font-weight:700}.n2_layer_navigation_list_layer__title_label_text[contenteditable=true]:focus{text-overflow:initial;cursor:initial}.n2_layer_navigation_list_layer__title_label_text::selection{background:rgba(255,255,255,.99);color:#1d81f9}.n2_layer_navigation_list_layer__title_actions{display:flex;align-items:center;padding:0 5px}.n2_layer_navigation_list_layer__title_action{margin:3px;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:16px;cursor:pointer}.n2_layer_navigation_list_layer__title_label_rename{display:inline-flex;align-items:center;justify-content:center;width:12px;height:32px;opacity:.5;cursor:pointer}.n2_layer_navigation_list_layer__title_label_rename:HOVER{opacity:1}.n2_layer_navigation_list_layer__title--hidden .n2_layer_navigation_list_layer__title_action_hide .ssi_16::before{content:"\E923"}.n2_ss_layer_window .n2_layer_navigation_list_layer__title_action--add-animation,.n2_layer_navigation_list_layer__title--has-animations .n2_layer_navigation_list_layer__title_action--add-animation{display:none}.n2_ss_layer_window .n2_layer_navigation_list_layer__title_action--remove-animation,.n2_layer_navigation_list_layer__title:not(.n2_layer_navigation_list_layer__title--has-animations) .n2_layer_navigation_list_layer__title_action--remove-animation{display:none}.n2_layer_navigation_list_layer__title_absolute_marker{margin:2px;width:16px;height:16px;background-color:#5f39c2;border-radius:2px;text-align:center;font-size:12px;line-height:16px;color:#fff;font-weight:700}.n2_layer_navigation_list_layer--sorted{position:absolute;left:0;width:100%;overflow:hidden;opacity:.7}.n2_timeline{position:relative;flex:1 1 auto;overflow:scroll;background:#1c2933}.n2_timeline__inner_pane{display:flex;flex-flow:column}.n2_timeline__inner_pane--calculate-duration{width:auto!important}.n2_timeline__time_frames{position:-webkit-sticky;position:sticky;top:0;z-index:100000;display:flex;height:48px;background-color:#0c1924;padding-left:21px}.n2_timeline__inner_pane--calculate-duration .n2_timeline__time_frames{width:0;overflow:hidden}.n2_timeline__cti{position:absolute;left:-10px;top:3px;z-index:100001;width:0;height:1000%;border-left:1px solid RGBA(230,182,37,.5);margin-left:21px;cursor:ew-resize}.n2_timeline__cti_dot{position:relative;left:-6px;top:0;width:11px;height:11px;border-radius:0 50% 50% 50%;transform:rotate(-135deg);background-color:#e6b625}.n2_timeline__time_frames_overlay{position:absolute;left:0;top:0;width:100%;height:100%;z-index:2;display:flex}.n2_timeline__time_frames_overlay svg{flex:1 1 auto;margin-left:19px;height:48px;color:#3a454e}.n2_timeline__one_second{flex:0 0 auto;position:relative;width:195px;height:100%;padding-left:5px;font-size:12px;line-height:48px;color:#94b2c1}.n2_timeline_layer__animations{display:flex;height:32px;padding-left:20px;background-color:#1c2933;border-bottom:1px solid rgba(0,0,0,.2)}.n2_timeline_layer__animations[data-rows="2"]{height:64px}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation{padding-left:0}.n2_timeline_layer__animations--active{background-color:#0c1924}.n2_timeline_animation_repeat{position:relative;display:none;align-items:center;justify-content:flex-end;line-height:32px;font-size:12px;color:#fff;cursor:ew-resize;padding:0 5px}.n2_timeline_animation_repeat:after{position:absolute;top:50%;margin-top:-5px;display:block;content:'';width:10px;height:10px;border-radius:10px;background-color:rgba(255,255,255,.3)}.n2_timeline_animation_repeat--start{margin-left:-20px;padding:0 20px}.n2_timeline_animation_repeat--start:after{right:5px}.n2_timeline_animation_repeat--end{margin-left:-10px}.n2_timeline_animation_repeat--end:after{right:-15px}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_repeat{display:flex;flex-shrink:0}.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_group,.n2_timeline_layer__animations.n2_timeline_layer__animations--repeated.n2_timeline_layer__animations--has-animation .n2_timeline_animation_repeat--end{background-color:#3a4956}.n2_timeline_animation_group__row{display:flex}.nui_resize_bar__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:90;position:absolute;top:0;width:18px}.nui_resize_bar__handle:after{margin:4px;display:block;content:'';width:10px;height:10px;border-radius:10px;background-color:RGBA(0,0,0,.5)}.nui_resize_bar__handle--e{cursor:e-resize;right:0}.nui_resize_bar__handle--w{cursor:w-resize;left:0}.n2_timeline_animation_bar{position:relative;height:18px;margin:7px 0;border-radius:10px;cursor:ew-resize;z-index:90}.n2_timeline_animation_bar:HOVER{z-index:90}.n2_timeline_animation_bar--in{background-color:#1d81f9}.n2_timeline_animation_bar--loop{background-color:#04c018}.n2_timeline_animation_bar--out{background-color:#6b7986}.n2_timeline_animation_bar--extra{background-color:#6b7986}.n2_timeline_animation_bar__delay{position:absolute;line-height:18px;text-align:right;right:100%;margin-right:5px;font-size:11px;color:#fff}.n2_timeline_animation_bar__delay--small{display:none}.n2_timeline_animation_bar__duration{margin:0 7px;line-height:18px;text-align:center;cursor:ew-resize;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:#fff;text-transform:uppercase}.n2_timeline_layer--closed .n2_timeline_layer__children{display:none}.n2_timeline_overlay_playing{display:none;position:fixed;width:100%;height:100%;left:0;top:0;z-index:9999;cursor:pointer}.n2_body--timeline-preview .n2_timeline_overlay_playing{display:block}.n2_body--timeline-preview .n2_ss_layer_window{display:none!important}.n2_body--timeline-preview #n2-ss-0 .n2-ss-layer{cursor:default}.n2_body--timeline-preview #n2-ss-slide-canvas-container #n2-ss-0 .n2-ss-layer .nui_resize_normal__handle{display:none!important}#n2-ss-0[data-responsive=fullpage]{min-height:0!important}#n2-ss-0{box-shadow:0 3px 10px 0 rgba(0,0,0,.1)}#n2-ss-0 .n2-ss-widget{pointer-events:none;opacity:.5!important}#n2-ss-0-align{margin:0!important}body:not(.n2-ss-slider-visible) #n2-ss-0 .n2-ss-layer{opacity:0!important}.n2_slide_editor_slider{position:relative;z-index:1;display:inline-flex;align-items:flex-start;min-width:100%;min-height:calc(100vh - 60px);padding-bottom:100px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.n2_slide_editor_slider__editor{position:relative}.n2_slide_editor_slider__editor_inner{position:relative;background:#f0f4f7;box-shadow:0 2px 20px rgba(0,0,0,.2)}div#n2-ss-0:HOVER .n2-ss-static-slide:not(.n2-ss-currently-edited-slide){visibility:hidden;z-index:-1}div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=slide],div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=content],div div#n2-ss-0 .n2-ss-static-slide div[data-sstype=content] div.n2-ss-section-main-content{visibility:visible}.n2_ruler{display:none;z-index:1;position:absolute;left:0;top:0;height:100%;width:100%;direction:ltr;overflow:hidden;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html[dir=rtl] .n2_ruler{left:auto;right:0}.n2_body--ruler .n2_ruler{display:block}.n2_ruler_mark{flex:0 0 auto;position:relative;vertical-align:top}.n2_ruler_mark__label{position:absolute;display:block;font-size:9px;color:#325c77;line-height:12px}.n2_ruler--vertical{top:14px;height:calc(100% - 14px)}.n2_ruler--vertical .n2_ruler__inner{width:14px;visibility:visible;position:relative;background:#fff;border-right:1px solid #94b2c1}.n2_ruler--vertical .n2_ruler_mark{width:3px;height:9px;border-top:1px solid #94b2c1}.n2_ruler--vertical .n2_ruler_mark--small{left:11px}.n2_ruler--vertical .n2_ruler_mark--large{width:100%}.n2_ruler--vertical .n2_ruler_mark__label{left:0;top:2px;writing-mode:vertical-rl;-ms-writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;-webkit-text-orientation:upright;text-orientation:upright}.n2_ruler--horizontal{left:14px;width:calc(100% - 14px)}.n2_ruler--horizontal .n2_ruler__inner{visibility:visible;height:14px;position:relative;display:inline-flex;vertical-align:top;flex-wrap:nowrap;direction:ltr;background:#fff;border-bottom:1px solid #94b2c1}.n2_ruler--horizontal .n2_ruler_mark{width:9px;height:3px;border-left:1px solid #94b2c1}.n2_ruler--horizontal .n2_ruler_mark--small{top:11px}.n2_ruler--horizontal .n2_ruler_mark--large{height:100%}.n2_ruler--horizontal .n2_ruler_mark__label{left:2px;top:0}.n2_ruler__guide{visibility:hidden;position:absolute;left:0;top:0;z-index:2}.n2_ruler--vertical .n2_ruler__guide{width:100%;height:0}.n2_ruler--horizontal .n2_ruler__guide{width:0;height:100%}.n2_ruler__guide--measure{z-index:1}.n2_ruler__guide_border{visibility:visible;pointer-events:none}.n2_ruler--vertical .n2_ruler__guide_border{border-bottom:1px solid #ccaa2b;width:100%}.n2_ruler--horizontal .n2_ruler__guide_border{border-right:1px solid #ccaa2b;height:100%}.n2_ruler__guide--measure .n2_ruler__guide_border{border-color:red}.n2_ruler__guide_handle{visibility:visible;position:absolute;left:0;top:0;background:#e6b625;width:9px;height:9px;color:#fff;font-size:9px;line-height:9px;cursor:pointer;display:flex;justify-content:center;align-items:center}.n2_ruler__guide_handle .ssi_16{font-size:9px!important}.n2_ruler--vertical .n2_ruler__guide_handle{top:-4px}.n2_ruler--horizontal .n2_ruler__guide_handle{left:-4px}.n2_ruler_corner{display:block;position:absolute;left:0;top:0;width:14px;height:14px;border-right:1px solid #94b2c1;border-bottom:1px solid #94b2c1;visibility:visible;background:#fff;cursor:pointer}.n2_layer_contextual_hover_layer::after,.n2_layer_context_menu_target::after,.n2_layer_col_highlight::after,.n2_layer_highlight_row_structure::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #6b7986;pointer-events:none}.n2_layer_contextual_hover_layer[data-pm=absolute]::after,.n2_layer_context_menu_target[data-pm=absolute]::after,.n2_layer_col_highlight[data-pm=absolute]::after,.n2_layer_highlight_row_structure[data-pm=absolute]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #5f39c2;pointer-events:none}.n2_layer_contextual_active_layer::after,.nui_resize_absolute--resizing::after,.n2_layer_resize_snap_to::after,.n2_layer_drag__dragging::after,.n2_layer_drag_snap_to::after,.n2_layer_parent_highlight::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #1d81f9;pointer-events:none}.n2_layer_contextual_active_layer[data-pm=absolute]::after,.nui_resize_absolute--resizing[data-pm=absolute]::after,.n2_layer_resize_snap_to[data-pm=absolute]::after,.n2_layer_drag__dragging[data-pm=absolute]::after,.n2_layer_drag_snap_to[data-pm=absolute]::after,.n2_layer_parent_highlight[data-pm=absolute]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #5f39c2;pointer-events:none}.n2_layer_drag__dragging{opacity:.5}.n2_layer_drag_target_groups[data-sstype=content]::after,.n2_layer_drag_target_groups[data-sstype=col]::after{display:block!important;content:'';z-index:10;position:absolute;left:0;top:0;box-sizing:border-box!important;width:100%;height:100%;border:2px solid #6b7986;pointer-events:none}.n2_layer--creation-in-progress,.n2_layer--creation-in-progress *{visibility:hidden!important}.n2_admin_editor__content--hover .n2-ss-layer-content .n2-ss-layer.n2-active{z-index:10}.n2_admin_editor__content--hover .n2-ss-layer.n2-active{overflow:visible!important}.n2-ss-section-main-content{min-height:20px}.n2-ss-layer-row .n2-ss-layer-content{min-height:20px}[data-visibility=hidden],[data-visibility=hidden] *{visibility:hidden!important;transition:none!important}.n2_admin_editor__content--hover .n2-ss-layer.n2-active{z-index:9999999!important}.n2_layer_layer_list_hover--force-zindex{z-index:9999999!important}.n2-ss-layer-placeholder{display:block;position:relative;width:100%;height:0;z-index:11}.n2-ss-layer-placeholder::after{display:block!important;content:'';position:absolute;left:0;top:-3px;box-sizing:border-box!important;width:100%;border:3px solid #1d81f9}.n2_smartguide{background:#4affff;position:absolute;left:0;top:0;z-index:1000000;display:none}.n2_smartguide--horizontal{width:100%;height:1px}.n2_smartguide--vertical{height:100%;width:1px}.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col],.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col] .n2-ss-layer{cursor:pointer}.ui-column-width-handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;position:absolute;top:25%;height:50%;cursor:ew-resize;width:5px;background:#1d81f9;z-index:88;opacity:.5;box-sizing:border-box!important;border-radius:5px}.ui-column-width-handle--visible{display:block}.n2-ss-layer:not(.n2-ss-layer--block)>.n2-ss-layer-row>.ui-column-width-handle,.n2-ss-layer-row[data-row-wrapped="1"]>.ui-column-width-handle{display:none!important}#n2-ss-0 .n2-ss-layer{cursor:not-allowed}#n2-ss-0 .n2-ss-currently-edited-slide .n2-ss-layer{cursor:pointer}div#n2-ss-0 .n2-ss-layer[data-sstype=content] .n2-ss-layer.nui-draggable-dragging,div#n2-ss-0 .n2-ss-layer[data-sstype=col] .n2-ss-layer.nui-draggable-dragging{z-index:100000;outline:0!important}#n2-ss-0 .n2-ss-slide:not(.n2-ss-currently-edited-slide){opacity:.3}.nui_resize_normal__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;z-index:90;display:none;border:2px solid #1d81f9;height:6px;width:6px;background:#fff;border-radius:50px;transform-origin:50% 50%}.nui_resize_normal__handle:HOVER{transform:scale(1.5)}.nui_resize_normal__handle.nui-enabled{display:block}.nui_resize_normal__handle--none{border-color:#6b7986}.nui_resize_normal__handle--e{cursor:e-resize;right:-4px;top:50%;margin-top:-4px}.nui_resize_normal__handle--w{cursor:w-resize;left:-4px;top:50%;margin-top:-4px}.nui_resize_normal__handle--s{cursor:s-resize;bottom:-4px;left:50%;margin-left:-4px}.nui_spacing__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;display:block;z-index:89;background:#1d81f9;overflow:hidden;opacity:0}.nui_spacing__handle.nui-enabled{opacity:.5}.nui_spacing__handle--zero{background:#6b7986}.nui_spacing__handle--negative{background:#be331f}.nui_spacing__handle:HOVER.nui-enabled,.nui_spacing__handle--spacing.nui-enabled{opacity:.8}.nui_spacing__handle--n.nui_spacing__handle.nui-enabled{min-height:5px;cursor:s-resize}.nui_spacing__handle--n.nui_spacing__handle--padding{top:0;margin-left:0;left:25%;width:50%}.nui_spacing__handle--n.nui_spacing__handle--margin{left:0;bottom:100%;width:100%}.nui_spacing__handle--e.nui_spacing__handle.nui-enabled{min-width:5px;cursor:w-resize}.nui_spacing__handle--e.nui_spacing__handle--padding{top:25%;margin-top:0;right:0;height:50%}.nui_spacing__handle--e.nui_spacing__handle--margin{top:0;left:100%;height:100%}.nui_spacing__handle--s.nui_spacing__handle.nui-enabled{min-height:5px;cursor:n-resize}.nui_spacing__handle--s.nui_spacing__handle--padding{bottom:0;margin-left:0;left:25%;width:50%}.nui_spacing__handle--s.nui_spacing__handle--margin{bottom:auto;top:100%;left:0;width:100%}.nui_spacing__handle--w.nui_spacing__handle.nui-enabled{min-width:5px;cursor:e-resize}.nui_spacing__handle--w.nui_spacing__handle--padding{top:25%;margin-top:0;left:0;height:50%}.nui_spacing__handle--w.nui_spacing__handle--margin{left:auto;right:100%;top:0;height:100%}.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>.nui_spacing__handle--margin,.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>.nui_spacing__handle--padding,.n2-ss-layer.n2_layer_contextual_hover_layer:not(.n2-active)>div>.nui_spacing__handle--padding{display:block;min-width:0;min-height:0;background:#6b7986;opacity:.5}#n2-ss-0 .n2-ss-layer{cursor:not-allowed}#n2-ss-0 .n2-ss-currently-edited-slide .n2-ss-layer{cursor:pointer}div#n2-ss-0 .n2-ss-layer[data-sstype=content] .n2-ss-layer.nui-draggable-dragging,div#n2-ss-0 .n2-ss-layer[data-sstype=col] .n2-ss-layer.nui-draggable-dragging{z-index:100000;outline:0!important}.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col],.n2-ss-currently-edited-slide .n2-ss-layer[data-sstype=col] .n2-ss-layer{cursor:pointer}.ui-column-width-handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:none;position:absolute;top:25%;height:50%;cursor:ew-resize;width:5px;background:#1d81f9;z-index:88;opacity:.5;box-sizing:border-box!important;border-radius:5px}.ui-column-width-handle--visible{display:block}.n2-ss-layer:not(.n2-ss-layer--block)>.n2-ss-layer-row>.ui-column-width-handle,.n2-ss-layer-row[data-row-wrapped="1"]>.ui-column-width-handle{display:none!important}.n2-ss-layer-cc,.nui_resize_absolute__handle{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;z-index:90;display:none;border:2px solid #5f39c2;height:6px;width:6px;background:#fff;border-radius:50px;transform-origin:50% 50%}.n2-ss-layer-cc:HOVER,.nui_resize_absolute__handle:HOVER{transform:scale(1.5)}.n2-ss-layer-cc.nui-enabled,.nui_resize_absolute__handle.nui-enabled{display:block}.n2-ss-layer-cc{opacity:0;left:50%;top:50%;margin-top:-5px;margin-left:-5px}.n2-ss-layer-cc:HOVER{opacity:1}.n2-ss-layer[data-align=left][data-valign=top] .nui_resize_absolute__handle--nw,.n2-ss-layer[data-align=left][data-valign=middle] .nui_resize_absolute__handle--w,.n2-ss-layer[data-align=left][data-valign=bottom] .nui_resize_absolute__handle--sw,.n2-ss-layer[data-align=center][data-valign=top] .nui_resize_absolute__handle--n,.n2-ss-layer[data-align=center][data-valign=middle] .n2-ss-layer-cc,.n2-ss-layer[data-align=center][data-valign=bottom] .nui_resize_absolute__handle--s,.n2-ss-layer[data-align=right][data-valign=top] .nui_resize_absolute__handle--ne,.n2-ss-layer[data-align=right][data-valign=middle] .nui_resize_absolute__handle--e,.n2-ss-layer[data-align=right][data-valign=bottom] .nui_resize_absolute__handle--se{background:#5f39c2;opacity:1;border:2px solid #fff}.nui_resize_absolute__handle--e{cursor:e-resize;right:-4px;top:50%;margin-top:-5px}.nui_resize_absolute__handle--w{cursor:w-resize;left:-4px;top:50%;margin-top:-5px}.nui_resize_absolute__handle--n{cursor:n-resize;left:50%;top:-4px;margin-left:-5px}.nui_resize_absolute__handle--ne{cursor:ne-resize;right:-4px;top:-4px}.nui_resize_absolute__handle--nw{cursor:nw-resize;left:-4px;top:-4px}.nui_resize_absolute__handle--s{cursor:s-resize;bottom:-4px;left:50%;margin-left:-5px}.nui_resize_absolute__handle--se{cursor:se-resize;right:-4px;bottom:-4px}.nui_resize_absolute__handle--sw{cursor:sw-resize;left:-4px;bottom:-4px}.n2-ss-item-overlay{display:none;position:absolute;top:0;left:0;width:100%;height:100%}.n2-ss-item-html .n2-ss-item-overlay,.n2-ss-item-iframe .n2-ss-item-overlay{display:block}.n2-ss-item{position:relative;float:left;width:100%}.n2-ss-item-video,.n2-ss-item-youtube,.n2-ss-item-vimeo,.n2-ss-item-area,.n2-ss-item-imagearea{height:100%}.n2_ss_absolute_parent_picker{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;background:#6b7986;border-radius:3px;cursor:pointer;line-height:30px;color:#fff}.n2_ss_absolute_parent_picker .ssi_16::before{content:"\E64D"}.n2_ss_absolute_parent_picker:HOVER{background-color:#8694a2}.n2_ss_absolute_parent_picker--active{background:#1d81f9}.n2_ss_absolute_parent_picker--active .ssi_16::before{content:"\E64B"}.n2_ss_absolute_parent_picker--active:HOVER{background-color:#338ef9}.n2_ss_absolute_parent_picker__overlay{position:absolute;left:0;top:0;width:100%;height:100%;z-index:1000000;box-shadow:inset 0 0 0 1px rgba(0,0,0,.8);cursor:pointer;background:#5f39c2;opacity:.5}.n2_ss_absolute_parent_picker__overlay--tile{width:33%;height:33%}.n2_ss_absolute_parent_picker__overlay:HOVER,.n2_ss_absolute_parent_picker__overlay--selected{opacity:1}.n2_ss_absolute_parent_picker__component--focused{z-index:2147483647!important}.n2_field_generator_data_button{position:absolute;right:-2px;top:-26px;z-index:10;display:inline-flex;align-items:center;padding:0 5px;background-color:#1d81f9;border-radius:3px;color:#fff;cursor:pointer}.n2_field_generator_data_button:HOVER{background-color:#338ef9}.n2_field_generator_data_button_icon{flex:0 0 auto;display:flex;align-items:center;justify-content:center}.n2_field_generator_data_button_label{padding:0 2px;font-size:10px;line-height:22px;font-weight:700;text-transform:uppercase}.n2_layer_contextual{display:none;position:absolute;z-index:8;height:28px;margin-top:-28px}.n2_layer_contextual--hover-section{z-index:7;opacity:.7}.n2_layer_contextual--hover{z-index:9}.n2_layer_contextual--hover.n2_layer_contextual--hover-active{visibility:hidden;pointer-events:none}.n2_layer_contextual--visible{display:inline-flex}.n2_layer_contextual__inner{display:inline-flex;background-color:#1d81f9;border-top-left-radius:3px;border-top-right-radius:3px;line-height:30px;overflow:hidden}.n2_layer_contextual--invert .n2_layer_contextual__inner{border-radius:0 0 3px 3px}.n2_layer_contextual__label{padding:0 6px;font-size:12px;line-height:30px;text-transform:uppercase;color:#fff;cursor:pointer;max-width:100px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.n2_layer_contextual__button{height:28px;padding:0 6px;display:inline-flex;align-items:center;justify-content:center;color:#fff;cursor:pointer}.n2_layer_contextual__button--active{background:#1167cd}.n2_layer_contextual[data-color=purple] .n2_layer_contextual__inner{background-color:#5f39c2}.n2_layer_contextual[data-color=purple] .n2_layer_contextual__button--active{background-color:#4c2d9b}.n2_layer_contextual[data-color=grey] .n2_layer_contextual__inner{background-color:#6b7986}.n2_layer_contextual__button--responsive-tools{display:none}body:not([data-device=desktopPortrait]) .n2_layer_contextual--has-responsive-tools .n2_layer_contextual__button--responsive-tools{display:inline-flex}.n2_layer_contextual_responsive_tools{display:flex;height:30px}.n2_layer_contextual_responsive_tools .ssi_16{display:block;padding:0 5px;color:#94b2c1}.n2_layer_contextual_responsive_tools__hide{padding:7px 0;cursor:pointer}.n2_layer_contextual_responsive_tools__hide .ssi_16::before{content:"\E60F"}.n2_layer_contextual_responsive_tools__hide--hidden .ssi_16::before{content:"\E923"}.n2_layer_contextual_responsive_tools__text_scale{display:flex}.n2_layer_contextual_responsive_tools__text_scale input{margin:0;padding:0;height:30px;line-height:30px;font-size:12px;color:#325c77;text-align:right}.n2_layer_contextual_responsive_tools__text_scale input,.n2_layer_contextual_responsive_tools__text_scale input:FOCUS{box-shadow:none;outline:0;border:0}.n2_layer_contextual_responsive_tools__text_scale input::-webkit-inner-spin-button,.n2_layer_contextual_responsive_tools__text_scale input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.n2_layer_contextual_responsive_tools__text_scale input[type=number]{-moz-appearance:textfield}.n2_layer_contextual_responsive_tools__text_scale .nui-slider{position:relative;background-color:#94b2c1;height:6px;margin:12px 10px;border-radius:10px}.n2_layer_contextual_responsive_tools__text_scale .nui-slider .nui-slider-handle{position:absolute;top:0;z-index:2;width:10px;height:10px;background-color:#fff;border:2px solid #94b2c1;margin:-4px -7px 0;border-radius:50px;cursor:ew-resize;box-sizing:content-box;-ms-touch-action:none;touch-action:none}.n2_layer_contextual_responsive_tools__text_scale_percent{line-height:30px;font-size:12px;color:#325c77}.n2_context_menu{font-family:"Inter-Nextend",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.3;font-size:16px;-webkit-font-smoothing:antialiased;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1000000;position:fixed;left:0;top:0}.n2_context_menu a{transition:none 0s;text-decoration:none;box-shadow:none}.n2_context_menu__inner{background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_context_menu__item{display:flex;align-items:center;padding:0 10px;height:36px;cursor:default}.n2_context_menu__item--has-action{cursor:pointer}.n2_context_menu__item--has-action:HOVER,.n2_context_menu__item--active{background-color:#1d81f9}.n2_context_menu__item_icon{padding:0 5px;color:#94b2c1}.n2_context_menu__item--color-red .n2_context_menu__item_icon{color:#c43e2a}.n2_context_menu__item--has-action:HOVER .n2_context_menu__item_icon,.n2_context_menu__item--active .n2_context_menu__item_icon{color:#fff}.n2_context_menu__item_onoff .n2_context_menu__item_icon::before{content:"\E19A"}.n2_context_menu__item_onoff--on .n2_context_menu__item_icon::before{content:"\E199"}.n2_context_menu__item_label{padding:0 5px;font-size:12px;color:#325c77;white-space:nowrap;text-transform:capitalize}.n2_context_menu__item--color-red .n2_context_menu__item_label{color:#c43e2a}.n2_context_menu__item--has-action:HOVER .n2_context_menu__item_label,.n2_context_menu__item--active .n2_context_menu__item_label{color:#fff}.n2_context_menu__sub_menu{display:none;z-index:2;position:absolute;left:0;top:0;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);overflow:hidden}.n2_context_menu__sub_menu--active{display:block}html[data-component=layer][data-component-sub=image] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=transition] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=youtube] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=vimeo] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=video] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=audio] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=imagearea] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=area] .n2_field[data-field=layerfont-size],html[data-component=layer][data-component-sub=iframe] .n2_field[data-field=layerfont-size]{display:none}html[data-component=layer][data-component-sub=animatedHeading] .n2_field .n2_field_decoration__option[data-value=underline],html[data-component=layer][data-component-sub=highlightedHeading] .n2_field .n2_field_decoration__option[data-value=underline]{display:none}.n2_slide_generator_box{position:relative;width:270px;height:180px;border-radius:3px;overflow:hidden;display:flex;flex-flow:column;justify-content:flex-end;background-color:#dce2e5;background-position:left top}.n2_slide_generator_box__title{display:flex;align-items:center;padding:10px;background-color:#0c1924}.n2_slide_generator_box__title_label{flex:1 1 auto;padding:0 5px;font-size:14px;line-height:20px;color:#bdcfd9;display:flex;align-items:center}.n2_slide_generator_box__title_label_inner{margin-right:5px}html[dir=rtl] .n2_slide_generator_box__title_label_inner{margin-right:0;margin-left:5px}.n2_slide_generator_box__title_button{padding:0 10px;background-color:#1d81f9;border-radius:3px;font-size:11px;line-height:30px;text-align:center;text-transform:uppercase}.n2_slide_generator_box__title_button:HOVER{background-color:#338ef9}.n2_slide_generator_box__title_button,.n2_slide_generator_box__title_button:HOVER,.n2_slide_generator_box__title_button:FOCUS{color:#fff}.n2_slide_generator_step1__installed_generators{padding:40px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_slide_generator_step1__not_installed{padding:10px 40px 40px 40px}.n2_slide_generator_step1__not_installed_label{font-size:22px;line-height:32px;color:#283f4d}.n2_slide_generator_step1__not_installed_generators{padding-top:20px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_slide_generator_step3{padding:40px;display:grid;grid-gap:32px;grid-template-columns:repeat(auto-fill,270px)}.n2_generator_records_table{margin:20px 0;display:grid;overflow:auto;background:#fff;grid-gap:2px}.n2_generator_records_table__heading{padding:0 10px;background-color:#f0f4f7;color:#325c77;font-size:12px;line-height:30px;font-weight:700}.n2_generator_records_table__cell{padding:0 10px;background-color:#f0f4f7;color:#325c77;font-size:12px;line-height:30px;max-height:100px;min-width:150px;overflow:auto}.n2_slider_preview_area{margin-top:20px;display:flex;justify-content:center;min-height:150vh}.n2_slider_preview_area__inner{position:relative;background-color:#fff;box-shadow:0 2px 20px 0 rgba(0,0,0,.2)}.n2_preview{display:flex;flex-flow:column;align-items:center;height:calc(100vh - 60px)}.n2_preview__ruler{width:100%;position:relative;flex:0 0 auto;height:20px;background-color:#94b2c1;overflow:hidden}.n2_preview__ruler_device{position:absolute;left:50%;top:0;height:100%;cursor:pointer}.n2_preview__ruler_device div{border-left:1px solid #fff;border-right:1px solid #fff;padding:0 5px;height:100%}.n2_preview__ruler_device:HOVER div{background-color:#1d81f9}.n2_preview__ruler--ready .n2_preview__ruler_device{transition:width .5s,margin-left .5s}.n2_preview__ruler_label{position:absolute;left:50%;top:0;z-index:10;width:200px;margin-left:-100px;pointer-events:none;text-align:center;font-size:12px;line-height:20px;color:#fff}.n2_preview__device_screen{position:relative;flex:1 1 auto;width:100%;height:100%;display:flex;justify-content:center;padding:0 20px 20px;box-sizing:border-box;overflow:hidden}.n2_preview__device_info{margin-top:13px;position:relative;flex:0 0 auto;width:100%;height:26px;display:flex;align-items:center;justify-content:center;font-size:13px;line-height:26px;color:#325c77}.n2_preview__device_info .ssi_16{margin:0 5px;color:#94b2c1}.n2_preview__device_info_state{font-weight:700}.n2_preview__notification_scale{pointer-events:none;position:absolute;left:50%;top:30px;z-index:10;background:RGBA(0,0,0,.5);width:90px;margin-left:-45px;color:#fff;text-align:center;border-radius:5px;line-height:48px;font-size:16px;transition:opacity .5s ease 0s;opacity:0}.n2_preview__notification_scale--visible{opacity:1}.n2_preview__device_screen_inner{position:relative;flex:1 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.n2_preview__device_screen_inner iframe{border:0;max-width:none;width:100%;height:100%;box-shadow:0 2px 20px rgba(0,0,0,.2);transform-origin:50% 0;transition:transform .5s}.n2_preview__frame_overlay{display:none;position:absolute;left:0;top:0;width:100%;height:100%}.n2_body--resize-horizontal .n2_preview__frame_overlay,.n2_body--resize-vertical .n2_preview__frame_overlay{display:block}.n2_preview__resize_width{position:absolute;top:0;right:-8px;width:8px;height:100%;background:#1d81f9;opacity:0;cursor:ew-resize;transition:opacity .3s}.n2_preview__device_screen:HOVER .n2_preview__resize_width{opacity:.5}.n2_preview__device_screen .n2_preview__resize_width:HOVER,.n2_body--resize-horizontal .n2_preview__device_screen .n2_preview__resize_width{opacity:1}.n2_body--scale-preview .n2_preview__resize_width{opacity:0!important}.n2_preview__resize_height{position:absolute;left:0;bottom:-8px;width:100%;flex:0 0 auto;height:8px;background:#1d81f9;opacity:0;cursor:ns-resize;transition:opacity .3s}.n2_preview__device_screen:HOVER .n2_preview__resize_height{opacity:.5}.n2_preview__device_screen .n2_preview__resize_height:HOVER,.n2_body--resize-vertical .n2_preview__device_screen .n2_preview__resize_height{opacity:1}.n2_body--scale-preview .n2_preview__resize_height{opacity:0!important}#n2_preview_frame{display:block;width:100%;height:100%}.n2_preview_toolbar{display:flex;align-items:center}.n2_preview_toolbar__size{margin:0 10px;display:flex}.n2_preview_toolbar__editable{width:46px;height:28px;background-color:#2c3a45;border-radius:3px;font-size:12px;line-height:28px;color:#bdcfd9;text-align:center}.n2_preview_toolbar__x{margin:0 10px;font-size:12px;line-height:28px;color:#94b2c1}select.n2_preview_toolbar__scale{margin:0;padding:0 10px;max-width:initial;width:auto;height:28px;min-height:28px;font-family:inherit;-webkit-appearance:menulist;-moz-appearance:menulist;background:#2c3a45;font-size:12px;line-height:28px}select.n2_preview_toolbar__scale,select.n2_preview_toolbar__scale:FOCUS,select.n2_preview_toolbar__scale:HOVER{color:#bdcfd9;box-shadow:none;border:0}.n2_html--slider-preview{background:#fff}.n2_html--slider-preview body{width:100%;overflow-x:hidden;overflow-y:scroll;background:#fff}@media only screen and (max-width:700px){.n2_html--slider-preview::-webkit-scrollbar{width:0}.n2_html--slider-preview{-ms-overflow-style:none;scrollbar-width:none}}.n2_getting_started{display:flex;flex-flow:column;align-items:center;padding:60px 0 120px}.n2_getting_started__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_getting_started__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_getting_started__video{margin-top:20px;position:relative;width:100%;max-width:calc(100vh - 100px)}.n2_getting_started__video .n2_getting_started__video_placeholder{padding-top:56.25%;height:0}.n2_getting_started__video iframe,.n2_getting_started__video img{position:absolute;left:0;top:0;width:100%;height:100%;border:0}.n2_getting_started__buttons{margin-top:20px;display:flex;width:100%}.n2_getting_started__buttons>div{width:50%}.n2_getting_started__button_dont_show{text-align:right;padding:0 10px}.n2_getting_started__button_dont_show a{display:inline-block;padding:0 20px;font-size:14px;line-height:36px}.n2_getting_started__button_dont_show a,.n2_getting_started__button_dont_show a:HOVER,.n2_getting_started__button_dont_show a:FOCUS{color:#1375e9}html[dir=rtl] .n2_getting_started__button_dont_show{text-align:left}.n2_getting_started__button_dashboard{text-align:left;padding:0 10px}.n2_getting_started__button_dashboard a{display:inline-block;padding:0 20px;background-color:#04c018;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-align:center;text-transform:uppercase}.n2_getting_started__button_dashboard a:HOVER{background-color:#07ca1c}.n2_getting_started__button_dashboard a,.n2_getting_started__button_dashboard a:HOVER,.n2_getting_started__button_dashboard a:FOCUS{color:#fff}html[dir=rtl] .n2_getting_started__button_dashboard{text-align:right}.n2_page_activate{display:flex;flex-flow:column;align-items:center;padding:60px 0 120px}.n2_page_activate__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_page_activate__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_page_activate__video{margin-top:20px;position:relative;width:100%;max-width:calc(100vh - 100px)}.n2_page_activate__video .n2_page_activate__video_placeholder{padding-top:56.25%;height:0}.n2_page_activate__video iframe{position:absolute;left:0;top:0;width:100%;height:100%}.n2_page_activate__buttons{margin-top:20px;display:flex;width:100%}.n2_page_activate__buttons>div{width:50%}.n2_page_activate__button_dont_show{text-align:right;padding:0 10px}.n2_page_activate__button_dont_show a{display:inline-block;padding:0 20px;font-size:14px;line-height:36px}.n2_page_activate__button_dont_show a,.n2_page_activate__button_dont_show a:HOVER,.n2_page_activate__button_dont_show a:FOCUS{color:#1375e9}.n2_page_activate__button_dashboard{text-align:left;padding:0 10px}.n2_page_activate__button_dashboard a{display:inline-block;padding:0 20px;background-color:#04c018;border-radius:3px;font-size:12px;line-height:36px;font-weight:700;text-align:center;text-transform:uppercase}.n2_page_activate__button_dashboard a:HOVER{background-color:#07ca1c}.n2_page_activate__button_dashboard a,.n2_page_activate__button_dashboard a:HOVER,.n2_page_activate__button_dashboard a:FOCUS{color:#fff}.n2_page_free_go_pro{display:flex;padding:30px 0 90px;flex-wrap:wrap;justify-content:center}.n2_page_free_go_pro__col{display:flex;flex-flow:column;align-items:center;padding:30px}.n2_page_free_go_pro__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_page_free_go_pro__subheading{margin-bottom:20px;font-size:14px;line-height:28px;color:#325c77}.n2_page_free_go_pro_already_purchased{position:relative;display:flex;flex-flow:column;align-items:center;width:572px;height:392px;background-color:#fff;border-radius:5px;box-shadow:0 10px 8px -10px rgba(0,0,0,.1)}.n2_page_free_go_pro_already_purchased:HOVER{box-shadow:0 10px 8px -10px rgba(0,0,0,.2)}.n2_page_free_go_pro_already_purchased__logo{margin-top:44px;display:flex;align-items:center;justify-content:center;width:100px;height:100px;background-color:rgba(4,192,24,.1);border-radius:50px;color:#04c018}.n2_page_free_go_pro_already_purchased__heading{margin-top:9px;font-size:18px;line-height:30px;color:#283f4d;font-weight:700}.n2_page_free_go_pro_already_purchased__paragraph{width:380px;height:78px;color:#325c77;font-size:14px;line-height:26px;text-align:center}.n2_page_free_go_pro_already_purchased__paragraph a,.n2_page_free_go_pro_already_purchased__paragraph a:HOVER,.n2_page_free_go_pro_already_purchased__paragraph a:FOCUS{color:#1375e9}.n2_page_free_go_pro_already_purchased__button{margin:20px 0 10px;padding:0 20px;min-width:260px;background-color:#04c018;border-radius:3px;text-align:center;font-size:12px;line-height:36px;text-transform:uppercase;font-weight:700}.n2_page_free_go_pro_already_purchased__button,.n2_page_free_go_pro_already_purchased__button:HOVER,.n2_page_free_go_pro_already_purchased__button:FOCUS{color:#fff}.n2_page_free_go_pro_already_purchased__button:HOVER{background-color:#07ca1c}.n2_help_center{display:flex;flex-flow:column;align-items:center;background-color:#f0f4f7;text-align:center;padding:0 40px}.n2_help_center a:HOVER{color:#005bc6}.n2_help_center a,.n2_help_center a:FOCUS{color:#1375e9}.n2_help_center__getting_started{width:100%;max-width:1140px;margin-top:44px}.n2_help_center__getting_started__heading{font-size:32px;line-height:32px;color:#283f4d}.n2_help_center__getting_started__subheading{font-size:14px;line-height:28px;color:#325c77}.n2_help_center__getting_started__video{margin-top:20px;position:relative;width:100%;max-width:1140px}.n2_help_center__getting_started__video .n2_help_center__getting_started__video_placeholder{padding-top:56.25%;height:0}.n2_help_center__getting_started__video iframe,.n2_help_center__getting_started__video img{position:absolute;left:0;top:0;width:100%;height:100%}.n2_help_center__conflicts{max-width:1140px;width:100%;box-sizing:border-box;border-radius:3px 3px 0 0;background-color:#fff;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);padding:48px 20px 25px;margin-top:60px}.n2_help_center__conflicts_test_api{margin-bottom:20px}.n2_help_center__search{width:100%;box-sizing:border-box;padding:60px 20px 0}.n2_help_center__search_heading{color:#283f4d;font-size:22px;line-height:32px}.n2_help_center__search_field{margin-top:20px}.n2_help_center__search_field form{display:inline-flex;width:100%;max-width:600px}.n2_help_center__search_field form input{flex:1 1 auto;margin:0;padding:0 20px;border:2px solid #94b2c1;border-right:0;border-radius:3px 0 0 3px;background-color:#fff;color:#325c77;font-size:14px;line-height:46px;height:auto}.n2_help_center__search_field form input,.n2_help_center__search_field form input:FOCUS{box-shadow:none;outline:0}.n2_help_center__search_field form input:FOCUS{border-color:#1d81f9}html[dir=rtl] .n2_help_center__search_field form input{border:2px solid #94b2c1;border-left:0;border-radius:0 3px 3px 0}.n2_help_center__search_field form button{padding:0 35px;background-color:#1d81f9;border:0;border-top-right-radius:3px;border-bottom-right-radius:3px;color:#fff;font-size:12px;line-height:50px;text-transform:uppercase}.n2_help_center__search_field form button:HOVER{background-color:#338ef9}.n2_help_center__search_field form button,.n2_help_center__search_field form button:FOCUS{box-shadow:none;outline:0}html[dir=rtl] .n2_help_center__search_field form button{border-radius:3px 0 0 3px}.n2_help_center__actions{margin-top:60px;max-width:1140px;width:100%;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px 60px}.n2_help_center__action{position:relative;padding:20px;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);text-align:center}.n2_help_center__action_link{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%}.n2_help_center__action_icon{margin-top:30px;text-align:center;color:#1375e9}.n2_help_center__conflicts_icon{color:#1375e9}.n2_help_center__action_label,.n2_help_center__conflicts_label{margin-top:16px;color:#283f4d;font-size:18px;line-height:28px}.n2_help_center__conflicts_description,.n2_help_center__action_description{margin:5px 0 15px;color:#325c77;font-size:14px;line-height:24px}.n2_help_center__articles{margin-top:20px;max-width:1140px;width:100%;display:grid;grid-template-columns:repeat(3,1fr);grid-gap:10px 60px}.n2_help_center__articles_heading{color:#283f4d;font-size:22px;line-height:32px;margin-top:60px;max-width:1140px;width:100%}.n2_help_center__article{position:relative;padding:20px 20px;background-color:#fff;border-radius:3px;box-shadow:0 1px 5px 1px rgba(55,77,88,.2);display:flex;align-items:center;color:#325c77;font-size:14px;line-height:20px}.n2_help_center__article:HOVER{color:#1375e9}.n2_help_center__article_link{position:absolute;z-index:2;left:0;top:0;width:100%;height:100%}.n2_help_center__article_label{flex:1 1 auto;text-align:left}html[dir=rtl] .n2_help_center__article_label{text-align:right}.n2_help_center__article_icon{font-size:16px}html[dir=rtl] .n2_help_center__article_icon{transform:rotate(180deg)}.n2_help_center__system_information{margin-top:60px;max-width:1140px;width:100%}.n2_help_center__system_information_label,.n2_help_center__articles_label{color:#283f4d;font-size:22px;line-height:32px}.n2_help_center__system_information_form textarea{display:block;margin-top:30px;height:300px;background-color:#fff;border:2px solid #94b2c1;border-radius:3px;padding:15px 20px;color:#325c77;font-size:14px;line-height:24px}.n2_loading_screen{display:none;position:fixed;z-index:2147483647;width:100%;height:100%;left:0;top:0;background:RGBA(32,41,52,.95)}.n2_loading_screen--visible{display:flex;align-items:center;justify-content:center}.n2_loading_screen__circle{border:10px solid #6b7986;border-left-color:#fff;border-radius:50%;width:40px;height:40px;animation:n2_loading_screen__circle_animation 1.1s infinite linear}@keyframes n2_loading_screen__circle_animation{0%{transform:rotate(0deg)}to{transform:rotate(360deg)}}.n2_ss_background_animation_preview{overflow:hidden}.n2_ss_background_animation_preview .n2-bganim-side{position:absolute;left:0;top:0;overflow:hidden}.n2_ss_background_animation_preview .n2-bganim-tile-overlay-colored{z-index:100000}.n2_ss_background_animation_preview__slider{position:relative;width:800px;height:500px;margin:20px;z-index:3}.n2_ss_background_animation_preview__animation_container,.n2_ss_background_animation_preview__slide{position:absolute;left:0;top:0;width:800px;height:500px}.n2_ss_background_animation_preview__slide{z-index:2}.n2_ss_background_animation_preview__slide_background{height:100%}.n2_ss_background_animation_preview__slide_background_image{height:100%;background-size:cover;background-position:50% 50%}
Public/SmartSlider3/Application/Admin/Assets/dist/smartslider-backend.min.js CHANGED
@@ -1 +1 @@
1
- (function(t){var i=t;i._N2=i._N2||{_r:[],_d:[],r:function(){this._r.push(arguments)},d:function(){this._d.push(arguments)}};var s=t.document,n=s.documentElement,h,r,o=t.setTimeout,a=t.clearTimeout,c=i._N2,l=t.requestAnimationFrame,u=function(t,i=null,n=null,h=null){const r=s.createElement(t);return i&&("string"==typeof i?G(r,i):J(r,i)),n&&M(r,n),h&&F(r,h),r},d=function(t,i,s,n,h){const r=u(i,s,n,h);return t&&t.appendChild(r),r},f=function(t,i,s,n,h){const r=u(t,s,n,h);return r.innerHTML=i,r},_=function(t,i,s,n,h,r){const o=d(t,i,n,h,r);return o.innerHTML=s,o},v=function(t,i,s){return u("div",t,i,s)},p=function(t,i,s,n){return d(t,"div",i,s,n)},m=function(t,i,s,n){return f("div",t,i,s,n)},b=function(t,i,s,n,h){return _(t,"div",i,s,n,h)},g=function(t,i,s,n,h){const r=u("a",s,n,h);return S(r,"href",i),r.innerHTML=t,r},y=function(t,i,s,n,h,r){const o=d(t,"a",n,h,r);return S(o,"href",s),o.innerHTML=i,o},w=Object.assign,k=function(t,i){for(var s=Object(t),n=1;n<arguments.length;n++){var h=arguments[n];if(null!==h&&h!==r)for(var o in h)null!==h[o]&&Object.prototype.hasOwnProperty.call(h,o)&&("object"==typeof h[o]&&(h[o].constructor===Object||Array.isArray(h[o]))?(Array.isArray(h[o])?s[o]=[]:("object"!=typeof s[o]||Array.isArray(s[o]))&&(s[o]={}),s[o]=k(s[o],h[o])):s[o]=h[o])}return s},x=function(t,i){return t.getAttribute(i)},S=function(t,i,s){t.setAttribute(i,s)},M=function(t,i){for(var s in i)S(t,s,i[s])},C=function(t,i){t.removeAttribute(i)},I=function(t,i,s){t.forEach((function(t){S(t,i,s)}))},N=function(t,i){t.forEach((function(t){M(t,i)}))},O=function(t,i){t.forEach((function(t){G(t,i)}))},j=function(t,i){t.forEach((function(t){Y(t,i)}))},P=function(t,i){return t.dataset[i]},T=function(t,i,s){t.dataset[i]=s},F=function(t,i){for(let s in i)T(t,s,i[s])},A=function(t,i){delete t.dataset[i]},z=function(t,s){return i.getComputedStyle(t).getPropertyValue(s)},L=function(t,i,s){t.style.setProperty(i,s)},E=function(t,i){for(var s in i)L(t,s,i[s])},R=function(t,i){t.style.removeProperty(i)},D=function(t,i){i.forEach((function(i){R(t,i)}))},U=function(t,i,s){t.forEach((function(t){L(t,i,s)}))},B=function(t,i){t.forEach((function(t){E(t,i)}))},W=function(t,i){t.forEach((function(t){R(t,i)}))},H=function(t){t&&t.parentNode&&t.parentNode.removeChild(t)},V=function(t){t.forEach((function(t){H(t)}))},G=function(t,i){t.classList.add(i)},J=function(t,i){i.forEach((function(i){t.classList.add(i)}))},Y=function(t,i){t.classList.remove(i)},q=function(t,i){i.forEach((function(i){t.classList.remove(i)}))},X=function(t,i,s){s?G(t,i):Y(t,i)},Z=function(t,i){i.appendChild(t)},Q=function(t,i){i.childNodes.length?tt(t,i.childNodes[0]):i.appendChild(t)},K=function(t,i){i.nextSibling?tt(t,i.nextSibling):i.parentNode.appendChild(t)},tt=function(t,i){i.parentNode.insertBefore(t,i)},it=function(t,i){return t.dispatchEvent(i)},st=function(t,i,s){return s=w({bubbles:!0,cancelable:!0},s),it(t,new Event(i,s))},nt=function(t,i){return it(t,new Event(i,{bubbles:!1,cancelable:!1}))},et=function(t,i,s){return it(t,new CustomEvent(i,{bubbles:!1,cancelable:!1,detail:s}))},ht=function(t,i,s,n){t.removeEventListener(i,s,n)},rt=function(t){t.forEach((function(t){t()})),t.splice(0,t.length)},ot=function(t,i,s,n){return n=n||{},t.addEventListener(i,s,n),t.removeEventListener.bind(t,i,s,n)},at=function(t,i,s,n){n=n||{},t.addEventListener(i,s,n)},ct=function(t,i,s){t.addEventListener(i,s,{once:!0})},lt=function(t,i,s){t.ssEvent&&t.ssEvent[i]&&t.ssEvent[i].forEach((function(t){t(s)}))},ut=function(t,i,s){t.ssEvent||(t.ssEvent={}),t.ssEvent[i]||(t.ssEvent[i]=[]),t.ssEvent[i].push(s)},dt=function(t,i,s){return ut(t,i,s),ft.bind(t,i,s)},ft=function(t,i){if(this.ssEvent&&this.ssEvent[t])for(var s=this.ssEvent[t],n=s.length-1;n>=0;n--)s[n]===i&&s.splice(n,1)},_t=function(){return n.scrollTop},vt=function(t){n.scrollTop=t},pt=function(){return n.scrollLeft},mt=function(t){return t.getBoundingClientRect().width},bt=function(t){return t.getBoundingClientRect().height},gt=function(t){return s.scrollingElement.scrollTop+t.getBoundingClientRect().top},yt=function(t){"complete"===s.readyState||"interactive"===s.readyState?t():Document&&Document.prototype&&Document.prototype.addEventListener&&Document.prototype.addEventListener!==s.addEventListener?Document.prototype.addEventListener.call(s,"DOMContentLoaded",t):s.addEventListener("DOMContentLoaded",t)},wt=function(t,i,s,n){if(Math.abs(t.scrollTop-i)<1)n&&n();else{s=Math.max(300,s||300);var h=t.scrollTop,r=i-h,o=performance.now(),a=function(i){var c=Math.min(1,(i-o)/s);c<.5?c*=2*c:c=(4-2*c)*c-1,t.scrollTop=h+c*r,c<1?requestAnimationFrame(a):n&&n()};a(o)}},kt=function(t,i,n){var h=s.createElementNS("http://www.w3.org/2000/svg",t);return i&&(St(h,i),n&&n.appendChild(h)),h},xt=function(t,i,s){t.setAttributeNS(null,i,s)},St=function(t,i){for(var s in i)xt(t,s,i[s])},Mt=function(t){return t.charAt(0).toUpperCase()+t.slice(1)},Ct=navigator.userAgent.indexOf("+http://www.google.com/bot.html")>-1?function(t){t()}:i.requestIdleCallback||function(t){return o(t,1)},It=i.cancelIdleCallback||function(t){a(t)},Nt=function(t,i){i=(((i||"")+"").toLowerCase().match(/<[a-z][a-z0-9]*>/g)||[]).join("");return(t+"").replace(/<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi,"").replace(/<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,(function(t,s){return i.indexOf("<"+s.toLowerCase()+">")>-1?t:""}))},Ot=function(t,i=""){return $t(Nt(t,"<a><span><sub><sup><em><i><var><cite><b><strong><small><bdo><br><img><picture><source>"+i))},$t=function(t){var i=new RegExp(["onclick","onfocus","ondrag","onmouse","onwheel","onscroll","ontouch","onload","onerror"].join("|"),"gi");return t.replace(i,"not-allowed")};yt((function(){h=s.body})),c.d("Base64",(function(){return{_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(t){var i,s,n,h,r,o,a,c="",l=0;for(t=function(t){t=t.replace(/\r\n/g,"\n");for(var i="",s=0;s<t.length;s++){var n=t.charCodeAt(s);n<128?i+=String.fromCharCode(n):n>127&&n<2048?(i+=String.fromCharCode(n>>6|192),i+=String.fromCharCode(63&n|128)):(i+=String.fromCharCode(n>>12|224),i+=String.fromCharCode(n>>6&63|128),i+=String.fromCharCode(63&n|128))}return i}(t);l<t.length;)h=(i=t.charCodeAt(l++))>>2,r=(3&i)<<4|(s=t.charCodeAt(l++))>>4,o=(15&s)<<2|(n=t.charCodeAt(l++))>>6,a=63&n,isNaN(s)?o=a=64:isNaN(n)&&(a=64),c=c+this._keyStr.charAt(h)+this._keyStr.charAt(r)+this._keyStr.charAt(o)+this._keyStr.charAt(a);return c},decode:function(t){var i,s,n,h,r,o,a="",c=0;for(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");c<t.length;)i=this._keyStr.indexOf(t.charAt(c++))<<2|(h=this._keyStr.indexOf(t.charAt(c++)))>>4,s=(15&h)<<4|(r=this._keyStr.indexOf(t.charAt(c++)))>>2,n=(3&r)<<6|(o=this._keyStr.indexOf(t.charAt(c++))),a+=String.fromCharCode(i),64!=r&&(a+=String.fromCharCode(s)),64!=o&&(a+=String.fromCharCode(n));return a=function(t){for(var i="",s=0,n=c1=c2=0;s<t.length;)(n=t.charCodeAt(s))<128?(i+=String.fromCharCode(n),s++):n>191&&n<224?(c2=t.charCodeAt(s+1),i+=String.fromCharCode((31&n)<<6|63&c2),s+=2):(c2=t.charCodeAt(s+1),c3=t.charCodeAt(s+2),i+=String.fromCharCode((15&n)<<12|(63&c2)<<6|63&c3),s+=3);return i}(a)}}})),i.n2_=function(t){return c._localization&&c._localization[t]!==r?c._localization[t]:t},i.n2_sprintf=function(t){var i=arguments,s=1;return t.replace(/%s/g,(function(){return i[s++]}))},c.r("$",(function(){var $=c.$;c._animationManager=null,c._browse=null,c._roundTo=5,c._roundHelper=function(t){return c._roundTo<=1?t:Math.round(t/c._roundTo)*c._roundTo},$.fn.n2opener=function(){return this.each((function(){console.error("deprecated $.fn.n2opener");var t=$(this).on("click",(function(e){t.toggleClass("n2-active")}));t.siblings("span").on("click",(function(e){t.toggleClass("n2-active")})),t.parent().on("mouseleave",(function(){t.removeClass("n2-active")})),t.find(".n2-button-menu").on("click",(function(e){e.stopPropagation(),t.removeClass("n2-active")}))}))},jQuery!==r&&jQuery(s).on("wp-collapse-menu",(function(){$(i).trigger("resize")})),c._deepDiff={map:function(t,i){if(this.isValue(t))return t!==r&&t!=i?t:r;for(var s in i)this.isFunction(i[s])||(t[s]=this.map(t[s],i[s]),(t[s]===r||$.isPlainObject(t[s])&&$.isEmptyObject(t[s])||this.isArray(t[s])&&0==t[s].length)&&delete t[s]);return t},isFunction:function(t){return"[object Function]"==={}.toString.apply(t)},isArray:function(t){return"[object Array]"==={}.toString.apply(t)},isObject:function(t){return"[object Object]"==={}.toString.apply(t)},isValue:function(t){return!this.isObject(t)&&!this.isArray(t)}},c._UnicodeToHTMLEntity=function(t){try{var i,s=/(?:[\uD800-\uDBFF][\uDC00-\uDFFF])/g;function n(t){for(var i,s,n,h=[],r=0;r<t.length;)55296==(63488&(i=t.charCodeAt(r)))?h.push((s=i,n=t.charCodeAt(++r),((1023&s)<<10)+(1023&n)+65536)):h.push(i),++r;return"&#"+h+";"}for(;i=s.exec(t);)t=t.substr(0,i.index)+n(t.substr(i.index,s.lastIndex-i.index))+t.substr(s.lastIndex)}catch(i){return console.error(i),t}return t}})),c.d("Popover",["$"],(function(){var $=c.$;function t(t){this.$container=t,this.$content=t.find(".n2_popover_content"),this.$exit=this.$content.find(".n2_popover_content_exit").on("click",this.hide.bind(this)),this.positionCallback=this.position.bind(this),this.$trigger=t.find(".n2_popover__trigger").on("click",this.show.bind(this))}return t.prototype.lazyLoad=function(){this.options=w({horizontal:"right",vertical:"below",relatedclass:!1},this.$container.data()),this.$content.appendTo("body"),this.$inner=this.$content.find(".n2_popover_content_inner"),this.$content.find(".n2_floating_menu__item").on("click",function(e){$(e.currentTarget).data("stay-open")||this.hide(e)}.bind(this)),this.lazyLoad=function(){}},t.prototype.position=function(){var t=this.$trigger[0].getBoundingClientRect(),s=this.$inner[0].getBoundingClientRect(),n=0,h=0,r=0,o=1;"left"===this.options.horizontal?(n=this.getXLeft(t,s))<0&&(n=this.getXRight(t,s),r=t.x-n):(n=this.getXRight(t,s))<0?n=this.getXLeft(t,s):r=t.x-n,"above"===this.options.vertical?(h=this.getYAbove(t,s))<0?h=this.getYBelow(t,s):o=3:(h=this.getYBelow(t,s))+s.height>i.innerHeight&&(h=this.getYAbove(t,s),o=3),this.$content.css({transform:"translate("+Math.round(n)+"px, "+Math.round(h)+"px)"}),this.$exit.css({order:String(o),height:t.height+5+"px",width:Math.round(t.width),marginLeft:Math.round(r)+"px"})},t.prototype.getXLeft=function(t,i){return t.x},t.prototype.getXRight=function(t,i){return t.x-i.width+t.width},t.prototype.getYAbove=function(t,i){return t.y-i.height-5},t.prototype.getYBelow=function(t,i){return t.y},t.prototype.show=function(e){e&&e.preventDefault(),this.lazyLoad(),this.options.relatedclass&&(this.$related=this.$container.closest("."+this.options.relatedclass),this.$related.addClass(this.options.relatedclass+"--popover-visible")),this.$content.addClass("n2_popover_content--visible").on("mouseleave",this.hide.bind(this)),this.position(),i.addEventListener("scroll",this.positionCallback,{capture:!0,passive:!0})},t.prototype.hide=function(e){this.$related&&(this.$related.removeClass(this.options.relatedclass+"--popover-visible"),delete this.$related),this.$content.off("mouseleave").removeClass("n2_popover_content--visible"),i.removeEventListener("scroll",this.positionCallback,{capture:!0,passive:!0})},t.prototype.setStates=function(t){this.$content.find("a[data-state]").each((function(){var i=$(this),s=i.data("state").match(/^(!)?(.*)$/);"!"===s[1]?i.toggleClass("n2_floating_menu__item--has-state",!t[s[2]]):i.toggleClass("n2_floating_menu__item--has-state",t[s[2]])}))},$.fn.nextendPopover=function(){return this.each((function(){var i=$(this);i.data("popover",new t(i))}))},t})),c.d("NextendHeadingPane",["$"],(function(){var $=c.$;function t(t,i,s,n){this.$node=t.data("pane",this),this.headings=i,this.contents=s,this.tabNames=[],this.headings.each(function(t,i){this.tabNames.push($(i).data("tab"))}.bind(this)),this.identifier=n,this._active=i.index(i.filter(".n2-active"));for(var h=0;h<i.length;h++)i.eq(h).on("click",this.switchToPane.bind(this,h));if(n){var r=localStorage.getItem(this.identifier+"-pane")||-1;if(-1!=r)return void this.switchToPane(r)}this.hideAndShow()}return t.prototype.switchToPane=function(t,e){e&&e.preventDefault(),this.headings.eq(this._active).removeClass("n2-active"),this.headings.eq(t).addClass("n2-active"),this._active=t,this.hideAndShow(),this.store(this._active),this.$node.triggerHandler("changetab")},t.prototype.hideAndShow=function(){$(this.contents[this._active]).css("display","block").trigger("activate");for(var t=0;t<this.contents.length;t++)t!=this._active&&$(this.contents[t]).css("display","none")},t.prototype.store=function(t){this.identifier&&localStorage.setItem(this.identifier+"-pane",t)},t.prototype.showTabs=function(t){for(var i=!1,s=0;s<this.tabNames.length;s++)"-1"!=t.indexOf(this.tabNames[s])?(this.headings.eq(s).css("display",""),$(this.contents[s]).css("display",""),(s==this._active||!1===i)&&(i=s)):(this.headings.eq(s).css("display","none"),$(this.contents[s]).css("display","none"));this.switchToPane(i)},t})),c.d("Window",(function(){var t=!1;var h={getTopOffset:function(){var i=s.getElementById("wpadminbar");return i&&(t=i.getBoundingClientRect().height),h.getTopOffset=function(){return t},t},getBottomOffset:function(){return 0},getHeight:function(){return(i.innerHeight||n.clientHeight)-h.getTopOffset()},getWidth:function(){return i.innerWidth||n.clientWidth}};return h})),c.d("WindowManager",(function(){var t=["main"],i={};return{addWindow:function(i){t.push(i)},removeWindow:function(){t.pop()},getCurrentWindow:function(){return t[t.length-1]},actionPrevent:function(t){this.actionCancelPreventRelease(t),i[t]=requestAnimationFrame(this.actionPreventRelease.bind(this,t))},actionPreventFunction:function(t){return this.actionPrevent.bind(this,t)},actionCancelPreventRelease:function(t){i[t]!==r&&(cancelAnimationFrame(i[t]),delete i[t])},actionPreventRelease:function(t){delete i[t]},isActionPrevented:function(t){return i[t]!==r}}})),c.d("LoadingScreen",["$"],(function(){var t,i,s,$=c.$;c.r("documentReady",(function(){t=$('<div class="n2_loading_screen"><div class="n2_loading_screen__circle"></div></div>').appendTo("body")}));var n={startLoading:function(){i&&a(i),s=$.now(),t.addClass("n2_loading_screen--visible")},stopLoading:function(){var n=$.now()-s;n>=300?t.removeClass("n2_loading_screen--visible"):i=o((function(){t.removeClass("n2_loading_screen--visible")}),300-n)}};return n})),c.d("AjaxHelper",["$"],(function(){var $=c.$;function t(){}t.query={};var s={};return t.addAdminUrl=function(t,i){s[t]=i},t.getAdminUrl=function(t){return s[t]},t.addAjaxArray=function(i){for(var s in i)t.query[s]=i[s]},t.makeAjaxUrl=function(i,s){var n=i.split("?");n.length<2&&(n[1]="");var h=c.N2QueryString.parse(n[1]);if(s!==r)for(var o in s)h[o]=s[o];for(var o in t.query)h[o]=t.query[o];return c.N2QueryString.add_query_arg(h,n[0])},t.ajax=function(s){return c.LoadingScreen.startLoading(),s.data=s.data||{},$.ajax(s).always((function(s,n){c.LoadingScreen.stopLoading();try{if(n&&("success"!==n?s=JSON.parse(s.responseText):"string"==typeof s&&(s=JSON.parse(s))),s.redirect!==r)return c.LoadingScreen.startLoading(),void(i.location.href=s.redirect);t.notification(s)}catch(t){var h=/<body[^>]*>((.|[\n\r])*)<\/body>/im.exec(s.responseText);h?c.ModalSafeHTML(h[1]):console.error(s.responseText,s)}}))},t.notification=function(t){if(t.notification!==r&&t.notification)for(var i in t.notification)for(var s=0;s<t.notification[i].length;s++)c.Notification[i](t.notification[i][s][0],t.notification[i][s][1])},t.getJSON=function(t){return c.LoadingScreen.startLoading(),$.getJSON(t).always((function(){c.LoadingScreen.stopLoading()}))},t})),c.d("Esc",["$"],(function(){var $=c.$;function t(){this.FiLo=[],this.doc=$(s),this.isListening=!1}return t.prototype.add=function(t){this.FiLo.push(t),this.isListening||(this.doc.on("keydown.n2-esc",function(e){"Escape"!==e.code&&"Backspace"!==e.code||($(e.target).is("input, textarea")?"Escape"===e.code&&(e.preventDefault(),$(e.target).trigger("blur")):(e.preventDefault(),this.onClose()))}.bind(this)).on("n2Close.n2-esc",function(e){this.onClose()}.bind(this)),this.isListening=!0)},t.prototype.pop=function(){this.FiLo.pop(),0===this.FiLo.length&&(this.doc.off(".n2-esc"),this.isListening=!1)},t.prototype.onClose=function(){this.FiLo[this.FiLo.length-1]()&&this.pop()},new t})),c.d("tooltip",["$"],(function(){var $=c.$;function t(){this.$element=$('<div class="n2_tooltip"></div>'),this.timeout=null,this.$tipFor=null,yt(this.ready.bind(this))}function s(){this.isVisible=!1,this.$body=$("body"),this.$element=$('<div class="n2_tooltip"></div>').appendTo(this.$body)}return t.prototype.ready=function(){this.$element.appendTo("body"),this.add($("body"))},t.prototype.add=function(t){t.find("[data-n2tip]").off(".n2hastip").on({"mouseenter.n2hastip":this.onEnter.bind(this)})},t.prototype.addElement=function(t,i,s,n){t.data({n2tip:i,n2tipv:n,n2tiph:s}).off(".n2hastip").on({"mouseenter.n2hastip":this.onEnter.bind(this)})},t.prototype.removeElement=function(t){t.off(".n2hastip")},t.prototype.hide=function(){this.onLeave()},t.prototype.onEnter=function(e){this.lastE=e,this.timeout&&a(this.timeout),this.$tipFor=$(e.currentTarget).on({"mousemove.n2tip":this.onMove.bind(this),"mouseleave.n2tip":this.onLeave.bind(this)}),this.timeout=o(function(){var t=this.$tipFor.data("n2tipv"),i=this.$tipFor.data("n2tiph");t===r&&(t=10),i===r&&(i=10);var s=this.$tipFor.data("n2tip");"function"==typeof s&&(s=s.call()),this.$element.css({margin:t+"px "+i+"px"}).html(s).addClass("n2_tooltip--active"),this.onMove(this.lastE)}.bind(this),500)},t.prototype.onMove=function(e){this.lastE=e,this.$element.css({left:Math.min(e.clientX,i.innerWidth-this.$element.outerWidth()-30)+"px",top:Math.min(e.clientY,i.innerHeight-this.$element.height()-20)+"px"})},t.prototype.onLeave=function(){this.timeout&&a(this.timeout),this.$tipFor&&(this.$tipFor.off(".n2tip"),this.$tipFor=null,this.$element.removeClass("n2_tooltip--active").css("margin",""))},s.prototype.show=function(t,e){this.isVisible?this.$element.html(t):(this.isVisible=!0,this.$body.on("mousemove.tooltipMouse",this.mouseMove.bind(this)),this.mouseMove(e),this.$element.html(t).addClass("n2_tooltip--active"))},s.prototype.mouseMove=function(e){this.$element.css({left:Math.min(e.clientX+10,i.innerWidth-this.$element.outerWidth()-32)+"px",top:Math.min(e.clientY+10,i.innerHeight-this.$element.height()-40)+"px"})},s.prototype.hide=function(){this.$body.off("mousemove.tooltipMouse"),this.$element.removeClass("n2_tooltip--active").html(""),this.isVisible=!1},c._tooltip=new t,yt((function(){c._tooltipMouse=new s})),c._tooltip})),c.d("FormTipManager",["$"],(function(){var $=c.$,t=1;function s(i){this.$el=i,this.id=t++,this.isVisible=!1,this.$tip=!1,this.ui="el",this.$el.on({"mouseenter.formTip":this.onMouseEnter.bind(this),"mouseleave.formTip":this.onMouseLeave.bind(this)})}s.prototype.onMouseEnter=function(){this.mouseLeaveTimeout&&a(this.mouseLeaveTimeout),this.mouseEnterTimeout=o(this.onMouseEnterTimeout.bind(this),300)},s.prototype.onMouseEnterTimeout=function(){delete this.mouseEnterTimeout,this.isVisible||(this.ui="el",this.show(),this.isVisible=!0)},s.prototype.onMouseLeave=function(){this.mouseEnterTimeout&&a(this.mouseEnterTimeout),this.mouseLeaveTimeout=o(this.onMouseLeaveTimeout.bind(this),300)},s.prototype.onMouseLeaveTimeout=function(){delete this.mouseLeaveTimeout,this.isVisible&&"el"===this.ui&&this.hide()},s.prototype.show=function(){!1===this.$tip&&this.buildTip(),this.$tip.addClass("n2_form_tip--visible"),$(i).on("scroll.formTip"+this.id,this.positionTip.bind(this)).on("resize.formTip"+this.id,this.positionTip.bind(this)),this.positionTip()},s.prototype.hide=function(){$(i).off(".formTip"+this.id),this.$tip.removeClass("n2_form_tip--visible"),this.isVisible=!1},s.prototype.stopPropagation=function(e){e.stopPropagation()},s.prototype.buildTip=function(){this.$tip=$('<div class="n2_form_tip"></div>').on({mouseenter:this.onTipMouseEnter.bind(this),mouseleave:this.onTipMouseLeave.bind(this),mousedown:this.stopPropagation.bind(this),mouseup:this.stopPropagation.bind(this),click:this.stopPropagation.bind(this)}).appendTo("body"),$('<div class="n2_form_tip__overlay"></div>').appendTo(this.$tip);var t=$('<div class="n2_form_tip__content"></div>').appendTo(this.$tip);this.$el.data("tip-label")&&$('<div class="n2_form_tip__label"></div>').text(this.$el.data("tip-label")).appendTo(t),this.$description=$('<div class="n2_form_tip__description"></div>').html(this.$el.data("tip-description")).appendTo(t),this.$el.data("tip-link")&&$('<a class="n2_form_tip__link" href="'+this.$el.data("tip-link")+'" target="_blank">'+n2_("Open docs")+"</a>").appendTo(t)},s.prototype.setDescription=function(t){this.$description?this.$description.html(t):this.$el.data("tip-description",t)},s.prototype.onTipMouseEnter=function(){this.ui="tip"},s.prototype.onTipMouseLeave=function(){this.hide()},s.prototype.positionTip=function(){this.$tip.css({left:"0",top:"0"});var t,s,n=i.innerWidth,h=(i.innerHeight,this.$el[0].getBoundingClientRect()),r=this.$tip[0].getBoundingClientRect(),o={left:"0",top:"0"};(n2const.rtl.isRtl?h.left>r.width:n-h.left<r.width)?(t="right",o.left=h.left+h.width-r.width+"px"):(t="left",o.left=h.left+"px"),h.top>r.height?(s="bottom",o.top=h.top-r.height+"px"):(s="top",o.top=h.top+h.height+"px"),this.$tip.attr("data-position-horizontal",t).attr("data-position-vertical",s).css(o)};var n={add:function(t){t.find("[data-tip-description]").each((function(){var t=$(this);t.data("formTip")||t.data("formTip",new s(t))}))}};return c.r("windowLoad",(function(){n.add($("body"))})),n})),i.N2Color={hex2rgba:function(t){"#"===t[0]&&(t=t.substring(1)),6===t.length&&(t+="ff");var i=parseInt(t,16);return[i>>24&255,i>>16&255,i>>8&255,(255&i)/255]},hex2rgbaCSS:function(t){return"RGBA("+N2Color.hex2rgba(t).join(",")+")"},hexdec:function(t){return t=(t+"").replace(/[^a-f0-9]/gi,""),parseInt(t,16)},hex2alpha:function(t){return 8!==t.length?1:((255&parseInt(t,16))/255).toFixed(3)},colorizeSVG:function(t,i){var s=t.split("base64,");return 1===s.length?t:(s[1]=c.Base64.encode(c.Base64.decode(s[1]).replace('fill="#FFF"','fill="#'+i.substr(0,6)+'"').replace('opacity="1"','opacity="'+N2Color.hex2alpha(i)+'"')),s.join("base64,"))},colorToSVG:function(t){var i=parseInt(t,16);return[t.substr(0,6),(255&i)/255]}},c.d("N2QueryString",(function(){"use strict";return{parse:function(t){return"string"!=typeof t?{}:(t=t.trim().replace(/^(\?|#)/,""))?t.trim().split("&").reduce((function(t,i){var s=i.replace(/\+/g," ").split("="),n=s[0],h=s[1];return n=decodeURIComponent(n),h=h===r?null:decodeURIComponent(h),t.hasOwnProperty(n)?Array.isArray(t[n])?t[n].push(h):t[n]=[t[n],h]:t[n]=h,t}),{}):{}},stringify:function(t){return t?Object.keys(t).map((function(i){var s=t[i];return Array.isArray(s)?s.map((function(t){return encodeURIComponent(i)+"[]="+encodeURIComponent(t)})).join("&"):encodeURIComponent(i)+"="+encodeURIComponent(s)})).join("&"):""},add_query_arg:function(t,i){var s=i.split("?");s.length<2&&(s[1]="");var n=this.parse(s[1]);for(var h in t)t.hasOwnProperty(h)&&(n[h]=t[h]);return s[0]+"?"+this.stringify(n)}}})),function(t){var i=[],s=[],n=[],h=[],r="0123456789abcdef".split(""),o=[],a=[],c=!1,l=0,u=0,d=[];if(t.Int32Array)s=new Int32Array(16),n=new Int32Array(16),h=new Int32Array(4),o=new Int32Array(4),a=new Int32Array(4),d=new Int32Array(4);else{var f;for(f=0;f<16;f++)s[f]=n[f]=0;for(f=0;f<4;f++)h[f]=o[f]=a[f]=d[f]=0}function _(t){for(var i=16;i--;){var s=i<<2;n[i]=t.charCodeAt(s)+(t.charCodeAt(s+1)<<8)+(t.charCodeAt(s+2)<<16)+(t.charCodeAt(s+3)<<24)}}function v(t,i,s,n,h,r,o){return((i+=t+n+o)<<h|i>>>r)+s<<0}function p(t){b(0,0,0,0,t),a[0]=d[0]+1732584193<<0,a[1]=d[1]-271733879<<0,a[2]=d[2]-1732584194<<0,a[3]=d[3]+271733878<<0}function m(t){b(a[0],a[1],a[2],a[3],t),a[0]=d[0]+a[0]<<0,a[1]=d[1]+a[1]<<0,a[2]=d[2]+a[2]<<0,a[3]=d[3]+a[3]<<0}function b(t,i,s,n,h){var r,o;c?(t=v((s^n)&i^n,t,i,h[0],7,25,-680876936),n=v((i^s)&t^s,n,t,h[1],12,20,-389564586),s=v((t^i)&n^i,s,n,h[2],17,15,606105819),i=v((n^t)&s^t,i,s,h[3],22,10,-1044525330)):(t=((t=h[0]-680876937)<<7|t>>>25)-271733879<<0,n=((n=h[1]-117830708+(2004318071&t^-1732584194))<<12|n>>>20)+t<<0,s=((s=h[2]-1126478375+((-271733879^t)&n^-271733879))<<17|s>>>15)+n<<0,i=((i=h[3]-1316259209+((n^t)&s^t))<<22|i>>>10)+s<<0),t=v((s^n)&i^n,t,i,h[4],7,25,-176418897),n=v((i^s)&t^s,n,t,h[5],12,20,1200080426),s=v((t^i)&n^i,s,n,h[6],17,15,-1473231341),i=v((n^t)&s^t,i,s,h[7],22,10,-45705983),t=v((s^n)&i^n,t,i,h[8],7,25,1770035416),n=v((i^s)&t^s,n,t,h[9],12,20,-1958414417),s=v((t^i)&n^i,s,n,h[10],17,15,-42063),i=v((n^t)&s^t,i,s,h[11],22,10,-1990404162),t=v((s^n)&i^n,t,i,h[12],7,25,1804603682),n=v((i^s)&t^s,n,t,h[13],12,20,-40341101),s=v((t^i)&n^i,s,n,h[14],17,15,-1502002290),i=v((n^t)&s^t,i,s,h[15],22,10,1236535329),t=v((i^s)&n^s,t,i,h[1],5,27,-165796510),n=v((t^i)&s^i,n,t,h[6],9,23,-1069501632),s=v((n^t)&i^t,s,n,h[11],14,18,643717713),i=v((s^n)&t^n,i,s,h[0],20,12,-373897302),t=v((i^s)&n^s,t,i,h[5],5,27,-701558691),n=v((t^i)&s^i,n,t,h[10],9,23,38016083),s=v((n^t)&i^t,s,n,h[15],14,18,-660478335),i=v((s^n)&t^n,i,s,h[4],20,12,-405537848),t=v((i^s)&n^s,t,i,h[9],5,27,568446438),n=v((t^i)&s^i,n,t,h[14],9,23,-1019803690),s=v((n^t)&i^t,s,n,h[3],14,18,-187363961),i=v((s^n)&t^n,i,s,h[8],20,12,1163531501),t=v((i^s)&n^s,t,i,h[13],5,27,-1444681467),n=v((t^i)&s^i,n,t,h[2],9,23,-51403784),s=v((n^t)&i^t,s,n,h[7],14,18,1735328473),i=v((s^n)&t^n,i,s,h[12],20,12,-1926607734),t=v((r=i^s)^n,t,i,h[5],4,28,-378558),n=v(r^t,n,t,h[8],11,21,-2022574463),s=v((o=n^t)^i,s,n,h[11],16,16,1839030562),i=v(o^s,i,s,h[14],23,9,-35309556),t=v((r=i^s)^n,t,i,h[1],4,28,-1530992060),n=v(r^t,n,t,h[4],11,21,1272893353),s=v((o=n^t)^i,s,n,h[7],16,16,-155497632),i=v(o^s,i,s,h[10],23,9,-1094730640),t=v((r=i^s)^n,t,i,h[13],4,28,681279174),n=v(r^t,n,t,h[0],11,21,-358537222),s=v((o=n^t)^i,s,n,h[3],16,16,-722521979),i=v(o^s,i,s,h[6],23,9,76029189),t=v((r=i^s)^n,t,i,h[9],4,28,-640364487),n=v(r^t,n,t,h[12],11,21,-421815835),s=v((o=n^t)^i,s,n,h[15],16,16,530742520),i=v(o^s,i,s,h[2],23,9,-995338651),t=v(s^(i|~n),t,i,h[0],6,26,-198630844),n=v(i^(t|~s),n,t,h[7],10,22,1126891415),s=v(t^(n|~i),s,n,h[14],15,17,-1416354905),i=v(n^(s|~t),i,s,h[5],21,11,-57434055),t=v(s^(i|~n),t,i,h[12],6,26,1700485571),n=v(i^(t|~s),n,t,h[3],10,22,-1894986606),s=v(t^(n|~i),s,n,h[10],15,17,-1051523),i=v(n^(s|~t),i,s,h[1],21,11,-2054922799),t=v(s^(i|~n),t,i,h[8],6,26,1873313359),n=v(i^(t|~s),n,t,h[15],10,22,-30611744),s=v(t^(n|~i),s,n,h[6],15,17,-1560198380),i=v(n^(s|~t),i,s,h[13],21,11,1309151649),t=v(s^(i|~n),t,i,h[4],6,26,-145523070),n=v(i^(t|~s),n,t,h[11],10,22,-1120210379),s=v(t^(n|~i),s,n,h[2],15,17,718787259),i=v(n^(s|~t),i,s,h[9],21,11,-343485551),d[0]=t,d[1]=i,d[2]=s,d[3]=n}h[0]=128,h[1]=32768,h[2]=8388608,h[3]=-2147483648,o[0]=0,o[1]=8,o[2]=16,o[3]=24,t.md5=t.md5||function(t,d,f){!function(t){var i,r;if(c=!1,l=u=(t+="").length,u>63){for(_(t.substring(0,64)),p(n),c=!0,i=128;i<=u;i+=64)_(t.substring(i-64,i)),m(n);t=t.substring(i-64),u=t.length}for(s[0]=0,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=0,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=0,s[11]=0,s[12]=0,s[13]=0,s[14]=0,s[15]=0,i=0;i<u;i++)0==(r=i%4)?s[i>>2]=t.charCodeAt(i):s[i>>2]|=t.charCodeAt(i)<<o[r];if(s[i>>2]|=h[i%4],i>55)return c?m(s):(p(s),c=!0),m([0,0,0,0,0,0,0,0,0,0,0,0,0,0,l<<3,0]);s[14]=l<<3,c?m(s):p(s)}(d?t:function(t){for(var i=enc="",s=end=0,n=0,h=t.length;n<h;n++){var r=t.charCodeAt(n);r<128?end++:(enc=r>127&&r<2048?String.fromCharCode(r>>6|192,63&r|128):String.fromCharCode(r>>12|224,r>>6&63|128,63&r|128),end>s&&(i+=t.slice(s,end)),i+=enc,s=end=n+1)}return end>s&&(i+=t.slice(s,h)),i}(t));var v=a[0];return i[1]=r[15&v],i[0]=r[15&(v>>=4)],i[3]=r[15&(v>>=4)],i[2]=r[15&(v>>=4)],i[5]=r[15&(v>>=4)],i[4]=r[15&(v>>=4)],i[7]=r[15&(v>>=4)],i[6]=r[15&(v>>=4)],v=a[1],i[9]=r[15&v],i[8]=r[15&(v>>=4)],i[11]=r[15&(v>>=4)],i[10]=r[15&(v>>=4)],i[13]=r[15&(v>>=4)],i[12]=r[15&(v>>=4)],i[15]=r[15&(v>>=4)],i[14]=r[15&(v>>=4)],v=a[2],i[17]=r[15&v],i[16]=r[15&(v>>=4)],i[19]=r[15&(v>>=4)],i[18]=r[15&(v>>=4)],i[21]=r[15&(v>>=4)],i[20]=r[15&(v>>=4)],i[23]=r[15&(v>>=4)],i[22]=r[15&(v>>=4)],v=a[3],i[25]=r[15&v],i[24]=r[15&(v>>=4)],i[27]=r[15&(v>>=4)],i[26]=r[15&(v>>=4)],i[29]=r[15&(v>>=4)],i[28]=r[15&(v>>=4)],i[31]=r[15&(v>>=4)],i[30]=r[15&(v>>=4)],f?i:i.join("")}}(i),c.d("CssInjection",(function(){function t(t,i){this.baseClassName=t,this.style=u("style"),this.style.setAttribute("data-base-class-name",t),this.style.setAttribute("type","text/css"),this.style.styleSheet?this.style.styleSheet.cssText=i:this.style.appendChild(s.createTextNode(i)),h.appendChild(this.style)}return t.prototype.getBaseClassName=function(){return this.baseClassName},t.prototype.destroy=function(){this.style.parentNode.removeChild(this.style)},t})),c.d("NextendCSS",(function(){function t(){this.style=""}return t.prototype.add=function(t,i){return new c.CssInjection(t,i)},t.prototype.deleteRule=function(t){for(var i=t.toLowerCase(),n=i.replace(".","\\."),h=s.styleSheets.length-1;h>=0;h--)for(var r=this._getRulesArray(h),o=0;r&&o<r.length;o++)if(r[o].selectorText){var a=r[o].selectorText.toLowerCase();a!=i&&a!=n||(s.styleSheets[h].cssRules?s.styleSheets[h].deleteRule(o):s.styleSheets[h].removeRule(o))}return!0},t.prototype._getRulesArray=function(t){var i=null;try{s.styleSheets[t].cssRules?i=s.styleSheets[t].cssRules:s.styleSheets[t].rules&&(i=s.styleSheets[t].rules)}catch(t){}return i},c._css=new t,c._css})),c.d("ImageHelper",(function(){function t(t){c._imageHelper=this,this.parameters=w({siteKeywords:[],imageUrls:[],wordpressUrl:"",placeholderImage:"",placeholderRepeatedImage:"",protocolRelative:1},t)}return t.prototype.protocolRelative=function(t){return this.parameters.protocolRelative?t.replace(/^http(s)?:\/\//,"//"):t},t.prototype.dynamic=function(t){for(var i=this.parameters.imageUrls,s=this.parameters.siteKeywords,n=this.protocolRelative(t),h=0;h<s.length;h++)if(0===n.indexOf(i[h])){t=s[h]+n.slice(i[h].length);break}return t},t.prototype.fixed=function(t){if("string"==typeof t)for(var i=this.parameters.imageUrls,s=this.parameters.siteKeywords,n=0;n<s.length;n++)if(0===t.indexOf(s[n])){t=i[n]+t.slice(s[n].length);break}return t},t.prototype.openLightbox=function(t){c.PlatformImageChooser.single(t)},t.prototype.openMultipleLightbox=function(t){c.PlatformImageChooser.multiple(t)},t.prototype.getPlaceholder=function(){return this.fixed(this.parameters.placeholderImage)},t.prototype.getRepeatedPlaceholder=function(){return this.fixed(this.parameters.placeholderRepeatedImage)},t})),c.d("PlatformImageChooser",["$"],(function(){function t(){}return t.single=function(t){c.WindowManager.addWindow("imagechooser");var i={states:[new wp.media.controller.Library({filterable:"all",priority:20})]};wp.media.controller.EditImage!==r&&i.states.push(new wp.media.controller.EditImage);var s=wp.media(i);s.on("content:render:edit-image",(function(){var t=this.state().get("image"),i=new wp.media.view.EditImage({model:t,controller:this}).render();this.content.set(i),i.loadEditor()}),s),s.on("select",function(){var i=s.state().get("selection").first().toJSON();t(c._imageHelper.dynamic(i.url),{alt:i.alt})}.bind(this)),s.on("close",(function(){c.WindowManager.removeWindow(),o((function(){c.Esc.pop()}),50)})),c.Esc.add((function(){return!1})),s.open()},t.multiple=function(t){c.WindowManager.addWindow("imagechooser");var i={states:[new wp.media.controller.Library({filterable:"all",multiple:"add",priority:20})]};wp.media.controller.EditImage!==r&&i.states.push(new wp.media.controller.EditImage);var s=wp.media(i);s.on("content:render:edit-image",(function(){var t=this.state().get("image"),i=new wp.media.view.EditImage({model:t,controller:this}).render();this.content.set(i),i.loadEditor()}),s),s.on("select",function(){for(var i=s.state().get("selection").toJSON(),n=[],h=0;h<i.length;h++){var r=i[h];n.push({title:r.title,description:r.description,image:c._imageHelper.dynamic(r.url),alt:r.alt})}t(n)}.bind(this)),s.on("close",(function(){c.WindowManager.removeWindow(),o((function(){c.Esc.pop()}),50)})),s.open(),c.Esc.add((function(){return!1}))},t})),c.d("AbstractModal",["$"],(function(){var $=c.$;function t(i,s){t.counter++,this.id=t.counter,this.type=i,this.buttons=[],this.options=w({hasClose:!0,width:!1,destroyOnHide:!1},s),this.$modal=$('<div class="n2 n2_modal" data-modal-type="'+this.type+'"></div>').appendTo("body"),this.options.hasClose&&$('<div class="n2_modal__overlay"></div>').on("click",this.hide.bind(this)).appendTo(this.$modal),this.$modalWindow=$('<div class="n2_modal__window"></div>').appendTo(this.$modal),!1!==this.options.width&&this.$modalWindow.css("width",this.options.width+"px"),this.renderModal()}return t.counter=0,t.prototype.renderModal=function(){},t.prototype.show=function(){s.activeElement&&s.activeElement!==h&&s.activeElement.blur(),c.WindowManager.addWindow("modal"),this.options.hasClose&&c.Esc.add(function(){return this.hide("esc"),!0}.bind(this)),this.$modal.addClass("n2_modal--visible")},t.prototype.hide=function(e){c.WindowManager.removeWindow(),"esc"!==e&&(c.Esc.pop(),e&&e.preventDefault()),this.$modal.removeClass("n2_modal--visible"),this.options.destroyOnHide&&this.$modal.remove(),s.activeElement&&s.activeElement!==h&&s.activeElement.blur()},t.prototype.getBody=function(){return this.$modalBody},t.prototype.addContent=function(t){t.appendTo(this.$modalBody)},t.prototype.clearButtons=function(){for(var t in this.buttons)this.buttons[t].remove();this.buttons=[],this.$modalButtons.html("").attr("data-buttons",0)},t.prototype.addButton=function(t,i){i=i||!1;var s=$('<div class="n2_modal__button"></div>').append(t);return i?s.prependTo(this.$modalButtons):s.appendTo(this.$modalButtons),this.buttons.push(s),this.$modalButtons.attr("data-buttons",this.buttons.length),s},t})),c.d("ModalDeleteConfirm",["$"],(function(){var $=c.$;function t(t,i){var s=new c.ModalSimple("delete",{destroyOnHide:!0});s.addContent(c.UI.modalIcon("ssi_48 ssi_48--delete","red")),s.addContent(c.UI.modalHeading(n2_("Are you sure?"))),s.addContent(c.UI.modalParagraphHTML(n2_sprintf(n2_("You're about to %s. "),t)+n2_sprintf(n2_("The deletion is irreversible, and it's not possible to recover %s."),t)).css("margin-bottom","19px"));var n=c.UI.modalButton(n2_("Cancel"),"grey").on("click",(function(e){e.preventDefault(),s.hide()}));s.addButton(n);var h=c.UI.modalButton(n2_("Delete"),"red").on("click",(function(e){e.preventDefault(),i(),s.hide(e)}));s.addButton(h),s.show()}return t.href=function(e,s,n){e.preventDefault(),t(n,(function(){i.location.href=$(s).attr("href")}))},t})),c.d("ModalIframe",["$","AbstractModal"],(function(){var $=c.$;function t(t,i){c.AbstractModal.prototype.constructor.call(this,t,w({},i))}return t.prototype=Object.create(c.AbstractModal.prototype),t.prototype.constructor=t,t.prototype.renderModal=function(){this.$modal.addClass("n2_modal--iframe"),this.$frame=$('<iframe name="'+this.type+'" src="about:blank" style="width: 100%;height:100%;" allowfullscreen></iframe>').appendTo(this.$modalWindow)},t.prototype.setSrc=function(t){this.$frame.attr("src",t)},t.prototype.hide=function(e){c.AbstractModal.prototype.hide.call(this,e),this.$frame.attr("src","about:blank")},t})),c.d("ModalLightbox",["$","AbstractModal"],(function(){var $=c.$;function t(t,i,s){this.title=t,c.AbstractModal.prototype.constructor.call(this,i,w({},s))}return t.prototype=Object.create(c.AbstractModal.prototype),t.prototype.constructor=t,t.prototype.renderModal=function(){if(this.$modal.addClass("n2_modal--lightbox"),this.$modalTopBar=$('<div class="n2_modal__top_bar"></div>').appendTo(this.$modalWindow),this.$title=$('<div class="n2_modal__top_bar_title"></div>').text(this.title).appendTo(this.$modalTopBar),this.$modalButtons=$('<div class="n2_modal__top_bar_buttons" data-buttons="0"></div>').appendTo(this.$modalTopBar),this.options.hasClose){var t=c.UI.modalButton(n2_("Close"),"grey-dark").on("click",this.hide.bind(this));this.addButton(t)}this.$modalBody=$('<div class="n2_modal__body"></div>').appendTo(this.$modalWindow)},t.prototype.setTitle=function(t){this.title=t,this.$title.text(t)},t})),c.d("ModalSimple",["$","AbstractModal"],(function(){var $=c.$;function t(t,i){c.AbstractModal.prototype.constructor.call(this,t,w({width:500},i))}return t.prototype=Object.create(c.AbstractModal.prototype),t.prototype.constructor=t,t.prototype.renderModal=function(){if(this.$modal.addClass("n2_modal--simple"),this.$modalBodyOuter=$('<div class="n2_modal__body_outer"></div>').appendTo(this.$modalWindow),this.options.hasClose){var t=$('<div class="n2_modal__close_wrap"></div>').appendTo(this.$modalBodyOuter);$('<div class="n2_modal__close"><i class="ssi_16 ssi_16--remove"></i></div>').on("click",this.hide.bind(this)).appendTo(t)}this.$modalBody=$('<div class="n2_modal__body"></div>').appendTo(this.$modalBodyOuter),this.$modalButtons=$('<div class="n2_modal__buttons" data-buttons="0"></div>').appendTo(this.$modalWindow)},t})),c.d("PreviewPopup",["$"],(function(){return function(t,s){var n=["height="+screen.availHeight,"width="+screen.availWidth,"toolbar=yes,scrollbars=yes,resizable=yes"].join(","),h=i.open(t,s,n);return h.moveTo(0,0),h.resizeTo(screen.availWidth,screen.availHeight),h}})),c.d("ModalGeneratorRecordViewer",["$"],(function(){var $=c.$;return function(t,i){this.createRecordModal=new c.ModalSimple("generator-record-viewer",{width:1e3,destroyOnHide:!0}),this.createRecordModal.addContent(c.UI.modalIcon("ssi_48 ssi_48--data","blue")),this.createRecordModal.addContent(c.UI.modalHeading(n2_("Records"))),function(t,i,s){var n=$('<div class="n2_generator_records_table"></div>').css("grid-template-columns","40px repeat("+(i.length-1)+", auto)").appendTo(t),h=0;for($('<div class="n2_generator_records_table__heading" data-col="1"></div>').text(i[h]).appendTo(n),h=1;h<i.length;h++)$('<div class="n2_generator_records_table__heading"></div>').text(i[h]).appendTo(n);for(h=0;h<s.length;h++){var r=0;for($('<div class="n2_generator_records_table__heading" data-col="1"></div>').text(s[h][r]).appendTo(n),r=1;r<s[h].length;r++)$('<div class="n2_generator_records_table__cell"></div>').html(s[h][r]).appendTo(n)}}(this.createRecordModal.getBody(),t,i),this.createRecordModal.show()}})),c.d("ModalHotkey",["$"],(function(){var $=c.$;function t(){var t=this.getHotkeys();this.modal=new c.ModalSimple("hotkey",{width:800}),this.modal.addContent(c.UI.modalIcon("ssi_48 ssi_48--keyboard","blue")),this.modal.addContent(c.UI.modalHeading(n2_("Keyboard shortcuts")));var i=$('<div class="n2_modal__hotkey"></div>');this.modal.addContent(i);for(var s=0;s<t.length;s++)for(var n=$('<div class="n2_modal__hotkey_column"></div>').appendTo(i),h=0;h<t[s].length;h++){var r=t[s][h][0],o=t[s][h][1],a=$('<div class="n2_modal__hotkey_group"></div>').appendTo(n);$('<div class="n2_modal__hotkey_title">'+r+"</div>").appendTo(a);for(var l=0;l<o.length;l++){var u=$('<div class="n2_modal__hotkey_row"></div>').appendTo(a),d=o[l][0];$('<div class="n2_modal__hotkey_text">'+d+"</div>").appendTo(u);for(var f=$('<div class="n2_modal__hotkey_keys"></div>').appendTo(u),_=o[l][1],v=0;v<_.length;v++)$('<div class="n2_modal__hotkey_key">'+_[v]+"</div>").appendTo(f)}}var p=c.UI.modalButton(n2_("Got it"),"blue");this.modal.addButton(p),p.on("click",function(e){this.modal.hide()}.bind(this))}t.prototype.getHotkeys=function(){var t="ctrl",i=[],s=[];this.isMac()&&(t="cmd");var n=[n2_("General"),[[n2_("Content tab"),["q"]],[n2_("Style tab"),["w"]]]];i.push(n),n[1].push([n2_("Add Layer"),["a"]],[n2_("Layer List"),["s"]]);var h=[n2_("View"),[[n2_("Preview"),[t,"1"]],[n2_("Desktop"),[t,"2"]],[n2_("Tablet"),[t,"3"]],[n2_("Mobile"),[t,"4"]]]];i.push(h);var r=[n2_("Adjust"),[[n2_("Move (Absolute)"),[n2_("Arrows")]],[n2_("Align (Absolute)"),[n2_("Numeric keys")]]]];i.push(r);var o=[n2_("Action"),[[n2_("Delete"),["del"]],[n2_("Duplicate"),[t,"d"]],[n2_("Copy"),[t,"c"]],[n2_("Paste"),[t,"v"]],[n2_("Undo"),[t,"z"]],[n2_("Redo"),[t,"shift","z"]],[n2_("Save"),[t,"s"]]]];s.push(o);var a=[n2_("Clear device specific settings"),[[n2_("Current layer, current device"),["shift","e"]],[n2_("Current layer, all devices"),["shift","alt","e"]],[n2_("All layers, current device"),["shift","r"]],[n2_("All layers, all devices"),["shift","alt","r"]]]];return s.push(a),[i,s]},t.prototype.isMac=function(){return navigator.platform.toUpperCase().indexOf("MAC")>=0},t.prototype.show=function(){this.modal.show()};var i=!1;function s(){}return s.show=function(){i||(i=new t),i.show()},s})),c.d("ModalSafeHTML",["$"],(function(){var $=c.$;return function(t){var s=new c.ModalSimple("safe-html",{destroyOnHide:!1,width:440});s.addContent(c.UI.modalHeading(n2_("Unexpected response")));var n=$(t.replace(/document\.write/g,"n2Write"));i.n2Write=function(t){s.addContent($("<span></span>").html(t))},n.each((function(t,i){s.addContent($(i))})),delete i.n2Write,s.show()}})),c.d("ModalUrlTabPro",["$"],(function(){var $=c.$;function t(t,i){$(".n2_free_need_more").eq(0).clone().appendTo(t)}return t.prototype.show=function(t){},t})),c.d("ModalUrlTabUrl",["$"],(function(){var $=c.$;function t(t,i){this.modalManager=i,this.cache={};var s=c.UI.modalFormRow(!0).appendTo(t);this.$url=c.UI.modalFieldText(s,"url",n2_("URL"),"");var n=c.UI.modalFormRow(!0).appendTo(t);this.$searchKeyword=c.UI.modalFieldText(n,"search-keyword",n2_("Search keyword"),"").on("keyup",this.search.bind(this)).trigger("focus");var h=c.UI.modalFormRow(!0).appendTo(t);this.$postSelector=c.UI.modalSelectList(h,"url-post",n2_("Posts"),function(t){this.$url.val(t.link)}.bind(this),{mode:"insert"})}return t.prototype.show=function(t){this.$url.val(t),this.$searchKeyword.val(""),this.search()},t.prototype.search=function(){this.searchString=this.$searchKeyword.val(),this.getAjaxSearchResult(this.searchString).done(function(t){if(this.$searchKeyword.val()===this.searchString){this.$postSelector.removeOptions();for(var i=t.data,s=0;s<i.length;s++)this.$postSelector.addOption(i[s].title,i[s].info,i[s])}}.bind(this))},t.prototype.getAjaxSearchResult=function(t){return this.cache[t]===r&&(this.cache[t]=$.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.modalManager.ajaxUrl),data:{keyword:t},dataType:"json"})),this.cache[t]},t.prototype.getResult=function(){return this.$url.val()},t})),c.d("ModalUrl",["$"],(function(){function t(t){this.ajaxUrl=t,this.activeTab="",this.modal=new c.ModalSimple("url-modal"),this.modal.addContent(c.UI.modalIcon("ssi_48 ssi_48--link","green").css("margin-bottom","20px")),this.uiTabs=c.UI.modalTabs(this.modal.getBody(),"url-tabs",{url:n2_("URL"),lightbox:n2_("Lightbox"),action:n2_("Action")},this.onTabActiveChange.bind(this)),this.tabs={},this.tabs.url=new c.ModalUrlTabUrl(this.uiTabs.tabs.url.$content,this),this.tabs.lightbox=new c.ModalUrlTabPro(this.uiTabs.tabs.lightbox.$content),this.tabs.action=new c.ModalUrlTabPro(this.uiTabs.tabs.action.$content);var i=c.UI.modalButton(n2_("Insert"),"green");this.modal.addButton(i),i.on("click",function(e){e.preventDefault(),this.setCallback(this.tabs[this.activeTab].getResult()),this.modal.hide()}.bind(this))}t.prototype.onTabActiveChange=function(t){this.activeTab=t,this.tabs[t].show(this.originalValue)},t.prototype.show=function(t,i){this.originalValue=t,this.setCallback=i,t.match(/lightbox\[(.+)\]/)?this.uiTabs.setActiveTab("lightbox"):t.match(/ScrollTo|ScrollToAlias|SlideEvent|ToSlide|ToSlideID|\[(.+)\]/)||t.match(/PreviousSlide|NextSlide|\[\]/)?this.uiTabs.setActiveTab("action"):this.uiTabs.setActiveTab("url"),this.modal.show()};var i=!1;function s(){}return s.show=function(s,n,h){i||(i=new t(n)),i.show(s,h)},s})),c.d("UI",["$"],(function(){var $=c.$,t={modalButton:function(t,i,s){return $('<a class="n2_button n2_button--'+(s=s||"big")+" n2_button--"+i+'" href="#"><span class="n2_button__label">'+t+"</span></a>")},modalIcon:function(t,i){return $('<div class="n2_modal__icon n2_modal__icon--'+i+'"><i class="'+t+'"></i></div>')},modalHeading:function(t){return $('<div class="n2_modal__heading"></div>').text(t)},modalSubHeading:function(t){return $('<div class="n2_modal__subheading"></div>').text(t)},modalParagraph:function(t){return $('<div class="n2_modal__paragraph"></div>').text(t)},modalParagraphHTML:function(t){return $('<div class="n2_modal__paragraph"></div>').html(t)},modalInput:function(t,i,s,n){return $('<input class="n2_modal__input" type="'+i+'" id="'+t+'" name="'+t+'" value="'+s+'" '+(n!==r?'placeholder="'+n+'"':"")+">")},modalFormTable:function(t){var i=$('<div class="n2_form__table"></div>');return $('<div class="n2_form__table_label"></div>').append($('<div class="n2_form__table_label_title"></div>').text(t)).appendTo(i),{$table:i,$content:$('<div class="n2_form__table_preview"></div>').appendTo(i)}},modalFormContainer:function(t,i){return $('<div class="n2_modal__form_container" data-field="'+i+'"></div>').appendTo(t)},modalHiddenContainer:function(t){return $('<div class="n2_modal__container_hidden"></div>').appendTo(t)},modalFormRow:function(t){return $('<div class="n2_modal__form_row"></div>').toggleClass("n2_modal__form_row--fullwidth",!0===t)},modalFormRowLarge:function(t){return $('<div class="n2_modal__form_row n2_modal__form_row--large"></div>').toggleClass("n2_modal__form_row--fullwidth",!0===t)},modalFieldWrapper:function(t,i,s){var n=$('<div class="n2_field" data-field="'+i+'"></div>').appendTo(t);return!1===s?n.addClass("n2_field--label-none"):""===s&&n.addClass("n2_field--label-placeholder"),s&&$('<div class="n2_field__label"><label for="modal-field-'+i+'">'+s+"</label></div>").appendTo(n),{$field:n,$element:$('<div class="n2_field__element"></div>').appendTo(n)}},modalFieldText:function(i,s,n,h){var r=t.modalFieldWrapper(i,s,n),o=$('<div class="n2_field_text"></div>').appendTo(r.$element),a=$('<input type="text" id="modal-field-'+s+'" name="'+s+'" autocomplete="off">').val(h).appendTo(o);return new c.FormElementText("modal-field-"+s),a},modalOnOff:function(i,s,n,h,r){var o=t.modalFieldWrapper(i,s,n),a=$('<div class="n2_field_onoff"><div class="n2_field_onoff__slider"><div class="n2_field_onoff__slider_bullet"></div></div><div class="n2_field_onoff__labels"><div class="n2_field_onoff__label n2_field_onoff__label_off">'+n2_("Off")+'</div><div class="n2_field_onoff__label n2_field_onoff__label_on">'+n2_("On")+"</div></div></div>").appendTo(o.$element),l=$('<input id="modal-field-'+s+'" name="'+s+'" value="'+h+'" type="hidden" autocomplete="off">').val(h).appendTo(a);return new c.FormElementOnoff("modal-field-"+s,r),l},modalSelect:function(i,s,n,h,r,o){o=w({isMultiple:!1,isOrderable:!1,orderDirection:"ASC",keepFirst:!0},o);let a=t.modalFieldWrapper(i,s,n),l=$(d(a.$element[0],"input",null,{id:"modal-field-"+s,name:s,value:r,type:"hidden",autocomplete:"off"})),u=p(a.$element[0],"n2_field_select"),f=d(u,"select",null,{id:"modal-field-"+s+"_select",name:"select"+s,autocomplete:"off"});if(o.isMultiple&&M(f,{multiple:"multiple",size:8}),o.isOrderable)h=Object.entries(h),o.keepFirst&&(o.keepFirst=h.shift()),h.sort(((t,i)=>("ASC"===o.orderDirection?t[1]<i[1]:t[1]>i[1])?-1:1)),o.keepFirst&&h.unshift(o.keepFirst),h.forEach((t=>{d(f,"option",null,{value:t[0]}).innerText=t[1]}));else for(var _ in h)d(f,"option",null,{value:_}).innerText=h[_];return new c.FormElementList("modal-field-"+s).insideChange(r),l},modalNumber:function(i,s,n,h,r){var o=100;switch((r=w({unit:!1,min:-Number.MAX_VALUE,max:Number.MAX_VALUE,wide:4,sublabel:""},r)).wide){case 2:o=20;break;case 3:o=26;break;case 4:o=32;break;case 5:o=44;break;case 6:o=60}var a=t.modalFieldWrapper(i,s,n),l=$('<div class="n2_field_text n2_field_number"></div>').appendTo(a.$element);""!==r.sublabel&&$('<div class="n2_field_number__unit"></div>').text(r.sublabel).appendTo(l);var u=$('<input id="modal-field-'+s+'" name="'+s+'" value="'+h+'" type="text" autocomplete="off">').css("width",o+"px").appendTo(l);return r.unit&&$('<div class="n2_field_number__unit"></div>').text(r.unit).appendTo(l),new c.FormElementNumber("modal-field-"+s,r.min,r.max),u},modalTextarea:function(i,s,n){var h=t.modalFieldWrapper(i,s,n),r=$('<div class="n2_field_textarea"></div>').appendTo(h.$element);return $('<textarea name="'+s+'" autocomplete="off"></textarea>').appendTo(r)},modalTable:function(i,s,n,h){var r=t.modalFieldWrapper(i,s,n);r.$field.addClass("n2_field_table");for(var o=$('<div class="n2_field_table__content"></div>').css("grid-template-columns","repeat("+h[0].length+", auto)").appendTo(r.$element),a=0;a<h.length;a++)for(var c=0;c<h[a].length;c++)$('<div class="n2_field_table__cell">'+h[a][c]+"</div>").appendTo(o);return o},modalSelectList:function(i,s,n,h,r){r=w({mode:"select"},r);var o=t.modalFieldWrapper(i,s,n),a=$('<div class="n2_field_select_list"></div>').appendTo(o.$element);return{getField:function(){return o.$field},addOption:function(t,i,s){$('<div class="n2_field_select_list__option"></div>').on("click",function(t,e){"select"===r.mode&&(o.$field.find(".n2_field_select_list__option--selected").removeClass("n2_field_select_list__option--selected"),$(e.currentTarget).addClass("n2_field_select_list__option--selected")),h(t)}.bind(this,s)).append($('<div class="n2_field_select_list__option_primary"></div>').text(t)).append($('<div class="n2_field_select_list__option_secondary"></div>').text(i)).appendTo(a)},removeOptions:function(){a.html("")}}},modalGeneratorVariableList:function(t,i,s,n,h,r){t.addContent(this.modalHeading(n2_(s)));var o=c.UI.modalFormRow(!0);t.addContent(o);var a,l=c.UI.modalFieldWrapper(o,n,h),u=$('<div class="n2_generator_variables"></div>').appendTo(l.$element),d=[];if(Number.isInteger(i))for(var f=1;f<=i;f++)d[f]=f;else d=i;for(var _ in d){var v=$('<div class="n2_generator_variables__variable"></div>');v.text(_).on("click",function(t){a.removeClass("n2_generator_variables__variable--selected"),this.addClass("n2_generator_variables__variable--selected"),r(t)}.bind(v,_)).appendTo(u)}(a=u.find(".n2_generator_variables__variable")).eq(0).addClass("n2_generator_variables__variable--selected")},modalTabs:function(t,i,s,n){var h=$('<div class="n2_modal_tab"></div>').appendTo(t),r=$('<div class="n2_modal_tab__tabs"></div>').appendTo(h),o=$('<div class="n2_modal_tab__tabs_contents"></div>').appendTo(h),a=!1,c={};function l(t){a&&a!==t&&(c[a].$button.removeClass("n2_modal_tab__tabs_button--active"),c[a].$content.removeClass("n2_modal_tab__tabs_content--active")),c[a=t].$button.addClass("n2_modal_tab__tabs_button--active"),c[a].$content.addClass("n2_modal_tab__tabs_content--active"),n(a)}for(var u in s)c[u]={$button:$('<div class="n2_modal_tab__tabs_button" data-tab="'+u+'">'+s[u]+"</div>").on("click",l.bind(this,u)).appendTo(r),$content:$('<div class="n2_modal_tab__tabs_content" data-tab="'+u+'"></div>').appendTo(o)};return{tabs:c,setActiveTab:l}},modalFieldSelectIcon:function(i,s,n,h,r,o){var a=t.modalFieldWrapper(i,s,n),l=$('<div class="n2_field_select_icon"></div>').appendTo(a.$element);for(var u in h)$('<div class="n2_field_select_icon__option"></div>').attr("data-value",u).toggleClass("n2_field_select_icon__option--selected",u===r).append('<div class="n2_field_select_icon__option_icon"><i class="'+h[u].icon+'"></i></div>').append('<div class="n2_field_select_icon__option_label">'+h[u].label+"</div>").append('<div class="n2_field_select_icon__selected_marker"><i class="ssi_16 ssi_16--check"></i></div>').appendTo(l);var d=$('<input id="modal-field-'+s+'" name="'+s+'" value="'+r+'" type="hidden">').appendTo(a.$element);return new c.FormElementSelectIcon("modal-field-"+s,o),d},modalNotice:function(i,s,n){var h=t.modalFieldWrapper(i,"notice",n2_("Notice"));return $('<div class="n2_field_message n2_field_message--'+n+'"></div>').html(n2_(s)).appendTo(h.$element)}};return t})),c.d("AutocompleteSimple",["$"],(function(){var $=c.$;return function(t,i){var s=$("#"+t);new c.UIAutocomplete(s,{positionTo:".n2_autocomplete_position_to",y:-2,appendTo:function(){return s.closest(".n2_container_scrollable, body")},source:function(){return i},select:function(t,i){$(this).val(i.value).trigger("change")}})}}));const jt={DecToHex:function(t){var i=Math.round(t).toString(16);return 1===i.length?"0"+i:i},HexToDec:function(t){return parseInt(t,16)},HSVtoRGB:function(t,i,s){var n,h,r,o,a,c,l,u;switch(c=s*(1-i),l=s*(1-(a=6*t-(o=Math.floor(6*t)))*i),u=s*(1-(1-a)*i),o%6){case 0:n=s,h=u,r=c;break;case 1:n=l,h=s,r=c;break;case 2:n=c,h=s,r=u;break;case 3:n=c,h=l,r=s;break;case 4:n=u,h=c,r=s;break;case 5:n=s,h=c,r=l}return[Math.round(255*n),Math.round(255*h),Math.round(255*r)]},HSVtoHex6:function(t,i,s){var n=jt.HSVtoRGB(t,i,s);return jt.DecToHex(n[0])+jt.DecToHex(n[1])+jt.DecToHex(n[2])},RGBtoHSV:function(t,i,s){var n=Math.max(t,i,s),h=n-Math.min(t,i,s),r=h&&(n==t?(i-s)/h:n==i?2+(s-t)/h:4+(t-i)/h);return[60*(r<0?r+6:r)/360,n&&h/n,n/255]},Hex6toHSV:function(t){return jt.RGBtoHSV(jt.HexToDec(t.substr(0,2)),jt.HexToDec(t.substr(2,2)),jt.HexToDec(t.substr(4,2)))},Hex8toRGBA:function(t){var i=1;return 8===t.length?i=jt.HexToDec(t.substr(6,2))/255:3===t.length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),[jt.HexToDec(t.substr(0,2)),jt.HexToDec(t.substr(2,2)),jt.HexToDec(t.substr(4,2)),i]},Hex8toCssRGBA:function(t){for(var i=jt.Hex8toRGBA(t),s=0;s<i.length;s++)isNaN(i[s])&&(i[s]=0,i[3]=0);return"RGBA("+i.join(",")+")"}};c.d("ColorPicker",(function(){class t{constructor(t){this._t=t,this.Mt=["000000","81898d","ced3d5","ffffff","55aa39","5cba3c","27ae60","2ecc71","357cbd","4594e1","01add3","00c1c4","bb4a28","d85935","e79d19","ecc31f","8757b2","9e74c2","e264af","ec87c0","000000CC","00000080","FFFFFFCC","FFFFFF80"],this.It=[];var i=localStorage.getItem("n2-colors");i&&(this.It=JSON.parse(i),this.It.splice(6))}initUI(t){var i=v();G(i,"n2_color_picker__palette"),t.appendChild(i);for(var s=["000000","81898d","ced3d5","ffffff","55aa39","5cba3c","27ae60","2ecc71","357cbd","4594e1","01add3","00c1c4","bb4a28","d85935","e79d19","ecc31f","8757b2","9e74c2","e264af","ec87c0","000000CC","00000080","FFFFFFCC","FFFFFF80"],n=0;n<s.length;n++){var h=v();G(h,"n2_color_picker__palette_item"),G(h,"n2_checker_box"),8===s[n].length&&G(h,"n2_color_picker__palette_item_alpha"),L(h,"--palette-item-color",jt.Hex8toCssRGBA(s[n])),i.appendChild(h);var r=v();G(r,"n2_color_picker__palette_item_color"),h.appendChild(r),at(h,"click",this._t.setColor.bind(this._t,s[n]))}this.Nt(t)}Nt(t){this.$t=[];var i=v();G(i,"n2_color_picker__palette_history"),t.appendChild(i);for(var s=0;s<6;s++){var n=v();G(n,"n2_color_picker__palette_item"),G(n,"n2_checker_box"),T(n,"color","ffffffff"),L(n,"--palette-item-color","#fff"),i.appendChild(n);var h=v();G(h,"n2_color_picker__palette_item_color"),n.appendChild(h),this.$t.push(n),at(n,"click",function(e){this._t.setColor(P(e.currentTarget,"color"))}.bind(this))}this.jt()}jt(){for(var t=0;t<this.It.length;t++)T(this.$t[t],"color",this.It[t]),L(this.$t[t],"--palette-item-color",jt.Hex8toCssRGBA(this.It[t]))}addHistoryColor(t){if(-1===this.Mt.indexOf(t)&&-1===this.It.indexOf(t)){this.It.unshift(t),this.It.splice(6);try{localStorage.setItem("n2-colors",JSON.stringify(this.It))}catch(t){}this.jt()}}}class n{constructor(t){this._t=t,this.Pt=[]}initUI(t){this.Tt=v(),G(this.Tt,"n2_color_picker__picker_canvas"),t.appendChild(this.Tt),this.Ft=v(),G(this.Ft,"n2_color_picker__picker_canvas_dot"),this.Tt.appendChild(this.Ft),this.Tt.addEventListener("pointerdown",this.At.bind(this))}At(e){this.Pt.push(ot(this._t.area,"pointermove",this.zt.bind(this))),this.Pt.push(ot(this._t.area,"pointerup",this.Lt.bind(this))),this.Pt.push(ot(this._t.area,"pointerleave",this.Et.bind(this))),this.Rt(e)}zt(e){this.Rt(e)}Lt(e){this.Rt(e),this.Ut()}Et(e){this.Ut()}Ut(){rt(this.Pt)}Rt(e){var t=this.Tt.getBoundingClientRect(),i=Math.max(0,Math.min(t.width,e.clientX-t.left)),s=Math.max(0,Math.min(t.height,e.clientY-t.top));this.Ft.style.setProperty("transform","translate("+i+"px, "+s+"px)"),this._t.setSaturationValue(i/t.width,1-s/t.height)}updateHue(t){this.Tt.style.setProperty("background-color","#"+jt.HSVtoHex6(t,1,1))}sync(){var t=this._t.currentSaturation,i=this._t.currentValue,s=this.Tt.getBoundingClientRect();this.Ft.style.setProperty("transform","translate("+s.width*t+"px, "+s.height*(1-i)+"px)")}}class h{constructor(t){this._t=t,this.Pt=[]}initUI(t){this.Bt=v(),G(this.Bt,"n2_color_picker__picker_hue"),t.appendChild(this.Bt),this.Ft=v(),G(this.Ft,"n2_color_picker__picker_hue_dot"),this.Bt.appendChild(this.Ft),this.Bt.addEventListener("pointerdown",this.At.bind(this))}At(e){this.Pt.push(ot(this._t.area,"pointermove",this.zt.bind(this))),this.Pt.push(ot(this._t.area,"pointerup",this.Lt.bind(this))),this.Pt.push(ot(this._t.area,"pointerleave",this.Et.bind(this))),this.Rt(e)}zt(e){this.Rt(e)}Lt(e){this.Rt(e),this.Ut()}Et(e){this.Ut()}Ut(){rt(this.Pt)}Rt(e){var t=this.Bt.getBoundingClientRect(),i=Math.max(0,Math.min(t.height,e.clientY-t.top));this.Ft.style.setProperty("transform","translateY("+i+"px)"),this._t.setHue(i/t.height)}sync(){var t=this._t.currentHue,i=this.Bt.getBoundingClientRect();this.Ft.style.setProperty("transform","translateY("+i.height*t+"px)")}}class r{constructor(t){this._t=t,this.Pt=[]}initUI(t){var i=v();G(i,"n2_color_picker__picker_opacity"),G(i,"n2_checker_box"),t.appendChild(i),this.Ht=v(),G(this.Ht,"n2_color_picker__picker_opacity_inner"),i.appendChild(this.Ht),this.Ft=v(),G(this.Ft,"n2_color_picker__picker_opacity_dot"),this.Ht.appendChild(this.Ft),this.Ht.addEventListener("pointerdown",this.At.bind(this))}At(e){this.Pt.push(ot(this._t.area,"pointermove",this.zt.bind(this))),this.Pt.push(ot(this._t.area,"pointerup",this.Lt.bind(this))),this.Pt.push(ot(this._t.area,"pointerleave",this.Et.bind(this))),this.Rt(e)}zt(e){this.Rt(e)}Lt(e){this.Rt(e),this.Ut()}Et(e){this.Ut()}Ut(){rt(this.Pt)}Rt(e){var t=this.Ht.getBoundingClientRect(),i=Math.max(0,Math.min(t.height,e.clientY-t.top));this.Ft.style.setProperty("transform","translateY("+i+"px)"),this._t.setOpacity(1-i/t.height)}update(){var t=this._t.rgb.join(",");this.Ht.style.setProperty("background-image","linear-gradient(180deg, RGBA("+t+", 1) 0%, RGBA("+t+", 0) 100%)")}sync(){var t=this._t.currentOpacity,i=this.Ht.getBoundingClientRect();this.Ft.style.setProperty("transform","translateY("+i.height*(1-t)+"px)")}}return new class{constructor(){this.Vt=0,this.Gt=0,this.Jt=0,this.Yt=0,this.Pt=[],this.qt=new t(this),this.Xt=new n(this),this.Zt=new h(this),this.Qt=new r(this)}Kt(){this.ti||(this.ti=v(),G(this.ti,"n2_color_picker"),this.qt.initUI(this.ti),this.Xt.initUI(this.ti),this.Zt.initUI(this.ti),this.Qt.initUI(this.ti),s.body.appendChild(this.ti))}get area(){return this.ti}get rgb(){return jt.HSVtoRGB(this.Vt,this.Gt,this.Jt)}get rgba(){var t=jt.HSVtoRGB(this.Vt,this.Gt,this.Jt);return t.push(this.opacity),t}get hex(){return jt.HSVtoHex6(this.Vt,this.Gt,this.Jt)}get hexa(){return jt.HSVtoHex6(this.Vt,this.Gt,this.Jt)+jt.DecToHex(Math.round(255*this.opacity))}get opacity(){return this.Yt}get cssRGB(){return"#"+this.hex}get cssRGBA(){return"RGBA("+this.rgba.join(",")+")"}get currentHue(){return this.Vt}get currentSaturation(){return this.Gt}get currentValue(){return this.Jt}get currentOpacity(){return this.Yt}updateUI(){this.Xt.updateHue(this.Vt),this.Qt.update()}setHue(t){this.Vt=t,this.updateUI(),this.updateTargetValue()}setSaturationValue(t,i){this.Gt=t,this.Jt=i,this.updateUI(),this.updateTargetValue()}setOpacity(t){this.Yt=t,this.updateTargetValue()}show(t,i,n,h,r){if(this.l=t,this.ii=i,this.si=!1,(6!==i.length&&8!==i.length||i.length>0&&"{"===i.charAt(0))&&(i="ffffff"),this.ni=n,this.ei=h,this.hi=r||function(){},this.Kt(),this.ni?this.ri={width:390,height:184}:this.ri={width:360,height:156},this.oi(),L(this.ti,"display",""),this.ti.classList.toggle("n2_color_picker--has-opacity",this.ni),8===i.length?(this.Yt=jt.HexToDec(i.substr(6,2))/255,i=i.substr(0,6)):this.Yt=1,6===i.length){var o=jt.Hex6toHSV(i);this.Vt=o[0],this.Gt=o[1],this.Jt=o[2]}this.Zt.sync(),this.Xt.sync(),this.Qt.sync(),this.updateUI(),this.Pt.push(ot(s,"scroll",this.detach.bind(this))),this.Pt.push(ot(s.body,"pointerdown",function(e){this.ti===e.target||this.ti.contains(e.target)||this.detach()}.bind(this),{capture:!0}))}detach(){var t=this.ni?this.hexa:this.hex;this.si&&this.ii!==t&&(this.ei(t),this.qt.addHistoryColor(t)),L(this.ti,"display","none"),rt(this.Pt)}oi(){var t=this.l.getBoundingClientRect(),s=t.top+t.height;s>i.innerHeight-this.ri.height-5&&(s=t.top-this.ri.height-5),E(this.ti,{left:Math.min(t.left,i.innerWidth-this.ri.width-5)+"px",top:s+"px"})}updateTargetValue(){this.si=!0,this.hi(this.ni?this.hexa:this.hex)}setColor(t){var i=t;if(8===t.length?(this.Yt=jt.HexToDec(t.substr(6,2))/255,i=i.substr(0,6)):this.Yt=1,6===i.length){var s=jt.Hex6toHSV(i);this.Vt=s[0],this.Gt=s[1],this.Jt=s[2]}this.Zt.sync(),this.Xt.sync(),this.Qt.sync(),this.updateUI(),this.updateTargetValue(),this.detach()}}})),c.d("Notification",["$"],(function(){var $=c.$;function t(){this.deferred=$.Deferred(),c.r("documentReady",this.ready.bind(this))}return t.prototype.ready=function(){this.$container=$('<div class="n2_notification_center n2_admin_ui"></div>').appendTo("body"),this.deferred.resolve()},t.prototype.error=function(t,i){i=w({wide:!1,heading:n2_("Oops, Something Went Wrong")},i);var s=new c.ModalSimple("notification error",{width:i.wide?1e3:440});s.addContent(c.UI.modalIcon("ssi_48 ssi_48--error","red")),s.addContent(c.UI.modalHeading(i.heading)),s.addContent(c.UI.modalParagraphHTML(t));var n=c.UI.modalButton(n2_("Got it"),"red");s.addButton(n),n.on("click",(function(e){e.preventDefault(),s.hide(e)})),s.show()},t.prototype.success=function(t){this.message("success",n2_("Success"),t,{timeout:3})},t.prototype.notice=function(t){this.message("notice",n2_("Notice"),t)},t.prototype.message=function(t,i,s,n){n=w({timeout:0},n);var h=$('<div class="n2_notification_center__message n2_notification_center__message--'+t+'"></div>').scrollTop(0).prependTo(this.$container);$('<div class="n2_notification_center__message_icon"><i class="ssi_24"></i></div>').appendTo(h);var r=$('<div class="n2_notification_center__message_content"></div>').appendTo(h);$('<div class="n2_notification_center__message_content_label">'+i+"</div>").appendTo(r),$('<div class="n2_notification_center__message_content_description">'+s+"</div>").appendTo(r),n.timeout?(h.one("mouseenter",(function(){h.remove()})),o((function(){h.remove()}),1e3*n.timeout)):$('<div class="n2_notification_center__message_action"></div>').text(n2_("Got it")).on("click",(function(){h.remove()})).appendTo(h),o(function(t){t.addClass("n2_notification_center__message--animate")}.bind(this,h),100)},new t})),c.d("Form",["$"],(function(){var $=c.$;function t(){this.skipChangeConfirm=!1,this.onChangeCallback=this.onChange.bind(this)}return t.prototype.setID=function(t){this.$form=$(t).data("form",this)},t.prototype.onReady=function(){this.window=$("#n2-admin")[0],this.initButtons(),this.resetChangeTracker(),this.registerBeforeUnload(),s.addEventListener("keydown",this.onKeyDown.bind(this),{capture:!0})},t.prototype.initButtons=function(){},t.prototype.resetChangeTracker=function(){this.hasChange=!1,this.window.addEventListener("nextendChange",this.onChangeCallback,{passive:!0,capture:!0}),this.window.addEventListener("change",this.onChangeCallback,{passive:!0,capture:!0}),this.$saveButton.addClass("n2_button--inactive")},t.prototype.onChange=function(){this.hasChange=!0,this.$saveButton.removeClass("n2_button--inactive"),this.window.removeEventListener("nextendChange",this.onChangeCallback,{passive:!0,capture:!0}),this.window.removeEventListener("change",this.onChangeCallback,{passive:!0,capture:!0})},t.prototype.onKeyDown=function(e){if(!e.defaultPrevented){var t=!1;e.ctrlKey||e.metaKey?"KeyS"===e.code&&(this.actionSave(),t=!0):"Escape"===e.code&&("INPUT"!==e.target.tagName&&"textarea"!==e.target.tagName||(e.target.blur(),t=!0)),t&&e.preventDefault()}},t.prototype.isChanged=function(){return this.hasChange},t.prototype.registerBeforeUnload=function(){i.addEventListener("beforeunload",this.actionUnload.bind(this))},t.prototype.actionUnload=function(e){if(!this.skipChangeConfirm&&this.isChanged()){var t=n2_("The changes you made will be lost if you navigate away from this page.");return e.returnValue=t,t}},t.prototype.actionSave=function(){},t.prototype.afterSave=function(){this.resetChangeTracker()},t})),c.d("FormElement",(function(){function t(){this.connectedField=null,this.element.data("field",this)}return t.prototype.triggerOutsideChange=function(){this.element[0].dispatchEvent(new CustomEvent("outsideChange",{cancelable:!1,bubbles:!0,detail:{field:this}})),this.element[0].dispatchEvent(new CustomEvent("nextendChange",{cancelable:!1,bubbles:!0,detail:{field:this}}))},t.prototype.triggerInsideChange=function(){this.element[0].dispatchEvent(new CustomEvent("insideChange",{cancelable:!1,bubbles:!0,detail:{field:this}})),this.element[0].dispatchEvent(new CustomEvent("nextendChange",{cancelable:!1,bubbles:!0,detail:{field:this}}))},t.prototype.focus=function(t){this.connectedField&&this.connectedField.focus(t)},t})),c.d("FormElementAutocomplete",["$","FormElementText"],(function(){var $=c.$;function t(t,i){this.tags=i,c.FormElementText.prototype.constructor.call(this,t),this.parent.find(".n2_field_text__clear").on("click",this.clear.bind(this)),new c.UIAutocomplete(this.element,{positionTo:".n2_field_autocomplete",y:-2,appendTo:function(){return this.element.closest(".n2_container_scrollable, body")}.bind(this),source:function(){return this.tags}.bind(this),select:function(t,i){var s=this.value.split(/,/);s.pop(),s.push(i.value),s.push(""),this.value=s.join(","),$(this).trigger("change")}})}return t.prototype=Object.create(c.FormElementText.prototype),t.prototype.constructor=t,t.prototype.clear=function(e){e.preventDefault(),this.element.val(""),this.change()},t})),c.d("BasicCSSFont",["$","BasicCSSSkeleton"],(function(){var $=c.$;function t(){this._singular="font",this._prular="fonts",c.BasicCSSSkeleton.prototype.constructor.apply(this,arguments),this.form={afont:$("#layer-font-family"),color:$("#layer-font-color"),size:$("#layer-font-size"),weight:$("#layer-font-weight"),lineheight:$("#layer-font-lineheight"),align:$("#layer-font-textalign"),underline:$("#layer-font-decoration"),italic:$("#layer-font-decoration"),letterspacing:$("#layer-font-letterspacing"),wordspacing:$("#layer-font-wordspacing"),texttransform:$("#layer-font-texttransform"),tshadow:$("#layer-font-tshadow"),extra:$("#layer-font-extracss")},this.loaded()}return t.prototype=Object.create(c.BasicCSSSkeleton.prototype),t.prototype.constructor=t,t.prototype.activateVisual=function(t){this.activeVisual=t,this.setValue(c.CSSRendererFont.transformData(this.visuals[t].value,this.visuals[t].mode)),this.setStates(c.CSSRendererFont.rendererModes[this.visuals[t].mode].tabs),c.BasicCSSSkeleton.prototype.activateVisual.call(this,t)},t.prototype.setValue=function(t){this.value=c.CSSRendererFont.fixBold(t)},t.prototype._transformsize=function(t){return t.split("||").join("|*|")},t.prototype._setsize=function(t,i){t.size=i.replace("|*|","||")},t.prototype._transformweight=function(t){return parseInt(t)},t.prototype._setweight=function(t,i){t.weight=parseInt(i)},t.prototype._transformunderline=function(t){return[1==this.value[this.activeState].italic?"italic":"",1==t?"underline":""].join("||")},t.prototype._setunderline=function(t,i){var s=i.split("||");t.underline="underline"===s[1]?1:0},t.prototype._transformitalic=function(t){return[1==t?"italic":"",1==this.value[this.activeState].underline?"underline":""].join("||")},t.prototype._setitalic=function(t,i){var s=i.split("||");t.italic="italic"===s[0]?1:0},t})),c.d("BasicCSSSkeleton",["$"],(function(){var $=c.$;function t(t){this.hasVisuals=!1,this.isInsideChange=!1,this.isReload=!1,this.manager=t,this.$container=t.$container.find('.n2_fields_layer_window[data-field="fieldset-layer-window-basiccss-'+this._singular+'"]'),this.$relatedContainers=t.$container.find('.n2_fields_layer_window[data-parent-design="fieldset-layer-window-basiccss-'+this._singular+'"]'),this.$containers=this.$container.add(this.$relatedContainers).attr("data-state","0"),this.elementField=$("#layerbasiccss-"+this._singular+"-element").data("field"),this.elementField.element.on("nextendChange",function(){this.activateVisual(this.elementField.element.val()),this.activateState(0)}.bind(this)),this.stateField=$("#layerbasiccss-"+this._singular+"-state").data("field"),this.stateField.element.on("nextendChange",function(){this.activateState(this.stateField.element.val())}.bind(this)),this.relatedElementFields=[],this.relatedStateFields=[],this.$relatedContainers.each(function(t,i){var s=$(i),n=s.find("#layerbasiccss-"+s.data("singular")+"-element").data("field"),h=s.find("#layerbasiccss-"+s.data("singular")+"-state").data("field");n.element.on("outsideChange",function(t){this.elementField.insideChange(t.val())}.bind(this,n.element)),h.element.on("outsideChange",function(t){this.stateField.insideChange(t.val())}.bind(this,h.element)),this.relatedElementFields.push(n),this.relatedStateFields.push(h)}.bind(this)),this.$containers.find('.n2_form__table_label_field[data-design-feature="reset-to-normal"] a').on("click",function(e){e.preventDefault(),this.value[this.activeState]={},this._lazySave(e),this.activateState(this.activeState)}.bind(this)),this.activeVisual=0,this.activeState=0}return t.prototype.loaded=function(){for(var t in this.form)this.form[t].on({nextendChange:this.changeValue.bind(this,t)})},t.prototype.changeValue=function(t,e){this.isReload||("function"==typeof this["_set"+t]?this["_set"+t](this.value[this.activeState],this.form[t].val()):this.value[this.activeState][t]=this.form[t].val(),this._lazySave(e))},t.prototype._lazySave=NextendDeBounce((function(e){this.isInsideChange=!0;var t=this.getData();this.visuals[this.activeVisual].field.save(e,t),this.visuals[this.activeVisual].value=t,this.isInsideChange=!1}),50),t.prototype.save=function(t){for(var i in this.isInsideChange=!0,t)this.visualsByName[i].field.save({},t[i]),this.visualsByName[i].value=t[i];this.isInsideChange=!1},t.prototype.getData=function(){return JSON.stringify({data:this.value})},t.prototype.load=function(t,i){if(this.hasVisuals=i.length>0,this.$containers.attr("data-elements",i.length),this.hasVisuals){var s={};this.visuals=[],this.visualsByName={};for(var n=0;n<i.length;n++){var h=i[n];this.visualsByName[h.name]={value:t[h.name],mode:h.mode,field:h.field},h.field.element.off(".basiccss").on("outsideChange.basiccss",this.loadSingleValue.bind(this,n,h.name)),this.visuals.push(this.visualsByName[h.name]),s[n]=h.field.getLabel()}this.elementField.setOptions(s);for(n=0;n<this.relatedElementFields.length;n++)this.relatedElementFields[n].setOptions(s);this.activateVisual(0),this.activateState(0)}},t.prototype.loadSingleValue=function(t){this.isInsideChange||(this.visuals[t].value=this.visuals[t].field.element.val(),this.activeVisual==t&&(this.activateVisual(t),this.activateState(this.activeState)))},t.prototype.activateVisual=function(t){for(var i=0;i<this.relatedElementFields.length;i++)parseInt(this.relatedElementFields[i].element.val())!==t&&this.relatedElementFields[i].insideChange(t)},t.prototype.setValue=function(t){this.value=t},t.prototype.setStates=function(t){for(var i={},s=0;s<t.length;s++)i[s]=t[s];this.stateField.setOptions(i);for(s=0;s<this.relatedStateFields.length;s++)this.relatedStateFields[s].setOptions(i)},t.prototype.activateState=function(t){var i;for(var s in t=Math.max(0,parseInt(t)),this.isReload=!0,this.activeState=t,this.$containers.attr("data-state",t),i=0===t?this.value[0]:w({},this.value[0],this.value[t]))this.form[s]!==r&&("function"==typeof this["_transform"+s]?this.form[s].data("field").insideChange(this["_transform"+s](i[s])):this.form[s].data("field").insideChange(i[s]));for(var n=0;n<this.relatedStateFields.length;n++)parseInt(this.relatedStateFields[n].element.val())!==t&&this.relatedStateFields[n].insideChange(t);this.isReload=!1},t.prototype.serialize=function(){if(this.hasVisuals){var t={};for(var i in this.visualsByName)t[i]=this.visualsByName[i].value;return t}return{}},t.prototype.unSerialize=function(t){for(var i in t)t.hasOwnProperty(i)&&(this.visualsByName[i].field.save({},t[i]),this.visualsByName[i].value=t[i])},t})),c.d("BasicCSSStyle",["$","BasicCSSSkeleton"],(function(){var $=c.$;function t(){this._singular="style",this._prular="styles",c.BasicCSSSkeleton.prototype.constructor.apply(this,arguments),this.form={backgroundcolor:$("#layer-style-backgroundcolor"),opacity:$("#layer-style-opacity"),padding:$("#layer-style-padding"),border:$("#layer-style-border"),borderradius:$("#layer-style-borderradius"),boxshadow:$("#layer-style-boxshadow"),extra:$("#layer-style-extracss")},this.loaded()}return t.prototype=Object.create(c.BasicCSSSkeleton.prototype),t.prototype.constructor=t,t.prototype.activateVisual=function(t){this.activeVisual=t,this.setValue(c.CSSRendererStyle.transformData(this.visuals[t].value,this.visuals[t].mode)),this.setStates(c.CSSRendererStyle.rendererModes[this.visuals[t].mode].tabs),c.BasicCSSSkeleton.prototype.activateVisual.call(this,t)},t})),c.d("BasicCSS",["$"],(function(){var $=c.$;function t(t,i){this.inPresetList=!1,this.$container=$("#"+t),this.options=w({ajaxUrl:""},i),this.throttleSetTimeout=null,this.throttleExitTimeout=null,this.storage={},this.assets={font:new c.BasicCSSFont(this),style:new c.BasicCSSStyle(this)},this.$preset=$('<div class="n2_layer_window_design_preset"><div class="n2_layer_window_design_preset__label_container"><div class="n2_layer_window_design_preset__label">'+n2_("Preset")+'</div><i class="ssi_16 ssi_16--info" data-tip-description="'+n2_("You can use presets to save style settings for later use. Clicking on any preset will load its styling to your current layer, and the previous style settings will be lost.")+'" data-tip-label="'+n2_("Preset")+'"></i></div></div>').prependTo(this.$container),this.$notice=$('<div class="n2_layer_window_notice n2_layer_window_notice__device_icon"><div class="n2_field" data-field="layerslide-background-notice-image"><div class="n2_field__label"><label for="layerslide-background-notice-image">Note</label></div><div class="n2_field__element"><div class="n2_field_message n2_field_message--warning">'+n2_("Layer design options affect every device. If you need to make responsive adjustments, look for the options with the device icon.")+"</div></div></div></div>").prependTo(this.$container);var s=$('<div class="n2_layer_window_design_preset__fields"></div>').appendTo(this.$preset),n=$('<div class="n2_layer_window_design_preset__fields_secondary"></div>').appendTo(s);$('<a class="n2_layer_window_design_preset__button_secondary" href="#" data-n2tip="'+n2_("Reset style to default")+'"><i class="ssi_16 ssi_16--reset"></i></a>').on("click",function(e){e.preventDefault(),this.exitPresetList(this.defs,e)}.bind(this)).appendTo(n),$('<a class="n2_layer_window_design_preset__button_secondary" href="#" data-n2tip="'+n2_("Save style as new preset")+'"><i class="ssi_16 ssi_16--save"></i></a>').on("click",function(e){e.preventDefault(),this.saveAsNew()}.bind(this)).appendTo(n),this.$presets=$('<div class="n2_layer_window_design_preset__presets"></div>').insertAfter(this.$preset),$('<a class="n2_layer_window_design_preset__button_choose" data-n2tip="'+n2_("Load style")+'" href="#"><i class="ssi_16 ssi_16--plus"></i></a>').on("click",function(e){e.preventDefault(),this.showList()}.bind(this)).appendTo(s),$('<a class="n2_layer_window_design_preset__button_back" href="#"><i class="ssi_16 ssi_16--remove"></i></a>').on("click",function(e){e.preventDefault(),this.exitPresetList(!1,e)}.bind(this)).appendTo(s),c._basicCSS=this}return t.prototype.showList=function(){this.inPresetList=!0,this.lastState=this.serialize(),this.$presets.on("mouseleave",function(){this.throttledUnSerialize(this.lastState)}.bind(this)),$.when(this.loadType()).done(function(t){0===this.storage[this.type].data("presets")?(c.Notification.notice(n2_("You have not created any presets for this layer yet.")),this.deActivate()):(this.$presets.append(this.storage[this.type]),$(".n2_ss_layer_window").addClass("n2_ss_layer_window--show-presets"),$(".n2_ss_layer_window__tab_container").scrollTop(0))}.bind(this))},t.prototype.activate=function(t,i,s){this.inPresetList&&this.exitPresetList(!1),this.type&&this.type!==t&&this.storage[this.type]!==r&&this.storage[this.type].detach();var n=!1;for(var h in this.defs={font:[],style:[]},this.type=t,this.assets){for(var o=0;o<s[h].length;o++)this.defs[h][s[h][o].name]=s[h][o].def;this.assets[h].load(i,s[h]),n=n||this.assets[h].hasVisuals}this.$container.toggleClass("n2_ss_design_layer_window_design--visible",n)},t.prototype.deActivate=function(){this.inPresetList&&this.exitPresetList(!1)},t.prototype.serialize=function(){var t={};for(var i in this.assets)t[i]=this.assets[i].serialize();return t},t.prototype.unSerialize=function(t){this.assets.font.unSerialize(t.font),this.assets.style.unSerialize(t.style)},t.prototype.throttledUnSerialize=function(t){this._addThrottledRenderTimeout(this.unSerialize.bind(this,t))},t.prototype.saveAsNew=function(t){var i=new c.ModalSimple("section-save-as",{destroyOnHide:!1,width:440});i.addContent(c.UI.modalIcon("ssi_48 ssi_48--plus","green")),i.addContent(c.UI.modalHeading(n2_("Save as")));var s=c.UI.modalFormRow(!0);i.addContent(s);var n=c.UI.modalFieldText(s,"name",n2_("Name"),""),h=c.UI.modalButton(n2_("Save as"),"green");i.addButton(h),h.on("click",function(e){e.preventDefault();var t=n.val();""===t?c.Notification.error(n2_("Please fill the name field!")):c.AjaxHelper.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.options.ajaxUrl,{nextendaction:"addVisual"}),data:{type:this.type,value:c.Base64.encode(JSON.stringify({name:t,data:this.serialize()}))},dataType:"json"}).done(function(t){$.when(this.loadType()).done(function(){this.addVisual(t.data.visual).prependTo(this.storage[this.type])}.bind(this)),i.hide(e),c.Notification.success(n2_("Preset saved."))}.bind(this))}.bind(this)),i.show()},t.prototype.loadType=function(){if(this.storage[this.type]===r){var t=$.Deferred(),s=function(i){this.storage[this.type]=$('<div class="n2_layer_window_design_preset__presets_list"></div>').data("presets",0);for(var s=0;s<i.length;s++)this.addVisual(i[s]);t.resolve()}.bind(this);i[this.type]===r?(this.storage[this.type]=t,c.AjaxHelper.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.options.ajaxUrl,{nextendaction:"loadVisuals"}),data:{type:this.type},dataType:"json"}).done(function(t){s(t.data.visuals)}.bind(this))):s(i[this.type])}return this.storage[this.type]},t.prototype.addVisual=function(t){var i=t.value;"{"!==i[0]&&(i=c.Base64.decode(i));var s=JSON.parse(i),n=$('<div class="n2_layer_window_design_preset__preset_list_preset"><span>'+s.name+"</span></div>").on({mouseenter:function(t,e){this.throttledUnSerialize(t.data)}.bind(this,s),click:function(t,e){e.preventDefault(),this.exitPresetList(t,e)}.bind(this,s.data)}).appendTo(this.storage[this.type]);if(this.storage[this.type].data("presets",this.storage[this.type].data("presets")+1),t.id>1e4){var h=$('<div class="n2_layer_window_design_preset__preset_list_preset_buttons"></div>').appendTo(n);$('<div class="n2_layer_window_design_preset__preset_list_preset_button" data-n2tip="'+n2_("Overwrite preset")+'"><i class="ssi_16 ssi_16--save"></i></div>').on("click",function(t,i,e){e.stopPropagation(),c.AjaxHelper.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.options.ajaxUrl,{nextendaction:"changeVisual"}),data:{visualId:t,value:c.Base64.encode(JSON.stringify({name:i,data:this.lastState})),type:this.type},dataType:"json"}).done(function(t){n.replaceWith(this.addVisual(t.data.visual)),this.storage[this.type].data("presets",this.storage[this.type].data("presets")-1),c.Notification.success(n2_("Preset saved."))}.bind(this))}.bind(this,t.id,s.name)).appendTo(h),$('<div class="n2_layer_window_design_preset__preset_list_preset_button"><i class="ssi_16 ssi_16--delete"></i></div>').on("click",function(t,e){e.preventDefault(),e.stopPropagation(),c.AjaxHelper.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.options.ajaxUrl,{nextendaction:"deleteVisual"}),data:{visualId:t,type:this.type},dataType:"json"}).done(function(t){n.remove(),this.storage[this.type].data("presets",this.storage[this.type].data("presets")-1),c.Notification.success(n2_("Preset deleted."))}.bind(this))}.bind(this,t.id)).appendTo(h),c._tooltip.add(h)}return n},t.prototype.exitPresetList=function(t,e){this.throttleSetTimeout&&a(this.throttleSetTimeout),this.$presets.off("mouseleave"),t?(this.inPresetList=!1,this.unSerialize(t)):this.unSerialize(this.lastState),$(".n2_ss_layer_window").removeClass("n2_ss_layer_window--show-presets"),$(".n2_ss_layer_window__tab_container").scrollTop(0),this.inPresetList=!1},t.prototype._addThrottledRenderTimeout=function(t){this.throttleSetTimeout&&a(this.throttleSetTimeout),this.throttleSetTimeout=o(t,100)},t.prototype._addThrottledExitTimeout=function(t){this.throttleExitTimeout&&a(this.throttleExitTimeout),this.throttleExitTimeout=o(t,100)},t})),c.d("FormElementBreakpoint",["$"],(function(){var $=c.$;function t(t,i){this.$container=$("#"+t).find(".n2_field_breakpoint__breakpoint_container"),this.options=w({orientation:"",devices:[],fields:{},enables:!1,global:!1},i),this.hasEnables=!!this.options.enables,this.useGlobal=!1,this.$container.toggleClass("n2_field_breakpoint--with-enables",this.hasEnables),this.$orientationField=$("#"+this.options.orientation).on("nextendChange",this.onOrientationChanged.bind(this)),this.breakpoints={},$('<div class="n2_field_breakpoint__breakpoint_start"><div class="n2_field_breakpoint__breakpoint_label_container"><div class="n2_field_breakpoint__breakpoint_label">0</div></div></div>').prependTo(this.$container),this.$devices=this.$container.find(".n2_field_breakpoint__device"),this.options.global&&(this.$useGlobalField=$("#"+this.options.global.field).on("nextendChange",this.syncUseGlobal.bind(this)),this.useGlobal="1"===this.$useGlobalField.val(),this.syncUseGlobal());for(var s=!1,n=!1,h=0;h<this.$devices.length;h++){var o=this.createBreakpoint(this.$devices.eq(h),s);o!==r?(n?o.$breakpoint.insertBefore(o.$device):o.$breakpoint.insertAfter(o.$device),s=o):n=!0}this.options.global&&this.syncUseGlobal(),$('<div class="n2_field_breakpoint__breakpoint_end"><div class="n2_field_breakpoint__breakpoint_label_container"><div class="n2_field_breakpoint__breakpoint_label">&infin;</div></div></div>').appendTo(this.$container)}function i(t,i,s,n){this.parentField=t,this.prev=n,n&&n.setNext(this),this.next=!1,this.disableEdit=!1,this.orientation="portrait",this.device=i,this.$device=s,this.$breakpoint=$('<div class="n2_field_breakpoint__breakpoint" data-id="'+i+'"><div class="n2_field_breakpoint__breakpoint_divider"></div></div>'),this.$fieldPortrait=$("#"+t.options.fields[i+"-portrait"]),this.$fieldLandscape=$("#"+t.options.fields[i+"-landscape"]),this.$labelContainer=$('<div class="n2_field_breakpoint__breakpoint_label_container"></div>').appendTo(this.$breakpoint),$('<div class="n2_field_breakpoint__breakpoint_label_rename"><i class="ssi_16 ssi_16--rename"></i></div>').on("click",this.edit.bind(this)).appendTo(this.$labelContainer),this.$labelPortrait=$('<div class="n2_field_breakpoint__breakpoint_label" data-orientation="portrait"></div>').text(this.$fieldPortrait.val()).appendTo(this.$labelContainer),this.$labelLandscape=$('<div class="n2_field_breakpoint__breakpoint_label" data-orientation="landscape"></div>').text(this.$fieldLandscape.val()).appendTo(this.$labelContainer),t.hasEnables&&t.options.enables[i]&&(this.$enableField=$("#"+t.options.enables[i]),this.enableField=this.$enableField.data("field"),this.isEnabled=1===parseInt(this.$enableField.val()),this.syncEnabledClass(),this.$device.append('<div class="n2_field_breakpoint__device_disable"><i class="ssi_16 ssi_16--remove"></i></div>'),this.$device.on("click",this.toggleEnable.bind(this)))}return t.prototype.syncUseGlobal=function(){for(var t in this.useGlobal="1"===this.$useGlobalField.val(),this.breakpoints)this.breakpoints[t].syncUseGlobal(this.useGlobal)},t.prototype.createBreakpoint=function(t,s){var n=t.data("id");return"desktopportrait"!==n?(this.breakpoints[n]=new i(this,n,t,s),this.breakpoints[n]):r},t.prototype.onOrientationChanged=function(){var t=this.$orientationField.val();for(var i in this.breakpoints)this.breakpoints[i].setOrientation(t);this.$container.attr("data-orientation",t)},i.prototype.setOrientation=function(t){this.orientation=t},i.prototype.setNext=function(t){this.next=t},i.prototype.getValue=function(){return parseInt(this.$fieldPortrait.val())},i.prototype.syncUseGlobal=function(t){t?(this.disableEdit=!0,this.$labelPortrait.text(this.parentField.options.global.values[this.device+"-portrait"]),this.$labelLandscape.text(this.parentField.options.global.values[this.device+"-landscape"])):(this.disableEdit=!1,this.$labelPortrait.text(this.$fieldPortrait.val()),this.$labelLandscape.text(this.$fieldLandscape.val())),this.$labelContainer.toggleClass("n2_field_breakpoint__breakpoint_label_container--disable-edit",this.disableEdit)},i.prototype.toggleEnable=function(e){e.preventDefault(),this.isEnabled=!this.isEnabled,this.enableField.insideChange(this.isEnabled?1:0),this.syncEnabledClass()},i.prototype.syncEnabledClass=function(){this.$device.toggleClass("n2_field_breakpoint__device--enabled",this.isEnabled),this.$breakpoint.toggleClass("n2_field_breakpoint__breakpoint--enabled",this.isEnabled),$("body").attr("data-"+this.device,this.isEnabled?1:0)},i.prototype.edit=function(e){var t="portrait"===this.orientation?this.$labelPortrait:this.$labelLandscape,i="portrait"===this.orientation?this.$fieldPortrait:this.$fieldLandscape;this.disableEdit||"true"===t[0].contentEditable||(e.preventDefault(),new c.InlineTextEditor(t[0],{filter:this.onFilter.bind(this),onSave:this.onSave.bind(this,i,t),onCancel:this.onCancel.bind(this,i,t)}))},i.prototype.onFilter=function(t){return t.replace(/[^0-9]/gi,"").replace(/^[0]+/gi,"").substr(0,4)},i.prototype.onSave=function(t,i,s){(s=parseInt(s))?(s=Math.max(100,Math.min(99999,parseInt(s))),t.val(s).trigger("change"),i.text(s)):this.onCancel(t,i)},i.prototype.onCancel=function(t,i){i.text(parseInt(t.val()))},t})),c.d("FormElementButtonMoreLess",["$"],(function(){var $=c.$;function t(t,i){if(this.$button=$("#"+t).on("click",this.switchState.bind(this)),this.options=w({labelMore:"",labelLess:"",relatedFields:[]},i),this.shownMore=!1,this.relatedFields=$(""),i.relatedFields!==r&&i.relatedFields.length)for(var s=0;s<i.relatedFields.length;s++)this.relatedFields=this.relatedFields.add($('[data-field="'+i.relatedFields[s]+'"]'));this.syncState()}return t.prototype.switchState=function(e){e.preventDefault(),this.shownMore=!this.shownMore,this.shownMore?this.$button.text(this.options.labelLess):this.$button.text(this.options.labelMore),this.syncState()},t.prototype.syncState=function(){this.relatedFields.toggleClass("n2_form_element--hidden",!this.shownMore)},t})),c.d("FormElementCheckboxOnOff",["$","FormElement"],(function(){var $=c.$;function t(t,i){if(this.separator="||",this.element=$("#"+t),this.$parent=this.element.parent(),this.options=w({invert:!1},i),this.relatedFields=$(""),i.relatedFields!==r&&i.relatedFields.length){for(var s=0;s<i.relatedFields.length;s++)this.relatedFields=this.relatedFields.add($('[data-field="'+i.relatedFields[s]+'"]'));this.setValue(parseInt(this.element.val())?1:0)}c.FormElement.prototype.constructor.call(this),this.$parent.on("click",this.switchCheckbox.bind(this))}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.switchCheckbox=function(){this.setValue(parseInt(this.element.val())?0:1),this.triggerOutsideChange()},t.prototype.setValue=function(t){this.element.val(t);var i=!1;this.options.invert||1!==t?this.options.invert&&1!==t&&(i=!0):i=!0,this.$parent.toggleClass("n2_field_checkbox_onoff--active",i),this.relatedFields.toggleClass("n2_form_element--hidden",this.options.invert?i:!i)},t.prototype.insideChange=function(t){this.setValue(parseInt(t)?1:0),this.triggerInsideChange()},t})),c.d("FormElementColor",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.elementInner=this.element[0].parentNode.querySelector(".n2-field-color-preview-inner"),this.elementInnerSMW=c.MW.k(this.elementInner),this.alpha=1===i,this.element.on("change",this.onChange.bind(this)),this.text=this.element.data("field"),c.FormElement.prototype.constructor.call(this),this.syncUI(),at(this.elementInner,"click",this.showColorPicker.bind(this))}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.syncUI=function(){this.elementInnerSMW.background=jt.Hex8toCssRGBA(this.element.val())},t.prototype.showColorPicker=function(){c.ColorPicker.show(this.element[0].parentNode,this.element.val(),this.alpha,this.notifySaveCallback.bind(this),this.notifyChangeCallback.bind(this))},t.prototype.notifyChangeCallback=function(t){this.element.val(t),this.triggerOutsideChange(),this.syncUI()},t.prototype.notifySaveCallback=function(t){this.element.val(t),this.element.trigger("change")},t.prototype.onChange=function(e){var t=this.element.val().trim(),i=t;let s=t.match(/^{[a-z0-9()\/-]+}$/i);if(0===t.length)t=this.alpha?"00000000":"000000";else{var n=/rgb\((\d{1,3}), ?(\d{1,3}), ?(\d{1,3})\)/i.exec(t);if(n&&(t=jt.DecToHex(n[1])+jt.DecToHex(n[2])+jt.DecToHex(n[3])),this.alpha){var h=/rgba\((\d{1,3}), ?(\d{1,3}), ?(\d{1,3}), ?([0-9.]+)\)/i.exec(t);if(h){var r=+h[4];isNaN(r)&&(r=1),t=jt.DecToHex(h[1])+jt.DecToHex(h[2])+jt.DecToHex(h[3])+jt.DecToHex(Math.floor(255*r))}}if(!(s||n&&h)&&8!==(t=t.match(/^#?([A-F0-9]+)$/i)?.[1]??"").length)switch(t.length){case 3:t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2];case 6:this.alpha&&(t+="ff");break;default:t=this.alpha?"FFFFFF00":"FFFFFF"}}i!==t&&this.element.val(t),this.triggerInsideChange(),this.triggerOutsideChange(),this.syncUI(),e&&e.stopImmediatePropagation()},t.prototype.insideChange=function(t){this.element.val(t),this.triggerInsideChange(),this.syncUI()},t})),c.d("FormElementDecoration",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.separator="||",this.element=$("#"+t),this.values=i,this.checkboxes=this.element.parent().find(".n2_field_decoration__option"),this.states=this.element.val().split(this.separator);for(var s=0;s<this.checkboxes.length;s++)this.states[s]!==r&&this.states[s]===this.values[s]||(this.states[s]=""),this.checkboxes.eq(s).on("click",this.switchCheckbox.bind(this,s));c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.switchCheckbox=function(t){this.states[t]===this.values[t]?(this.states[t]="",this.setSelected(t,0)):(this.states[t]=this.values[t],this.setSelected(t,1)),this.element.val(this.states.join(this.separator)),this.triggerOutsideChange()},t.prototype.insideChange=function(t){for(var i=t.split(this.separator),s=0;s<this.checkboxes.length;s++)i[s]===r||i[s]!==this.values[s]?(this.states[s]="",this.setSelected(s,0)):(this.states[s]=this.values[s],this.setSelected(s,1));this.element.val(this.states.join(this.separator)),this.triggerInsideChange()},t.prototype.setSelected=function(t,i){this.checkboxes.eq(t).toggleClass("n2_field_decoration__option--selected",1===i)},t})),c.d("FormElementDevice",["FormElementOnoff"],(function(){function t(t){c.FormElementOnoff.prototype.constructor.call(this,t,{values:{0:1,1:0}})}return t.prototype=Object.create(c.FormElementOnoff.prototype),t.prototype.constructor=t,t.prototype.detach=function(){this.onoff.detach()},t.prototype.syncOff=function(){this.onoff.removeClass("n2_field_radio__option--selected")},t.prototype.syncOn=function(){this.onoff.addClass("n2_field_radio__option--selected")},t})),c.d("FormElementDevices",["$","FormElementDevice"],(function(){var $=c.$;function t(t,i){this.$el=$("#"+t).data("field",this),this.fields={};for(var s=0;s<i.length;s++)this.fields[i[s]]=new c.FormElementDevice(t+"-"+i[s])}return t.prototype.setAvailableDevices=function(t){for(var i in t){var s=this.fields[i.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()];!t[i]&&s&&s.detach()}this.$el.children().first().addClass("n2-first"),this.$el.children().last().addClass("n2-last")},t})),c.d("FormElementFolders",["FormElementText"],(function(){function t(t,i){c.FormElementText.prototype.constructor.call(this,t),this.parameters=i,this.parent.find(".n2_field_text__clear").on("click",this.clear.bind(this)),this.parent.find(".n2_field_text__choose").on("click",this.show.bind(this)),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElementText.prototype),t.prototype.constructor=t,t.prototype.clear=function(e){e.preventDefault(),this.val("")},t.prototype.val=function(t){this.element.val(t),this.change()},t.prototype.show=function(e){e.preventDefault(),this.modal=new c.ModalLightbox(n2_("Choose folder"),"filesystem"),this.modal.addContent(c._browse.getNode("folder"));var t=c.UI.modalButton(n2_("Select"),"green").on("click",function(e){e.preventDefault(),this.modal.hide(e),this.val(c._browse.getCurrentFolder())}.bind(this));this.modal.addButton(t),this.modal.show()},t})),c.d("FormElementFontHidden",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.parameters=w({mode:"",label:""},i),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.getLabel=function(){return this.parameters.label},t.prototype.save=function(e,t){this.val(t)},t.prototype.val=function(t){this.element.val(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t),this.triggerInsideChange()},t.prototype.renderFont=function(){return c.CSSRendererFont.addCSS("",c.CSSRendererFont.getClass(),this.element.val(),c.CSSRendererFont.rendererModes[this.parameters.mode])},t})),c.d("FormElementFont",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.parent=this.element.parent(),this.parameters=w({mode:"",label:"",style:"",style2:"",preview:""},i),c.FormElement.prototype.constructor.call(this),this.parent.on("click",this.show.bind(this))}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.getLabel=function(){return this.parameters.label},t.prototype.show=function(e){e.preventDefault(),""!==this.parameters.style&&c._fontManager.setConnectedStyle(this.parameters.style),""!==this.parameters.style2&&c._fontManager.setConnectedStyle2(this.parameters.style2),c._fontManager.setFieldID(this.element.attr("id")),c._fontManager.show(this.element.val(),this.save.bind(this),{previewMode:this.parameters.mode,previewHTML:this.parameters.preview})},t.prototype.save=function(e,t){this.val(t)},t.prototype.val=function(t){this.element.val(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t),this.triggerInsideChange()},t.prototype.renderFont=function(){return c.CSSRendererFont.addCSS("",c.CSSRendererFont.getClass(),this.element.val(),c.CSSRendererFont.rendererModes[this.parameters.mode])},t})),c.d("FormTabbed",["$"],(function(){var $=c.$;function t(t,i){if(this.options=w({toggleMode:!1,sessionID:""},i),this.id=t,this.$buttons=$('.n2_form__tab_button[data-related-form="'+t+'"]'),this.$tabs=$('.n2_form__tab[data-related-form="'+t+'"]'),this.$buttons.on("click",this.showTab.bind(this)),!this.options.toggleMode){var s=this.$buttons.eq(0).data("related-tab");""!==this.options.sessionID&&(s=sessionStorage.getItem(this.options.sessionID));var n=this.$buttons.filter('[data-related-tab="'+s+'"]');0===n.length&&(n=this.$buttons.eq(0)),n.triggerHandler("click")}}return t.prototype.showTab=function(e){e.preventDefault();var t=$(e.currentTarget),i=t.data("related-tab");this.$buttons.removeClass("n2_form__tab_button--active"),this.$tabs.removeClass("n2_form__tab--active"),this.options.toggleMode&&this.currentTab===i?delete this.currentTab:(t.addClass("n2_form__tab_button--active"),this.$tabs.filter('[data-tab="'+i+'"]').addClass("n2_form__tab--active"),this.currentTab=i,""!==this.options.sessionID&&sessionStorage.setItem(this.options.sessionID,i))},t})),c.d("FormElementGap",["FormElementMixed"],(function(){function t(t,i,s){this.linkedValues=!1,c.FormElementMixed.prototype.constructor.apply(this,arguments),this.$field=this.element.parent(),this.$field.find(".n2_field_margin_padding__pre_label").on("click",function(e){e.preventDefault(),this.linkedValues=!this.linkedValues,this.$field.toggleClass("n2_field_margin_padding--linked-values",this.linkedValues),this.linkedValues&&this.elements[0].trigger("change")}.bind(this)),this.refresh()}return t.prototype=Object.create(c.FormElementMixed.prototype),t.prototype.constructor=t,t.prototype.onFieldChange=function(){if(this.linkedValues)for(var t=this.elements[0].val(),i=1;i<2;i++)this.elements[i].data("field").insideChange(t);this.element.val(this.getValue()),this.triggerOutsideChange()},t.prototype.insideChange=function(t){c.FormElementMixed.prototype.insideChange.apply(this,arguments),this.refresh()},t.prototype.refresh=function(){this.linkedValues=!0;for(var t=this.elements[0].val(),i=1;i<2;i++)if(t!==this.elements[i].val()){this.linkedValues=!1;break}this.$field.toggleClass("n2_field_margin_padding--linked-values",this.linkedValues)},t.prototype.relatedFieldsOff=function(){return"0|*|0"===this.element.val()},t.prototype.isEmpty=function(t){return"|*|"===t||"0|*|0"===t},t})),c.d("FormElementIconTab",["$","FormElement"],(function(){var $=c.$;function t(t,i){if(this.options=w({relatedValueFields:[],relatedAttribute:""},i),this.parent=$("#"+t+"_icon_tab"),this.parent.find(".n2_field_icon_tab__option").each(function(t,i){$(i).on("click",function(e){this.onClick($(e.currentTarget))}.bind(this))}.bind(this)),this.element=$("#"+t).on("change",this.onHiddenChange.bind(this)),this.relatedValueFields=!1,this.options.relatedValueFields.length){var s=this.element.val();this.relatedValueFields=$("");for(var n=0;n<this.options.relatedValueFields.length;n++)for(var h,r=0;r<this.options.relatedValueFields[n].field.length;r++)(h=$('[data-field="'+this.options.relatedValueFields[n].field[r]+'"]').data("show-values",this.options.relatedValueFields[n].values)).toggleClass("n2_form_element--hidden",-1===this.options.relatedValueFields[n].values.indexOf(s)),this.relatedValueFields=this.relatedValueFields.add(h)}if(""!==this.options.relatedAttribute){var o=$("#n2-admin").attr("data-"+this.options.relatedAttribute,this.element.val());this.element.on("nextendChange",function(){o.attr("data-"+this.options.relatedAttribute,this.element.val())}.bind(this))}c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onHiddenChange=function(){var t=this.element.val();t&&this.insideChange(t)},t.prototype.onClick=function(t){t.hasClass("n2_field_icon_tab__option--selected")||(this.parent.find(".n2_field_icon_tab__option--selected").removeClass("n2_field_icon_tab__option--selected"),t.addClass("n2_field_icon_tab__option--selected"),this.setHiddenValue(t.attr("data-ssoption")),this.triggerOutsideChange())},t.prototype.insideChange=function(t){this.setHiddenValue(t);var i=this.parent.find('.n2_field_icon_tab__option[data-ssoption="'+t+'"]');this.onClick(i),this.triggerInsideChange()},t.prototype.setHiddenValue=function(t){this.element.val(t),this.relatedValueFields&&this.relatedValueFields.each((function(){var i=$(this);i.toggleClass("n2_form_element--hidden",-1===i.data("show-values").indexOf(t))}))},t})),c.d("FormElementIcon2Manager",["$","FormElement"],(function(){var $=c.$;function t(t){this.element=$("#"+t),this.parent=this.element.parent(),c.FormElement.prototype.constructor.call(this),this.parent.find(".n2_field_chooser__clear").on("click",this.clear.bind(this)),this.parent.find(".n2_field_chooser__choose").on("click",this.openModal.bind(this)),this.$preview=this.parent.find(".n2_field_icon__preview").on("click",this.openModal.bind(this)),this.updateIsEmpty()}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.isEmpty=function(t){return""===t},t.prototype.clear=function(e){e.preventDefault(),this.val("")},t.prototype.insideChange=function(t){this.updatePreview(t),this.element.val(t),this.updateIsEmpty(),this.triggerInsideChange()},t.prototype.openModal=function(e){e&&e.preventDefault(),c.Icons.showModal(this.setIcon.bind(this),this.element.val())},t.prototype.val=function(t){this.element.val(t),this.updatePreview(t),this.updateIsEmpty(),this.triggerOutsideChange()},t.prototype.setIcon=function(t){this.val(t)},t.prototype.updateIsEmpty=function(){this.parent.toggleClass("n2_field_chooser--empty",this.isEmpty(this.element.val()))},t.prototype.updatePreview=function(t){var i=c.Icons.render(t);i?this.$preview.html('<i class="n2i '+i.class+'">'+i.ligature+"</i>"):this.$preview.html("")},t.prototype.focus=function(t){t&&this.openModal()},t})),c.d("FormElementImageList",["$","FormElement"],(function(){var $=c.$;function t(t,i,s){if(this.id=t,this.element=$("#"+t),this.$parent=this.element.parent(),this.$preview=this.$parent.find(".n2_field_image_list__preview"),this.$fields=this.$parent.find(".n2_field_image_list__fields"),this.$fields.length&&(this.field=this.$fields.find('input[type="text"]').data("field"),this.field.element.on("outsideChange",function(){var t=this.element.val();this.markSelected(t),this.renderPreview(t)}.bind(this))),this.$popover=!1,this.parameters=w({width:120,column:3,hasDisabled:!1,options:[]},i),this.realItemWidth=this.parameters.width+10,this.relatedFields=!1,s!==r&&s.length){this.relatedFields=$("");for(var n=0;n<s.length;n++)this.relatedFields=this.relatedFields.add($('[data-field="'+s[n]+'"]'));this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(this.element.val()))}c.FormElement.prototype.constructor.call(this),this.$parent.on("click",this.toggle.bind(this)),this.renderPreview(this.element.val())}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.stopPropagation=function(e){return e.originalEvent["handled"+this.id]!==r||(e.originalEvent["handled"+this.id]=!0,!1)},t.prototype.toggle=function(e){this.$parent.hasClass("n2_field_image_list--focus")?this.blur(e):this.focus(e)},t.prototype.focus=function(e){this.stopPropagation(e)||(this.$parent.addClass("n2_field_image_list--focus"),$("body").on("click."+this.id,this.blur.bind(this)),this.buildPopover(),this.markSelected(this.element.val()))},t.prototype.blur=function(e){this.stopPropagation(e)||(this.$parent.removeClass("n2_field_image_list--focus"),$("body").off("click."+this.id))},t.prototype.isOff=function(t){return"-1"===t},t.prototype.buildPopover=function(){if(!this.$popover){this.items={},this.$popover=$('<div class="n2_field_image_list__popover"></div>').on("click",this.stopPropagation.bind(this));var t=$('<div class="n2_field_image_list__popover_items"></div>').css("width",(this.realItemWidth+20)*this.parameters.column+"px").appendTo(this.$popover);for(var i in this.parameters.options){this.items[i]=$('<div class="n2_field_image_list__popover_item"></div>').css("width",this.realItemWidth+"px").on("click",this.selectOption.bind(this,i)).appendTo(t);var s=$('<div class="n2_field_image_list__popover_item_image"></div>').appendTo(this.items[i]);this.loadImage(this.parameters.options[i].url,s),this.parameters.options[i].label!==r&&$('<div class="n2_field_image_list__popover_item_label"></div>').text(this.parameters.options[i].label).appendTo(this.items[i])}this.parameters.hasDisabled&&(this.parameters.options[-1]={url:""},this.items[-1]=$('<div class="n2_field_image_list__popover_item"></div>').on("click",this.selectOption.bind(this,"-1")).append($('<div class="n2_field_image_list__popover_item_disabled"></div>').text(n2_("Disabled"))).appendTo(t)),this.$fields.appendTo(this.$popover),this.$parent.append(this.$popover),this.$items=this.$popover.find(".n2_field_image_list__popover_item")}},t.prototype.selectOption=function(t,e){this.setValue(t),this.markSelected(t),this.renderPreview(t),this.triggerOutsideChange(),this.blur(e)},t.prototype.setValue=function(t){this.element.val(t),this.relatedFields&&this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(t))},t.prototype.markSelected=function(t){this.$items.removeClass("n2_field_image_list__popover_item--selected"),this.field&&""!==this.field.element.val()||this.items[t].addClass("n2_field_image_list__popover_item--selected")},t.prototype.renderPreview=function(t){var i,s;this.$preview.html(""),this.field&&""!==this.field.element.val()?i=c._imageHelper.fixed(this.field.element.val()):"-1"!==t&&this.parameters.options[t]!==r&&(i=this.parameters.options[t].url,s=this.parameters.options[t].label),i!==r?(this.loadImage(i,this.$preview),s&&$('<div class="n2_field_image_list__preview_label"></div>').text(s).appendTo(this.$preview)):$('<div class="n2_field_image_list__preview_label"></div>').text(n2_("Disabled")).appendTo(this.$preview)},t.prototype.insideChange=function(t){this.parameters.options[t]!==r&&(this.setValue(t),this.markSelected(t),this.renderPreview(t),this.triggerInsideChange())},t.prototype.loadImage=function(t,i){this.getImage(t,"94b2c1").done((function(t){$('<img alt="" src="'+t+'">').prependTo(i)}))},t.prototype.getCurrentImage=function(t){var i=this.element.val(),s="";return this.parameters.options[i]&&(s=this.parameters.options[i].url),this.getImage(s,t)},t.prototype.getImage=function(t,i){var s=$.Deferred();return"svg"===t.split("?")[0].split(".").pop()?$.ajax({url:t,method:"GET",dataType:"text",data:{},success:function(t){var n=t.replace(/fill="#FFF"/gi,'fill="#'+i.substr(0,6)+'"').replace('opacity="1"','opacity="'+N2Color.hex2alpha(i)+'"');s.resolve("data:image/svg+xml;base64,"+btoa(n))}.bind(this)}):s.resolve(t),s},t})),c.d("FormElementImage",["$","FormElementText"],(function(){var $=c.$;function t(t,i){c.FormElementText.prototype.constructor.call(this,t),this.parameters=w({alt:!1},i),this.preview=this.parent.find(".n2_field_text_image__preview").on("click",this.open.bind(this)),this.element.on("nextendChange",this.makePreview.bind(this)),this.parent.find(".n2_field_text__choose").on("click",this.open.bind(this)),this.parent.find(".n2_field_text__clear").on("click",this.clear.bind(this)),this.$sizeLabel=$('<div class="n2_field_text_image__size_label"></div>').appendTo(this.parent),this.refreshSizeLabel()}return t.prototype=Object.create(c.FormElementText.prototype),t.prototype.constructor=t,t.prototype.clear=function(e){e.preventDefault(),this.val("")},t.prototype.val=function(t,i){(i=w({alt:!1},i)).alt&&""!==i.alt&&this.parameters.alt&&""!==this.parameters.alt&&$("#"+this.parameters.alt).val(i.alt).trigger("change"),this.element.val(t),this.change()},t.prototype.makePreview=function(){var t=this.element.val();"{"===t.substr(0,1)?this.preview.css("background-image",""):this.preview.css("background-image","url("+c._imageHelper.fixed(t)+")"),this.refreshSizeLabel()},t.prototype.open=function(e){e&&e.preventDefault(),c._imageHelper.openLightbox(this.val.bind(this))},t.prototype.focus=function(t){t&&this.open()},t.prototype.refreshSizeLabel=function(){this.$sizeLabel.removeClass("n2_field_text_image__size_label--visible");var t=this.element.val();if(""!==t&&"{"!==t.substr(0,1)){var i=new Image;i.addEventListener("load",function(){i.naturalWidth&&i.naturalHeight&&this.$sizeLabel.text(i.naturalWidth+"x"+i.naturalHeight).addClass("n2_field_text_image__size_label--visible")}.bind(this)),i.src=c._imageHelper.fixed(t)}},t})),c.d("FormElementLayerWindowFocus",["$","UIDragTooltip"],(function(){var $=c.$,t=new c.UIDragTooltip("Focus");function i(t,i){this.$field=$("#"+t).on("mousedown",this.onMouseDown.bind(this)),this.onMouseMoveCallback=this.onMouseMove.bind(this),this.onMouseUpCallback=this.onMouseUp.bind(this),this.$image=this.$field.find(".n2_field_layer_window_focus__image").on({error:function(){this.$image.attr("src",c._imageHelper.fixed("$system$/images/placeholder/image.png"))}.bind(this)}),this.$dot=$('<div class="n2_field_layer_window_focus__dot"></div>').on("mouseenter",this.onMouseEnter.bind(this)).appendTo(this.$field),this.options=w({image:"",focusX:"",focusY:""},i),this.$imageField=$("#"+this.options.image).on("nextendChange",this.onImageChange.bind(this)),this.imageField=this.$imageField.data("field"),this.$focusXField=$("#"+this.options.focusX).on("nextendChange",this.onFocusXChange.bind(this)),this.focusXField=this.$focusXField.data("field"),this.$focusYField=$("#"+this.options.focusY).on("nextendChange",this.onFocusYChange.bind(this)),this.focusYField=this.$focusYField.data("field")}return i.prototype.onImageChange=function(){var t=c._imageHelper.fixed(c._currentEditor.generator.fill(this.$imageField.val()));this.image!==t&&(this.image=t,this.$image.attr("src",this.image))},i.prototype.onFocusXChange=function(){var t=this.$focusXField.val();t!==this.focusX&&(this.focusX=t,this.$dot.css("left",this.focusX+"%"))},i.prototype.onFocusYChange=function(){var t=this.$focusYField.val();t!==this.focusY&&(this.focusY=t,this.$dot.css("top",this.focusY+"%"))},i.prototype.onMouseDown=function(e){this.context={originalFocusX:this.$focusXField.val(),originalFocusY:this.$focusYField.val()},c.History.get().off(),t.dragShow(),this.onMouseMove(e),s.addEventListener("mousemove",this.onMouseMoveCallback),s.addEventListener("mouseup",this.onMouseUpCallback)},i.prototype.onMouseMove=function(e){e.preventDefault();var i=this.$field[0].getBoundingClientRect(),s=Math.max(Math.min(Math.round((e.clientX-i.left)/i.width*100),100),0),n=Math.max(Math.min(Math.round((e.clientY-i.top)/i.height*100),100),0);this.$focusXField.val(s).trigger("change"),this.$focusYField.val(n).trigger("change"),t.dragUpdate(e,"X: "+s+"%<br>Y: "+n+"%")},i.prototype.onMouseUp=function(e){this.$focusXField.val(this.context.originalFocusX).trigger("change"),this.$focusYField.val(this.context.originalFocusY).trigger("change"),c.History.get().on(),t.dragHide(),s.removeEventListener("mousemove",this.onMouseMoveCallback),s.removeEventListener("mouseup",this.onMouseUpCallback),this.onMouseMove(e),delete this.context},i.prototype.onMouseEnter=function(e){t.hoverShow(e,function(){return"X: "+this.$focusXField.val()+"%<br>Y: "+this.$focusYField.val()+"%"}.bind(this)),this.$dot.on({"mousemove.tooltip":function(e){t.hoverUpdatePosition(e)},"mouseleave.tooltip":function(){this.timeout&&(a(this.timeout),delete this.timeout),this.$dot.off(".tooltip"),t.hoverHide()}.bind(this)})},i})),c.d("FormElementList",["$","FormElement"],(function(){var $=c.$;function t(t,i){if(this.separator="||",this.options=w({relatedFields:[],relatedValueFields:[],relatedAttribute:""},i),this.element=$("#"+t).on("change",this.onHiddenChange.bind(this)),this.select=$("#"+t+"_select").on("change",this.onChange.bind(this)),this.relatedFields=!1,this.options.relatedFields.length){this.relatedFields=$("");for(var s=0;s<this.options.relatedFields.length;s++)this.relatedFields=this.relatedFields.add($('[data-field="'+this.options.relatedFields[s]+'"]'));this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(this.element.val()))}if(this.relatedValueFields=!1,this.options.relatedValueFields.length){var n=this.element.val();this.relatedValueFields=$("");for(s=0;s<this.options.relatedValueFields.length;s++)for(var h,r=0;r<this.options.relatedValueFields[s].field.length;r++)(h=$('[data-field="'+this.options.relatedValueFields[s].field[r]+'"]').data("show-values",this.options.relatedValueFields[s].values)).toggleClass("n2_form_element--hidden",-1===this.options.relatedValueFields[s].values.indexOf(n)),this.relatedValueFields=this.relatedValueFields.add(h)}if(""!==this.options.relatedAttribute){var o=$("#n2-admin").attr("data-"+this.options.relatedAttribute,this.element.val());this.element.on("nextendChange",function(){o.attr("data-"+this.options.relatedAttribute,this.element.val())}.bind(this))}c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onHiddenChange=function(){var t=this.element.val();t&&t!==this.select.val()&&this.insideChange(t)},t.prototype.onChange=function(){var t=this.select.val();null!==t&&"object"==typeof t&&(t=t.join(this.separator)),this.setHiddenValue(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){"object"==typeof t?(this.select.val(t),t=t.join("||")):this.select.val(t),this.setHiddenValue(t),this.triggerInsideChange()},t.prototype.setHiddenValue=function(t){this.element.val(t),this.relatedFields&&this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(t)),this.relatedValueFields&&this.relatedValueFields.each((function(){var i=$(this);i.toggleClass("n2_form_element--hidden",-1===i.data("show-values").indexOf(t))}))},t.prototype.isOff=function(t){return""==t||"0"==t||"off"==t},t.prototype.setOptions=function(t){for(var i in this.select.html(""),t)$('<option value="'+i+'"></option>').text(t[i]).appendTo(this.select)},t})),c.d("FormElementMarginPadding",["FormElementMixed"],(function(){function t(t,i,s){this.linkedValues=!1,c.FormElementMixed.prototype.constructor.apply(this,arguments),this.$field=this.element.parent(),this.$field.find(".n2_field_margin_padding__pre_label").on("click",function(e){e.preventDefault(),this.linkedValues=!this.linkedValues,this.$field.toggleClass("n2_field_margin_padding--linked-values",this.linkedValues),this.linkedValues&&this.elements[0].trigger("change")}.bind(this)),this.refresh()}return t.prototype=Object.create(c.FormElementMixed.prototype),t.prototype.constructor=t,t.prototype.onFieldChange=function(){if(this.linkedValues)for(var t=this.elements[0].val(),i=1;i<4;i++)this.elements[i].data("field").insideChange(t);this.element.val(this.getValue()),this.triggerOutsideChange()},t.prototype.insideChange=function(t){c.FormElementMixed.prototype.insideChange.apply(this,arguments),this.refresh()},t.prototype.refresh=function(){this.linkedValues=!0;for(var t=this.elements[0].val(),i=1;i<4;i++)if(t!==this.elements[i].val()){this.linkedValues=!1;break}this.$field.toggleClass("n2_field_margin_padding--linked-values",this.linkedValues)},t.prototype.relatedFieldsOff=function(){return"0|*|0|*|0|*|0"===this.element.val()},t.prototype.isEmpty=function(t){return"|*||*||*|"===t||"0|*|0|*|0|*|0"===t},t})),c.d("FormElementMixed",["$","FormElement"],(function(){var $=c.$;function t(t,i,s){this.element=$("#"+t),this.elements=[];for(var n=0;n<i.length;n++)this.elements.push($("#"+i[n]).on("outsideChange",this.onFieldChange.bind(this)));this.separator=s,c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onFieldChange=function(){this.element.val(this.getValue()),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t);for(var i=t.split(this.separator),s=0;s<this.elements.length;s++)this.elements[s].data("field").insideChange(i[s]);this.triggerInsideChange()},t.prototype.getValue=function(){for(var t=[],i=0;i<this.elements.length;i++)t.push(this.elements[i].val());return t.join(this.separator)},t})),c.d("FormElementNumberSlider",["$"],(function(){var $=c.$;function t(t,i){this.localChange=!1,this.element=$("#"+t),this.$parent=this.element.parent().on({"mouseenter.n2slider":this.startSlider.bind(this,i)});var s=this.$parent.siblings(".n2_field_unit").find("> input");if(i.units&&s.length){var n=i.units;s.on("nextendChange",function(){i.min=n[s.val()+"Min"],i.max=n[s.val()+"SliderMax"],this.slider&&(this.uiSlider.setOption("min",i.min),this.uiSlider.setOption("max",i.max))}.bind(this))}}return t.prototype.startSlider=function(t,e){if(this.element.parent().off(".n2slider"),!this.slider){var i=$('<div class="n2_field_number__slider"></div>').appendTo(this.$parent),s=$('<div class="n2_field_number__slider_inner"></div>').appendTo(i);this.slider=$("<div></div>").appendTo(s).removeAttr("slide").prop("slide",!1),this.uiSlider=new c.UISlider(this.slider,w({start:function(){this.element.parent().addClass("n2-active")}.bind(this),stop:function(){this.element.parent().removeClass("n2-active")}.bind(this),sliding:function(e,t){this.localChange=!0,this.element.val(t.value).trigger("change"),this.localChange=!1}.bind(this)},t)),this.slider[0].slide!==r&&(this.slider[0].slide=null),this.element.on("nextendChange",function(){if(!this.localChange){var t=parseFloat(this.element.val());isFinite(t)&&this.uiSlider.setOption("value",t)}}.bind(this))}this.uiSlider.setOption("value",parseFloat(this.element.val()))},t})),c.d("FormElementNumber",["$","FormElement"],(function(){var $=c.$;function t(t,i,s,n){this.min=i,this.max=s,this.element=$("#"+t).on({focus:this._focus.bind(this),blur:this.blur.bind(this),change:this.change.bind(this)}),this.parent=this.element.parent();var h=this.parent.siblings(".n2-form-element-units").find("> input");n&&h.length&&h.on("nextendChange",function(){this.min=n[h.val()+"Min"],this.max=n[h.val()+"Max"]}.bind(this)),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype._focus=function(){this.parent.addClass("n2_field_text--focus"),this.element.on("keypress.n2-text",function(e){"Enter"===e.code&&(this.element.off("keypress.n2-text"),this.element.trigger("blur"))}.bind(this))},t.prototype.blur=function(){this.parent.removeClass("n2_field_text--focus")},t.prototype.change=function(){var t=this.validate(this.element.val());!0===t?this.triggerOutsideChange():this.element.val(t).trigger("change")},t.prototype.insideChange=function(t){var i=this.validate(t);!0===i?this.element.val(t):this.element.val(i),this.triggerInsideChange()},t.prototype.validate=function(t){if(t!==r&&t.length>0&&"{"===t.charAt(0))return!0;var i=parseFloat(t);return isNaN(i)&&(i=0),(i=Math.max(this.min,Math.min(this.max,i)))+""===t||i},t.prototype.relatedFieldsOff=function(){return 0===parseInt(this.element.val())},t.prototype.isEmpty=function(t){return""===t||0===t},t})),c.d("FormElementOnoff",["$","FormElement"],(function(){var $=c.$;function t(t,i){for(var s in this.element=$("#"+t),this.options=w({values:{0:0,1:1},relatedFieldsOff:[],relatedFieldsOn:[],relatedAttribute:""},i),this.options.valuesDict={},this.options.values)this.options.valuesDict[this.options.values[s]]=s;if(this.options.relatedFieldsOff.length){this.relatedFieldsOff=$("");for(var n=0;n<this.options.relatedFieldsOff.length;n++)this.relatedFieldsOff=this.relatedFieldsOff.add($('[data-field="'+this.options.relatedFieldsOff[n]+'"]'))}else this.relatedFieldsOff=!1;if(this.options.relatedFieldsOn.length){this.relatedFieldsOn=$("");for(n=0;n<this.options.relatedFieldsOn.length;n++)this.relatedFieldsOn=this.relatedFieldsOn.add($('[data-field="'+this.options.relatedFieldsOn[n]+'"]'))}else this.relatedFieldsOn=!1;if(""!==this.options.relatedAttribute){var h=$("#n2-admin");h.attr("data-"+this.options.relatedAttribute,this.element.val()),this.element.on("nextendChange",function(){h.attr("data-"+this.options.relatedAttribute,this.element.val())}.bind(this))}this.onoff=this.element.parent().on({click:this.switch.bind(this),keydown:function(e){"Space"===e.code&&(e.stopPropagation(),e.preventDefault(),this.onoff.trigger("click"))}.bind(this)}),this.options.values[this.element.val()]?this.syncOn():this.syncOff(),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.switch=function(){var t=this.options.values[this.element.val()]?0:1;this.element.val(this.options.valuesDict[t]),this.setSelected(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){var i=this.options.values[t];this.element.val(this.options.valuesDict[i]),this.setSelected(i),this.triggerInsideChange()},t.prototype.setSelected=function(t){t?this.syncOn():this.syncOff()},t.prototype.syncOff=function(){this.onoff.removeClass("n2_field_onoff--on").attr("aria-checked","false"),this.relatedFieldsOff&&this.relatedFieldsOff.removeClass("n2_form_element--hidden"),this.relatedFieldsOn&&this.relatedFieldsOn.addClass("n2_form_element--hidden")},t.prototype.syncOn=function(){this.onoff.addClass("n2_field_onoff--on").attr("aria-checked","true"),this.relatedFieldsOff&&this.relatedFieldsOff.addClass("n2_form_element--hidden"),this.relatedFieldsOn&&this.relatedFieldsOn.removeClass("n2_form_element--hidden")},t})),c.d("FormElementRadio",["$","FormElement"],(function(){var $=c.$;function t(t,i,s){if(this.element=$("#"+t),this.values=i,this.relatedFields=!1,s!==r&&s.length){this.relatedFields=$("");for(var n=0;n<s.length;n++)this.relatedFields=this.relatedFields.add($('[data-field="'+s[n]+'"]'));this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(this.element.val()))}this.parent=this.element.parent(),this.options=this.parent.find(".n2_field_radio__option");for(n=0;n<this.options.length;n++)this.options.eq(n).on("click",this.click.bind(this));c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.click=function(e){this.changeSelectedIndex(this.options.index(e.currentTarget))},t.prototype.changeSelectedIndex=function(t){var i=this.values[t];this.setValue(i),this.setSelected(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t,i){var s=this.values.indexOf(t);-1===s&&(s=this.partialSearch(t)),-1===s&&i!==r&&(s=this.addOption(t,i)),-1!==s?(this.setValue(this.values[s]),this.setSelected(s),this.triggerInsideChange()):this.options.eq(0).trigger("click")},t.prototype.setSelected=function(t){this.options.removeClass("n2_field_radio__option--selected"),this.options.eq(t).addClass("n2_field_radio__option--selected")},t.prototype.partialSearch=function(t){t=t.replace(/^.*[\\\/]/,"");for(var i=0;i<this.values.length;i++)if(-1!==this.values[i].indexOf(t))return i;return-1},t.prototype.addOption=function(t,i){var s=this.values.push(t)-1;return i.appendTo(this.parent).on("click",this.click.bind(this)),this.options=this.options.add(i),s},t.prototype.addTabOption=function(t,i){var s=this.values.push(t)-1,n=$('<div class="n2_field_radio__option">'+i+"</div>").insertAfter(this.options.last()).on("click",this.click.bind(this));return this.options=this.options.add(n),s},t.prototype.removeTabOption=function(t){var i=this.values.indexOf(t),s=this.options.eq(i);this.options=this.options.not(s),s.remove(),this.values.splice(i,1)},t.prototype.moveTab=function(t,i){},t.prototype.setValue=function(t){this.element.val(t),this.relatedFields&&this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(t))},t.prototype.isOff=function(t){return""===t||"0"===t||0===t||"off"===t},t})),c.d("FormRelatedFields",["$"],(function(){var $=c.$;function t(t,i){this.$field=$("#"+t),this.options=w({relatedFieldsOn:[],relatedFieldsOff:[]},i),this.field=this.$field.data("field"),this.field&&this.field.relatedFieldsOff!==r?this.fieldChanged=this.fieldChangedCallback:this.fieldChanged=this.fieldChangedSimple,this.$field.on("nextendChange",this.fieldChanged.bind(this)),this.relatedFieldsOn=$("");for(var s=0;s<this.options.relatedFieldsOn.length;s++)this.relatedFieldsOn=this.relatedFieldsOn.add($('[data-field="'+this.options.relatedFieldsOn[s]+'"]'));this.relatedFieldsOff=$("");for(s=0;s<this.options.relatedFieldsOff.length;s++)this.relatedFieldsOff=this.relatedFieldsOff.add($('[data-field="'+this.options.relatedFieldsOff[s]+'"]'));this.fieldChanged()}return t.prototype.fieldChangedSimple=function(){var t=this.$field.val(),i=this.field.isEmpty(t);this.relatedFieldsOn.toggleClass("n2_form_element--hidden",i),this.relatedFieldsOff.toggleClass("n2_form_element--hidden",!i)},t.prototype.fieldChangedCallback=function(){var t=this.field.relatedFieldsOff();this.relatedFieldsOn.toggleClass("n2_form_element--hidden",t),this.relatedFieldsOff.toggleClass("n2_form_element--hidden",!t)},t})),c.d("FormElementRichText",["$","FormElementText"],(function(){var $=c.$;function t(t){c.FormElementText.prototype.constructor.apply(this,arguments),this.parent.find(".n2_field_textarea_rich__button").on("click",this.onButtonClick.bind(this))}return t.prototype=Object.create(c.FormElementText.prototype),t.prototype.constructor=t,t.prototype.onButtonClick=function(e){switch($(e.currentTarget).data("action")){case"bold":this.bold();break;case"italic":this.italic();break;case"link":this.link()}},t.prototype.bold=function(){this.wrapText("<b>","</b>")},t.prototype.italic=function(){this.wrapText("<i>","</i>")},t.prototype.link=function(){this.wrapText('<a href="#">',"</a>")},t.prototype.wrapText=function(t,i){var s=this.element,n=s.val().length,h=s[0].selectionStart,r=s[0].selectionEnd,o=t+s.val().substring(h,r)+i;s.val(s.val().substring(0,h)+o+s.val().substring(r,n)),this.triggerOutsideChange(),this.element.focus(),s[0].selectionEnd=r+t.length+i.length},t})),c.d("FormElementSelectIcon",["$","FormElement"],(function(){var $=c.$;function t(t,i){if(this.options=w({relatedFields:[],relatedValueFields:[]},i),this.element=$("#"+t),this.$parent=this.element.parent(),this.$options=this.$parent.find(".n2_field_select_icon__option").on("click",this.onSelect.bind(this)),this.relatedFields=!1,this.options.relatedFields.length){this.relatedFields=$("");for(var s=0;s<this.options.relatedFields.length;s++)this.relatedFields=this.relatedFields.add($('[data-field="'+this.options.relatedFields[s]+'"]'));this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(this.element.val()))}if(this.relatedValueFields=!1,this.options.relatedValueFields.length){var n=this.element.val();this.relatedValueFields=$("");for(s=0;s<this.options.relatedValueFields.length;s++)for(var h,r=0;r<this.options.relatedValueFields[s].field.length;r++)(h=$('[data-field="'+this.options.relatedValueFields[s].field[r]+'"]').data("show-values",this.options.relatedValueFields[s].values)).toggleClass("n2_form_element--hidden",-1===this.options.relatedValueFields[s].values.indexOf(n)),this.relatedValueFields=this.relatedValueFields.add(h)}c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onSelect=function(e){var t=$(e.currentTarget);t.data("value")!==this.element.val()&&(this.$options.removeClass("n2_field_select_icon__option--selected"),t.addClass("n2_field_select_icon__option--selected"),this.setHiddenValue(t.data("value")),this.triggerOutsideChange())},t.prototype.insideChange=function(t){this.$options.removeClass("n2_field_select_icon__option--selected"),this.$options.filter('[data-value="'+t+'"]').addClass("n2_field_select_icon__option--selected"),this.setHiddenValue(t),this.triggerInsideChange()},t.prototype.setHiddenValue=function(t){this.element.val(t),this.relatedFields&&this.relatedFields.toggleClass("n2_form_element--hidden",this.isOff(t)),this.relatedValueFields&&this.relatedValueFields.each((function(){var i=$(this);i.toggleClass("n2_form_element--hidden",-1===i.data("show-values").indexOf(t))}))},t})),c.d("FormElementSkin",["$","FormElement"],(function(){var $=c.$;function t(t,i,s,n){this.element=$("#"+t),this.preId=i,this.skins=s,this.list=this.element.data("field"),this.fixedMode=n,this.firstOption=this.list.select.find("option").eq(0),this.originalText=this.firstOption.text(),this.element.on("outsideChange",this.onSkinSelect.bind(this)),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onSkinSelect=function(){var t=this.element.val();if("0"!==t){for(var i in t=this.skins[t].settings)if(t.hasOwnProperty(i)){var s=$("#"+this.preId+i);if(s.length)s.data("field").insideChange(t[i])}this.fixedMode||(this.changeFirstOptionText(n2_("Done")),this.list.insideChange("0"),o(this.changeFirstOptionText.bind(this,this.originalText),3e3))}},t.prototype.changeFirstOptionText=function(t){this.firstOption.text(t)},t.prototype.insideChange=function(t){this.element.val(t),this.list.insideChange(t)},t})),c.d("FormElementStyleHidden",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.parameters=w({mode:"",label:""},i),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.getLabel=function(){return this.parameters.label},t.prototype.save=function(e,t){this.val(t)},t.prototype.val=function(t){this.element.val(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t),this.triggerInsideChange()},t.prototype.renderStyle=function(){return c.CSSRendererStyle.addCSS("",c.CSSRendererStyle.getClass(),this.element.val(),c.CSSRendererStyle.rendererModes[this.parameters.mode])},t})),c.d("FormElementStyle",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.parent=this.element.parent(),this.parameters=w({mode:"",label:"",font:"",font2:"",style2:"",preview:""},i),c.FormElement.prototype.constructor.call(this),this.parent.on("click",this.show.bind(this))}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.getLabel=function(){return this.parameters.label},t.prototype.show=function(e){e.preventDefault(),""!==this.parameters.font&&c._styleManager.setConnectedFont(this.parameters.font),""!==this.parameters.font2&&c._styleManager.setConnectedFont2(this.parameters.font2),""!==this.parameters.style2&&c._styleManager.setConnectedStyle(this.parameters.style2),c._styleManager.setFieldID(this.element.attr("id")),c._styleManager.show(this.element.val(),this.save.bind(this),{previewMode:this.parameters.mode,previewHTML:this.parameters.preview})},t.prototype.save=function(e,t){this.val(t)},t.prototype.val=function(t){this.element.val(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t),this.triggerInsideChange()},t.prototype.renderStyle=function(){return c.CSSRendererStyle.addCSS("",c.CSSRendererStyle.getClass(),this.element.val(),c.CSSRendererStyle.rendererModes[this.parameters.mode])},t})),c.d("FormElementSubformIcon",["$","FormElement"],(function(){var $=c.$;function t(t,i,s,n){this.id=t,this.ajaxUrl=i,this.element=$("#"+t).data("field",this),this.$parent=this.element.parent(),this.$targetContainer=$("#"+s),this.originalValue=n,this.form=this.element.closest("form"),this.$options=this.$parent.find(".n2_field_subform_icon__option").on("click",this.selectOption.bind(this)),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.selectOption=function(e){var t=$(e.currentTarget),i=t.data("value");this.$options.removeClass("n2_field_subform_icon__option--selected"),t.addClass("n2_field_subform_icon__option--selected"),this.element.val(i),this.triggerOutsideChange(),this.loadSubform(i)},t.prototype.loadSubform=function(t){var i={values:[],value:t};t===this.originalValue&&(i.values=this.form.data("form").values),c.AjaxHelper.ajax({type:"POST",url:c.AjaxHelper.makeAjaxUrl(this.ajaxUrl),data:i,dataType:"json"}).done(this.load.bind(this))},t.prototype.load=function(t){this.$targetContainer.html(t.data.html),eval(t.data.scripts),c.FormTipManager.add(this.$targetContainer)},t})),c.d("FormElementSubformImage",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.options=$("#"+i).find(".n2-subform-image-option"),this.subform=this.element.data("field"),this.active=this.getIndex(this.options.filter(".n2-active").get(0));for(var s=0;s<this.options.length;s++)this.options.eq(s).on("click",this.selectOption.bind(this));c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.selectOption=function(e){var t=this.getIndex(e.currentTarget);if(t!=this.active){this.options.eq(t).addClass("n2-active"),this.options.eq(this.active).removeClass("n2-active"),this.active=t;var i=this.subform.list.select.find("option").eq(t).val();this.subform.list.insideChange(i)}},t.prototype.getIndex=function(t){return this.options.indexOf(t)},t})),c.d("FormElementTab",["$","FormElement"],(function(){var $=c.$;function t(t,i){if(this.parent=$("#"+t+"_tab"),this.parent.find(".n2_field_tab__option").each(function(t,i){$(i).on("click",function(e){this.onClick($(e.currentTarget))}.bind(this))}.bind(this)),this.element=$("#"+t).on("change",this.onHiddenChange.bind(this)),this.relatedValueFields=!1,i.length){var s=this.element.val();this.relatedValueFields=$("");for(var n=0;n<i.length;n++)for(var h,r=0;r<i[n].field.length;r++)(h=$('[data-field="'+i[n].field[r]+'"]').data("show-values",i[n].values)).toggleClass("n2_form_element--hidden",-1===i[n].values.indexOf(s)),this.relatedValueFields=this.relatedValueFields.add(h)}c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.onHiddenChange=function(){var t=this.element.val();t&&this.insideChange(t)},t.prototype.onClick=function(t){t.hasClass("n2_field_tab__option--selected")||(this.parent.find(".n2_field_tab__option--selected").removeClass("n2_field_tab__option--selected"),t.addClass("n2_field_tab__option--selected"),this.setHiddenValue(t.attr("data-ssoption")),this.triggerOutsideChange())},t.prototype.insideChange=function(t){this.setHiddenValue(t),this.triggerInsideChange()},t.prototype.setHiddenValue=function(t){this.element.val(t),this.relatedValueFields&&this.relatedValueFields.each((function(){var i=$(this);i.toggleClass("n2_form_element--hidden",-1===i.data("show-values").indexOf(t))}))},t.prototype.setOptions=function(i,s,n,h){for(var r in h||(h=[]),s.html(""),i){var o=$('<div class="n2_field_tab__option" data-ssoption="'+r+'">'+i[r]+"</div>");n===r&&o.addClass("n2_field_tab__option--selected"),s.append(o),new t(s.attr("id").replace("_tab",""),h)}},t})),c.d("FormElementText",["$","FormElement"],(function(){var $=c.$;function t(t){this.element=$("#"+t).on({focus:this._focus.bind(this),blur:this._blur.bind(this),change:this.change.bind(this)}),this.tagName=this.element.prop("tagName"),this.parent=this.element.parent(),c.FormElement.prototype.constructor.call(this),this.updateIsEmpty()}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype._focus=function(){this.parent.addClass("n2_field_text--focus"),"TEXTAREA"!==this.tagName&&this.element.on("keypress.n2-text",function(e){"Enter"===e.code&&(this.element.off("keypress.n2-text"),this.element.trigger("blur"))}.bind(this))},t.prototype._blur=function(){this.parent.removeClass("n2_field_text--focus")},t.prototype.change=function(){this.updateIsEmpty(),this.triggerOutsideChange()},t.prototype.insideChange=function(t){this.element.val(t),this.updateIsEmpty(),this.triggerInsideChange()},t.prototype.updateIsEmpty=function(){this.parent.toggleClass("n2_field_text--empty",this.isEmpty(this.element.val()))},t.prototype.isEmpty=function(t){return""===t},t.prototype.focus=function(t){this.connectedField?this.connectedField.focus(t):t&&this.element.focus().select()},t})),c.d("FormElementUnits",["$","FormElement"],(function(){var $=c.$;function t(t,i){this.element=$("#"+t),this.$parent=this.element.parent(),this.options=this.$parent.find(".n2_field_unit__unit"),this.currentUnit=this.$parent.find(".n2_field_unit__current_unit"),this.values=i;for(var s=0;s<this.options.length;s++)this.options.eq(s).on("click",this.switch.bind(this,s));c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.switch=function(t,e){this.element.val(this.values[t]),this.setSelected(t),this.triggerOutsideChange()},t.prototype.insideChange=function(t){var i=this.values.indexOf(t);this.element.val(this.values[i]),this.setSelected(i),this.triggerInsideChange()},t.prototype.setSelected=function(t){this.currentUnit.html(this.options.eq(t).html())},t})),c.d("FormElementUpload",["$","FormElement"],(function(){var $=c.$;function t(t){this.element=$("#"+t).on("change",this.updateName.bind(this)),this.parent=this.element.parent(),this.$name=this.parent.find(".n2_field_chooser__label"),this.updateName(this.element.val()),c.FormElement.prototype.constructor.call(this)}return t.prototype=Object.create(c.FormElement.prototype),t.prototype.constructor=t,t.prototype.insideChange=function(t){this.updateName(),this.triggerInsideChange()},t.prototype.updateName=function(){var t=this.element[0].value;if(this.parent.toggleClass("n2_field_chooser--empty",""===t),this.isEmpty(t))this.$name.text(n2_("No file selected."));else{var i=t.split("\\").pop();this.$name.text(i)}},t.prototype.isEmpty=function(t){return""===t},t})),c.d("FormElementUrl",["$","FormElementText"],(function(){function t(t,i){c.FormElementText.prototype.constructor.call(this,t),this.parameters=i,this.button=this.parent.find(".n2_field_text__choose").on("click",this.open.bind(this)),this.element.siblings(".n2_field_text__clear").on("click",this.clear.bind(this))}return t.prototype=Object.create(c.FormElementText.prototype),t.prototype.constructor=t,t.prototype.isEmpty=function(t){return""===t||"#"===t},t.prototype.clear=function(e){e.preventDefault(),this.val("#")},t.prototype.val=function(t){this.element.val(t),this.change()},t.prototype.open=function(e){e.preventDefault(),this.element.val(),c.ModalUrl.show(this.element.val(),this.parameters.url,function(t){this.val(t)}.bind(this))},t})),c.r("$",(function(){var $=c.$;function t(t){return t+Math.floor(281474976710656*(1+Math.random())).toString(16)}$.fn.uid=function(i){var s=null;i=i||"n";do{s=t(i)}while($("#"+s).length>0);return s},$.fn.generateUniqueClass=function(i){var s=null;i=i||"n";do{s=t(i)}while($("."+s).length>0);return s}})),c.d("UIAutocomplete",["$","UIWidgetBase"],(function(){var $=c.$;function t(t,i){this.isRendered=!1,this.element=t,this.widgetName=this.widgetName||"UIAutocomplete",this.widgetEventPrefix="autocomplete",this.isActive=!1,this.allowBlur=!0,this.options=w({appendTo:"body",source:null,select:null,positionTo:"self",x:0,y:0},this.options,i),c.UIWidgetBase.prototype.constructor.apply(this,arguments),this.element.on({focus:this.focus.bind(this),blur:this.blur.bind(this)}),"self"===this.options.positionTo?this.positionTo=this.element:this.positionTo=this.element.closest(this.options.positionTo)}return t.prototype=Object.create(c.UIWidgetBase.prototype),t.prototype.constructor=t,t.prototype.focus=function(e){!1===this.isActive&&(this.showList(e),this.element.on("click."+this.widgetEventPrefix,this.showList.bind(this)),this.isActive=!0)},t.prototype.showList=function(e){"function"==typeof this.options.appendTo?this.options.appendTo=this.options.appendTo.call(i):this.options.appendTo=$(this.options.appendTo);var t=this.getList().appendTo(this.options.appendTo),s={left:0,top:0},n=this.positionTo.offset(),h=0;if(!this.options.appendTo.is($("body"))){(s=this.options.appendTo.offset()).top-=this.options.appendTo.scrollTop(),t.css("height","");var r=t.height(),o=this.options.appendTo[0].getBoundingClientRect(),a=this.positionTo[0].getBoundingClientRect(),c=Math.min(o.top+o.height-a.top-a.height-10,r);c<100&&c<r&&(c=Math.min(a.top-o.top-10,r),s.top=s.top+a.height+c),t.css("height",c+"px"),n2const.rtl.isRtl&&(h=o.width-this.options.appendTo[0].clientWidth)}t.css({left:n.left-s.left+this.options.x-h+"px",top:n.top+this.positionTo.outerHeight()-s.top+this.options.y+"px",minWidth:this.element.parent().outerWidth()+"px"}),t.off("."+this.widgetEventPrefix).on("mousedown."+this.widgetEventPrefix,function(e){$(e.target).is(t)&&(this.element.parent().addClass("focus2"),this.allowBlur=!1)}.bind(this)).on("mouseup."+this.widgetEventPrefix,function(e){$(e.target).is(t)&&(this.allowBlur=!0,this.element.focus(),this.element.parent().removeClass("focus2"))}.bind(this))},t.prototype.blur=function(e){this.allowBlur&&(this.hide(),this.element.off("."+this.widgetEventPrefix))},t.prototype.hide=function(){this.$list.detach(),this.isActive=!1},t.prototype.getList=function(){if(!this.isRendered){this.$list=$('<div class="n2_autocomplete_options"></div>').attr({unselectable:"on"}).on({wheel:function(e){e.stopPropagation()}});for(var t=this.options.source.call(this,this.ui()),i=0;i<t.length;i++)$('<div class="n2_autocomplete_option" tabindex="-1">'+t[i]+"</div>").on({mousedown:function(e){e.preventDefault()},click:function(t,e){this._trigger("select",e,{value:t}),this.hide()}.bind(this,t[i])}).appendTo(this.$list);this.isRendered=!0}return this.$list},t.prototype.ui=function(){return{}},t})),c.d("UIDraggableBar",["$","UIMouse"],(function(){"use strict";function t(t,i){this.element=t,this.widgetName=this.widgetName||"UIDraggable",this.widgetEventPrefix="drag",this.options=w({drag:null,start:null,stop:null},this.options,i),c.UIMouse.prototype.constructor.apply(this,arguments),this._mouseInit()}return t.prototype=Object.create(c.UIMouse.prototype),t.prototype.constructor=t,t.prototype._mouseStart=function(t){return this.currentData=this.originalData={margin:parseInt(this.element.css("marginLeft"))},this.originalMousePosition={left:t.pageX},this.element.addClass("nui-draggable-dragging"),this._trigger("start",t,this.ui()),this._mouseDrag(t),!0},t.prototype._mouseDrag=function(t){var i=t.pageX-this.originalMousePosition.left||0;return this.currentData={},this.currentData.margin=Math.max(0,this.originalData.margin+i),this._trigger("drag",t,this.ui()),this.element.css("marginLeft",this.currentData.margin+"px"),!0},t.prototype._