Version Description
Current Release = Released: 10th February, 2020 - Release Notes
(v.7) ADDED: New admin notice to indicate that the plugin is currently disabled.
(v.7) IMPROVED: Malware scanning for premium assets always uses hashes where possible to verify contents.
(v.7) IMPROVED: Optimised loading of libraries that run for certain features, if they aren't enabled.
(v.7) IMPROVED: Prevent a rare fatal error on activation.
Download this release
Release Info
Developer | paultgoodchild |
Plugin | Shield Security for WordPress |
Version | 8.5.7 |
Comparing to | |
See all releases |
Code changes from version 8.4.4 to 8.5.7
- changelog.html +53 -1
- icwp-wpsf.php +4 -22
- plugin-spec.php +4 -4
- readme.txt +43 -18
- resources/css/bootstrap4.css +393 -207
- resources/css/bootstrap4.min.css +2 -2
- resources/css/introjs.min.css +1 -0
- resources/css/plugin.css +29 -20
- resources/images/pluginlogo_32x32.png +0 -0
- resources/js/bootstrap4.bundle.js +430 -309
- resources/js/bootstrap4.bundle.min.js +2 -2
- resources/js/bootstrap4.js +376 -290
- resources/js/bootstrap4.min.js +2 -2
- resources/js/global-plugin.js +12 -0
- resources/js/introjs.min.js +1 -0
- resources/js/plugin.js +10 -1
- resources/js/shield-tables.js +18 -0
- src/common/icwp-data.php +0 -606
- src/common/wp-admin-notices.php +0 -92
- src/common/wp-widget.php +0 -22
- src/config/feature-admin_access_restriction.php +11 -0
- src/config/feature-audit_trail.php +2 -0
- src/config/feature-hack_protect.php +0 -34
- src/config/feature-headers.php +13 -1
- src/config/feature-ips.php +13 -0
- src/config/feature-plugin.php +17 -9
- src/features/admin_access_restriction.php +43 -11
- src/features/audit_trail.php +1 -1
- src/features/autoupdates.php +0 -147
- src/features/base.php +105 -122
- src/features/base_wpsf.php +147 -137
- src/features/events.php +0 -8
- src/features/hack_protect.php +263 -244
- src/features/headers.php +133 -105
- src/features/insights.php +72 -44
- src/features/ips.php +62 -18
- src/features/license.php +9 -18
- src/features/login_protect.php +7 -27
- src/features/plugin.php +183 -168
- src/features/sessions.php +0 -8
- src/features/statistics.php +0 -25
- src/features/traffic.php +1 -8
- src/features/user_management.php +76 -43
- src/lib/src/Controller/Controller.php +115 -43
- src/lib/src/Databases/AuditTrail/EntryVO.php +10 -8
- src/lib/src/Databases/AuditTrail/Handler.php +16 -41
- src/lib/src/Databases/AuditTrail/Insert.php +2 -6
- src/lib/src/Databases/AuditTrail/Select.php +2 -1
- src/lib/src/Databases/AuditTrail/Update.php +8 -0
- src/lib/src/Databases/Base/BaseQuery.php +38 -8
- src/lib/src/Databases/Base/EntryVO.php +0 -8
- src/lib/src/Databases/Base/EntryVoConsumer.php +31 -0
- src/lib/src/Databases/Base/Handler.php +5 -5
- src/lib/src/Databases/Base/Select.php +23 -5
- src/lib/src/Databases/Events/Insert.php +1 -0
- src/lib/src/Databases/Events/Update.php +1 -0
- src/lib/src/Databases/GeoIp/Select.php +2 -3
- src/lib/src/Databases/IPs/CommonFilters.php +25 -0
- src/lib/src/Databases/IPs/Delete.php +2 -5
- src/lib/src/Databases/IPs/EntryVO.php +13 -14
- src/lib/src/Databases/IPs/Handler.php +3 -2
- src/lib/src/Databases/IPs/Select.php +25 -8
- src/lib/src/Databases/IPs/Update.php +9 -1
- src/lib/src/Databases/ScanQueue/Update.php +9 -0
- src/lib/src/Databases/Scanner/Common.php +82 -0
- src/lib/src/Databases/Scanner/Delete.php +1 -21
- src/lib/src/Databases/Scanner/EntryVO.php +7 -7
- src/lib/src/Databases/Scanner/Select.php +1 -65
- src/lib/src/Databases/Scanner/Update.php +38 -0
- src/lib/src/Databases/Session/Insert.php +10 -6
- src/lib/src/Databases/Session/Select.php +2 -1
- src/lib/src/Databases/Tally/Insert.php +1 -1
- src/lib/src/Databases/Traffic/Insert.php +14 -0
- src/lib/src/Databases/Traffic/Select.php +4 -5
- src/lib/src/Deprecated/Foundation.php +7 -18
- src/lib/src/Modules/AuditTrail/Auditors/Base.php +0 -1
- src/lib/src/Modules/AuditTrail/Auditors/Posts.php +3 -3
- src/lib/src/Modules/AuditTrail/Auditors/Users.php +2 -2
- src/lib/src/Modules/AuditTrail/Lib/AuditWriter.php +72 -0
- src/lib/src/Modules/AuditTrail/Lib/Ops/Commit.php +108 -0
- src/lib/src/Modules/Autoupdates/Options.php +8 -1
- src/lib/src/Modules/Base/BaseModCon.php +44 -112
- src/lib/src/Modules/Base/Lib/BaseService.php +36 -0
- src/lib/src/Modules/Base/Options.php +32 -28
- src/lib/src/Modules/Base/Strings.php +2 -0
- src/lib/src/Modules/CommentsFilter/Scan/Bot.php +4 -4
- src/lib/src/Modules/CommentsFilter/Scan/Human.php +2 -1
- src/lib/src/Modules/CommentsFilter/Token/Create.php +0 -3
- src/lib/src/Modules/Email/Options.php +1 -0
- src/lib/src/Modules/Events/Lib/EventsListener.php +61 -0
- src/lib/src/Modules/Events/Lib/EventsService.php +82 -0
- src/lib/src/Modules/Events/Lib/StatsWriter.php +52 -0
- src/lib/src/Modules/Events/Strings.php +2 -2
- src/lib/src/Modules/Firewall/Options.php +7 -0
- src/lib/src/Modules/HackGuard/AjaxHandler.php +71 -70
- src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesForAsset.php +48 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromApi.php +88 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromDir.php +84 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/FindAssetsToSnap.php +36 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/Store.php +277 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseAction.php +48 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseBulk.php +10 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/Build.php +64 -0
- src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BuildAll.php +16 -0
changelog.html
CHANGED
@@ -1,3 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<p>= 8.3 - Series =
|
2 |
<em>Released: 18th November, 2019</em> - <a href="https://shsec.io/g3">Release Notes</a></p>
|
3 |
<ul>
|
@@ -1359,4 +1411,4 @@ will outright block any access they have to your WordPress site.</p>
|
|
1359 |
<li>You can now add a comment to IP addresses in the whitelist/blacklist. To do this, write your IP address then type a SPACE and write whatever you want (don't take a new line).</li>
|
1360 |
<li>You can now set to delete ALL firewall settings when you deactivate the plugin.</li>
|
1361 |
<li>Improved formatting of the firewall log.</li>
|
1362 |
-
</ul>
|
1 |
+
<p>= 8.5 - Series =
|
2 |
+
<em>Released: 8th January, 2020</em> - <a href="https://shsec.io/gb">Release Notes</a></p>
|
3 |
+
<ul>
|
4 |
+
<li><strong>(v.7)</strong> ADDED: New admin notice to indicate that the plugin is currently disabled.</li>
|
5 |
+
<li><strong>(v.7)</strong> IMPROVED: Optimised loading of libraries that run for certain options, if they aren't enabled.</li>
|
6 |
+
<li><strong>(v.7)</strong> IMPROVED: Prevent a rare fatal error on activation.</li>
|
7 |
+
<li><strong>(v.6)</strong> FIXED: Locking session to IP address was not handling all IP addresses correctly.</li>
|
8 |
+
<li><strong>(v.5)</strong> FIXED: Further protection against errors if IP address is of a private network.</li>
|
9 |
+
<li><strong>(v.5)</strong> FIXED: Can't activate plugins in a particular scenario.</li>
|
10 |
+
<li><strong>(v.5)</strong> FIXED: Traffic Logger wasn't capturing traffic in some cases.</li>
|
11 |
+
<li><strong>(v.3)</strong> FIXED: Prevent MySQL error when Shield is running on private network or local machine.</li>
|
12 |
+
<li><strong>(v.3)</strong> FIXED: Prevent duplicate emails being sent when removing Security Admin key.</li>
|
13 |
+
<li><strong>(v.2)</strong> ADDED: Introductory tour of plugin, on activation.</li>
|
14 |
+
<li><strong>(v.2)</strong> IMPROVED: Enhanced IP detection of service providers for exclusion from traffic log.</li>
|
15 |
+
<li><strong>(v.2)</strong> IMPROVED: Plugin/Theme Hack Guard Snapshot building is optimised to reduce disruption is some cases.</li>
|
16 |
+
<li><strong>(v.2)</strong> IMPROVED: Visitor IP detection processing.</li>
|
17 |
+
<li><strong>(v.2)</strong> IMPROVED: Improved cache-prevention of Login Two-Factor Authentication portal.</li>
|
18 |
+
<li><strong>(v.2)</strong> FIXED: Firewall email alert was not sent when using certain dedicated email plugins.</li>
|
19 |
+
<li><strong>(v.2)</strong> FIXED: Firewall 404 setting was redirecting instead of responding with 404.</li>
|
20 |
+
<li><strong>(v.2)</strong> ADDED: Added support for NodePing filtering in the traffic logger.</li>
|
21 |
+
<li><strong>(v.1)</strong> FIXED: Fix for page loading issue/slowdown in some cases.</li>
|
22 |
+
<li><strong>(v.0)</strong> NEW: Initial support for checksum scanning of premium plugins and themes.</li>
|
23 |
+
<li><strong>(v.0)</strong> NEW: Ability to switch-off Security Admin with an email confirmation if key is lost/forgotten.</li>
|
24 |
+
<li><strong>(v.0)</strong> NEW: Ability to auto-repair theme files.</li>
|
25 |
+
<li><strong>(v.0)</strong> ADDED: Ability to whitelist requests so that they are never blacklisted.</li>
|
26 |
+
<li><strong>(v.0)</strong> ADDED: Ability to filter the IP White/Black list tables for a specific IP address.</li>
|
27 |
+
<li><strong>(v.0)</strong> ADDED: Support for repeated audit trail entries - so the logs don't get filled with repeated messages.</li>
|
28 |
+
<li><strong>(v.0)</strong> ADDED: [<strong>PRO</strong>] Option to provide complete, custom Content Security Policy headers.</li>
|
29 |
+
<li><strong>(v.0)</strong> IMPROVED: Protection against a certain type of broken plugin installation if WordPress doesn't properly copy files.</li>
|
30 |
+
<li><strong>(v.0)</strong> IMPROVED: Redesigned Table UI for scan results.</li>
|
31 |
+
<li><strong>(v.0)</strong> IMPROVED: Redesigned Plugin/Theme File Guard.</li>
|
32 |
+
<li><strong>(v.0)</strong> IMPROVED: Completely re-written much of the scanners code.</li>
|
33 |
+
<li><strong>(v.0)</strong> IMPROVED: Better detection of the hosting server's IP addresses - i.e. support for IPv6 alongside IPv4.</li>
|
34 |
+
<li><strong>(v.0)</strong> FIXED: Two-Factor Authentication (2FA) login screen redirection bug.</li>
|
35 |
+
<li><strong>(v.0)</strong> FIXED: It was possible to temporarily by-pass the 2FA screen to gain access to WP Admin after logging-in.</li>
|
36 |
+
<li><strong>(v.0)</strong> CLEANED: Code cleaning.</li>
|
37 |
+
<li><strong>(v.0)</strong> UPDATED: Twitter Bootstrap library.</li>
|
38 |
+
</ul>
|
39 |
+
<p>= 8.4 - Series =
|
40 |
+
<em>Released: 29th November, 2019</em> - <a href="https://shsec.io/g5">Release Notes</a></p>
|
41 |
+
<ul>
|
42 |
+
<li><strong>(v.4)</strong> IMPROVED: Discovered serious conflict with SiteGround Optimizer plugin. Provided admin notice and automatic fixing.</li>
|
43 |
+
<li><strong>(v.4)</strong> FIXED: Protected against spurious error log notices when comparing hashes with "nothing".</li>
|
44 |
+
<li><strong>(v.3)</strong> FIXED: Reduce chances of fatal error occurring during upgrade.</li>
|
45 |
+
<li><strong>(v.0)</strong> ADDED: Charts of important events on Overview page highlight effectiveness of Shield.</li>
|
46 |
+
<li><strong>(v.0)</strong> ADDED: Support for whitelisting IPv6 ranges.</li>
|
47 |
+
<li><strong>(v.0)</strong> ADDED: Allow Audit Trail logging for Shield's Bot Detection features for all free installations.</li>
|
48 |
+
<li><strong>(v.0)</strong> IMPROVED: Malware scanner false-positive lookups now use further intelligence from API.</li>
|
49 |
+
<li><strong>(v.0)</strong> IMPROVED: Refactor Comment SPAM implementation away from inline-Javascript.</li>
|
50 |
+
<li><strong>(v.0)</strong> IMPROVED: Consolidate Events/Statistics database table to significantly reduce DB size.</li>
|
51 |
+
<li><strong>(v.0)</strong> CLEANED: Significant clean-out of old, deprecated, retired code.</li>
|
52 |
+
</ul>
|
53 |
<p>= 8.3 - Series =
|
54 |
<em>Released: 18th November, 2019</em> - <a href="https://shsec.io/g3">Release Notes</a></p>
|
55 |
<ul>
|
1411 |
<li>You can now add a comment to IP addresses in the whitelist/blacklist. To do this, write your IP address then type a SPACE and write whatever you want (don't take a new line).</li>
|
1412 |
<li>You can now set to delete ALL firewall settings when you deactivate the plugin.</li>
|
1413 |
<li>Improved formatting of the firewall log.</li>
|
1414 |
+
</ul>
|
icwp-wpsf.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Shield Security
|
4 |
* Plugin URI: https://shsec.io/2f
|
5 |
* Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
|
6 |
-
* Version: 8.
|
7 |
* Text Domain: wp-simple-firewall
|
8 |
* Domain Path: /languages
|
9 |
* Author: Shield Security
|
@@ -11,7 +11,7 @@
|
|
11 |
*/
|
12 |
|
13 |
/**
|
14 |
-
* Copyright (c)
|
15 |
* All rights reserved.
|
16 |
* "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
|
17 |
* General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
|
@@ -35,28 +35,10 @@ if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
|
|
35 |
return;
|
36 |
}
|
37 |
|
38 |
-
if (
|
39 |
-
|
40 |
-
* @param $sStr
|
41 |
-
* @deprecated
|
42 |
-
*/
|
43 |
-
function _wpsf_e( $sStr ) {
|
44 |
-
_e( $sStr, 'wp-simple-firewall' );
|
45 |
-
}
|
46 |
-
}
|
47 |
-
if ( !function_exists( '_wpsf__' ) ) {
|
48 |
-
/**
|
49 |
-
* @param $sStr
|
50 |
-
* @return string|void
|
51 |
-
* @deprecated
|
52 |
-
*/
|
53 |
-
function _wpsf__( $sStr ) {
|
54 |
-
return __( $sStr, 'wp-simple-firewall' );
|
55 |
-
}
|
56 |
}
|
57 |
|
58 |
-
require_once( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' );
|
59 |
-
|
60 |
if ( !include_once( dirname( __FILE__ ).'/filesnotfound.php' ) ) {
|
61 |
return;
|
62 |
}
|
3 |
* Plugin Name: Shield Security
|
4 |
* Plugin URI: https://shsec.io/2f
|
5 |
* Description: Powerful, Easy-To-Use #1 Rated WordPress Security System
|
6 |
+
* Version: 8.5.7
|
7 |
* Text Domain: wp-simple-firewall
|
8 |
* Domain Path: /languages
|
9 |
* Author: Shield Security
|
11 |
*/
|
12 |
|
13 |
/**
|
14 |
+
* Copyright (c) 2020 Shield Security <support@shieldsecurity.io>
|
15 |
* All rights reserved.
|
16 |
* "Shield" (formerly WordPress Simple Firewall) is distributed under the GNU
|
17 |
* General Public License, Version 2, June 1991. Copyright (C) 1989, 1991 Free
|
35 |
return;
|
36 |
}
|
37 |
|
38 |
+
if ( @is_file( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' ) ) {
|
39 |
+
require_once( dirname( __FILE__ ).'/src/lib/vendor/autoload.php' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
|
|
|
|
|
42 |
if ( !include_once( dirname( __FILE__ ).'/filesnotfound.php' ) ) {
|
43 |
return;
|
44 |
}
|
plugin-spec.php
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
{
|
2 |
"properties": {
|
3 |
-
"version": "8.
|
4 |
-
"release_timestamp":
|
5 |
-
"build": "
|
6 |
"slug_parent": "icwp",
|
7 |
"slug_plugin": "wpsf",
|
8 |
"human_name": "Shield",
|
@@ -42,7 +42,7 @@
|
|
42 |
},
|
43 |
"plugin_admin": {
|
44 |
"css": [
|
45 |
-
"bootstrap4",
|
46 |
"bootstrap-select.min",
|
47 |
"plugin",
|
48 |
"featherlight"
|
1 |
{
|
2 |
"properties": {
|
3 |
+
"version": "8.5.7",
|
4 |
+
"release_timestamp": 1581339113,
|
5 |
+
"build": "202002.1001",
|
6 |
"slug_parent": "icwp",
|
7 |
"slug_plugin": "wpsf",
|
8 |
"human_name": "Shield",
|
42 |
},
|
43 |
"plugin_admin": {
|
44 |
"css": [
|
45 |
+
"bootstrap4.min",
|
46 |
"bootstrap-select.min",
|
47 |
"plugin",
|
48 |
"featherlight"
|
readme.txt
CHANGED
@@ -8,7 +8,7 @@ Requires at least: 3.5.2
|
|
8 |
Requires PHP: 5.4.0
|
9 |
Recommended PHP: 7.0
|
10 |
Tested up to: 5.3
|
11 |
-
Stable tag: 8.
|
12 |
|
13 |
Smarter security protection from hackers through automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
|
14 |
|
@@ -370,22 +370,47 @@ You will always be able to use Shield Security and its free features in-full.
|
|
370 |
|
371 |
[Go Pro for just $1/month](https://shsec.io/aa).
|
372 |
|
373 |
-
= 8.
|
374 |
-
*Released:
|
375 |
-
|
376 |
-
* **(v.
|
377 |
-
* **(v.
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
*
|
383 |
-
|
384 |
-
* **(v.
|
385 |
-
* **(v.
|
386 |
-
* **(v.
|
387 |
-
* **(v.
|
388 |
-
* **(v.
|
389 |
-
* **(v.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
390 |
|
391 |
#### [Full Shield Security Changelog](https://shsec.io/shieldwporgfullchangelog)
|
8 |
Requires PHP: 5.4.0
|
9 |
Recommended PHP: 7.0
|
10 |
Tested up to: 5.3
|
11 |
+
Stable tag: 8.5.7
|
12 |
|
13 |
Smarter security protection from hackers through automation. Powerful scanners, 2-Factor Auth, limit logins, auto IP blocks & more.
|
14 |
|
370 |
|
371 |
[Go Pro for just $1/month](https://shsec.io/aa).
|
372 |
|
373 |
+
= 8.5.7 - Current Release =
|
374 |
+
*Released: 10th February, 2020* - [Release Notes](https://shsec.io/gb)
|
375 |
+
|
376 |
+
* **(v.7)** ADDED: New admin notice to indicate that the plugin is currently disabled.
|
377 |
+
* **(v.7)** IMPROVED: Malware scanning for premium assets always uses hashes where possible to verify contents.
|
378 |
+
* **(v.7)** IMPROVED: Optimised loading of libraries that run for certain features, if they aren't enabled.
|
379 |
+
* **(v.7)** IMPROVED: Prevent a rare fatal error on activation.
|
380 |
+
|
381 |
+
= 8.5 - Series =
|
382 |
+
*Released: 8th January, 2020* - [Release Notes](https://shsec.io/gb)
|
383 |
+
|
384 |
+
* **(v.6)** FIXED: Locking session to IP address was not handling all IP addresses correctly.
|
385 |
+
* **(v.5)** FIXED: Further protection against errors if IP address is of a private network.
|
386 |
+
* **(v.5)** FIXED: Can't activate plugins in a particular scenario.
|
387 |
+
* **(v.5)** FIXED: Traffic Logger wasn't capturing traffic in some cases.
|
388 |
+
* **(v.3)** FIXED: Prevent MySQL error when Shield is running on private network or local machine.
|
389 |
+
* **(v.3)** FIXED: Prevent duplicate emails being sent when removing Security Admin key.
|
390 |
+
* **(v.2)** ADDED: Introductory tour of plugin, on activation.
|
391 |
+
* **(v.2)** IMPROVED: Enhanced IP detection of service providers for exclusion from traffic log.
|
392 |
+
* **(v.2)** IMPROVED: Plugin/Theme Hack Guard Snapshot building is optimised to reduce disruption is some cases.
|
393 |
+
* **(v.2)** IMPROVED: Visitor IP detection processing.
|
394 |
+
* **(v.2)** IMPROVED: Improved cache-prevention of Login Two-Factor Authentication portal.
|
395 |
+
* **(v.2)** FIXED: Firewall email alert was not sent when using certain dedicated email plugins.
|
396 |
+
* **(v.2)** FIXED: Firewall 404 setting was redirecting instead of responding with 404.
|
397 |
+
* **(v.2)** ADDED: Added support for NodePing filtering in the traffic logger.
|
398 |
+
* **(v.1)** FIXED: Fix for page loading issue/slowdown in some cases.
|
399 |
+
* **(v.0)** NEW: Initial support for checksum scanning of premium plugins and themes.
|
400 |
+
* **(v.0)** NEW: Ability to switch-off Security Admin with an email confirmation if key is lost/forgotten.
|
401 |
+
* **(v.0)** NEW: Ability to auto-repair theme files.
|
402 |
+
* **(v.0)** ADDED: Ability to whitelist requests so that they are never blacklisted.
|
403 |
+
* **(v.0)** ADDED: Ability to filter the IP White/Black list tables for a specific IP address.
|
404 |
+
* **(v.0)** ADDED: Support for repeated audit trail entries - so the logs don't get filled with repeated messages.
|
405 |
+
* **(v.0)** ADDED: [**PRO**] Option to provide complete, custom Content Security Policy headers.
|
406 |
+
* **(v.0)** IMPROVED: Protection against a certain type of broken plugin installation if WordPress doesn't properly copy files.
|
407 |
+
* **(v.0)** IMPROVED: Redesigned Table UI for scan results.
|
408 |
+
* **(v.0)** IMPROVED: Redesigned Plugin/Theme File Guard.
|
409 |
+
* **(v.0)** IMPROVED: Completely re-written much of the scanners code.
|
410 |
+
* **(v.0)** IMPROVED: Better detection of the hosting server's IP addresses - i.e. support for IPv6 alongside IPv4.
|
411 |
+
* **(v.0)** FIXED: Two-Factor Authentication (2FA) login screen redirection bug.
|
412 |
+
* **(v.0)** FIXED: It was possible to temporarily by-pass the 2FA screen to gain access to WP Admin after logging-in.
|
413 |
+
* **(v.0)** CLEANED: Code cleaning.
|
414 |
+
* **(v.0)** UPDATED: Twitter Bootstrap library.
|
415 |
|
416 |
#### [Full Shield Security Changelog](https://shsec.io/shieldwporgfullchangelog)
|
resources/css/bootstrap4.css
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors
|
4 |
* Copyright 2011-2019 Twitter, Inc.
|
5 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
@@ -63,7 +63,7 @@ body {
|
|
63 |
background-color: #fff;
|
64 |
}
|
65 |
|
66 |
-
[tabindex="-1"]:focus {
|
67 |
outline: 0 !important;
|
68 |
}
|
69 |
|
@@ -163,20 +163,16 @@ a:hover {
|
|
163 |
text-decoration: underline;
|
164 |
}
|
165 |
|
166 |
-
a:not([href])
|
167 |
color: inherit;
|
168 |
text-decoration: none;
|
169 |
}
|
170 |
|
171 |
-
a:not([href]):
|
172 |
color: inherit;
|
173 |
text-decoration: none;
|
174 |
}
|
175 |
|
176 |
-
a:not([href]):not([tabindex]):focus {
|
177 |
-
outline: 0;
|
178 |
-
}
|
179 |
-
|
180 |
pre,
|
181 |
code,
|
182 |
kbd,
|
@@ -507,7 +503,7 @@ mark,
|
|
507 |
code {
|
508 |
font-size: 87.5%;
|
509 |
color: #e83e8c;
|
510 |
-
word-
|
511 |
}
|
512 |
|
513 |
a > code {
|
@@ -577,7 +573,7 @@ pre code {
|
|
577 |
}
|
578 |
}
|
579 |
|
580 |
-
.container-fluid {
|
581 |
width: 100%;
|
582 |
padding-right: 15px;
|
583 |
padding-left: 15px;
|
@@ -585,6 +581,30 @@ pre code {
|
|
585 |
margin-left: auto;
|
586 |
}
|
587 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
588 |
.row {
|
589 |
display: -ms-flexbox;
|
590 |
display: flex;
|
@@ -625,6 +645,42 @@ pre code {
|
|
625 |
max-width: 100%;
|
626 |
}
|
627 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
628 |
.col-auto {
|
629 |
-ms-flex: 0 0 auto;
|
630 |
flex: 0 0 auto;
|
@@ -831,6 +887,36 @@ pre code {
|
|
831 |
flex-grow: 1;
|
832 |
max-width: 100%;
|
833 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
834 |
.col-sm-auto {
|
835 |
-ms-flex: 0 0 auto;
|
836 |
flex: 0 0 auto;
|
@@ -1003,6 +1089,36 @@ pre code {
|
|
1003 |
flex-grow: 1;
|
1004 |
max-width: 100%;
|
1005 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1006 |
.col-md-auto {
|
1007 |
-ms-flex: 0 0 auto;
|
1008 |
flex: 0 0 auto;
|
@@ -1175,6 +1291,36 @@ pre code {
|
|
1175 |
flex-grow: 1;
|
1176 |
max-width: 100%;
|
1177 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1178 |
.col-lg-auto {
|
1179 |
-ms-flex: 0 0 auto;
|
1180 |
flex: 0 0 auto;
|
@@ -1347,6 +1493,36 @@ pre code {
|
|
1347 |
flex-grow: 1;
|
1348 |
max-width: 100%;
|
1349 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1350 |
.col-xl-auto {
|
1351 |
-ms-flex: 0 0 auto;
|
1352 |
flex: 0 0 auto;
|
@@ -1881,6 +2057,11 @@ pre code {
|
|
1881 |
border: 0;
|
1882 |
}
|
1883 |
|
|
|
|
|
|
|
|
|
|
|
1884 |
.form-control:focus {
|
1885 |
color: #495057;
|
1886 |
background-color: #fff;
|
@@ -1955,9 +2136,9 @@ select.form-control:focus::-ms-value {
|
|
1955 |
.form-control-plaintext {
|
1956 |
display: block;
|
1957 |
width: 100%;
|
1958 |
-
padding
|
1959 |
-
padding-bottom: 0.375rem;
|
1960 |
margin-bottom: 0;
|
|
|
1961 |
line-height: 1.5;
|
1962 |
color: #212529;
|
1963 |
background-color: transparent;
|
@@ -2030,6 +2211,7 @@ textarea.form-control {
|
|
2030 |
margin-left: -1.25rem;
|
2031 |
}
|
2032 |
|
|
|
2033 |
.form-check-input:disabled ~ .form-check-label {
|
2034 |
color: #6c757d;
|
2035 |
}
|
@@ -2077,12 +2259,19 @@ textarea.form-control {
|
|
2077 |
border-radius: 0.25rem;
|
2078 |
}
|
2079 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2080 |
.was-validated .form-control:valid, .form-control.is-valid {
|
2081 |
border-color: #28a745;
|
2082 |
padding-right: calc(1.5em + 0.75rem);
|
2083 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
|
2084 |
background-repeat: no-repeat;
|
2085 |
-
background-position:
|
2086 |
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2087 |
}
|
2088 |
|
@@ -2091,12 +2280,6 @@ textarea.form-control {
|
|
2091 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
2092 |
}
|
2093 |
|
2094 |
-
.was-validated .form-control:valid ~ .valid-feedback,
|
2095 |
-
.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,
|
2096 |
-
.form-control.is-valid ~ .valid-tooltip {
|
2097 |
-
display: block;
|
2098 |
-
}
|
2099 |
-
|
2100 |
.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
|
2101 |
padding-right: calc(1.5em + 0.75rem);
|
2102 |
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
|
@@ -2104,8 +2287,8 @@ textarea.form-control {
|
|
2104 |
|
2105 |
.was-validated .custom-select:valid, .custom-select.is-valid {
|
2106 |
border-color: #28a745;
|
2107 |
-
padding-right: calc(
|
2108 |
-
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2109 |
}
|
2110 |
|
2111 |
.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
|
@@ -2113,18 +2296,6 @@ textarea.form-control {
|
|
2113 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
2114 |
}
|
2115 |
|
2116 |
-
.was-validated .custom-select:valid ~ .valid-feedback,
|
2117 |
-
.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,
|
2118 |
-
.custom-select.is-valid ~ .valid-tooltip {
|
2119 |
-
display: block;
|
2120 |
-
}
|
2121 |
-
|
2122 |
-
.was-validated .form-control-file:valid ~ .valid-feedback,
|
2123 |
-
.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,
|
2124 |
-
.form-control-file.is-valid ~ .valid-tooltip {
|
2125 |
-
display: block;
|
2126 |
-
}
|
2127 |
-
|
2128 |
.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
|
2129 |
color: #28a745;
|
2130 |
}
|
@@ -2143,12 +2314,6 @@ textarea.form-control {
|
|
2143 |
border-color: #28a745;
|
2144 |
}
|
2145 |
|
2146 |
-
.was-validated .custom-control-input:valid ~ .valid-feedback,
|
2147 |
-
.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,
|
2148 |
-
.custom-control-input.is-valid ~ .valid-tooltip {
|
2149 |
-
display: block;
|
2150 |
-
}
|
2151 |
-
|
2152 |
.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
|
2153 |
border-color: #34ce57;
|
2154 |
background-color: #34ce57;
|
@@ -2166,12 +2331,6 @@ textarea.form-control {
|
|
2166 |
border-color: #28a745;
|
2167 |
}
|
2168 |
|
2169 |
-
.was-validated .custom-file-input:valid ~ .valid-feedback,
|
2170 |
-
.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,
|
2171 |
-
.custom-file-input.is-valid ~ .valid-tooltip {
|
2172 |
-
display: block;
|
2173 |
-
}
|
2174 |
-
|
2175 |
.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
|
2176 |
border-color: #28a745;
|
2177 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
@@ -2200,12 +2359,19 @@ textarea.form-control {
|
|
2200 |
border-radius: 0.25rem;
|
2201 |
}
|
2202 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2203 |
.was-validated .form-control:invalid, .form-control.is-invalid {
|
2204 |
border-color: #dc3545;
|
2205 |
padding-right: calc(1.5em + 0.75rem);
|
2206 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'
|
2207 |
background-repeat: no-repeat;
|
2208 |
-
background-position:
|
2209 |
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2210 |
}
|
2211 |
|
@@ -2214,12 +2380,6 @@ textarea.form-control {
|
|
2214 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
2215 |
}
|
2216 |
|
2217 |
-
.was-validated .form-control:invalid ~ .invalid-feedback,
|
2218 |
-
.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
|
2219 |
-
.form-control.is-invalid ~ .invalid-tooltip {
|
2220 |
-
display: block;
|
2221 |
-
}
|
2222 |
-
|
2223 |
.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
|
2224 |
padding-right: calc(1.5em + 0.75rem);
|
2225 |
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
|
@@ -2227,8 +2387,8 @@ textarea.form-control {
|
|
2227 |
|
2228 |
.was-validated .custom-select:invalid, .custom-select.is-invalid {
|
2229 |
border-color: #dc3545;
|
2230 |
-
padding-right: calc(
|
2231 |
-
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'
|
2232 |
}
|
2233 |
|
2234 |
.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
|
@@ -2236,18 +2396,6 @@ textarea.form-control {
|
|
2236 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
2237 |
}
|
2238 |
|
2239 |
-
.was-validated .custom-select:invalid ~ .invalid-feedback,
|
2240 |
-
.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,
|
2241 |
-
.custom-select.is-invalid ~ .invalid-tooltip {
|
2242 |
-
display: block;
|
2243 |
-
}
|
2244 |
-
|
2245 |
-
.was-validated .form-control-file:invalid ~ .invalid-feedback,
|
2246 |
-
.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,
|
2247 |
-
.form-control-file.is-invalid ~ .invalid-tooltip {
|
2248 |
-
display: block;
|
2249 |
-
}
|
2250 |
-
|
2251 |
.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
|
2252 |
color: #dc3545;
|
2253 |
}
|
@@ -2266,12 +2414,6 @@ textarea.form-control {
|
|
2266 |
border-color: #dc3545;
|
2267 |
}
|
2268 |
|
2269 |
-
.was-validated .custom-control-input:invalid ~ .invalid-feedback,
|
2270 |
-
.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,
|
2271 |
-
.custom-control-input.is-invalid ~ .invalid-tooltip {
|
2272 |
-
display: block;
|
2273 |
-
}
|
2274 |
-
|
2275 |
.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
|
2276 |
border-color: #e4606d;
|
2277 |
background-color: #e4606d;
|
@@ -2289,12 +2431,6 @@ textarea.form-control {
|
|
2289 |
border-color: #dc3545;
|
2290 |
}
|
2291 |
|
2292 |
-
.was-validated .custom-file-input:invalid ~ .invalid-feedback,
|
2293 |
-
.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,
|
2294 |
-
.custom-file-input.is-invalid ~ .invalid-tooltip {
|
2295 |
-
display: block;
|
2296 |
-
}
|
2297 |
-
|
2298 |
.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
|
2299 |
border-color: #dc3545;
|
2300 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
@@ -2381,6 +2517,7 @@ textarea.form-control {
|
|
2381 |
color: #212529;
|
2382 |
text-align: center;
|
2383 |
vertical-align: middle;
|
|
|
2384 |
-webkit-user-select: none;
|
2385 |
-moz-user-select: none;
|
2386 |
-ms-user-select: none;
|
@@ -2432,6 +2569,9 @@ fieldset:disabled a.btn {
|
|
2432 |
}
|
2433 |
|
2434 |
.btn-primary:focus, .btn-primary.focus {
|
|
|
|
|
|
|
2435 |
box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
|
2436 |
}
|
2437 |
|
@@ -2466,6 +2606,9 @@ fieldset:disabled a.btn {
|
|
2466 |
}
|
2467 |
|
2468 |
.btn-secondary:focus, .btn-secondary.focus {
|
|
|
|
|
|
|
2469 |
box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
|
2470 |
}
|
2471 |
|
@@ -2500,6 +2643,9 @@ fieldset:disabled a.btn {
|
|
2500 |
}
|
2501 |
|
2502 |
.btn-success:focus, .btn-success.focus {
|
|
|
|
|
|
|
2503 |
box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
|
2504 |
}
|
2505 |
|
@@ -2534,6 +2680,9 @@ fieldset:disabled a.btn {
|
|
2534 |
}
|
2535 |
|
2536 |
.btn-info:focus, .btn-info.focus {
|
|
|
|
|
|
|
2537 |
box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
|
2538 |
}
|
2539 |
|
@@ -2568,6 +2717,9 @@ fieldset:disabled a.btn {
|
|
2568 |
}
|
2569 |
|
2570 |
.btn-warning:focus, .btn-warning.focus {
|
|
|
|
|
|
|
2571 |
box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
|
2572 |
}
|
2573 |
|
@@ -2602,6 +2754,9 @@ fieldset:disabled a.btn {
|
|
2602 |
}
|
2603 |
|
2604 |
.btn-danger:focus, .btn-danger.focus {
|
|
|
|
|
|
|
2605 |
box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
|
2606 |
}
|
2607 |
|
@@ -2636,6 +2791,9 @@ fieldset:disabled a.btn {
|
|
2636 |
}
|
2637 |
|
2638 |
.btn-light:focus, .btn-light.focus {
|
|
|
|
|
|
|
2639 |
box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
|
2640 |
}
|
2641 |
|
@@ -2670,6 +2828,9 @@ fieldset:disabled a.btn {
|
|
2670 |
}
|
2671 |
|
2672 |
.btn-dark:focus, .btn-dark.focus {
|
|
|
|
|
|
|
2673 |
box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
|
2674 |
}
|
2675 |
|
@@ -3419,9 +3580,9 @@ input[type="button"].btn-block {
|
|
3419 |
.input-group > .custom-select,
|
3420 |
.input-group > .custom-file {
|
3421 |
position: relative;
|
3422 |
-
-ms-flex: 1 1
|
3423 |
-
flex: 1 1
|
3424 |
-
width:
|
3425 |
margin-bottom: 0;
|
3426 |
}
|
3427 |
|
@@ -3613,7 +3774,10 @@ input[type="button"].btn-block {
|
|
3613 |
|
3614 |
.custom-control-input {
|
3615 |
position: absolute;
|
|
|
3616 |
z-index: -1;
|
|
|
|
|
3617 |
opacity: 0;
|
3618 |
}
|
3619 |
|
@@ -3637,11 +3801,11 @@ input[type="button"].btn-block {
|
|
3637 |
border-color: #b3d7ff;
|
3638 |
}
|
3639 |
|
3640 |
-
.custom-control-input:disabled ~ .custom-control-label {
|
3641 |
color: #6c757d;
|
3642 |
}
|
3643 |
|
3644 |
-
.custom-control-input:disabled ~ .custom-control-label::before {
|
3645 |
background-color: #e9ecef;
|
3646 |
}
|
3647 |
|
@@ -3680,7 +3844,7 @@ input[type="button"].btn-block {
|
|
3680 |
}
|
3681 |
|
3682 |
.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
|
3683 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.
|
3684 |
}
|
3685 |
|
3686 |
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
|
@@ -3689,7 +3853,7 @@ input[type="button"].btn-block {
|
|
3689 |
}
|
3690 |
|
3691 |
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
|
3692 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
|
3693 |
}
|
3694 |
|
3695 |
.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
|
@@ -3705,7 +3869,7 @@ input[type="button"].btn-block {
|
|
3705 |
}
|
3706 |
|
3707 |
.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
|
3708 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
|
3709 |
}
|
3710 |
|
3711 |
.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
|
@@ -3761,8 +3925,7 @@ input[type="button"].btn-block {
|
|
3761 |
line-height: 1.5;
|
3762 |
color: #495057;
|
3763 |
vertical-align: middle;
|
3764 |
-
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
|
3765 |
-
background-color: #fff;
|
3766 |
border: 1px solid #ced4da;
|
3767 |
border-radius: 0.25rem;
|
3768 |
-webkit-appearance: none;
|
@@ -3796,6 +3959,11 @@ input[type="button"].btn-block {
|
|
3796 |
display: none;
|
3797 |
}
|
3798 |
|
|
|
|
|
|
|
|
|
|
|
3799 |
.custom-select-sm {
|
3800 |
height: calc(1.5em + 0.5rem + 2px);
|
3801 |
padding-top: 0.25rem;
|
@@ -3834,6 +4002,7 @@ input[type="button"].btn-block {
|
|
3834 |
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
|
3835 |
}
|
3836 |
|
|
|
3837 |
.custom-file-input:disabled ~ .custom-file-label {
|
3838 |
background-color: #e9ecef;
|
3839 |
}
|
@@ -3881,7 +4050,7 @@ input[type="button"].btn-block {
|
|
3881 |
|
3882 |
.custom-range {
|
3883 |
width: 100%;
|
3884 |
-
height:
|
3885 |
padding: 0;
|
3886 |
background-color: transparent;
|
3887 |
-webkit-appearance: none;
|
@@ -3916,6 +4085,7 @@ input[type="button"].btn-block {
|
|
3916 |
background-color: #007bff;
|
3917 |
border: 0;
|
3918 |
border-radius: 1rem;
|
|
|
3919 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
3920 |
-webkit-appearance: none;
|
3921 |
appearance: none;
|
@@ -3923,6 +4093,7 @@ input[type="button"].btn-block {
|
|
3923 |
|
3924 |
@media (prefers-reduced-motion: reduce) {
|
3925 |
.custom-range::-webkit-slider-thumb {
|
|
|
3926 |
transition: none;
|
3927 |
}
|
3928 |
}
|
@@ -3947,6 +4118,7 @@ input[type="button"].btn-block {
|
|
3947 |
background-color: #007bff;
|
3948 |
border: 0;
|
3949 |
border-radius: 1rem;
|
|
|
3950 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
3951 |
-moz-appearance: none;
|
3952 |
appearance: none;
|
@@ -3954,6 +4126,7 @@ input[type="button"].btn-block {
|
|
3954 |
|
3955 |
@media (prefers-reduced-motion: reduce) {
|
3956 |
.custom-range::-moz-range-thumb {
|
|
|
3957 |
transition: none;
|
3958 |
}
|
3959 |
}
|
@@ -3981,12 +4154,14 @@ input[type="button"].btn-block {
|
|
3981 |
background-color: #007bff;
|
3982 |
border: 0;
|
3983 |
border-radius: 1rem;
|
|
|
3984 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
3985 |
appearance: none;
|
3986 |
}
|
3987 |
|
3988 |
@media (prefers-reduced-motion: reduce) {
|
3989 |
.custom-range::-ms-thumb {
|
|
|
3990 |
transition: none;
|
3991 |
}
|
3992 |
}
|
@@ -4157,8 +4332,8 @@ input[type="button"].btn-block {
|
|
4157 |
padding: 0.5rem 1rem;
|
4158 |
}
|
4159 |
|
4160 |
-
.navbar
|
4161 |
-
.navbar
|
4162 |
display: -ms-flexbox;
|
4163 |
display: flex;
|
4164 |
-ms-flex-wrap: wrap;
|
@@ -4243,7 +4418,7 @@ input[type="button"].btn-block {
|
|
4243 |
|
4244 |
@media (max-width: 575.98px) {
|
4245 |
.navbar-expand-sm > .container,
|
4246 |
-
.navbar-expand-sm > .container-fluid {
|
4247 |
padding-right: 0;
|
4248 |
padding-left: 0;
|
4249 |
}
|
@@ -4268,7 +4443,7 @@ input[type="button"].btn-block {
|
|
4268 |
padding-left: 0.5rem;
|
4269 |
}
|
4270 |
.navbar-expand-sm > .container,
|
4271 |
-
.navbar-expand-sm > .container-fluid {
|
4272 |
-ms-flex-wrap: nowrap;
|
4273 |
flex-wrap: nowrap;
|
4274 |
}
|
@@ -4285,7 +4460,7 @@ input[type="button"].btn-block {
|
|
4285 |
|
4286 |
@media (max-width: 767.98px) {
|
4287 |
.navbar-expand-md > .container,
|
4288 |
-
.navbar-expand-md > .container-fluid {
|
4289 |
padding-right: 0;
|
4290 |
padding-left: 0;
|
4291 |
}
|
@@ -4310,7 +4485,7 @@ input[type="button"].btn-block {
|
|
4310 |
padding-left: 0.5rem;
|
4311 |
}
|
4312 |
.navbar-expand-md > .container,
|
4313 |
-
.navbar-expand-md > .container-fluid {
|
4314 |
-ms-flex-wrap: nowrap;
|
4315 |
flex-wrap: nowrap;
|
4316 |
}
|
@@ -4327,7 +4502,7 @@ input[type="button"].btn-block {
|
|
4327 |
|
4328 |
@media (max-width: 991.98px) {
|
4329 |
.navbar-expand-lg > .container,
|
4330 |
-
.navbar-expand-lg > .container-fluid {
|
4331 |
padding-right: 0;
|
4332 |
padding-left: 0;
|
4333 |
}
|
@@ -4352,7 +4527,7 @@ input[type="button"].btn-block {
|
|
4352 |
padding-left: 0.5rem;
|
4353 |
}
|
4354 |
.navbar-expand-lg > .container,
|
4355 |
-
.navbar-expand-lg > .container-fluid {
|
4356 |
-ms-flex-wrap: nowrap;
|
4357 |
flex-wrap: nowrap;
|
4358 |
}
|
@@ -4369,7 +4544,7 @@ input[type="button"].btn-block {
|
|
4369 |
|
4370 |
@media (max-width: 1199.98px) {
|
4371 |
.navbar-expand-xl > .container,
|
4372 |
-
.navbar-expand-xl > .container-fluid {
|
4373 |
padding-right: 0;
|
4374 |
padding-left: 0;
|
4375 |
}
|
@@ -4394,7 +4569,7 @@ input[type="button"].btn-block {
|
|
4394 |
padding-left: 0.5rem;
|
4395 |
}
|
4396 |
.navbar-expand-xl > .container,
|
4397 |
-
.navbar-expand-xl > .container-fluid {
|
4398 |
-ms-flex-wrap: nowrap;
|
4399 |
flex-wrap: nowrap;
|
4400 |
}
|
@@ -4417,7 +4592,7 @@ input[type="button"].btn-block {
|
|
4417 |
}
|
4418 |
|
4419 |
.navbar-expand > .container,
|
4420 |
-
.navbar-expand > .container-fluid {
|
4421 |
padding-right: 0;
|
4422 |
padding-left: 0;
|
4423 |
}
|
@@ -4437,7 +4612,7 @@ input[type="button"].btn-block {
|
|
4437 |
}
|
4438 |
|
4439 |
.navbar-expand > .container,
|
4440 |
-
.navbar-expand > .container-fluid {
|
4441 |
-ms-flex-wrap: nowrap;
|
4442 |
flex-wrap: nowrap;
|
4443 |
}
|
@@ -4486,7 +4661,7 @@ input[type="button"].btn-block {
|
|
4486 |
}
|
4487 |
|
4488 |
.navbar-light .navbar-toggler-icon {
|
4489 |
-
background-image: url("data:image/svg+xml,%3csvg
|
4490 |
}
|
4491 |
|
4492 |
.navbar-light .navbar-text {
|
@@ -4534,7 +4709,7 @@ input[type="button"].btn-block {
|
|
4534 |
}
|
4535 |
|
4536 |
.navbar-dark .navbar-toggler-icon {
|
4537 |
-
background-image: url("data:image/svg+xml,%3csvg
|
4538 |
}
|
4539 |
|
4540 |
.navbar-dark .navbar-text {
|
@@ -4581,6 +4756,7 @@ input[type="button"].btn-block {
|
|
4581 |
.card-body {
|
4582 |
-ms-flex: 1 1 auto;
|
4583 |
flex: 1 1 auto;
|
|
|
4584 |
padding: 1.25rem;
|
4585 |
}
|
4586 |
|
@@ -4651,67 +4827,56 @@ input[type="button"].btn-block {
|
|
4651 |
padding: 1.25rem;
|
4652 |
}
|
4653 |
|
4654 |
-
.card-img
|
|
|
|
|
|
|
|
|
4655 |
width: 100%;
|
4656 |
-
border-radius: calc(0.25rem - 1px);
|
4657 |
}
|
4658 |
|
|
|
4659 |
.card-img-top {
|
4660 |
-
width: 100%;
|
4661 |
border-top-left-radius: calc(0.25rem - 1px);
|
4662 |
border-top-right-radius: calc(0.25rem - 1px);
|
4663 |
}
|
4664 |
|
|
|
4665 |
.card-img-bottom {
|
4666 |
-
width: 100%;
|
4667 |
border-bottom-right-radius: calc(0.25rem - 1px);
|
4668 |
border-bottom-left-radius: calc(0.25rem - 1px);
|
4669 |
}
|
4670 |
|
4671 |
-
.card-deck {
|
4672 |
-
display: -ms-flexbox;
|
4673 |
-
display: flex;
|
4674 |
-
-ms-flex-direction: column;
|
4675 |
-
flex-direction: column;
|
4676 |
-
}
|
4677 |
-
|
4678 |
.card-deck .card {
|
4679 |
margin-bottom: 15px;
|
4680 |
}
|
4681 |
|
4682 |
@media (min-width: 576px) {
|
4683 |
.card-deck {
|
|
|
|
|
4684 |
-ms-flex-flow: row wrap;
|
4685 |
flex-flow: row wrap;
|
4686 |
margin-right: -15px;
|
4687 |
margin-left: -15px;
|
4688 |
}
|
4689 |
.card-deck .card {
|
4690 |
-
display: -ms-flexbox;
|
4691 |
-
display: flex;
|
4692 |
-ms-flex: 1 0 0%;
|
4693 |
flex: 1 0 0%;
|
4694 |
-
-ms-flex-direction: column;
|
4695 |
-
flex-direction: column;
|
4696 |
margin-right: 15px;
|
4697 |
margin-bottom: 0;
|
4698 |
margin-left: 15px;
|
4699 |
}
|
4700 |
}
|
4701 |
|
4702 |
-
.card-group {
|
4703 |
-
display: -ms-flexbox;
|
4704 |
-
display: flex;
|
4705 |
-
-ms-flex-direction: column;
|
4706 |
-
flex-direction: column;
|
4707 |
-
}
|
4708 |
-
|
4709 |
.card-group > .card {
|
4710 |
margin-bottom: 15px;
|
4711 |
}
|
4712 |
|
4713 |
@media (min-width: 576px) {
|
4714 |
.card-group {
|
|
|
|
|
4715 |
-ms-flex-flow: row wrap;
|
4716 |
flex-flow: row wrap;
|
4717 |
}
|
@@ -4775,27 +4940,19 @@ input[type="button"].btn-block {
|
|
4775 |
overflow: hidden;
|
4776 |
}
|
4777 |
|
4778 |
-
.accordion > .card:not(:
|
4779 |
-
border-radius: 0;
|
4780 |
-
}
|
4781 |
-
|
4782 |
-
.accordion > .card:not(:first-of-type):not(:last-of-type) {
|
4783 |
-
border-bottom: 0;
|
4784 |
-
border-radius: 0;
|
4785 |
-
}
|
4786 |
-
|
4787 |
-
.accordion > .card:first-of-type {
|
4788 |
border-bottom: 0;
|
4789 |
border-bottom-right-radius: 0;
|
4790 |
border-bottom-left-radius: 0;
|
4791 |
}
|
4792 |
|
4793 |
-
.accordion > .card:
|
4794 |
border-top-left-radius: 0;
|
4795 |
border-top-right-radius: 0;
|
4796 |
}
|
4797 |
|
4798 |
-
.accordion > .card .card-header {
|
|
|
4799 |
margin-bottom: -1px;
|
4800 |
}
|
4801 |
|
@@ -4862,7 +5019,7 @@ input[type="button"].btn-block {
|
|
4862 |
}
|
4863 |
|
4864 |
.page-link:focus {
|
4865 |
-
z-index:
|
4866 |
outline: 0;
|
4867 |
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
|
4868 |
}
|
@@ -4879,7 +5036,7 @@ input[type="button"].btn-block {
|
|
4879 |
}
|
4880 |
|
4881 |
.page-item.active .page-link {
|
4882 |
-
z-index:
|
4883 |
color: #fff;
|
4884 |
background-color: #007bff;
|
4885 |
border-color: #007bff;
|
@@ -5277,6 +5434,7 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5277 |
flex-direction: column;
|
5278 |
-ms-flex-pack: center;
|
5279 |
justify-content: center;
|
|
|
5280 |
color: #fff;
|
5281 |
text-align: center;
|
5282 |
white-space: nowrap;
|
@@ -5350,7 +5508,6 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5350 |
position: relative;
|
5351 |
display: block;
|
5352 |
padding: 0.75rem 1.25rem;
|
5353 |
-
margin-bottom: -1px;
|
5354 |
background-color: #fff;
|
5355 |
border: 1px solid rgba(0, 0, 0, 0.125);
|
5356 |
}
|
@@ -5361,7 +5518,6 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5361 |
}
|
5362 |
|
5363 |
.list-group-item:last-child {
|
5364 |
-
margin-bottom: 0;
|
5365 |
border-bottom-right-radius: 0.25rem;
|
5366 |
border-bottom-left-radius: 0.25rem;
|
5367 |
}
|
@@ -5379,49 +5535,68 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5379 |
border-color: #007bff;
|
5380 |
}
|
5381 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5382 |
.list-group-horizontal {
|
5383 |
-ms-flex-direction: row;
|
5384 |
flex-direction: row;
|
5385 |
}
|
5386 |
|
5387 |
-
.list-group-horizontal .list-group-item {
|
5388 |
-
margin-right: -1px;
|
5389 |
-
margin-bottom: 0;
|
5390 |
-
}
|
5391 |
-
|
5392 |
.list-group-horizontal .list-group-item:first-child {
|
5393 |
-
border-top-left-radius: 0.25rem;
|
5394 |
border-bottom-left-radius: 0.25rem;
|
5395 |
border-top-right-radius: 0;
|
5396 |
}
|
5397 |
|
5398 |
.list-group-horizontal .list-group-item:last-child {
|
5399 |
-
margin-right: 0;
|
5400 |
border-top-right-radius: 0.25rem;
|
5401 |
-
border-bottom-right-radius: 0.25rem;
|
5402 |
border-bottom-left-radius: 0;
|
5403 |
}
|
5404 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5405 |
@media (min-width: 576px) {
|
5406 |
.list-group-horizontal-sm {
|
5407 |
-ms-flex-direction: row;
|
5408 |
flex-direction: row;
|
5409 |
}
|
5410 |
-
.list-group-horizontal-sm .list-group-item {
|
5411 |
-
margin-right: -1px;
|
5412 |
-
margin-bottom: 0;
|
5413 |
-
}
|
5414 |
.list-group-horizontal-sm .list-group-item:first-child {
|
5415 |
-
border-top-left-radius: 0.25rem;
|
5416 |
border-bottom-left-radius: 0.25rem;
|
5417 |
border-top-right-radius: 0;
|
5418 |
}
|
5419 |
.list-group-horizontal-sm .list-group-item:last-child {
|
5420 |
-
margin-right: 0;
|
5421 |
border-top-right-radius: 0.25rem;
|
5422 |
-
border-bottom-right-radius: 0.25rem;
|
5423 |
border-bottom-left-radius: 0;
|
5424 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5425 |
}
|
5426 |
|
5427 |
@media (min-width: 768px) {
|
@@ -5429,21 +5604,25 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5429 |
-ms-flex-direction: row;
|
5430 |
flex-direction: row;
|
5431 |
}
|
5432 |
-
.list-group-horizontal-md .list-group-item {
|
5433 |
-
margin-right: -1px;
|
5434 |
-
margin-bottom: 0;
|
5435 |
-
}
|
5436 |
.list-group-horizontal-md .list-group-item:first-child {
|
5437 |
-
border-top-left-radius: 0.25rem;
|
5438 |
border-bottom-left-radius: 0.25rem;
|
5439 |
border-top-right-radius: 0;
|
5440 |
}
|
5441 |
.list-group-horizontal-md .list-group-item:last-child {
|
5442 |
-
margin-right: 0;
|
5443 |
border-top-right-radius: 0.25rem;
|
5444 |
-
border-bottom-right-radius: 0.25rem;
|
5445 |
border-bottom-left-radius: 0;
|
5446 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5447 |
}
|
5448 |
|
5449 |
@media (min-width: 992px) {
|
@@ -5451,21 +5630,25 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5451 |
-ms-flex-direction: row;
|
5452 |
flex-direction: row;
|
5453 |
}
|
5454 |
-
.list-group-horizontal-lg .list-group-item {
|
5455 |
-
margin-right: -1px;
|
5456 |
-
margin-bottom: 0;
|
5457 |
-
}
|
5458 |
.list-group-horizontal-lg .list-group-item:first-child {
|
5459 |
-
border-top-left-radius: 0.25rem;
|
5460 |
border-bottom-left-radius: 0.25rem;
|
5461 |
border-top-right-radius: 0;
|
5462 |
}
|
5463 |
.list-group-horizontal-lg .list-group-item:last-child {
|
5464 |
-
margin-right: 0;
|
5465 |
border-top-right-radius: 0.25rem;
|
5466 |
-
border-bottom-right-radius: 0.25rem;
|
5467 |
border-bottom-left-radius: 0;
|
5468 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5469 |
}
|
5470 |
|
5471 |
@media (min-width: 1200px) {
|
@@ -5473,40 +5656,39 @@ a.badge-dark:focus, a.badge-dark.focus {
|
|
5473 |
-ms-flex-direction: row;
|
5474 |
flex-direction: row;
|
5475 |
}
|
5476 |
-
.list-group-horizontal-xl .list-group-item {
|
5477 |
-
margin-right: -1px;
|
5478 |
-
margin-bottom: 0;
|
5479 |
-
}
|
5480 |
.list-group-horizontal-xl .list-group-item:first-child {
|
5481 |
-
border-top-left-radius: 0.25rem;
|
5482 |
border-bottom-left-radius: 0.25rem;
|
5483 |
border-top-right-radius: 0;
|
5484 |
}
|
5485 |
.list-group-horizontal-xl .list-group-item:last-child {
|
5486 |
-
margin-right: 0;
|
5487 |
border-top-right-radius: 0.25rem;
|
5488 |
-
border-bottom-right-radius: 0.25rem;
|
5489 |
border-bottom-left-radius: 0;
|
5490 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5491 |
}
|
5492 |
|
5493 |
.list-group-flush .list-group-item {
|
5494 |
-
border-right: 0;
|
5495 |
-
border-left: 0;
|
5496 |
border-radius: 0;
|
5497 |
}
|
5498 |
|
5499 |
-
.list-group-flush .list-group-item:
|
5500 |
-
|
5501 |
-
}
|
5502 |
-
|
5503 |
-
.list-group-flush:first-child .list-group-item:first-child {
|
5504 |
-
border-top: 0;
|
5505 |
}
|
5506 |
|
5507 |
.list-group-flush:last-child .list-group-item:last-child {
|
5508 |
-
|
5509 |
-
border-bottom: 0;
|
5510 |
}
|
5511 |
|
5512 |
.list-group-item-primary {
|
@@ -5763,6 +5945,11 @@ a.close.disabled {
|
|
5763 |
transform: none;
|
5764 |
}
|
5765 |
|
|
|
|
|
|
|
|
|
|
|
5766 |
.modal-dialog-scrollable {
|
5767 |
display: -ms-flexbox;
|
5768 |
display: flex;
|
@@ -5856,8 +6043,8 @@ a.close.disabled {
|
|
5856 |
justify-content: space-between;
|
5857 |
padding: 1rem 1rem;
|
5858 |
border-bottom: 1px solid #dee2e6;
|
5859 |
-
border-top-left-radius: 0.3rem;
|
5860 |
-
border-top-right-radius: 0.3rem;
|
5861 |
}
|
5862 |
|
5863 |
.modal-header .close {
|
@@ -5880,22 +6067,20 @@ a.close.disabled {
|
|
5880 |
.modal-footer {
|
5881 |
display: -ms-flexbox;
|
5882 |
display: flex;
|
|
|
|
|
5883 |
-ms-flex-align: center;
|
5884 |
align-items: center;
|
5885 |
-ms-flex-pack: end;
|
5886 |
justify-content: flex-end;
|
5887 |
-
padding:
|
5888 |
border-top: 1px solid #dee2e6;
|
5889 |
-
border-bottom-right-radius: 0.3rem;
|
5890 |
-
border-bottom-left-radius: 0.3rem;
|
5891 |
-
}
|
5892 |
-
|
5893 |
-
.modal-footer > :not(:first-child) {
|
5894 |
-
margin-left: .25rem;
|
5895 |
}
|
5896 |
|
5897 |
-
.modal-footer >
|
5898 |
-
margin
|
5899 |
}
|
5900 |
|
5901 |
.modal-scrollbar-measure {
|
@@ -6102,7 +6287,7 @@ a.close.disabled {
|
|
6102 |
}
|
6103 |
|
6104 |
.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
|
6105 |
-
bottom: calc(
|
6106 |
}
|
6107 |
|
6108 |
.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
|
@@ -6122,7 +6307,7 @@ a.close.disabled {
|
|
6122 |
}
|
6123 |
|
6124 |
.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
|
6125 |
-
left: calc(
|
6126 |
width: 0.5rem;
|
6127 |
height: 1rem;
|
6128 |
margin: 0.3rem 0;
|
@@ -6145,7 +6330,7 @@ a.close.disabled {
|
|
6145 |
}
|
6146 |
|
6147 |
.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
|
6148 |
-
top: calc(
|
6149 |
}
|
6150 |
|
6151 |
.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
|
@@ -6176,7 +6361,7 @@ a.close.disabled {
|
|
6176 |
}
|
6177 |
|
6178 |
.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
|
6179 |
-
right: calc(
|
6180 |
width: 0.5rem;
|
6181 |
height: 1rem;
|
6182 |
margin: 0.3rem 0;
|
@@ -6289,7 +6474,7 @@ a.close.disabled {
|
|
6289 |
.carousel-fade .active.carousel-item-right {
|
6290 |
z-index: 0;
|
6291 |
opacity: 0;
|
6292 |
-
transition: 0s 0.6s
|
6293 |
}
|
6294 |
|
6295 |
@media (prefers-reduced-motion: reduce) {
|
@@ -6351,11 +6536,11 @@ a.close.disabled {
|
|
6351 |
}
|
6352 |
|
6353 |
.carousel-control-prev-icon {
|
6354 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.
|
6355 |
}
|
6356 |
|
6357 |
.carousel-control-next-icon {
|
6358 |
-
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.
|
6359 |
}
|
6360 |
|
6361 |
.carousel-indicators {
|
@@ -7807,6 +7992,7 @@ button.bg-dark:focus {
|
|
7807 |
width: 1px;
|
7808 |
height: 1px;
|
7809 |
padding: 0;
|
|
|
7810 |
overflow: hidden;
|
7811 |
clip: rect(0, 0, 0, 0);
|
7812 |
white-space: nowrap;
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors
|
4 |
* Copyright 2011-2019 Twitter, Inc.
|
5 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
63 |
background-color: #fff;
|
64 |
}
|
65 |
|
66 |
+
[tabindex="-1"]:focus:not(:focus-visible) {
|
67 |
outline: 0 !important;
|
68 |
}
|
69 |
|
163 |
text-decoration: underline;
|
164 |
}
|
165 |
|
166 |
+
a:not([href]) {
|
167 |
color: inherit;
|
168 |
text-decoration: none;
|
169 |
}
|
170 |
|
171 |
+
a:not([href]):hover {
|
172 |
color: inherit;
|
173 |
text-decoration: none;
|
174 |
}
|
175 |
|
|
|
|
|
|
|
|
|
176 |
pre,
|
177 |
code,
|
178 |
kbd,
|
503 |
code {
|
504 |
font-size: 87.5%;
|
505 |
color: #e83e8c;
|
506 |
+
word-wrap: break-word;
|
507 |
}
|
508 |
|
509 |
a > code {
|
573 |
}
|
574 |
}
|
575 |
|
576 |
+
.container-fluid, .container-sm, .container-md, .container-lg, .container-xl {
|
577 |
width: 100%;
|
578 |
padding-right: 15px;
|
579 |
padding-left: 15px;
|
581 |
margin-left: auto;
|
582 |
}
|
583 |
|
584 |
+
@media (min-width: 576px) {
|
585 |
+
.container, .container-sm {
|
586 |
+
max-width: 540px;
|
587 |
+
}
|
588 |
+
}
|
589 |
+
|
590 |
+
@media (min-width: 768px) {
|
591 |
+
.container, .container-sm, .container-md {
|
592 |
+
max-width: 720px;
|
593 |
+
}
|
594 |
+
}
|
595 |
+
|
596 |
+
@media (min-width: 992px) {
|
597 |
+
.container, .container-sm, .container-md, .container-lg {
|
598 |
+
max-width: 960px;
|
599 |
+
}
|
600 |
+
}
|
601 |
+
|
602 |
+
@media (min-width: 1200px) {
|
603 |
+
.container, .container-sm, .container-md, .container-lg, .container-xl {
|
604 |
+
max-width: 1140px;
|
605 |
+
}
|
606 |
+
}
|
607 |
+
|
608 |
.row {
|
609 |
display: -ms-flexbox;
|
610 |
display: flex;
|
645 |
max-width: 100%;
|
646 |
}
|
647 |
|
648 |
+
.row-cols-1 > * {
|
649 |
+
-ms-flex: 0 0 100%;
|
650 |
+
flex: 0 0 100%;
|
651 |
+
max-width: 100%;
|
652 |
+
}
|
653 |
+
|
654 |
+
.row-cols-2 > * {
|
655 |
+
-ms-flex: 0 0 50%;
|
656 |
+
flex: 0 0 50%;
|
657 |
+
max-width: 50%;
|
658 |
+
}
|
659 |
+
|
660 |
+
.row-cols-3 > * {
|
661 |
+
-ms-flex: 0 0 33.333333%;
|
662 |
+
flex: 0 0 33.333333%;
|
663 |
+
max-width: 33.333333%;
|
664 |
+
}
|
665 |
+
|
666 |
+
.row-cols-4 > * {
|
667 |
+
-ms-flex: 0 0 25%;
|
668 |
+
flex: 0 0 25%;
|
669 |
+
max-width: 25%;
|
670 |
+
}
|
671 |
+
|
672 |
+
.row-cols-5 > * {
|
673 |
+
-ms-flex: 0 0 20%;
|
674 |
+
flex: 0 0 20%;
|
675 |
+
max-width: 20%;
|
676 |
+
}
|
677 |
+
|
678 |
+
.row-cols-6 > * {
|
679 |
+
-ms-flex: 0 0 16.666667%;
|
680 |
+
flex: 0 0 16.666667%;
|
681 |
+
max-width: 16.666667%;
|
682 |
+
}
|
683 |
+
|
684 |
.col-auto {
|
685 |
-ms-flex: 0 0 auto;
|
686 |
flex: 0 0 auto;
|
887 |
flex-grow: 1;
|
888 |
max-width: 100%;
|
889 |
}
|
890 |
+
.row-cols-sm-1 > * {
|
891 |
+
-ms-flex: 0 0 100%;
|
892 |
+
flex: 0 0 100%;
|
893 |
+
max-width: 100%;
|
894 |
+
}
|
895 |
+
.row-cols-sm-2 > * {
|
896 |
+
-ms-flex: 0 0 50%;
|
897 |
+
flex: 0 0 50%;
|
898 |
+
max-width: 50%;
|
899 |
+
}
|
900 |
+
.row-cols-sm-3 > * {
|
901 |
+
-ms-flex: 0 0 33.333333%;
|
902 |
+
flex: 0 0 33.333333%;
|
903 |
+
max-width: 33.333333%;
|
904 |
+
}
|
905 |
+
.row-cols-sm-4 > * {
|
906 |
+
-ms-flex: 0 0 25%;
|
907 |
+
flex: 0 0 25%;
|
908 |
+
max-width: 25%;
|
909 |
+
}
|
910 |
+
.row-cols-sm-5 > * {
|
911 |
+
-ms-flex: 0 0 20%;
|
912 |
+
flex: 0 0 20%;
|
913 |
+
max-width: 20%;
|
914 |
+
}
|
915 |
+
.row-cols-sm-6 > * {
|
916 |
+
-ms-flex: 0 0 16.666667%;
|
917 |
+
flex: 0 0 16.666667%;
|
918 |
+
max-width: 16.666667%;
|
919 |
+
}
|
920 |
.col-sm-auto {
|
921 |
-ms-flex: 0 0 auto;
|
922 |
flex: 0 0 auto;
|
1089 |
flex-grow: 1;
|
1090 |
max-width: 100%;
|
1091 |
}
|
1092 |
+
.row-cols-md-1 > * {
|
1093 |
+
-ms-flex: 0 0 100%;
|
1094 |
+
flex: 0 0 100%;
|
1095 |
+
max-width: 100%;
|
1096 |
+
}
|
1097 |
+
.row-cols-md-2 > * {
|
1098 |
+
-ms-flex: 0 0 50%;
|
1099 |
+
flex: 0 0 50%;
|
1100 |
+
max-width: 50%;
|
1101 |
+
}
|
1102 |
+
.row-cols-md-3 > * {
|
1103 |
+
-ms-flex: 0 0 33.333333%;
|
1104 |
+
flex: 0 0 33.333333%;
|
1105 |
+
max-width: 33.333333%;
|
1106 |
+
}
|
1107 |
+
.row-cols-md-4 > * {
|
1108 |
+
-ms-flex: 0 0 25%;
|
1109 |
+
flex: 0 0 25%;
|
1110 |
+
max-width: 25%;
|
1111 |
+
}
|
1112 |
+
.row-cols-md-5 > * {
|
1113 |
+
-ms-flex: 0 0 20%;
|
1114 |
+
flex: 0 0 20%;
|
1115 |
+
max-width: 20%;
|
1116 |
+
}
|
1117 |
+
.row-cols-md-6 > * {
|
1118 |
+
-ms-flex: 0 0 16.666667%;
|
1119 |
+
flex: 0 0 16.666667%;
|
1120 |
+
max-width: 16.666667%;
|
1121 |
+
}
|
1122 |
.col-md-auto {
|
1123 |
-ms-flex: 0 0 auto;
|
1124 |
flex: 0 0 auto;
|
1291 |
flex-grow: 1;
|
1292 |
max-width: 100%;
|
1293 |
}
|
1294 |
+
.row-cols-lg-1 > * {
|
1295 |
+
-ms-flex: 0 0 100%;
|
1296 |
+
flex: 0 0 100%;
|
1297 |
+
max-width: 100%;
|
1298 |
+
}
|
1299 |
+
.row-cols-lg-2 > * {
|
1300 |
+
-ms-flex: 0 0 50%;
|
1301 |
+
flex: 0 0 50%;
|
1302 |
+
max-width: 50%;
|
1303 |
+
}
|
1304 |
+
.row-cols-lg-3 > * {
|
1305 |
+
-ms-flex: 0 0 33.333333%;
|
1306 |
+
flex: 0 0 33.333333%;
|
1307 |
+
max-width: 33.333333%;
|
1308 |
+
}
|
1309 |
+
.row-cols-lg-4 > * {
|
1310 |
+
-ms-flex: 0 0 25%;
|
1311 |
+
flex: 0 0 25%;
|
1312 |
+
max-width: 25%;
|
1313 |
+
}
|
1314 |
+
.row-cols-lg-5 > * {
|
1315 |
+
-ms-flex: 0 0 20%;
|
1316 |
+
flex: 0 0 20%;
|
1317 |
+
max-width: 20%;
|
1318 |
+
}
|
1319 |
+
.row-cols-lg-6 > * {
|
1320 |
+
-ms-flex: 0 0 16.666667%;
|
1321 |
+
flex: 0 0 16.666667%;
|
1322 |
+
max-width: 16.666667%;
|
1323 |
+
}
|
1324 |
.col-lg-auto {
|
1325 |
-ms-flex: 0 0 auto;
|
1326 |
flex: 0 0 auto;
|
1493 |
flex-grow: 1;
|
1494 |
max-width: 100%;
|
1495 |
}
|
1496 |
+
.row-cols-xl-1 > * {
|
1497 |
+
-ms-flex: 0 0 100%;
|
1498 |
+
flex: 0 0 100%;
|
1499 |
+
max-width: 100%;
|
1500 |
+
}
|
1501 |
+
.row-cols-xl-2 > * {
|
1502 |
+
-ms-flex: 0 0 50%;
|
1503 |
+
flex: 0 0 50%;
|
1504 |
+
max-width: 50%;
|
1505 |
+
}
|
1506 |
+
.row-cols-xl-3 > * {
|
1507 |
+
-ms-flex: 0 0 33.333333%;
|
1508 |
+
flex: 0 0 33.333333%;
|
1509 |
+
max-width: 33.333333%;
|
1510 |
+
}
|
1511 |
+
.row-cols-xl-4 > * {
|
1512 |
+
-ms-flex: 0 0 25%;
|
1513 |
+
flex: 0 0 25%;
|
1514 |
+
max-width: 25%;
|
1515 |
+
}
|
1516 |
+
.row-cols-xl-5 > * {
|
1517 |
+
-ms-flex: 0 0 20%;
|
1518 |
+
flex: 0 0 20%;
|
1519 |
+
max-width: 20%;
|
1520 |
+
}
|
1521 |
+
.row-cols-xl-6 > * {
|
1522 |
+
-ms-flex: 0 0 16.666667%;
|
1523 |
+
flex: 0 0 16.666667%;
|
1524 |
+
max-width: 16.666667%;
|
1525 |
+
}
|
1526 |
.col-xl-auto {
|
1527 |
-ms-flex: 0 0 auto;
|
1528 |
flex: 0 0 auto;
|
2057 |
border: 0;
|
2058 |
}
|
2059 |
|
2060 |
+
.form-control:-moz-focusring {
|
2061 |
+
color: transparent;
|
2062 |
+
text-shadow: 0 0 0 #495057;
|
2063 |
+
}
|
2064 |
+
|
2065 |
.form-control:focus {
|
2066 |
color: #495057;
|
2067 |
background-color: #fff;
|
2136 |
.form-control-plaintext {
|
2137 |
display: block;
|
2138 |
width: 100%;
|
2139 |
+
padding: 0.375rem 0;
|
|
|
2140 |
margin-bottom: 0;
|
2141 |
+
font-size: 1rem;
|
2142 |
line-height: 1.5;
|
2143 |
color: #212529;
|
2144 |
background-color: transparent;
|
2211 |
margin-left: -1.25rem;
|
2212 |
}
|
2213 |
|
2214 |
+
.form-check-input[disabled] ~ .form-check-label,
|
2215 |
.form-check-input:disabled ~ .form-check-label {
|
2216 |
color: #6c757d;
|
2217 |
}
|
2259 |
border-radius: 0.25rem;
|
2260 |
}
|
2261 |
|
2262 |
+
.was-validated :valid ~ .valid-feedback,
|
2263 |
+
.was-validated :valid ~ .valid-tooltip,
|
2264 |
+
.is-valid ~ .valid-feedback,
|
2265 |
+
.is-valid ~ .valid-tooltip {
|
2266 |
+
display: block;
|
2267 |
+
}
|
2268 |
+
|
2269 |
.was-validated .form-control:valid, .form-control.is-valid {
|
2270 |
border-color: #28a745;
|
2271 |
padding-right: calc(1.5em + 0.75rem);
|
2272 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
|
2273 |
background-repeat: no-repeat;
|
2274 |
+
background-position: right calc(0.375em + 0.1875rem) center;
|
2275 |
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2276 |
}
|
2277 |
|
2280 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
2281 |
}
|
2282 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2283 |
.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
|
2284 |
padding-right: calc(1.5em + 0.75rem);
|
2285 |
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
|
2287 |
|
2288 |
.was-validated .custom-select:valid, .custom-select.is-valid {
|
2289 |
border-color: #28a745;
|
2290 |
+
padding-right: calc(0.75em + 2.3125rem);
|
2291 |
+
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2292 |
}
|
2293 |
|
2294 |
.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {
|
2296 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
2297 |
}
|
2298 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2299 |
.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
|
2300 |
color: #28a745;
|
2301 |
}
|
2314 |
border-color: #28a745;
|
2315 |
}
|
2316 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2317 |
.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {
|
2318 |
border-color: #34ce57;
|
2319 |
background-color: #34ce57;
|
2331 |
border-color: #28a745;
|
2332 |
}
|
2333 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2334 |
.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {
|
2335 |
border-color: #28a745;
|
2336 |
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
|
2359 |
border-radius: 0.25rem;
|
2360 |
}
|
2361 |
|
2362 |
+
.was-validated :invalid ~ .invalid-feedback,
|
2363 |
+
.was-validated :invalid ~ .invalid-tooltip,
|
2364 |
+
.is-invalid ~ .invalid-feedback,
|
2365 |
+
.is-invalid ~ .invalid-tooltip {
|
2366 |
+
display: block;
|
2367 |
+
}
|
2368 |
+
|
2369 |
.was-validated .form-control:invalid, .form-control.is-invalid {
|
2370 |
border-color: #dc3545;
|
2371 |
padding-right: calc(1.5em + 0.75rem);
|
2372 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
|
2373 |
background-repeat: no-repeat;
|
2374 |
+
background-position: right calc(0.375em + 0.1875rem) center;
|
2375 |
background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2376 |
}
|
2377 |
|
2380 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
2381 |
}
|
2382 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2383 |
.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
|
2384 |
padding-right: calc(1.5em + 0.75rem);
|
2385 |
background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
|
2387 |
|
2388 |
.was-validated .custom-select:invalid, .custom-select.is-invalid {
|
2389 |
border-color: #dc3545;
|
2390 |
+
padding-right: calc(0.75em + 2.3125rem);
|
2391 |
+
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
|
2392 |
}
|
2393 |
|
2394 |
.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {
|
2396 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
2397 |
}
|
2398 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2399 |
.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
|
2400 |
color: #dc3545;
|
2401 |
}
|
2414 |
border-color: #dc3545;
|
2415 |
}
|
2416 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2417 |
.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {
|
2418 |
border-color: #e4606d;
|
2419 |
background-color: #e4606d;
|
2431 |
border-color: #dc3545;
|
2432 |
}
|
2433 |
|
|
|
|
|
|
|
|
|
|
|
|
|
2434 |
.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {
|
2435 |
border-color: #dc3545;
|
2436 |
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
|
2517 |
color: #212529;
|
2518 |
text-align: center;
|
2519 |
vertical-align: middle;
|
2520 |
+
cursor: pointer;
|
2521 |
-webkit-user-select: none;
|
2522 |
-moz-user-select: none;
|
2523 |
-ms-user-select: none;
|
2569 |
}
|
2570 |
|
2571 |
.btn-primary:focus, .btn-primary.focus {
|
2572 |
+
color: #fff;
|
2573 |
+
background-color: #0069d9;
|
2574 |
+
border-color: #0062cc;
|
2575 |
box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);
|
2576 |
}
|
2577 |
|
2606 |
}
|
2607 |
|
2608 |
.btn-secondary:focus, .btn-secondary.focus {
|
2609 |
+
color: #fff;
|
2610 |
+
background-color: #5a6268;
|
2611 |
+
border-color: #545b62;
|
2612 |
box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
|
2613 |
}
|
2614 |
|
2643 |
}
|
2644 |
|
2645 |
.btn-success:focus, .btn-success.focus {
|
2646 |
+
color: #fff;
|
2647 |
+
background-color: #218838;
|
2648 |
+
border-color: #1e7e34;
|
2649 |
box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
|
2650 |
}
|
2651 |
|
2680 |
}
|
2681 |
|
2682 |
.btn-info:focus, .btn-info.focus {
|
2683 |
+
color: #fff;
|
2684 |
+
background-color: #138496;
|
2685 |
+
border-color: #117a8b;
|
2686 |
box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
|
2687 |
}
|
2688 |
|
2717 |
}
|
2718 |
|
2719 |
.btn-warning:focus, .btn-warning.focus {
|
2720 |
+
color: #212529;
|
2721 |
+
background-color: #e0a800;
|
2722 |
+
border-color: #d39e00;
|
2723 |
box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
|
2724 |
}
|
2725 |
|
2754 |
}
|
2755 |
|
2756 |
.btn-danger:focus, .btn-danger.focus {
|
2757 |
+
color: #fff;
|
2758 |
+
background-color: #c82333;
|
2759 |
+
border-color: #bd2130;
|
2760 |
box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
|
2761 |
}
|
2762 |
|
2791 |
}
|
2792 |
|
2793 |
.btn-light:focus, .btn-light.focus {
|
2794 |
+
color: #212529;
|
2795 |
+
background-color: #e2e6ea;
|
2796 |
+
border-color: #dae0e5;
|
2797 |
box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
|
2798 |
}
|
2799 |
|
2828 |
}
|
2829 |
|
2830 |
.btn-dark:focus, .btn-dark.focus {
|
2831 |
+
color: #fff;
|
2832 |
+
background-color: #23272b;
|
2833 |
+
border-color: #1d2124;
|
2834 |
box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
|
2835 |
}
|
2836 |
|
3580 |
.input-group > .custom-select,
|
3581 |
.input-group > .custom-file {
|
3582 |
position: relative;
|
3583 |
+
-ms-flex: 1 1 0%;
|
3584 |
+
flex: 1 1 0%;
|
3585 |
+
min-width: 0;
|
3586 |
margin-bottom: 0;
|
3587 |
}
|
3588 |
|
3774 |
|
3775 |
.custom-control-input {
|
3776 |
position: absolute;
|
3777 |
+
left: 0;
|
3778 |
z-index: -1;
|
3779 |
+
width: 1rem;
|
3780 |
+
height: 1.25rem;
|
3781 |
opacity: 0;
|
3782 |
}
|
3783 |
|
3801 |
border-color: #b3d7ff;
|
3802 |
}
|
3803 |
|
3804 |
+
.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label {
|
3805 |
color: #6c757d;
|
3806 |
}
|
3807 |
|
3808 |
+
.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before {
|
3809 |
background-color: #e9ecef;
|
3810 |
}
|
3811 |
|
3844 |
}
|
3845 |
|
3846 |
.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
|
3847 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e");
|
3848 |
}
|
3849 |
|
3850 |
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
|
3853 |
}
|
3854 |
|
3855 |
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
|
3856 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
|
3857 |
}
|
3858 |
|
3859 |
.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
|
3869 |
}
|
3870 |
|
3871 |
.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
|
3872 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
|
3873 |
}
|
3874 |
|
3875 |
.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
|
3925 |
line-height: 1.5;
|
3926 |
color: #495057;
|
3927 |
vertical-align: middle;
|
3928 |
+
background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px;
|
|
|
3929 |
border: 1px solid #ced4da;
|
3930 |
border-radius: 0.25rem;
|
3931 |
-webkit-appearance: none;
|
3959 |
display: none;
|
3960 |
}
|
3961 |
|
3962 |
+
.custom-select:-moz-focusring {
|
3963 |
+
color: transparent;
|
3964 |
+
text-shadow: 0 0 0 #495057;
|
3965 |
+
}
|
3966 |
+
|
3967 |
.custom-select-sm {
|
3968 |
height: calc(1.5em + 0.5rem + 2px);
|
3969 |
padding-top: 0.25rem;
|
4002 |
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
|
4003 |
}
|
4004 |
|
4005 |
+
.custom-file-input[disabled] ~ .custom-file-label,
|
4006 |
.custom-file-input:disabled ~ .custom-file-label {
|
4007 |
background-color: #e9ecef;
|
4008 |
}
|
4050 |
|
4051 |
.custom-range {
|
4052 |
width: 100%;
|
4053 |
+
height: 1.4rem;
|
4054 |
padding: 0;
|
4055 |
background-color: transparent;
|
4056 |
-webkit-appearance: none;
|
4085 |
background-color: #007bff;
|
4086 |
border: 0;
|
4087 |
border-radius: 1rem;
|
4088 |
+
-webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4089 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4090 |
-webkit-appearance: none;
|
4091 |
appearance: none;
|
4093 |
|
4094 |
@media (prefers-reduced-motion: reduce) {
|
4095 |
.custom-range::-webkit-slider-thumb {
|
4096 |
+
-webkit-transition: none;
|
4097 |
transition: none;
|
4098 |
}
|
4099 |
}
|
4118 |
background-color: #007bff;
|
4119 |
border: 0;
|
4120 |
border-radius: 1rem;
|
4121 |
+
-moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4122 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4123 |
-moz-appearance: none;
|
4124 |
appearance: none;
|
4126 |
|
4127 |
@media (prefers-reduced-motion: reduce) {
|
4128 |
.custom-range::-moz-range-thumb {
|
4129 |
+
-moz-transition: none;
|
4130 |
transition: none;
|
4131 |
}
|
4132 |
}
|
4154 |
background-color: #007bff;
|
4155 |
border: 0;
|
4156 |
border-radius: 1rem;
|
4157 |
+
-ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4158 |
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
|
4159 |
appearance: none;
|
4160 |
}
|
4161 |
|
4162 |
@media (prefers-reduced-motion: reduce) {
|
4163 |
.custom-range::-ms-thumb {
|
4164 |
+
-ms-transition: none;
|
4165 |
transition: none;
|
4166 |
}
|
4167 |
}
|
4332 |
padding: 0.5rem 1rem;
|
4333 |
}
|
4334 |
|
4335 |
+
.navbar .container,
|
4336 |
+
.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl {
|
4337 |
display: -ms-flexbox;
|
4338 |
display: flex;
|
4339 |
-ms-flex-wrap: wrap;
|
4418 |
|
4419 |
@media (max-width: 575.98px) {
|
4420 |
.navbar-expand-sm > .container,
|
4421 |
+
.navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
|
4422 |
padding-right: 0;
|
4423 |
padding-left: 0;
|
4424 |
}
|
4443 |
padding-left: 0.5rem;
|
4444 |
}
|
4445 |
.navbar-expand-sm > .container,
|
4446 |
+
.navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl {
|
4447 |
-ms-flex-wrap: nowrap;
|
4448 |
flex-wrap: nowrap;
|
4449 |
}
|
4460 |
|
4461 |
@media (max-width: 767.98px) {
|
4462 |
.navbar-expand-md > .container,
|
4463 |
+
.navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
|
4464 |
padding-right: 0;
|
4465 |
padding-left: 0;
|
4466 |
}
|
4485 |
padding-left: 0.5rem;
|
4486 |
}
|
4487 |
.navbar-expand-md > .container,
|
4488 |
+
.navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl {
|
4489 |
-ms-flex-wrap: nowrap;
|
4490 |
flex-wrap: nowrap;
|
4491 |
}
|
4502 |
|
4503 |
@media (max-width: 991.98px) {
|
4504 |
.navbar-expand-lg > .container,
|
4505 |
+
.navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
|
4506 |
padding-right: 0;
|
4507 |
padding-left: 0;
|
4508 |
}
|
4527 |
padding-left: 0.5rem;
|
4528 |
}
|
4529 |
.navbar-expand-lg > .container,
|
4530 |
+
.navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl {
|
4531 |
-ms-flex-wrap: nowrap;
|
4532 |
flex-wrap: nowrap;
|
4533 |
}
|
4544 |
|
4545 |
@media (max-width: 1199.98px) {
|
4546 |
.navbar-expand-xl > .container,
|
4547 |
+
.navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
|
4548 |
padding-right: 0;
|
4549 |
padding-left: 0;
|
4550 |
}
|
4569 |
padding-left: 0.5rem;
|
4570 |
}
|
4571 |
.navbar-expand-xl > .container,
|
4572 |
+
.navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl {
|
4573 |
-ms-flex-wrap: nowrap;
|
4574 |
flex-wrap: nowrap;
|
4575 |
}
|
4592 |
}
|
4593 |
|
4594 |
.navbar-expand > .container,
|
4595 |
+
.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
|
4596 |
padding-right: 0;
|
4597 |
padding-left: 0;
|
4598 |
}
|
4612 |
}
|
4613 |
|
4614 |
.navbar-expand > .container,
|
4615 |
+
.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl {
|
4616 |
-ms-flex-wrap: nowrap;
|
4617 |
flex-wrap: nowrap;
|
4618 |
}
|
4661 |
}
|
4662 |
|
4663 |
.navbar-light .navbar-toggler-icon {
|
4664 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
4665 |
}
|
4666 |
|
4667 |
.navbar-light .navbar-text {
|
4709 |
}
|
4710 |
|
4711 |
.navbar-dark .navbar-toggler-icon {
|
4712 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
|
4713 |
}
|
4714 |
|
4715 |
.navbar-dark .navbar-text {
|
4756 |
.card-body {
|
4757 |
-ms-flex: 1 1 auto;
|
4758 |
flex: 1 1 auto;
|
4759 |
+
min-height: 1px;
|
4760 |
padding: 1.25rem;
|
4761 |
}
|
4762 |
|
4827 |
padding: 1.25rem;
|
4828 |
}
|
4829 |
|
4830 |
+
.card-img,
|
4831 |
+
.card-img-top,
|
4832 |
+
.card-img-bottom {
|
4833 |
+
-ms-flex-negative: 0;
|
4834 |
+
flex-shrink: 0;
|
4835 |
width: 100%;
|
|
|
4836 |
}
|
4837 |
|
4838 |
+
.card-img,
|
4839 |
.card-img-top {
|
|
|
4840 |
border-top-left-radius: calc(0.25rem - 1px);
|
4841 |
border-top-right-radius: calc(0.25rem - 1px);
|
4842 |
}
|
4843 |
|
4844 |
+
.card-img,
|
4845 |
.card-img-bottom {
|
|
|
4846 |
border-bottom-right-radius: calc(0.25rem - 1px);
|
4847 |
border-bottom-left-radius: calc(0.25rem - 1px);
|
4848 |
}
|
4849 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4850 |
.card-deck .card {
|
4851 |
margin-bottom: 15px;
|
4852 |
}
|
4853 |
|
4854 |
@media (min-width: 576px) {
|
4855 |
.card-deck {
|
4856 |
+
display: -ms-flexbox;
|
4857 |
+
display: flex;
|
4858 |
-ms-flex-flow: row wrap;
|
4859 |
flex-flow: row wrap;
|
4860 |
margin-right: -15px;
|
4861 |
margin-left: -15px;
|
4862 |
}
|
4863 |
.card-deck .card {
|
|
|
|
|
4864 |
-ms-flex: 1 0 0%;
|
4865 |
flex: 1 0 0%;
|
|
|
|
|
4866 |
margin-right: 15px;
|
4867 |
margin-bottom: 0;
|
4868 |
margin-left: 15px;
|
4869 |
}
|
4870 |
}
|
4871 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4872 |
.card-group > .card {
|
4873 |
margin-bottom: 15px;
|
4874 |
}
|
4875 |
|
4876 |
@media (min-width: 576px) {
|
4877 |
.card-group {
|
4878 |
+
display: -ms-flexbox;
|
4879 |
+
display: flex;
|
4880 |
-ms-flex-flow: row wrap;
|
4881 |
flex-flow: row wrap;
|
4882 |
}
|
4940 |
overflow: hidden;
|
4941 |
}
|
4942 |
|
4943 |
+
.accordion > .card:not(:last-of-type) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4944 |
border-bottom: 0;
|
4945 |
border-bottom-right-radius: 0;
|
4946 |
border-bottom-left-radius: 0;
|
4947 |
}
|
4948 |
|
4949 |
+
.accordion > .card:not(:first-of-type) {
|
4950 |
border-top-left-radius: 0;
|
4951 |
border-top-right-radius: 0;
|
4952 |
}
|
4953 |
|
4954 |
+
.accordion > .card > .card-header {
|
4955 |
+
border-radius: 0;
|
4956 |
margin-bottom: -1px;
|
4957 |
}
|
4958 |
|
5019 |
}
|
5020 |
|
5021 |
.page-link:focus {
|
5022 |
+
z-index: 3;
|
5023 |
outline: 0;
|
5024 |
box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
|
5025 |
}
|
5036 |
}
|
5037 |
|
5038 |
.page-item.active .page-link {
|
5039 |
+
z-index: 3;
|
5040 |
color: #fff;
|
5041 |
background-color: #007bff;
|
5042 |
border-color: #007bff;
|
5434 |
flex-direction: column;
|
5435 |
-ms-flex-pack: center;
|
5436 |
justify-content: center;
|
5437 |
+
overflow: hidden;
|
5438 |
color: #fff;
|
5439 |
text-align: center;
|
5440 |
white-space: nowrap;
|
5508 |
position: relative;
|
5509 |
display: block;
|
5510 |
padding: 0.75rem 1.25rem;
|
|
|
5511 |
background-color: #fff;
|
5512 |
border: 1px solid rgba(0, 0, 0, 0.125);
|
5513 |
}
|
5518 |
}
|
5519 |
|
5520 |
.list-group-item:last-child {
|
|
|
5521 |
border-bottom-right-radius: 0.25rem;
|
5522 |
border-bottom-left-radius: 0.25rem;
|
5523 |
}
|
5535 |
border-color: #007bff;
|
5536 |
}
|
5537 |
|
5538 |
+
.list-group-item + .list-group-item {
|
5539 |
+
border-top-width: 0;
|
5540 |
+
}
|
5541 |
+
|
5542 |
+
.list-group-item + .list-group-item.active {
|
5543 |
+
margin-top: -1px;
|
5544 |
+
border-top-width: 1px;
|
5545 |
+
}
|
5546 |
+
|
5547 |
.list-group-horizontal {
|
5548 |
-ms-flex-direction: row;
|
5549 |
flex-direction: row;
|
5550 |
}
|
5551 |
|
|
|
|
|
|
|
|
|
|
|
5552 |
.list-group-horizontal .list-group-item:first-child {
|
|
|
5553 |
border-bottom-left-radius: 0.25rem;
|
5554 |
border-top-right-radius: 0;
|
5555 |
}
|
5556 |
|
5557 |
.list-group-horizontal .list-group-item:last-child {
|
|
|
5558 |
border-top-right-radius: 0.25rem;
|
|
|
5559 |
border-bottom-left-radius: 0;
|
5560 |
}
|
5561 |
|
5562 |
+
.list-group-horizontal .list-group-item.active {
|
5563 |
+
margin-top: 0;
|
5564 |
+
}
|
5565 |
+
|
5566 |
+
.list-group-horizontal .list-group-item + .list-group-item {
|
5567 |
+
border-top-width: 1px;
|
5568 |
+
border-left-width: 0;
|
5569 |
+
}
|
5570 |
+
|
5571 |
+
.list-group-horizontal .list-group-item + .list-group-item.active {
|
5572 |
+
margin-left: -1px;
|
5573 |
+
border-left-width: 1px;
|
5574 |
+
}
|
5575 |
+
|
5576 |
@media (min-width: 576px) {
|
5577 |
.list-group-horizontal-sm {
|
5578 |
-ms-flex-direction: row;
|
5579 |
flex-direction: row;
|
5580 |
}
|
|
|
|
|
|
|
|
|
5581 |
.list-group-horizontal-sm .list-group-item:first-child {
|
|
|
5582 |
border-bottom-left-radius: 0.25rem;
|
5583 |
border-top-right-radius: 0;
|
5584 |
}
|
5585 |
.list-group-horizontal-sm .list-group-item:last-child {
|
|
|
5586 |
border-top-right-radius: 0.25rem;
|
|
|
5587 |
border-bottom-left-radius: 0;
|
5588 |
}
|
5589 |
+
.list-group-horizontal-sm .list-group-item.active {
|
5590 |
+
margin-top: 0;
|
5591 |
+
}
|
5592 |
+
.list-group-horizontal-sm .list-group-item + .list-group-item {
|
5593 |
+
border-top-width: 1px;
|
5594 |
+
border-left-width: 0;
|
5595 |
+
}
|
5596 |
+
.list-group-horizontal-sm .list-group-item + .list-group-item.active {
|
5597 |
+
margin-left: -1px;
|
5598 |
+
border-left-width: 1px;
|
5599 |
+
}
|
5600 |
}
|
5601 |
|
5602 |
@media (min-width: 768px) {
|
5604 |
-ms-flex-direction: row;
|
5605 |
flex-direction: row;
|
5606 |
}
|
|
|
|
|
|
|
|
|
5607 |
.list-group-horizontal-md .list-group-item:first-child {
|
|
|
5608 |
border-bottom-left-radius: 0.25rem;
|
5609 |
border-top-right-radius: 0;
|
5610 |
}
|
5611 |
.list-group-horizontal-md .list-group-item:last-child {
|
|
|
5612 |
border-top-right-radius: 0.25rem;
|
|
|
5613 |
border-bottom-left-radius: 0;
|
5614 |
}
|
5615 |
+
.list-group-horizontal-md .list-group-item.active {
|
5616 |
+
margin-top: 0;
|
5617 |
+
}
|
5618 |
+
.list-group-horizontal-md .list-group-item + .list-group-item {
|
5619 |
+
border-top-width: 1px;
|
5620 |
+
border-left-width: 0;
|
5621 |
+
}
|
5622 |
+
.list-group-horizontal-md .list-group-item + .list-group-item.active {
|
5623 |
+
margin-left: -1px;
|
5624 |
+
border-left-width: 1px;
|
5625 |
+
}
|
5626 |
}
|
5627 |
|
5628 |
@media (min-width: 992px) {
|
5630 |
-ms-flex-direction: row;
|
5631 |
flex-direction: row;
|
5632 |
}
|
|
|
|
|
|
|
|
|
5633 |
.list-group-horizontal-lg .list-group-item:first-child {
|
|
|
5634 |
border-bottom-left-radius: 0.25rem;
|
5635 |
border-top-right-radius: 0;
|
5636 |
}
|
5637 |
.list-group-horizontal-lg .list-group-item:last-child {
|
|
|
5638 |
border-top-right-radius: 0.25rem;
|
|
|
5639 |
border-bottom-left-radius: 0;
|
5640 |
}
|
5641 |
+
.list-group-horizontal-lg .list-group-item.active {
|
5642 |
+
margin-top: 0;
|
5643 |
+
}
|
5644 |
+
.list-group-horizontal-lg .list-group-item + .list-group-item {
|
5645 |
+
border-top-width: 1px;
|
5646 |
+
border-left-width: 0;
|
5647 |
+
}
|
5648 |
+
.list-group-horizontal-lg .list-group-item + .list-group-item.active {
|
5649 |
+
margin-left: -1px;
|
5650 |
+
border-left-width: 1px;
|
5651 |
+
}
|
5652 |
}
|
5653 |
|
5654 |
@media (min-width: 1200px) {
|
5656 |
-ms-flex-direction: row;
|
5657 |
flex-direction: row;
|
5658 |
}
|
|
|
|
|
|
|
|
|
5659 |
.list-group-horizontal-xl .list-group-item:first-child {
|
|
|
5660 |
border-bottom-left-radius: 0.25rem;
|
5661 |
border-top-right-radius: 0;
|
5662 |
}
|
5663 |
.list-group-horizontal-xl .list-group-item:last-child {
|
|
|
5664 |
border-top-right-radius: 0.25rem;
|
|
|
5665 |
border-bottom-left-radius: 0;
|
5666 |
}
|
5667 |
+
.list-group-horizontal-xl .list-group-item.active {
|
5668 |
+
margin-top: 0;
|
5669 |
+
}
|
5670 |
+
.list-group-horizontal-xl .list-group-item + .list-group-item {
|
5671 |
+
border-top-width: 1px;
|
5672 |
+
border-left-width: 0;
|
5673 |
+
}
|
5674 |
+
.list-group-horizontal-xl .list-group-item + .list-group-item.active {
|
5675 |
+
margin-left: -1px;
|
5676 |
+
border-left-width: 1px;
|
5677 |
+
}
|
5678 |
}
|
5679 |
|
5680 |
.list-group-flush .list-group-item {
|
5681 |
+
border-right-width: 0;
|
5682 |
+
border-left-width: 0;
|
5683 |
border-radius: 0;
|
5684 |
}
|
5685 |
|
5686 |
+
.list-group-flush .list-group-item:first-child {
|
5687 |
+
border-top-width: 0;
|
|
|
|
|
|
|
|
|
5688 |
}
|
5689 |
|
5690 |
.list-group-flush:last-child .list-group-item:last-child {
|
5691 |
+
border-bottom-width: 0;
|
|
|
5692 |
}
|
5693 |
|
5694 |
.list-group-item-primary {
|
5945 |
transform: none;
|
5946 |
}
|
5947 |
|
5948 |
+
.modal.modal-static .modal-dialog {
|
5949 |
+
-webkit-transform: scale(1.02);
|
5950 |
+
transform: scale(1.02);
|
5951 |
+
}
|
5952 |
+
|
5953 |
.modal-dialog-scrollable {
|
5954 |
display: -ms-flexbox;
|
5955 |
display: flex;
|
6043 |
justify-content: space-between;
|
6044 |
padding: 1rem 1rem;
|
6045 |
border-bottom: 1px solid #dee2e6;
|
6046 |
+
border-top-left-radius: calc(0.3rem - 1px);
|
6047 |
+
border-top-right-radius: calc(0.3rem - 1px);
|
6048 |
}
|
6049 |
|
6050 |
.modal-header .close {
|
6067 |
.modal-footer {
|
6068 |
display: -ms-flexbox;
|
6069 |
display: flex;
|
6070 |
+
-ms-flex-wrap: wrap;
|
6071 |
+
flex-wrap: wrap;
|
6072 |
-ms-flex-align: center;
|
6073 |
align-items: center;
|
6074 |
-ms-flex-pack: end;
|
6075 |
justify-content: flex-end;
|
6076 |
+
padding: 0.75rem;
|
6077 |
border-top: 1px solid #dee2e6;
|
6078 |
+
border-bottom-right-radius: calc(0.3rem - 1px);
|
6079 |
+
border-bottom-left-radius: calc(0.3rem - 1px);
|
|
|
|
|
|
|
|
|
6080 |
}
|
6081 |
|
6082 |
+
.modal-footer > * {
|
6083 |
+
margin: 0.25rem;
|
6084 |
}
|
6085 |
|
6086 |
.modal-scrollbar-measure {
|
6287 |
}
|
6288 |
|
6289 |
.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow {
|
6290 |
+
bottom: calc(-0.5rem - 1px);
|
6291 |
}
|
6292 |
|
6293 |
.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before {
|
6307 |
}
|
6308 |
|
6309 |
.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow {
|
6310 |
+
left: calc(-0.5rem - 1px);
|
6311 |
width: 0.5rem;
|
6312 |
height: 1rem;
|
6313 |
margin: 0.3rem 0;
|
6330 |
}
|
6331 |
|
6332 |
.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow {
|
6333 |
+
top: calc(-0.5rem - 1px);
|
6334 |
}
|
6335 |
|
6336 |
.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before {
|
6361 |
}
|
6362 |
|
6363 |
.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow {
|
6364 |
+
right: calc(-0.5rem - 1px);
|
6365 |
width: 0.5rem;
|
6366 |
height: 1rem;
|
6367 |
margin: 0.3rem 0;
|
6474 |
.carousel-fade .active.carousel-item-right {
|
6475 |
z-index: 0;
|
6476 |
opacity: 0;
|
6477 |
+
transition: opacity 0s 0.6s;
|
6478 |
}
|
6479 |
|
6480 |
@media (prefers-reduced-motion: reduce) {
|
6536 |
}
|
6537 |
|
6538 |
.carousel-control-prev-icon {
|
6539 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e");
|
6540 |
}
|
6541 |
|
6542 |
.carousel-control-next-icon {
|
6543 |
+
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e");
|
6544 |
}
|
6545 |
|
6546 |
.carousel-indicators {
|
7992 |
width: 1px;
|
7993 |
height: 1px;
|
7994 |
padding: 0;
|
7995 |
+
margin: -1px;
|
7996 |
overflow: hidden;
|
7997 |
clip: rect(0, 0, 0, 0);
|
7998 |
white-space: nowrap;
|
resources/css/bootstrap4.min.css
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors
|
4 |
* Copyright 2011-2019 Twitter, Inc.
|
5 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
6 |
-
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
|
7 |
/*# sourceMappingURL=bootstrap.min.css.map */
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors
|
4 |
* Copyright 2011-2019 Twitter, Inc.
|
5 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
6 |
+
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}
|
7 |
/*# sourceMappingURL=bootstrap.min.css.map */
|
resources/css/introjs.min.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
.introjs-overlay{position:absolute;box-sizing:content-box;z-index:999999;background-color:#000;opacity:0;background:-moz-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-webkit-gradient(radial,center center,0,center center,100%,color-stop(0,rgba(0,0,0,.4)),color-stop(100%,rgba(0,0,0,.9)));background:-webkit-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-o-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:-ms-radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);background:radial-gradient(center,ellipse farthest-corner,rgba(0,0,0,.4) 0,rgba(0,0,0,.9) 100%);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute;background-color:#fff;opacity:0}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{box-sizing:content-box;position:absolute;z-index:9999998;background-color:#fff;background-color:rgba(255,255,255,.9);border:1px solid #777;border:1px solid rgba(0,0,0,.5);border-radius:4px;box-shadow:0 2px 15px rgba(0,0,0,.4);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{box-sizing:content-box;position:absolute;visibility:hidden;z-index:100000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{box-sizing:content-box;position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid transparent;content:'';position:absolute}.introjs-arrow.top{top:-10px;border-bottom-color:#fff}.introjs-arrow.top-right{top:-10px;right:10px;border-bottom-color:#fff}.introjs-arrow.top-middle{top:-10px;left:50%;margin-left:-5px;border-bottom-color:#fff}.introjs-arrow.right{right:-10px;top:10px;border-left-color:#fff}.introjs-arrow.right-bottom{bottom:10px;right:-10px;border-left-color:#fff}.introjs-arrow.bottom{bottom:-10px;border-top-color:#fff}.introjs-arrow.bottom-right{bottom:-10px;right:10px;border-top-color:#fff}.introjs-arrow.bottom-middle{bottom:-10px;left:50%;margin-left:-5px;border-top-color:#fff}.introjs-arrow.left{left:-10px;top:10px;border-right-color:#fff}.introjs-arrow.left-bottom{left:-10px;bottom:10px;border-right-color:#fff}.introjs-tooltip{box-sizing:content-box;position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;box-shadow:0 1px 10px rgba(0,0,0,.4);-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{box-sizing:content-box;position:relative;overflow:visible;display:inline-block;padding:.3em .8em;border:1px solid #d4d4d4;margin:0;text-decoration:none;text-shadow:1px 1px 0 #fff;font:11px/normal sans-serif;color:#333;white-space:nowrap;cursor:pointer;outline:0;background-color:#ececec;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f4f4f4),to(#ececec));background-image:-moz-linear-gradient(#f4f4f4,#ececec);background-image:-o-linear-gradient(#f4f4f4,#ececec);background-image:linear-gradient(#f4f4f4,#ececec);-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em;zoom:1;margin-top:10px}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{box-sizing:content-box;margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-prevbutton.introjs-fullbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton.introjs-fullbutton{-webkit-border-radius:.2em;-moz-border-radius:.2em;border-radius:.2em}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-hidden{display:none}.introjs-bullets{text-align:center}.introjs-bullets ul{box-sizing:content-box;clear:both;margin:15px auto 0;padding:0;display:inline-block}.introjs-bullets ul li{box-sizing:content-box;list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{box-sizing:content-box;display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none;cursor:pointer}.introjs-bullets ul li a:hover{background:#999}.introjs-bullets ul li a.active{background:#999}.introjs-progress{box-sizing:content-box;overflow:hidden;height:10px;margin:10px 0 5px 0;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{box-sizing:content-box;float:left;width:0%;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.introjs-fixedTooltip{position:fixed}.introjs-hint{box-sizing:content-box;position:absolute;background:0 0;width:20px;height:15px;cursor:pointer}.introjs-hint:focus{border:0;outline:0}.introjs-hidehint{display:none}.introjs-fixedhint{position:fixed}.introjs-hint:hover>.introjs-hint-pulse{border:5px solid rgba(60,60,60,.57)}.introjs-hint-pulse{box-sizing:content-box;width:10px;height:10px;border:5px solid rgba(60,60,60,.27);-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;background-color:rgba(136,136,136,.24);z-index:10;position:absolute;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}.introjs-hint-no-anim .introjs-hint-dot{-webkit-animation:none;-moz-animation:none;animation:none}.introjs-hint-dot{box-sizing:content-box;border:10px solid rgba(146,146,146,.36);background:0 0;-webkit-border-radius:60px;-moz-border-radius:60px;border-radius:60px;height:50px;width:50px;-webkit-animation:introjspulse 3s ease-out;-moz-animation:introjspulse 3s ease-out;animation:introjspulse 3s ease-out;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;animation-iteration-count:infinite;position:absolute;top:-25px;left:-25px;z-index:1;opacity:0}@-webkit-keyframes introjspulse{0%{-webkit-transform:scale(0);opacity:0}25%{-webkit-transform:scale(0);opacity:.1}50%{-webkit-transform:scale(.1);opacity:.3}75%{-webkit-transform:scale(.5);opacity:.5}100%{-webkit-transform:scale(1);opacity:0}}@-moz-keyframes introjspulse{0%{-moz-transform:scale(0);opacity:0}25%{-moz-transform:scale(0);opacity:.1}50%{-moz-transform:scale(.1);opacity:.3}75%{-moz-transform:scale(.5);opacity:.5}100%{-moz-transform:scale(1);opacity:0}}@keyframes introjspulse{0%{transform:scale(0);opacity:0}25%{transform:scale(0);opacity:.1}50%{transform:scale(.1);opacity:.3}75%{transform:scale(.5);opacity:.5}100%{transform:scale(1);opacity:0}}
|
resources/css/plugin.css
CHANGED
@@ -4,6 +4,9 @@
|
|
4 |
body {
|
5 |
overflow-y: scroll;
|
6 |
}
|
|
|
|
|
|
|
7 |
#wpcontent {
|
8 |
padding: 0;
|
9 |
}
|
@@ -58,7 +61,7 @@ body {
|
|
58 |
margin-bottom: 50px;
|
59 |
}
|
60 |
#ColumnOptions .form-actions .btn {
|
61 |
-
box-shadow: -1px 2px 2px rgba(0,0,0,0.3);
|
62 |
opacity: 0.85;
|
63 |
}
|
64 |
#ColumnOptions .form-actions .btn:hover {
|
@@ -870,6 +873,7 @@ th.column-request_info {
|
|
870 |
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
|
871 |
}
|
872 |
#odp-PageHead .nav-link {
|
|
|
873 |
}
|
874 |
#odp-PageHead .nav-link.active {
|
875 |
font-weight: bold;
|
@@ -1037,24 +1041,19 @@ table.scan-table.wp-list-table button.toggle-row {
|
|
1037 |
display: none;
|
1038 |
}
|
1039 |
|
1040 |
-
#
|
1041 |
-
margin-top: 25px;
|
1042 |
}
|
1043 |
-
#
|
1044 |
color: #666666;
|
1045 |
-
|
1046 |
-
margin-bottom: 15px;
|
1047 |
}
|
1048 |
-
#
|
1049 |
-
background-color: transparent;
|
1050 |
color: #333333;
|
1051 |
-
font-weight: bolder;
|
1052 |
-
font-size: 14px;
|
1053 |
}
|
1054 |
-
#
|
1055 |
margin-top: 0;
|
1056 |
}
|
1057 |
-
#
|
1058 |
font-size: 12px;
|
1059 |
}
|
1060 |
|
@@ -1068,10 +1067,9 @@ PTG SCAN TABLES
|
|
1068 |
display: none;
|
1069 |
}
|
1070 |
|
1071 |
-
|
1072 |
.card.card-scan_results {
|
1073 |
-
|
1074 |
-
|
1075 |
}
|
1076 |
.card.card-scan_results .card-header {
|
1077 |
background-color: transparent;
|
@@ -1093,7 +1091,7 @@ table.odp-table.scan-table td.column-path code {
|
|
1093 |
/*display: none;*/
|
1094 |
}
|
1095 |
.container-scantable {
|
1096 |
-
max-height:
|
1097 |
overflow: auto;
|
1098 |
}
|
1099 |
.container-scantable .tablenav.top,
|
@@ -1154,10 +1152,6 @@ input[type=checkbox].form-check-input {
|
|
1154 |
}
|
1155 |
|
1156 |
/** copied from bootstrap to override WP admin styles */
|
1157 |
-
.wp-admin select.custom-select {
|
1158 |
-
height: calc(1.5em + 0.75rem + 2px);
|
1159 |
-
padding: 0.375rem 1.75rem 0.375rem 0.75rem;
|
1160 |
-
}
|
1161 |
.content-options {
|
1162 |
font-size: 14px;
|
1163 |
padding-top: 10px;
|
@@ -1223,4 +1217,19 @@ table.odp-table tr.audit-cat-2 td {
|
|
1223 |
}
|
1224 |
table.odp-table tr.audit-cat-3 td {
|
1225 |
background-color: #fffdfd;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1226 |
}
|
4 |
body {
|
5 |
overflow-y: scroll;
|
6 |
}
|
7 |
+
body.rtl {
|
8 |
+
text-align: right;
|
9 |
+
}
|
10 |
#wpcontent {
|
11 |
padding: 0;
|
12 |
}
|
61 |
margin-bottom: 50px;
|
62 |
}
|
63 |
#ColumnOptions .form-actions .btn {
|
64 |
+
box-shadow: -1px 2px 2px rgba(0, 0, 0, 0.3);
|
65 |
opacity: 0.85;
|
66 |
}
|
67 |
#ColumnOptions .form-actions .btn:hover {
|
873 |
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
|
874 |
}
|
875 |
#odp-PageHead .nav-link {
|
876 |
+
color: #343434;
|
877 |
}
|
878 |
#odp-PageHead .nav-link.active {
|
879 |
font-weight: bold;
|
1041 |
display: none;
|
1042 |
}
|
1043 |
|
1044 |
+
#ScanResultsTabs {
|
|
|
1045 |
}
|
1046 |
+
#ScanResultsTabs ul.nav.nav-tabs a.nav-link {
|
1047 |
color: #666666;
|
1048 |
+
font-size: 1.4rem;
|
|
|
1049 |
}
|
1050 |
+
#ScanResultsTabs ul.nav.nav-tabs a.nav-link.active {
|
|
|
1051 |
color: #333333;
|
|
|
|
|
1052 |
}
|
1053 |
+
#ScanResultsTabs .card.card-scan_results {
|
1054 |
margin-top: 0;
|
1055 |
}
|
1056 |
+
#ScanResultsTabs nav > a.nav-link .badge {
|
1057 |
font-size: 12px;
|
1058 |
}
|
1059 |
|
1067 |
display: none;
|
1068 |
}
|
1069 |
|
|
|
1070 |
.card.card-scan_results {
|
1071 |
+
background-color: transparent;
|
1072 |
+
border: 0 none;
|
1073 |
}
|
1074 |
.card.card-scan_results .card-header {
|
1075 |
background-color: transparent;
|
1091 |
/*display: none;*/
|
1092 |
}
|
1093 |
.container-scantable {
|
1094 |
+
max-height: 650px;
|
1095 |
overflow: auto;
|
1096 |
}
|
1097 |
.container-scantable .tablenav.top,
|
1152 |
}
|
1153 |
|
1154 |
/** copied from bootstrap to override WP admin styles */
|
|
|
|
|
|
|
|
|
1155 |
.content-options {
|
1156 |
font-size: 14px;
|
1157 |
padding-top: 10px;
|
1217 |
}
|
1218 |
table.odp-table tr.audit-cat-3 td {
|
1219 |
background-color: #fffdfd;
|
1220 |
+
}
|
1221 |
+
|
1222 |
+
.row-sticky td {
|
1223 |
+
background-color: #5a5a5a;
|
1224 |
+
position: sticky;
|
1225 |
+
top: 0;
|
1226 |
+
z-index: 1;
|
1227 |
+
}
|
1228 |
+
.row-sticky td h5 {
|
1229 |
+
margin: 0;
|
1230 |
+
color: #ffffff;
|
1231 |
+
}
|
1232 |
+
|
1233 |
+
.introjs-helperLayer {
|
1234 |
+
background-color: rgba(91, 228, 56, 0.34);
|
1235 |
}
|
resources/images/pluginlogo_32x32.png
ADDED
Binary file
|
resources/js/bootstrap4.bundle.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
@@ -7,7 +7,7 @@
|
|
7 |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
|
8 |
typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
|
9 |
(global = global || self, factory(global.bootstrap = {}, global.jQuery));
|
10 |
-
}(this, function (exports, $) { 'use strict';
|
11 |
|
12 |
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
13 |
|
@@ -42,20 +42,35 @@
|
|
42 |
return obj;
|
43 |
}
|
44 |
|
45 |
-
function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
for (var i = 1; i < arguments.length; i++) {
|
47 |
var source = arguments[i] != null ? arguments[i] : {};
|
48 |
-
var ownKeys = Object.keys(source);
|
49 |
|
50 |
-
if (
|
51 |
-
ownKeys
|
52 |
-
|
53 |
-
})
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
}
|
55 |
-
|
56 |
-
ownKeys.forEach(function (key) {
|
57 |
-
_defineProperty(target, key, source[key]);
|
58 |
-
});
|
59 |
}
|
60 |
|
61 |
return target;
|
@@ -69,7 +84,7 @@
|
|
69 |
|
70 |
/**
|
71 |
* --------------------------------------------------------------------------
|
72 |
-
* Bootstrap (v4.
|
73 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
74 |
* --------------------------------------------------------------------------
|
75 |
*/
|
@@ -218,8 +233,25 @@
|
|
218 |
}
|
219 |
|
220 |
return Util.findShadowRoot(element.parentNode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
}
|
222 |
};
|
|
|
223 |
setTransitionEndSupport();
|
224 |
|
225 |
/**
|
@@ -229,7 +261,7 @@
|
|
229 |
*/
|
230 |
|
231 |
var NAME = 'alert';
|
232 |
-
var VERSION = '4.
|
233 |
var DATA_KEY = 'bs.alert';
|
234 |
var EVENT_KEY = "." + DATA_KEY;
|
235 |
var DATA_API_KEY = '.data-api';
|
@@ -246,13 +278,12 @@
|
|
246 |
ALERT: 'alert',
|
247 |
FADE: 'fade',
|
248 |
SHOW: 'show'
|
249 |
-
/**
|
250 |
-
* ------------------------------------------------------------------------
|
251 |
-
* Class Definition
|
252 |
-
* ------------------------------------------------------------------------
|
253 |
-
*/
|
254 |
-
|
255 |
};
|
|
|
|
|
|
|
|
|
|
|
256 |
|
257 |
var Alert =
|
258 |
/*#__PURE__*/
|
@@ -394,7 +425,7 @@
|
|
394 |
*/
|
395 |
|
396 |
var NAME$1 = 'button';
|
397 |
-
var VERSION$1 = '4.
|
398 |
var DATA_KEY$1 = 'bs.button';
|
399 |
var EVENT_KEY$1 = "." + DATA_KEY$1;
|
400 |
var DATA_API_KEY$1 = '.data-api';
|
@@ -406,21 +437,23 @@
|
|
406 |
};
|
407 |
var Selector$1 = {
|
408 |
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
409 |
-
|
|
|
|
|
410 |
INPUT: 'input:not([type="hidden"])',
|
411 |
ACTIVE: '.active',
|
412 |
BUTTON: '.btn'
|
413 |
};
|
414 |
var Event$1 = {
|
415 |
CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
|
416 |
-
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
|
417 |
-
|
418 |
-
* ------------------------------------------------------------------------
|
419 |
-
* Class Definition
|
420 |
-
* ------------------------------------------------------------------------
|
421 |
-
*/
|
422 |
-
|
423 |
};
|
|
|
|
|
|
|
|
|
|
|
424 |
|
425 |
var Button =
|
426 |
/*#__PURE__*/
|
@@ -436,7 +469,7 @@
|
|
436 |
_proto.toggle = function toggle() {
|
437 |
var triggerChangeEvent = true;
|
438 |
var addAriaPressed = true;
|
439 |
-
var rootElement = $(this._element).closest(Selector$1.
|
440 |
|
441 |
if (rootElement) {
|
442 |
var input = this._element.querySelector(Selector$1.INPUT);
|
@@ -452,13 +485,16 @@
|
|
452 |
$(activeElement).removeClass(ClassName$1.ACTIVE);
|
453 |
}
|
454 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
455 |
}
|
456 |
|
457 |
if (triggerChangeEvent) {
|
458 |
-
if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
|
459 |
-
return;
|
460 |
-
}
|
461 |
-
|
462 |
input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
|
463 |
$(input).trigger('change');
|
464 |
}
|
@@ -468,12 +504,14 @@
|
|
468 |
}
|
469 |
}
|
470 |
|
471 |
-
if (
|
472 |
-
|
473 |
-
|
|
|
474 |
|
475 |
-
|
476 |
-
|
|
|
477 |
}
|
478 |
};
|
479 |
|
@@ -515,18 +553,58 @@
|
|
515 |
|
516 |
|
517 |
$(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
518 |
-
event.preventDefault();
|
519 |
var button = event.target;
|
520 |
|
521 |
if (!$(button).hasClass(ClassName$1.BUTTON)) {
|
522 |
-
button = $(button).closest(Selector$1.BUTTON);
|
523 |
}
|
524 |
|
525 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
526 |
}).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
527 |
var button = $(event.target).closest(Selector$1.BUTTON)[0];
|
528 |
$(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
|
529 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
530 |
/**
|
531 |
* ------------------------------------------------------------------------
|
532 |
* jQuery
|
@@ -548,7 +626,7 @@
|
|
548 |
*/
|
549 |
|
550 |
var NAME$2 = 'carousel';
|
551 |
-
var VERSION$2 = '4.
|
552 |
var DATA_KEY$2 = 'bs.carousel';
|
553 |
var EVENT_KEY$2 = "." + DATA_KEY$2;
|
554 |
var DATA_API_KEY$2 = '.data-api';
|
@@ -621,13 +699,12 @@
|
|
621 |
var PointerType = {
|
622 |
TOUCH: 'touch',
|
623 |
PEN: 'pen'
|
624 |
-
/**
|
625 |
-
* ------------------------------------------------------------------------
|
626 |
-
* Class Definition
|
627 |
-
* ------------------------------------------------------------------------
|
628 |
-
*/
|
629 |
-
|
630 |
};
|
|
|
|
|
|
|
|
|
|
|
631 |
|
632 |
var Carousel =
|
633 |
/*#__PURE__*/
|
@@ -747,7 +824,7 @@
|
|
747 |
;
|
748 |
|
749 |
_proto._getConfig = function _getConfig(config) {
|
750 |
-
config =
|
751 |
Util.typeCheckConfig(NAME$2, config, DefaultType);
|
752 |
return config;
|
753 |
};
|
@@ -759,7 +836,8 @@
|
|
759 |
return;
|
760 |
}
|
761 |
|
762 |
-
var direction = absDeltax / this.touchDeltaX;
|
|
|
763 |
|
764 |
if (direction > 0) {
|
765 |
this.prev();
|
@@ -885,8 +963,6 @@
|
|
885 |
event.preventDefault();
|
886 |
this.next();
|
887 |
break;
|
888 |
-
|
889 |
-
default:
|
890 |
}
|
891 |
};
|
892 |
|
@@ -1038,10 +1114,10 @@
|
|
1038 |
return this.each(function () {
|
1039 |
var data = $(this).data(DATA_KEY$2);
|
1040 |
|
1041 |
-
var _config =
|
1042 |
|
1043 |
if (typeof config === 'object') {
|
1044 |
-
_config =
|
1045 |
}
|
1046 |
|
1047 |
var action = typeof config === 'string' ? config : _config.slide;
|
@@ -1079,7 +1155,7 @@
|
|
1079 |
return;
|
1080 |
}
|
1081 |
|
1082 |
-
var config =
|
1083 |
|
1084 |
var slideIndex = this.getAttribute('data-slide-to');
|
1085 |
|
@@ -1148,7 +1224,7 @@
|
|
1148 |
*/
|
1149 |
|
1150 |
var NAME$3 = 'collapse';
|
1151 |
-
var VERSION$3 = '4.
|
1152 |
var DATA_KEY$3 = 'bs.collapse';
|
1153 |
var EVENT_KEY$3 = "." + DATA_KEY$3;
|
1154 |
var DATA_API_KEY$3 = '.data-api';
|
@@ -1181,13 +1257,12 @@
|
|
1181 |
var Selector$3 = {
|
1182 |
ACTIVES: '.show, .collapsing',
|
1183 |
DATA_TOGGLE: '[data-toggle="collapse"]'
|
1184 |
-
/**
|
1185 |
-
* ------------------------------------------------------------------------
|
1186 |
-
* Class Definition
|
1187 |
-
* ------------------------------------------------------------------------
|
1188 |
-
*/
|
1189 |
-
|
1190 |
};
|
|
|
|
|
|
|
|
|
|
|
1191 |
|
1192 |
var Collapse =
|
1193 |
/*#__PURE__*/
|
@@ -1374,7 +1449,7 @@
|
|
1374 |
;
|
1375 |
|
1376 |
_proto._getConfig = function _getConfig(config) {
|
1377 |
-
config =
|
1378 |
config.toggle = Boolean(config.toggle); // Coerce string values
|
1379 |
|
1380 |
Util.typeCheckConfig(NAME$3, config, DefaultType$1);
|
@@ -1428,7 +1503,7 @@
|
|
1428 |
var $this = $(this);
|
1429 |
var data = $this.data(DATA_KEY$3);
|
1430 |
|
1431 |
-
var _config =
|
1432 |
|
1433 |
if (!data && _config.toggle && /show|hide/.test(config)) {
|
1434 |
_config.toggle = false;
|
@@ -1503,7 +1578,7 @@
|
|
1503 |
|
1504 |
/**!
|
1505 |
* @fileOverview Kickass library to create and place poppers near their reference elements.
|
1506 |
-
* @version 1.
|
1507 |
* @license
|
1508 |
* Copyright (c) 2016 Federico Zivolo and contributors
|
1509 |
*
|
@@ -1525,16 +1600,17 @@
|
|
1525 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
1526 |
* SOFTWARE.
|
1527 |
*/
|
1528 |
-
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
|
1529 |
-
|
1530 |
-
var
|
1531 |
-
|
1532 |
-
|
1533 |
-
|
1534 |
-
|
1535 |
-
|
1536 |
}
|
1537 |
-
|
|
|
1538 |
|
1539 |
function microtaskDebounce(fn) {
|
1540 |
var called = false;
|
@@ -1654,6 +1730,17 @@
|
|
1654 |
return getScrollParent(getParentNode(element));
|
1655 |
}
|
1656 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1657 |
var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
|
1658 |
var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
|
1659 |
|
@@ -1962,8 +2049,8 @@
|
|
1962 |
|
1963 |
// subtract scrollbar size from sizes
|
1964 |
var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
|
1965 |
-
var width = sizes.width || element.clientWidth || result.
|
1966 |
-
var height = sizes.height || element.clientHeight || result.
|
1967 |
|
1968 |
var horizScrollbar = element.offsetWidth - width;
|
1969 |
var vertScrollbar = element.offsetHeight - height;
|
@@ -2115,7 +2202,7 @@
|
|
2115 |
// NOTE: 1 DOM access here
|
2116 |
|
2117 |
var boundaries = { top: 0, left: 0 };
|
2118 |
-
var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
|
2119 |
|
2120 |
// Handle viewport case
|
2121 |
if (boundariesElement === 'viewport') {
|
@@ -2243,7 +2330,7 @@
|
|
2243 |
function getReferenceOffsets(state, popper, reference) {
|
2244 |
var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
2245 |
|
2246 |
-
var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
|
2247 |
return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
|
2248 |
}
|
2249 |
|
@@ -2505,7 +2592,7 @@
|
|
2505 |
|
2506 |
this.disableEventListeners();
|
2507 |
|
2508 |
-
// remove the popper if user
|
2509 |
// do not use `remove` because IE11 doesn't support it
|
2510 |
if (this.options.removeOnDestroy) {
|
2511 |
this.popper.parentNode.removeChild(this.popper);
|
@@ -3107,7 +3194,14 @@
|
|
3107 |
|
3108 |
// flip the variation if required
|
3109 |
var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
|
3110 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3111 |
|
3112 |
if (overlapsRef || overflowsBoundaries || flippedVariation) {
|
3113 |
// this boolean to detect any flip loop
|
@@ -3714,7 +3808,23 @@
|
|
3714 |
* The popper will never be placed outside of the defined boundaries
|
3715 |
* (except if `keepTogether` is enabled)
|
3716 |
*/
|
3717 |
-
boundariesElement: 'viewport'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3718 |
},
|
3719 |
|
3720 |
/**
|
@@ -3931,8 +4041,8 @@
|
|
3931 |
/**
|
3932 |
* Creates a new Popper.js instance.
|
3933 |
* @class Popper
|
3934 |
-
* @param {
|
3935 |
-
* @param {
|
3936 |
* @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
|
3937 |
* @return {Object} instance - The generated Popper.js instance
|
3938 |
*/
|
@@ -4087,7 +4197,7 @@
|
|
4087 |
*/
|
4088 |
|
4089 |
var NAME$4 = 'dropdown';
|
4090 |
-
var VERSION$4 = '4.
|
4091 |
var DATA_KEY$4 = 'bs.dropdown';
|
4092 |
var EVENT_KEY$4 = "." + DATA_KEY$4;
|
4093 |
var DATA_API_KEY$4 = '.data-api';
|
@@ -4147,21 +4257,22 @@
|
|
4147 |
flip: true,
|
4148 |
boundary: 'scrollParent',
|
4149 |
reference: 'toggle',
|
4150 |
-
display: 'dynamic'
|
|
|
4151 |
};
|
4152 |
var DefaultType$2 = {
|
4153 |
offset: '(number|string|function)',
|
4154 |
flip: 'boolean',
|
4155 |
boundary: '(string|element)',
|
4156 |
reference: '(string|element)',
|
4157 |
-
display: 'string'
|
4158 |
-
|
4159 |
-
* ------------------------------------------------------------------------
|
4160 |
-
* Class Definition
|
4161 |
-
* ------------------------------------------------------------------------
|
4162 |
-
*/
|
4163 |
-
|
4164 |
};
|
|
|
|
|
|
|
|
|
|
|
4165 |
|
4166 |
var Dropdown =
|
4167 |
/*#__PURE__*/
|
@@ -4185,8 +4296,6 @@
|
|
4185 |
return;
|
4186 |
}
|
4187 |
|
4188 |
-
var parent = Dropdown._getParentFromElement(this._element);
|
4189 |
-
|
4190 |
var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
|
4191 |
|
4192 |
Dropdown._clearMenus();
|
@@ -4195,10 +4304,25 @@
|
|
4195 |
return;
|
4196 |
}
|
4197 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4198 |
var relatedTarget = {
|
4199 |
relatedTarget: this._element
|
4200 |
};
|
4201 |
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
|
|
|
|
|
|
4202 |
$(parent).trigger(showEvent);
|
4203 |
|
4204 |
if (showEvent.isDefaultPrevented()) {
|
@@ -4206,7 +4330,7 @@
|
|
4206 |
} // Disable totally Popper.js for Dropdown in Navbar
|
4207 |
|
4208 |
|
4209 |
-
if (!this._inNavbar) {
|
4210 |
/**
|
4211 |
* Check for Popper dependency
|
4212 |
* Popper - https://popper.js.org
|
@@ -4253,28 +4377,6 @@
|
|
4253 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
4254 |
};
|
4255 |
|
4256 |
-
_proto.show = function show() {
|
4257 |
-
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
|
4258 |
-
return;
|
4259 |
-
}
|
4260 |
-
|
4261 |
-
var relatedTarget = {
|
4262 |
-
relatedTarget: this._element
|
4263 |
-
};
|
4264 |
-
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
4265 |
-
|
4266 |
-
var parent = Dropdown._getParentFromElement(this._element);
|
4267 |
-
|
4268 |
-
$(parent).trigger(showEvent);
|
4269 |
-
|
4270 |
-
if (showEvent.isDefaultPrevented()) {
|
4271 |
-
return;
|
4272 |
-
}
|
4273 |
-
|
4274 |
-
$(this._menu).toggleClass(ClassName$4.SHOW);
|
4275 |
-
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
4276 |
-
};
|
4277 |
-
|
4278 |
_proto.hide = function hide() {
|
4279 |
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
|
4280 |
return;
|
@@ -4293,6 +4395,10 @@
|
|
4293 |
return;
|
4294 |
}
|
4295 |
|
|
|
|
|
|
|
|
|
4296 |
$(this._menu).toggleClass(ClassName$4.SHOW);
|
4297 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
4298 |
};
|
@@ -4331,7 +4437,7 @@
|
|
4331 |
};
|
4332 |
|
4333 |
_proto._getConfig = function _getConfig(config) {
|
4334 |
-
config =
|
4335 |
Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
|
4336 |
return config;
|
4337 |
};
|
@@ -4380,7 +4486,7 @@
|
|
4380 |
|
4381 |
if (typeof this._config.offset === 'function') {
|
4382 |
offset.fn = function (data) {
|
4383 |
-
data.offsets =
|
4384 |
return data;
|
4385 |
};
|
4386 |
} else {
|
@@ -4401,9 +4507,8 @@
|
|
4401 |
preventOverflow: {
|
4402 |
boundariesElement: this._config.boundary
|
4403 |
}
|
4404 |
-
}
|
4405 |
-
|
4406 |
-
};
|
4407 |
|
4408 |
if (this._config.display === 'static') {
|
4409 |
popperConfig.modifiers.applyStyle = {
|
@@ -4411,7 +4516,7 @@
|
|
4411 |
};
|
4412 |
}
|
4413 |
|
4414 |
-
return popperConfig;
|
4415 |
} // Static
|
4416 |
;
|
4417 |
|
@@ -4483,6 +4588,11 @@
|
|
4483 |
}
|
4484 |
|
4485 |
toggles[i].setAttribute('aria-expanded', 'false');
|
|
|
|
|
|
|
|
|
|
|
4486 |
$(dropdownMenu).removeClass(ClassName$4.SHOW);
|
4487 |
$(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
4488 |
}
|
@@ -4523,6 +4633,10 @@
|
|
4523 |
|
4524 |
var isActive = $(parent).hasClass(ClassName$4.SHOW);
|
4525 |
|
|
|
|
|
|
|
|
|
4526 |
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
4527 |
if (event.which === ESCAPE_KEYCODE) {
|
4528 |
var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
|
@@ -4533,7 +4647,9 @@
|
|
4533 |
return;
|
4534 |
}
|
4535 |
|
4536 |
-
var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS))
|
|
|
|
|
4537 |
|
4538 |
if (items.length === 0) {
|
4539 |
return;
|
@@ -4613,7 +4729,7 @@
|
|
4613 |
*/
|
4614 |
|
4615 |
var NAME$5 = 'modal';
|
4616 |
-
var VERSION$5 = '4.
|
4617 |
var DATA_KEY$5 = 'bs.modal';
|
4618 |
var EVENT_KEY$5 = "." + DATA_KEY$5;
|
4619 |
var DATA_API_KEY$5 = '.data-api';
|
@@ -4634,6 +4750,7 @@
|
|
4634 |
};
|
4635 |
var Event$5 = {
|
4636 |
HIDE: "hide" + EVENT_KEY$5,
|
|
|
4637 |
HIDDEN: "hidden" + EVENT_KEY$5,
|
4638 |
SHOW: "show" + EVENT_KEY$5,
|
4639 |
SHOWN: "shown" + EVENT_KEY$5,
|
@@ -4651,7 +4768,8 @@
|
|
4651 |
BACKDROP: 'modal-backdrop',
|
4652 |
OPEN: 'modal-open',
|
4653 |
FADE: 'fade',
|
4654 |
-
SHOW: 'show'
|
|
|
4655 |
};
|
4656 |
var Selector$5 = {
|
4657 |
DIALOG: '.modal-dialog',
|
@@ -4660,13 +4778,12 @@
|
|
4660 |
DATA_DISMISS: '[data-dismiss="modal"]',
|
4661 |
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
4662 |
STICKY_CONTENT: '.sticky-top'
|
4663 |
-
/**
|
4664 |
-
* ------------------------------------------------------------------------
|
4665 |
-
* Class Definition
|
4666 |
-
* ------------------------------------------------------------------------
|
4667 |
-
*/
|
4668 |
-
|
4669 |
};
|
|
|
|
|
|
|
|
|
|
|
4670 |
|
4671 |
var Modal =
|
4672 |
/*#__PURE__*/
|
@@ -4812,15 +4929,40 @@
|
|
4812 |
;
|
4813 |
|
4814 |
_proto._getConfig = function _getConfig(config) {
|
4815 |
-
config =
|
4816 |
Util.typeCheckConfig(NAME$5, config, DefaultType$3);
|
4817 |
return config;
|
4818 |
};
|
4819 |
|
4820 |
-
_proto.
|
4821 |
var _this3 = this;
|
4822 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4823 |
var transition = $(this._element).hasClass(ClassName$5.FADE);
|
|
|
4824 |
|
4825 |
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
4826 |
// Don't move modal's DOM position
|
@@ -4833,8 +4975,8 @@
|
|
4833 |
|
4834 |
this._element.setAttribute('aria-modal', true);
|
4835 |
|
4836 |
-
if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {
|
4837 |
-
|
4838 |
} else {
|
4839 |
this._element.scrollTop = 0;
|
4840 |
}
|
@@ -4854,12 +4996,12 @@
|
|
4854 |
});
|
4855 |
|
4856 |
var transitionComplete = function transitionComplete() {
|
4857 |
-
if (
|
4858 |
-
|
4859 |
}
|
4860 |
|
4861 |
-
|
4862 |
-
$(
|
4863 |
};
|
4864 |
|
4865 |
if (transition) {
|
@@ -4871,25 +5013,23 @@
|
|
4871 |
};
|
4872 |
|
4873 |
_proto._enforceFocus = function _enforceFocus() {
|
4874 |
-
var
|
4875 |
|
4876 |
$(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
|
4877 |
.on(Event$5.FOCUSIN, function (event) {
|
4878 |
-
if (document !== event.target &&
|
4879 |
-
|
4880 |
}
|
4881 |
});
|
4882 |
};
|
4883 |
|
4884 |
_proto._setEscapeEvent = function _setEscapeEvent() {
|
4885 |
-
var
|
4886 |
|
4887 |
if (this._isShown && this._config.keyboard) {
|
4888 |
$(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
|
4889 |
if (event.which === ESCAPE_KEYCODE$1) {
|
4890 |
-
|
4891 |
-
|
4892 |
-
_this5.hide();
|
4893 |
}
|
4894 |
});
|
4895 |
} else if (!this._isShown) {
|
@@ -4898,11 +5038,11 @@
|
|
4898 |
};
|
4899 |
|
4900 |
_proto._setResizeEvent = function _setResizeEvent() {
|
4901 |
-
var
|
4902 |
|
4903 |
if (this._isShown) {
|
4904 |
$(window).on(Event$5.RESIZE, function (event) {
|
4905 |
-
return
|
4906 |
});
|
4907 |
} else {
|
4908 |
$(window).off(Event$5.RESIZE);
|
@@ -4910,7 +5050,7 @@
|
|
4910 |
};
|
4911 |
|
4912 |
_proto._hideModal = function _hideModal() {
|
4913 |
-
var
|
4914 |
|
4915 |
this._element.style.display = 'none';
|
4916 |
|
@@ -4923,11 +5063,11 @@
|
|
4923 |
this._showBackdrop(function () {
|
4924 |
$(document.body).removeClass(ClassName$5.OPEN);
|
4925 |
|
4926 |
-
|
4927 |
|
4928 |
-
|
4929 |
|
4930 |
-
$(
|
4931 |
});
|
4932 |
};
|
4933 |
|
@@ -4939,7 +5079,7 @@
|
|
4939 |
};
|
4940 |
|
4941 |
_proto._showBackdrop = function _showBackdrop(callback) {
|
4942 |
-
var
|
4943 |
|
4944 |
var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
|
4945 |
|
@@ -4953,8 +5093,8 @@
|
|
4953 |
|
4954 |
$(this._backdrop).appendTo(document.body);
|
4955 |
$(this._element).on(Event$5.CLICK_DISMISS, function (event) {
|
4956 |
-
if (
|
4957 |
-
|
4958 |
return;
|
4959 |
}
|
4960 |
|
@@ -4962,11 +5102,7 @@
|
|
4962 |
return;
|
4963 |
}
|
4964 |
|
4965 |
-
|
4966 |
-
_this8._element.focus();
|
4967 |
-
} else {
|
4968 |
-
_this8.hide();
|
4969 |
-
}
|
4970 |
});
|
4971 |
|
4972 |
if (animate) {
|
@@ -4990,7 +5126,7 @@
|
|
4990 |
$(this._backdrop).removeClass(ClassName$5.SHOW);
|
4991 |
|
4992 |
var callbackRemove = function callbackRemove() {
|
4993 |
-
|
4994 |
|
4995 |
if (callback) {
|
4996 |
callback();
|
@@ -5037,7 +5173,7 @@
|
|
5037 |
};
|
5038 |
|
5039 |
_proto._setScrollbar = function _setScrollbar() {
|
5040 |
-
var
|
5041 |
|
5042 |
if (this._isBodyOverflowing) {
|
5043 |
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
@@ -5048,13 +5184,13 @@
|
|
5048 |
$(fixedContent).each(function (index, element) {
|
5049 |
var actualPadding = element.style.paddingRight;
|
5050 |
var calculatedPadding = $(element).css('padding-right');
|
5051 |
-
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) +
|
5052 |
}); // Adjust sticky content margin
|
5053 |
|
5054 |
$(stickyContent).each(function (index, element) {
|
5055 |
var actualMargin = element.style.marginRight;
|
5056 |
var calculatedMargin = $(element).css('margin-right');
|
5057 |
-
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) -
|
5058 |
}); // Adjust body padding
|
5059 |
|
5060 |
var actualPadding = document.body.style.paddingRight;
|
@@ -5103,7 +5239,7 @@
|
|
5103 |
return this.each(function () {
|
5104 |
var data = $(this).data(DATA_KEY$5);
|
5105 |
|
5106 |
-
var _config =
|
5107 |
|
5108 |
if (!data) {
|
5109 |
data = new Modal(this, _config);
|
@@ -5144,7 +5280,7 @@
|
|
5144 |
|
5145 |
|
5146 |
$(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
|
5147 |
-
var
|
5148 |
|
5149 |
var target;
|
5150 |
var selector = Util.getSelectorFromElement(this);
|
@@ -5153,7 +5289,7 @@
|
|
5153 |
target = document.querySelector(selector);
|
5154 |
}
|
5155 |
|
5156 |
-
var config = $(target).data(DATA_KEY$5) ? 'toggle' :
|
5157 |
|
5158 |
if (this.tagName === 'A' || this.tagName === 'AREA') {
|
5159 |
event.preventDefault();
|
@@ -5166,8 +5302,8 @@
|
|
5166 |
}
|
5167 |
|
5168 |
$target.one(Event$5.HIDDEN, function () {
|
5169 |
-
if ($(
|
5170 |
-
|
5171 |
}
|
5172 |
});
|
5173 |
});
|
@@ -5190,7 +5326,7 @@
|
|
5190 |
|
5191 |
/**
|
5192 |
* --------------------------------------------------------------------------
|
5193 |
-
* Bootstrap (v4.
|
5194 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5195 |
* --------------------------------------------------------------------------
|
5196 |
*/
|
@@ -5228,13 +5364,13 @@
|
|
5228 |
strong: [],
|
5229 |
u: [],
|
5230 |
ul: []
|
5231 |
-
/**
|
5232 |
-
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
5233 |
-
*
|
5234 |
-
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
5235 |
-
*/
|
5236 |
-
|
5237 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
5238 |
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
|
5239 |
/**
|
5240 |
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
@@ -5301,7 +5437,7 @@
|
|
5301 |
};
|
5302 |
|
5303 |
for (var i = 0, len = elements.length; i < len; i++) {
|
5304 |
-
var _ret = _loop(i
|
5305 |
|
5306 |
if (_ret === "continue") continue;
|
5307 |
}
|
@@ -5316,7 +5452,7 @@
|
|
5316 |
*/
|
5317 |
|
5318 |
var NAME$6 = 'tooltip';
|
5319 |
-
var VERSION$6 = '4.
|
5320 |
var DATA_KEY$6 = 'bs.tooltip';
|
5321 |
var EVENT_KEY$6 = "." + DATA_KEY$6;
|
5322 |
var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
|
@@ -5338,7 +5474,8 @@
|
|
5338 |
boundary: '(string|element)',
|
5339 |
sanitize: 'boolean',
|
5340 |
sanitizeFn: '(null|function)',
|
5341 |
-
whiteList: 'object'
|
|
|
5342 |
};
|
5343 |
var AttachmentMap$1 = {
|
5344 |
AUTO: 'auto',
|
@@ -5362,7 +5499,8 @@
|
|
5362 |
boundary: 'scrollParent',
|
5363 |
sanitize: true,
|
5364 |
sanitizeFn: null,
|
5365 |
-
whiteList: DefaultWhitelist
|
|
|
5366 |
};
|
5367 |
var HoverState = {
|
5368 |
SHOW: 'show',
|
@@ -5394,22 +5532,17 @@
|
|
5394 |
FOCUS: 'focus',
|
5395 |
CLICK: 'click',
|
5396 |
MANUAL: 'manual'
|
5397 |
-
/**
|
5398 |
-
* ------------------------------------------------------------------------
|
5399 |
-
* Class Definition
|
5400 |
-
* ------------------------------------------------------------------------
|
5401 |
-
*/
|
5402 |
-
|
5403 |
};
|
|
|
|
|
|
|
|
|
|
|
5404 |
|
5405 |
var Tooltip =
|
5406 |
/*#__PURE__*/
|
5407 |
function () {
|
5408 |
function Tooltip(element, config) {
|
5409 |
-
/**
|
5410 |
-
* Check for Popper dependency
|
5411 |
-
* Popper - https://popper.js.org
|
5412 |
-
*/
|
5413 |
if (typeof Popper === 'undefined') {
|
5414 |
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
|
5415 |
} // private
|
@@ -5480,7 +5613,7 @@
|
|
5480 |
clearTimeout(this._timeout);
|
5481 |
$.removeData(this.element, this.constructor.DATA_KEY);
|
5482 |
$(this.element).off(this.constructor.EVENT_KEY);
|
5483 |
-
$(this.element).closest('.modal').off('hide.bs.modal');
|
5484 |
|
5485 |
if (this.tip) {
|
5486 |
$(this.tip).remove();
|
@@ -5491,7 +5624,7 @@
|
|
5491 |
this._hoverState = null;
|
5492 |
this._activeTrigger = null;
|
5493 |
|
5494 |
-
if (this._popper
|
5495 |
this._popper.destroy();
|
5496 |
}
|
5497 |
|
@@ -5544,29 +5677,7 @@
|
|
5544 |
}
|
5545 |
|
5546 |
$(this.element).trigger(this.constructor.Event.INSERTED);
|
5547 |
-
this._popper = new Popper(this.element, tip,
|
5548 |
-
placement: attachment,
|
5549 |
-
modifiers: {
|
5550 |
-
offset: this._getOffset(),
|
5551 |
-
flip: {
|
5552 |
-
behavior: this.config.fallbackPlacement
|
5553 |
-
},
|
5554 |
-
arrow: {
|
5555 |
-
element: Selector$6.ARROW
|
5556 |
-
},
|
5557 |
-
preventOverflow: {
|
5558 |
-
boundariesElement: this.config.boundary
|
5559 |
-
}
|
5560 |
-
},
|
5561 |
-
onCreate: function onCreate(data) {
|
5562 |
-
if (data.originalPlacement !== data.placement) {
|
5563 |
-
_this._handlePopperPlacementChange(data);
|
5564 |
-
}
|
5565 |
-
},
|
5566 |
-
onUpdate: function onUpdate(data) {
|
5567 |
-
return _this._handlePopperPlacementChange(data);
|
5568 |
-
}
|
5569 |
-
});
|
5570 |
$(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
|
5571 |
// empty mouseover listeners to the body's immediate children;
|
5572 |
// only needed because of broken event delegation on iOS
|
@@ -5714,14 +5825,43 @@
|
|
5714 |
} // Private
|
5715 |
;
|
5716 |
|
5717 |
-
_proto.
|
5718 |
var _this3 = this;
|
5719 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5720 |
var offset = {};
|
5721 |
|
5722 |
if (typeof this.config.offset === 'function') {
|
5723 |
offset.fn = function (data) {
|
5724 |
-
data.offsets =
|
5725 |
return data;
|
5726 |
};
|
5727 |
} else {
|
@@ -5748,32 +5888,35 @@
|
|
5748 |
};
|
5749 |
|
5750 |
_proto._setListeners = function _setListeners() {
|
5751 |
-
var
|
5752 |
|
5753 |
var triggers = this.config.trigger.split(' ');
|
5754 |
triggers.forEach(function (trigger) {
|
5755 |
if (trigger === 'click') {
|
5756 |
-
$(
|
5757 |
-
return
|
5758 |
});
|
5759 |
} else if (trigger !== Trigger.MANUAL) {
|
5760 |
-
var eventIn = trigger === Trigger.HOVER ?
|
5761 |
-
var eventOut = trigger === Trigger.HOVER ?
|
5762 |
-
$(
|
5763 |
-
return
|
5764 |
-
}).on(eventOut,
|
5765 |
-
return
|
5766 |
});
|
5767 |
}
|
5768 |
});
|
5769 |
-
|
5770 |
-
|
5771 |
-
|
|
|
5772 |
}
|
5773 |
-
}
|
|
|
|
|
5774 |
|
5775 |
if (this.config.selector) {
|
5776 |
-
this.config =
|
5777 |
trigger: 'manual',
|
5778 |
selector: ''
|
5779 |
});
|
@@ -5873,7 +6016,7 @@
|
|
5873 |
delete dataAttributes[dataAttr];
|
5874 |
}
|
5875 |
});
|
5876 |
-
config =
|
5877 |
|
5878 |
if (typeof config.delay === 'number') {
|
5879 |
config.delay = {
|
@@ -6033,21 +6176,21 @@
|
|
6033 |
*/
|
6034 |
|
6035 |
var NAME$7 = 'popover';
|
6036 |
-
var VERSION$7 = '4.
|
6037 |
var DATA_KEY$7 = 'bs.popover';
|
6038 |
var EVENT_KEY$7 = "." + DATA_KEY$7;
|
6039 |
var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
|
6040 |
var CLASS_PREFIX$1 = 'bs-popover';
|
6041 |
var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
|
6042 |
|
6043 |
-
var Default$5 =
|
6044 |
placement: 'right',
|
6045 |
trigger: 'click',
|
6046 |
content: '',
|
6047 |
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
|
6048 |
});
|
6049 |
|
6050 |
-
var DefaultType$5 =
|
6051 |
content: '(string|element|function)'
|
6052 |
});
|
6053 |
|
@@ -6070,13 +6213,12 @@
|
|
6070 |
FOCUSOUT: "focusout" + EVENT_KEY$7,
|
6071 |
MOUSEENTER: "mouseenter" + EVENT_KEY$7,
|
6072 |
MOUSELEAVE: "mouseleave" + EVENT_KEY$7
|
6073 |
-
/**
|
6074 |
-
* ------------------------------------------------------------------------
|
6075 |
-
* Class Definition
|
6076 |
-
* ------------------------------------------------------------------------
|
6077 |
-
*/
|
6078 |
-
|
6079 |
};
|
|
|
|
|
|
|
|
|
|
|
6080 |
|
6081 |
var Popover =
|
6082 |
/*#__PURE__*/
|
@@ -6220,7 +6362,7 @@
|
|
6220 |
*/
|
6221 |
|
6222 |
var NAME$8 = 'scrollspy';
|
6223 |
-
var VERSION$8 = '4.
|
6224 |
var DATA_KEY$8 = 'bs.scrollspy';
|
6225 |
var EVENT_KEY$8 = "." + DATA_KEY$8;
|
6226 |
var DATA_API_KEY$6 = '.data-api';
|
@@ -6259,13 +6401,12 @@
|
|
6259 |
var OffsetMethod = {
|
6260 |
OFFSET: 'offset',
|
6261 |
POSITION: 'position'
|
6262 |
-
/**
|
6263 |
-
* ------------------------------------------------------------------------
|
6264 |
-
* Class Definition
|
6265 |
-
* ------------------------------------------------------------------------
|
6266 |
-
*/
|
6267 |
-
|
6268 |
};
|
|
|
|
|
|
|
|
|
|
|
6269 |
|
6270 |
var ScrollSpy =
|
6271 |
/*#__PURE__*/
|
@@ -6347,7 +6488,7 @@
|
|
6347 |
;
|
6348 |
|
6349 |
_proto._getConfig = function _getConfig(config) {
|
6350 |
-
config =
|
6351 |
|
6352 |
if (typeof config.target !== 'string') {
|
6353 |
var id = $(config.target).attr('id');
|
@@ -6527,7 +6668,7 @@
|
|
6527 |
*/
|
6528 |
|
6529 |
var NAME$9 = 'tab';
|
6530 |
-
var VERSION$9 = '4.
|
6531 |
var DATA_KEY$9 = 'bs.tab';
|
6532 |
var EVENT_KEY$9 = "." + DATA_KEY$9;
|
6533 |
var DATA_API_KEY$7 = '.data-api';
|
@@ -6554,13 +6695,12 @@
|
|
6554 |
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
|
6555 |
DROPDOWN_TOGGLE: '.dropdown-toggle',
|
6556 |
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
6557 |
-
/**
|
6558 |
-
* ------------------------------------------------------------------------
|
6559 |
-
* Class Definition
|
6560 |
-
* ------------------------------------------------------------------------
|
6561 |
-
*/
|
6562 |
-
|
6563 |
};
|
|
|
|
|
|
|
|
|
|
|
6564 |
|
6565 |
var Tab =
|
6566 |
/*#__PURE__*/
|
@@ -6762,7 +6902,7 @@
|
|
6762 |
*/
|
6763 |
|
6764 |
var NAME$a = 'toast';
|
6765 |
-
var VERSION$a = '4.
|
6766 |
var DATA_KEY$a = 'bs.toast';
|
6767 |
var EVENT_KEY$a = "." + DATA_KEY$a;
|
6768 |
var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
|
@@ -6791,13 +6931,12 @@
|
|
6791 |
};
|
6792 |
var Selector$a = {
|
6793 |
DATA_DISMISS: '[data-dismiss="toast"]'
|
6794 |
-
/**
|
6795 |
-
* ------------------------------------------------------------------------
|
6796 |
-
* Class Definition
|
6797 |
-
* ------------------------------------------------------------------------
|
6798 |
-
*/
|
6799 |
-
|
6800 |
};
|
|
|
|
|
|
|
|
|
|
|
6801 |
|
6802 |
var Toast =
|
6803 |
/*#__PURE__*/
|
@@ -6817,7 +6956,12 @@
|
|
6817 |
_proto.show = function show() {
|
6818 |
var _this = this;
|
6819 |
|
6820 |
-
|
|
|
|
|
|
|
|
|
|
|
6821 |
|
6822 |
if (this._config.animation) {
|
6823 |
this._element.classList.add(ClassName$a.FADE);
|
@@ -6831,12 +6975,16 @@
|
|
6831 |
$(_this._element).trigger(Event$a.SHOWN);
|
6832 |
|
6833 |
if (_this._config.autohide) {
|
6834 |
-
_this.
|
|
|
|
|
6835 |
}
|
6836 |
};
|
6837 |
|
6838 |
this._element.classList.remove(ClassName$a.HIDE);
|
6839 |
|
|
|
|
|
6840 |
this._element.classList.add(ClassName$a.SHOWING);
|
6841 |
|
6842 |
if (this._config.animation) {
|
@@ -6847,22 +6995,19 @@
|
|
6847 |
}
|
6848 |
};
|
6849 |
|
6850 |
-
_proto.hide = function hide(
|
6851 |
-
var _this2 = this;
|
6852 |
-
|
6853 |
if (!this._element.classList.contains(ClassName$a.SHOW)) {
|
6854 |
return;
|
6855 |
}
|
6856 |
|
6857 |
-
|
|
|
6858 |
|
6859 |
-
if (
|
6860 |
-
|
6861 |
-
} else {
|
6862 |
-
this._timeout = setTimeout(function () {
|
6863 |
-
_this2._close();
|
6864 |
-
}, this._config.delay);
|
6865 |
}
|
|
|
|
|
6866 |
};
|
6867 |
|
6868 |
_proto.dispose = function dispose() {
|
@@ -6881,26 +7026,26 @@
|
|
6881 |
;
|
6882 |
|
6883 |
_proto._getConfig = function _getConfig(config) {
|
6884 |
-
config =
|
6885 |
Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
|
6886 |
return config;
|
6887 |
};
|
6888 |
|
6889 |
_proto._setListeners = function _setListeners() {
|
6890 |
-
var
|
6891 |
|
6892 |
$(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
|
6893 |
-
return
|
6894 |
});
|
6895 |
};
|
6896 |
|
6897 |
_proto._close = function _close() {
|
6898 |
-
var
|
6899 |
|
6900 |
var complete = function complete() {
|
6901 |
-
|
6902 |
|
6903 |
-
$(
|
6904 |
};
|
6905 |
|
6906 |
this._element.classList.remove(ClassName$a.SHOW);
|
@@ -6970,31 +7115,6 @@
|
|
6970 |
return Toast._jQueryInterface;
|
6971 |
};
|
6972 |
|
6973 |
-
/**
|
6974 |
-
* --------------------------------------------------------------------------
|
6975 |
-
* Bootstrap (v4.3.1): index.js
|
6976 |
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
6977 |
-
* --------------------------------------------------------------------------
|
6978 |
-
*/
|
6979 |
-
|
6980 |
-
(function () {
|
6981 |
-
if (typeof $ === 'undefined') {
|
6982 |
-
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
|
6983 |
-
}
|
6984 |
-
|
6985 |
-
var version = $.fn.jquery.split(' ')[0].split('.');
|
6986 |
-
var minMajor = 1;
|
6987 |
-
var ltMajor = 2;
|
6988 |
-
var minMinor = 9;
|
6989 |
-
var minPatch = 1;
|
6990 |
-
var maxMajor = 4;
|
6991 |
-
|
6992 |
-
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
|
6993 |
-
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
|
6994 |
-
}
|
6995 |
-
})();
|
6996 |
-
|
6997 |
-
exports.Util = Util;
|
6998 |
exports.Alert = Alert;
|
6999 |
exports.Button = Button;
|
7000 |
exports.Carousel = Carousel;
|
@@ -7006,8 +7126,9 @@
|
|
7006 |
exports.Tab = Tab;
|
7007 |
exports.Toast = Toast;
|
7008 |
exports.Tooltip = Tooltip;
|
|
|
7009 |
|
7010 |
Object.defineProperty(exports, '__esModule', { value: true });
|
7011 |
|
7012 |
-
}));
|
7013 |
//# sourceMappingURL=bootstrap.bundle.js.map
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
7 |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :
|
8 |
typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :
|
9 |
(global = global || self, factory(global.bootstrap = {}, global.jQuery));
|
10 |
+
}(this, (function (exports, $) { 'use strict';
|
11 |
|
12 |
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
13 |
|
42 |
return obj;
|
43 |
}
|
44 |
|
45 |
+
function ownKeys(object, enumerableOnly) {
|
46 |
+
var keys = Object.keys(object);
|
47 |
+
|
48 |
+
if (Object.getOwnPropertySymbols) {
|
49 |
+
var symbols = Object.getOwnPropertySymbols(object);
|
50 |
+
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
51 |
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
52 |
+
});
|
53 |
+
keys.push.apply(keys, symbols);
|
54 |
+
}
|
55 |
+
|
56 |
+
return keys;
|
57 |
+
}
|
58 |
+
|
59 |
+
function _objectSpread2(target) {
|
60 |
for (var i = 1; i < arguments.length; i++) {
|
61 |
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
62 |
|
63 |
+
if (i % 2) {
|
64 |
+
ownKeys(Object(source), true).forEach(function (key) {
|
65 |
+
_defineProperty(target, key, source[key]);
|
66 |
+
});
|
67 |
+
} else if (Object.getOwnPropertyDescriptors) {
|
68 |
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
69 |
+
} else {
|
70 |
+
ownKeys(Object(source)).forEach(function (key) {
|
71 |
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
72 |
+
});
|
73 |
}
|
|
|
|
|
|
|
|
|
74 |
}
|
75 |
|
76 |
return target;
|
84 |
|
85 |
/**
|
86 |
* --------------------------------------------------------------------------
|
87 |
+
* Bootstrap (v4.4.1): util.js
|
88 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
89 |
* --------------------------------------------------------------------------
|
90 |
*/
|
233 |
}
|
234 |
|
235 |
return Util.findShadowRoot(element.parentNode);
|
236 |
+
},
|
237 |
+
jQueryDetection: function jQueryDetection() {
|
238 |
+
if (typeof $ === 'undefined') {
|
239 |
+
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
|
240 |
+
}
|
241 |
+
|
242 |
+
var version = $.fn.jquery.split(' ')[0].split('.');
|
243 |
+
var minMajor = 1;
|
244 |
+
var ltMajor = 2;
|
245 |
+
var minMinor = 9;
|
246 |
+
var minPatch = 1;
|
247 |
+
var maxMajor = 4;
|
248 |
+
|
249 |
+
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
|
250 |
+
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
|
251 |
+
}
|
252 |
}
|
253 |
};
|
254 |
+
Util.jQueryDetection();
|
255 |
setTransitionEndSupport();
|
256 |
|
257 |
/**
|
261 |
*/
|
262 |
|
263 |
var NAME = 'alert';
|
264 |
+
var VERSION = '4.4.1';
|
265 |
var DATA_KEY = 'bs.alert';
|
266 |
var EVENT_KEY = "." + DATA_KEY;
|
267 |
var DATA_API_KEY = '.data-api';
|
278 |
ALERT: 'alert',
|
279 |
FADE: 'fade',
|
280 |
SHOW: 'show'
|
|
|
|
|
|
|
|
|
|
|
|
|
281 |
};
|
282 |
+
/**
|
283 |
+
* ------------------------------------------------------------------------
|
284 |
+
* Class Definition
|
285 |
+
* ------------------------------------------------------------------------
|
286 |
+
*/
|
287 |
|
288 |
var Alert =
|
289 |
/*#__PURE__*/
|
425 |
*/
|
426 |
|
427 |
var NAME$1 = 'button';
|
428 |
+
var VERSION$1 = '4.4.1';
|
429 |
var DATA_KEY$1 = 'bs.button';
|
430 |
var EVENT_KEY$1 = "." + DATA_KEY$1;
|
431 |
var DATA_API_KEY$1 = '.data-api';
|
437 |
};
|
438 |
var Selector$1 = {
|
439 |
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
440 |
+
DATA_TOGGLES: '[data-toggle="buttons"]',
|
441 |
+
DATA_TOGGLE: '[data-toggle="button"]',
|
442 |
+
DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
|
443 |
INPUT: 'input:not([type="hidden"])',
|
444 |
ACTIVE: '.active',
|
445 |
BUTTON: '.btn'
|
446 |
};
|
447 |
var Event$1 = {
|
448 |
CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
|
449 |
+
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1),
|
450 |
+
LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1
|
|
|
|
|
|
|
|
|
|
|
451 |
};
|
452 |
+
/**
|
453 |
+
* ------------------------------------------------------------------------
|
454 |
+
* Class Definition
|
455 |
+
* ------------------------------------------------------------------------
|
456 |
+
*/
|
457 |
|
458 |
var Button =
|
459 |
/*#__PURE__*/
|
469 |
_proto.toggle = function toggle() {
|
470 |
var triggerChangeEvent = true;
|
471 |
var addAriaPressed = true;
|
472 |
+
var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0];
|
473 |
|
474 |
if (rootElement) {
|
475 |
var input = this._element.querySelector(Selector$1.INPUT);
|
485 |
$(activeElement).removeClass(ClassName$1.ACTIVE);
|
486 |
}
|
487 |
}
|
488 |
+
} else if (input.type === 'checkbox') {
|
489 |
+
if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) {
|
490 |
+
triggerChangeEvent = false;
|
491 |
+
}
|
492 |
+
} else {
|
493 |
+
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
|
494 |
+
triggerChangeEvent = false;
|
495 |
}
|
496 |
|
497 |
if (triggerChangeEvent) {
|
|
|
|
|
|
|
|
|
498 |
input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
|
499 |
$(input).trigger('change');
|
500 |
}
|
504 |
}
|
505 |
}
|
506 |
|
507 |
+
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
|
508 |
+
if (addAriaPressed) {
|
509 |
+
this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
|
510 |
+
}
|
511 |
|
512 |
+
if (triggerChangeEvent) {
|
513 |
+
$(this._element).toggleClass(ClassName$1.ACTIVE);
|
514 |
+
}
|
515 |
}
|
516 |
};
|
517 |
|
553 |
|
554 |
|
555 |
$(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
|
|
556 |
var button = event.target;
|
557 |
|
558 |
if (!$(button).hasClass(ClassName$1.BUTTON)) {
|
559 |
+
button = $(button).closest(Selector$1.BUTTON)[0];
|
560 |
}
|
561 |
|
562 |
+
if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
|
563 |
+
event.preventDefault(); // work around Firefox bug #1540995
|
564 |
+
} else {
|
565 |
+
var inputBtn = button.querySelector(Selector$1.INPUT);
|
566 |
+
|
567 |
+
if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
|
568 |
+
event.preventDefault(); // work around Firefox bug #1540995
|
569 |
+
|
570 |
+
return;
|
571 |
+
}
|
572 |
+
|
573 |
+
Button._jQueryInterface.call($(button), 'toggle');
|
574 |
+
}
|
575 |
}).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
576 |
var button = $(event.target).closest(Selector$1.BUTTON)[0];
|
577 |
$(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
|
578 |
});
|
579 |
+
$(window).on(Event$1.LOAD_DATA_API, function () {
|
580 |
+
// ensure correct active class is set to match the controls' actual values/states
|
581 |
+
// find all checkboxes/readio buttons inside data-toggle groups
|
582 |
+
var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS));
|
583 |
+
|
584 |
+
for (var i = 0, len = buttons.length; i < len; i++) {
|
585 |
+
var button = buttons[i];
|
586 |
+
var input = button.querySelector(Selector$1.INPUT);
|
587 |
+
|
588 |
+
if (input.checked || input.hasAttribute('checked')) {
|
589 |
+
button.classList.add(ClassName$1.ACTIVE);
|
590 |
+
} else {
|
591 |
+
button.classList.remove(ClassName$1.ACTIVE);
|
592 |
+
}
|
593 |
+
} // find all button toggles
|
594 |
+
|
595 |
+
|
596 |
+
buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE));
|
597 |
+
|
598 |
+
for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
|
599 |
+
var _button = buttons[_i];
|
600 |
+
|
601 |
+
if (_button.getAttribute('aria-pressed') === 'true') {
|
602 |
+
_button.classList.add(ClassName$1.ACTIVE);
|
603 |
+
} else {
|
604 |
+
_button.classList.remove(ClassName$1.ACTIVE);
|
605 |
+
}
|
606 |
+
}
|
607 |
+
});
|
608 |
/**
|
609 |
* ------------------------------------------------------------------------
|
610 |
* jQuery
|
626 |
*/
|
627 |
|
628 |
var NAME$2 = 'carousel';
|
629 |
+
var VERSION$2 = '4.4.1';
|
630 |
var DATA_KEY$2 = 'bs.carousel';
|
631 |
var EVENT_KEY$2 = "." + DATA_KEY$2;
|
632 |
var DATA_API_KEY$2 = '.data-api';
|
699 |
var PointerType = {
|
700 |
TOUCH: 'touch',
|
701 |
PEN: 'pen'
|
|
|
|
|
|
|
|
|
|
|
|
|
702 |
};
|
703 |
+
/**
|
704 |
+
* ------------------------------------------------------------------------
|
705 |
+
* Class Definition
|
706 |
+
* ------------------------------------------------------------------------
|
707 |
+
*/
|
708 |
|
709 |
var Carousel =
|
710 |
/*#__PURE__*/
|
824 |
;
|
825 |
|
826 |
_proto._getConfig = function _getConfig(config) {
|
827 |
+
config = _objectSpread2({}, Default, {}, config);
|
828 |
Util.typeCheckConfig(NAME$2, config, DefaultType);
|
829 |
return config;
|
830 |
};
|
836 |
return;
|
837 |
}
|
838 |
|
839 |
+
var direction = absDeltax / this.touchDeltaX;
|
840 |
+
this.touchDeltaX = 0; // swipe left
|
841 |
|
842 |
if (direction > 0) {
|
843 |
this.prev();
|
963 |
event.preventDefault();
|
964 |
this.next();
|
965 |
break;
|
|
|
|
|
966 |
}
|
967 |
};
|
968 |
|
1114 |
return this.each(function () {
|
1115 |
var data = $(this).data(DATA_KEY$2);
|
1116 |
|
1117 |
+
var _config = _objectSpread2({}, Default, {}, $(this).data());
|
1118 |
|
1119 |
if (typeof config === 'object') {
|
1120 |
+
_config = _objectSpread2({}, _config, {}, config);
|
1121 |
}
|
1122 |
|
1123 |
var action = typeof config === 'string' ? config : _config.slide;
|
1155 |
return;
|
1156 |
}
|
1157 |
|
1158 |
+
var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
|
1159 |
|
1160 |
var slideIndex = this.getAttribute('data-slide-to');
|
1161 |
|
1224 |
*/
|
1225 |
|
1226 |
var NAME$3 = 'collapse';
|
1227 |
+
var VERSION$3 = '4.4.1';
|
1228 |
var DATA_KEY$3 = 'bs.collapse';
|
1229 |
var EVENT_KEY$3 = "." + DATA_KEY$3;
|
1230 |
var DATA_API_KEY$3 = '.data-api';
|
1257 |
var Selector$3 = {
|
1258 |
ACTIVES: '.show, .collapsing',
|
1259 |
DATA_TOGGLE: '[data-toggle="collapse"]'
|
|
|
|
|
|
|
|
|
|
|
|
|
1260 |
};
|
1261 |
+
/**
|
1262 |
+
* ------------------------------------------------------------------------
|
1263 |
+
* Class Definition
|
1264 |
+
* ------------------------------------------------------------------------
|
1265 |
+
*/
|
1266 |
|
1267 |
var Collapse =
|
1268 |
/*#__PURE__*/
|
1449 |
;
|
1450 |
|
1451 |
_proto._getConfig = function _getConfig(config) {
|
1452 |
+
config = _objectSpread2({}, Default$1, {}, config);
|
1453 |
config.toggle = Boolean(config.toggle); // Coerce string values
|
1454 |
|
1455 |
Util.typeCheckConfig(NAME$3, config, DefaultType$1);
|
1503 |
var $this = $(this);
|
1504 |
var data = $this.data(DATA_KEY$3);
|
1505 |
|
1506 |
+
var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
|
1507 |
|
1508 |
if (!data && _config.toggle && /show|hide/.test(config)) {
|
1509 |
_config.toggle = false;
|
1578 |
|
1579 |
/**!
|
1580 |
* @fileOverview Kickass library to create and place poppers near their reference elements.
|
1581 |
+
* @version 1.16.0
|
1582 |
* @license
|
1583 |
* Copyright (c) 2016 Federico Zivolo and contributors
|
1584 |
*
|
1600 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
1601 |
* SOFTWARE.
|
1602 |
*/
|
1603 |
+
var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';
|
1604 |
+
|
1605 |
+
var timeoutDuration = function () {
|
1606 |
+
var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
|
1607 |
+
for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
|
1608 |
+
if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
|
1609 |
+
return 1;
|
1610 |
+
}
|
1611 |
}
|
1612 |
+
return 0;
|
1613 |
+
}();
|
1614 |
|
1615 |
function microtaskDebounce(fn) {
|
1616 |
var called = false;
|
1730 |
return getScrollParent(getParentNode(element));
|
1731 |
}
|
1732 |
|
1733 |
+
/**
|
1734 |
+
* Returns the reference node of the reference object, or the reference object itself.
|
1735 |
+
* @method
|
1736 |
+
* @memberof Popper.Utils
|
1737 |
+
* @param {Element|Object} reference - the reference element (the popper will be relative to this)
|
1738 |
+
* @returns {Element} parent
|
1739 |
+
*/
|
1740 |
+
function getReferenceNode(reference) {
|
1741 |
+
return reference && reference.referenceNode ? reference.referenceNode : reference;
|
1742 |
+
}
|
1743 |
+
|
1744 |
var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
|
1745 |
var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
|
1746 |
|
2049 |
|
2050 |
// subtract scrollbar size from sizes
|
2051 |
var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
|
2052 |
+
var width = sizes.width || element.clientWidth || result.width;
|
2053 |
+
var height = sizes.height || element.clientHeight || result.height;
|
2054 |
|
2055 |
var horizScrollbar = element.offsetWidth - width;
|
2056 |
var vertScrollbar = element.offsetHeight - height;
|
2202 |
// NOTE: 1 DOM access here
|
2203 |
|
2204 |
var boundaries = { top: 0, left: 0 };
|
2205 |
+
var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
|
2206 |
|
2207 |
// Handle viewport case
|
2208 |
if (boundariesElement === 'viewport') {
|
2330 |
function getReferenceOffsets(state, popper, reference) {
|
2331 |
var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
2332 |
|
2333 |
+
var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
|
2334 |
return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
|
2335 |
}
|
2336 |
|
2592 |
|
2593 |
this.disableEventListeners();
|
2594 |
|
2595 |
+
// remove the popper if user explicitly asked for the deletion on destroy
|
2596 |
// do not use `remove` because IE11 doesn't support it
|
2597 |
if (this.options.removeOnDestroy) {
|
2598 |
this.popper.parentNode.removeChild(this.popper);
|
3194 |
|
3195 |
// flip the variation if required
|
3196 |
var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
|
3197 |
+
|
3198 |
+
// flips variation if reference element overflows boundaries
|
3199 |
+
var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);
|
3200 |
+
|
3201 |
+
// flips variation if popper content overflows boundaries
|
3202 |
+
var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);
|
3203 |
+
|
3204 |
+
var flippedVariation = flippedVariationByRef || flippedVariationByContent;
|
3205 |
|
3206 |
if (overlapsRef || overflowsBoundaries || flippedVariation) {
|
3207 |
// this boolean to detect any flip loop
|
3808 |
* The popper will never be placed outside of the defined boundaries
|
3809 |
* (except if `keepTogether` is enabled)
|
3810 |
*/
|
3811 |
+
boundariesElement: 'viewport',
|
3812 |
+
/**
|
3813 |
+
* @prop {Boolean} flipVariations=false
|
3814 |
+
* The popper will switch placement variation between `-start` and `-end` when
|
3815 |
+
* the reference element overlaps its boundaries.
|
3816 |
+
*
|
3817 |
+
* The original placement should have a set variation.
|
3818 |
+
*/
|
3819 |
+
flipVariations: false,
|
3820 |
+
/**
|
3821 |
+
* @prop {Boolean} flipVariationsByContent=false
|
3822 |
+
* The popper will switch placement variation between `-start` and `-end` when
|
3823 |
+
* the popper element overlaps its reference boundaries.
|
3824 |
+
*
|
3825 |
+
* The original placement should have a set variation.
|
3826 |
+
*/
|
3827 |
+
flipVariationsByContent: false
|
3828 |
},
|
3829 |
|
3830 |
/**
|
4041 |
/**
|
4042 |
* Creates a new Popper.js instance.
|
4043 |
* @class Popper
|
4044 |
+
* @param {Element|referenceObject} reference - The reference element used to position the popper
|
4045 |
+
* @param {Element} popper - The HTML / XML element used as the popper
|
4046 |
* @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
|
4047 |
* @return {Object} instance - The generated Popper.js instance
|
4048 |
*/
|
4197 |
*/
|
4198 |
|
4199 |
var NAME$4 = 'dropdown';
|
4200 |
+
var VERSION$4 = '4.4.1';
|
4201 |
var DATA_KEY$4 = 'bs.dropdown';
|
4202 |
var EVENT_KEY$4 = "." + DATA_KEY$4;
|
4203 |
var DATA_API_KEY$4 = '.data-api';
|
4257 |
flip: true,
|
4258 |
boundary: 'scrollParent',
|
4259 |
reference: 'toggle',
|
4260 |
+
display: 'dynamic',
|
4261 |
+
popperConfig: null
|
4262 |
};
|
4263 |
var DefaultType$2 = {
|
4264 |
offset: '(number|string|function)',
|
4265 |
flip: 'boolean',
|
4266 |
boundary: '(string|element)',
|
4267 |
reference: '(string|element)',
|
4268 |
+
display: 'string',
|
4269 |
+
popperConfig: '(null|object)'
|
|
|
|
|
|
|
|
|
|
|
4270 |
};
|
4271 |
+
/**
|
4272 |
+
* ------------------------------------------------------------------------
|
4273 |
+
* Class Definition
|
4274 |
+
* ------------------------------------------------------------------------
|
4275 |
+
*/
|
4276 |
|
4277 |
var Dropdown =
|
4278 |
/*#__PURE__*/
|
4296 |
return;
|
4297 |
}
|
4298 |
|
|
|
|
|
4299 |
var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
|
4300 |
|
4301 |
Dropdown._clearMenus();
|
4304 |
return;
|
4305 |
}
|
4306 |
|
4307 |
+
this.show(true);
|
4308 |
+
};
|
4309 |
+
|
4310 |
+
_proto.show = function show(usePopper) {
|
4311 |
+
if (usePopper === void 0) {
|
4312 |
+
usePopper = false;
|
4313 |
+
}
|
4314 |
+
|
4315 |
+
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
|
4316 |
+
return;
|
4317 |
+
}
|
4318 |
+
|
4319 |
var relatedTarget = {
|
4320 |
relatedTarget: this._element
|
4321 |
};
|
4322 |
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
4323 |
+
|
4324 |
+
var parent = Dropdown._getParentFromElement(this._element);
|
4325 |
+
|
4326 |
$(parent).trigger(showEvent);
|
4327 |
|
4328 |
if (showEvent.isDefaultPrevented()) {
|
4330 |
} // Disable totally Popper.js for Dropdown in Navbar
|
4331 |
|
4332 |
|
4333 |
+
if (!this._inNavbar && usePopper) {
|
4334 |
/**
|
4335 |
* Check for Popper dependency
|
4336 |
* Popper - https://popper.js.org
|
4377 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
4378 |
};
|
4379 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4380 |
_proto.hide = function hide() {
|
4381 |
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
|
4382 |
return;
|
4395 |
return;
|
4396 |
}
|
4397 |
|
4398 |
+
if (this._popper) {
|
4399 |
+
this._popper.destroy();
|
4400 |
+
}
|
4401 |
+
|
4402 |
$(this._menu).toggleClass(ClassName$4.SHOW);
|
4403 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
4404 |
};
|
4437 |
};
|
4438 |
|
4439 |
_proto._getConfig = function _getConfig(config) {
|
4440 |
+
config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
|
4441 |
Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
|
4442 |
return config;
|
4443 |
};
|
4486 |
|
4487 |
if (typeof this._config.offset === 'function') {
|
4488 |
offset.fn = function (data) {
|
4489 |
+
data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
|
4490 |
return data;
|
4491 |
};
|
4492 |
} else {
|
4507 |
preventOverflow: {
|
4508 |
boundariesElement: this._config.boundary
|
4509 |
}
|
4510 |
+
}
|
4511 |
+
}; // Disable Popper.js if we have a static display
|
|
|
4512 |
|
4513 |
if (this._config.display === 'static') {
|
4514 |
popperConfig.modifiers.applyStyle = {
|
4516 |
};
|
4517 |
}
|
4518 |
|
4519 |
+
return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
|
4520 |
} // Static
|
4521 |
;
|
4522 |
|
4588 |
}
|
4589 |
|
4590 |
toggles[i].setAttribute('aria-expanded', 'false');
|
4591 |
+
|
4592 |
+
if (context._popper) {
|
4593 |
+
context._popper.destroy();
|
4594 |
+
}
|
4595 |
+
|
4596 |
$(dropdownMenu).removeClass(ClassName$4.SHOW);
|
4597 |
$(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
4598 |
}
|
4633 |
|
4634 |
var isActive = $(parent).hasClass(ClassName$4.SHOW);
|
4635 |
|
4636 |
+
if (!isActive && event.which === ESCAPE_KEYCODE) {
|
4637 |
+
return;
|
4638 |
+
}
|
4639 |
+
|
4640 |
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
4641 |
if (event.which === ESCAPE_KEYCODE) {
|
4642 |
var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
|
4647 |
return;
|
4648 |
}
|
4649 |
|
4650 |
+
var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) {
|
4651 |
+
return $(item).is(':visible');
|
4652 |
+
});
|
4653 |
|
4654 |
if (items.length === 0) {
|
4655 |
return;
|
4729 |
*/
|
4730 |
|
4731 |
var NAME$5 = 'modal';
|
4732 |
+
var VERSION$5 = '4.4.1';
|
4733 |
var DATA_KEY$5 = 'bs.modal';
|
4734 |
var EVENT_KEY$5 = "." + DATA_KEY$5;
|
4735 |
var DATA_API_KEY$5 = '.data-api';
|
4750 |
};
|
4751 |
var Event$5 = {
|
4752 |
HIDE: "hide" + EVENT_KEY$5,
|
4753 |
+
HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5,
|
4754 |
HIDDEN: "hidden" + EVENT_KEY$5,
|
4755 |
SHOW: "show" + EVENT_KEY$5,
|
4756 |
SHOWN: "shown" + EVENT_KEY$5,
|
4768 |
BACKDROP: 'modal-backdrop',
|
4769 |
OPEN: 'modal-open',
|
4770 |
FADE: 'fade',
|
4771 |
+
SHOW: 'show',
|
4772 |
+
STATIC: 'modal-static'
|
4773 |
};
|
4774 |
var Selector$5 = {
|
4775 |
DIALOG: '.modal-dialog',
|
4778 |
DATA_DISMISS: '[data-dismiss="modal"]',
|
4779 |
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
4780 |
STICKY_CONTENT: '.sticky-top'
|
|
|
|
|
|
|
|
|
|
|
|
|
4781 |
};
|
4782 |
+
/**
|
4783 |
+
* ------------------------------------------------------------------------
|
4784 |
+
* Class Definition
|
4785 |
+
* ------------------------------------------------------------------------
|
4786 |
+
*/
|
4787 |
|
4788 |
var Modal =
|
4789 |
/*#__PURE__*/
|
4929 |
;
|
4930 |
|
4931 |
_proto._getConfig = function _getConfig(config) {
|
4932 |
+
config = _objectSpread2({}, Default$3, {}, config);
|
4933 |
Util.typeCheckConfig(NAME$5, config, DefaultType$3);
|
4934 |
return config;
|
4935 |
};
|
4936 |
|
4937 |
+
_proto._triggerBackdropTransition = function _triggerBackdropTransition() {
|
4938 |
var _this3 = this;
|
4939 |
|
4940 |
+
if (this._config.backdrop === 'static') {
|
4941 |
+
var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED);
|
4942 |
+
$(this._element).trigger(hideEventPrevented);
|
4943 |
+
|
4944 |
+
if (hideEventPrevented.defaultPrevented) {
|
4945 |
+
return;
|
4946 |
+
}
|
4947 |
+
|
4948 |
+
this._element.classList.add(ClassName$5.STATIC);
|
4949 |
+
|
4950 |
+
var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
|
4951 |
+
$(this._element).one(Util.TRANSITION_END, function () {
|
4952 |
+
_this3._element.classList.remove(ClassName$5.STATIC);
|
4953 |
+
}).emulateTransitionEnd(modalTransitionDuration);
|
4954 |
+
|
4955 |
+
this._element.focus();
|
4956 |
+
} else {
|
4957 |
+
this.hide();
|
4958 |
+
}
|
4959 |
+
};
|
4960 |
+
|
4961 |
+
_proto._showElement = function _showElement(relatedTarget) {
|
4962 |
+
var _this4 = this;
|
4963 |
+
|
4964 |
var transition = $(this._element).hasClass(ClassName$5.FADE);
|
4965 |
+
var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null;
|
4966 |
|
4967 |
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
4968 |
// Don't move modal's DOM position
|
4975 |
|
4976 |
this._element.setAttribute('aria-modal', true);
|
4977 |
|
4978 |
+
if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) {
|
4979 |
+
modalBody.scrollTop = 0;
|
4980 |
} else {
|
4981 |
this._element.scrollTop = 0;
|
4982 |
}
|
4996 |
});
|
4997 |
|
4998 |
var transitionComplete = function transitionComplete() {
|
4999 |
+
if (_this4._config.focus) {
|
5000 |
+
_this4._element.focus();
|
5001 |
}
|
5002 |
|
5003 |
+
_this4._isTransitioning = false;
|
5004 |
+
$(_this4._element).trigger(shownEvent);
|
5005 |
};
|
5006 |
|
5007 |
if (transition) {
|
5013 |
};
|
5014 |
|
5015 |
_proto._enforceFocus = function _enforceFocus() {
|
5016 |
+
var _this5 = this;
|
5017 |
|
5018 |
$(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
|
5019 |
.on(Event$5.FOCUSIN, function (event) {
|
5020 |
+
if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) {
|
5021 |
+
_this5._element.focus();
|
5022 |
}
|
5023 |
});
|
5024 |
};
|
5025 |
|
5026 |
_proto._setEscapeEvent = function _setEscapeEvent() {
|
5027 |
+
var _this6 = this;
|
5028 |
|
5029 |
if (this._isShown && this._config.keyboard) {
|
5030 |
$(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
|
5031 |
if (event.which === ESCAPE_KEYCODE$1) {
|
5032 |
+
_this6._triggerBackdropTransition();
|
|
|
|
|
5033 |
}
|
5034 |
});
|
5035 |
} else if (!this._isShown) {
|
5038 |
};
|
5039 |
|
5040 |
_proto._setResizeEvent = function _setResizeEvent() {
|
5041 |
+
var _this7 = this;
|
5042 |
|
5043 |
if (this._isShown) {
|
5044 |
$(window).on(Event$5.RESIZE, function (event) {
|
5045 |
+
return _this7.handleUpdate(event);
|
5046 |
});
|
5047 |
} else {
|
5048 |
$(window).off(Event$5.RESIZE);
|
5050 |
};
|
5051 |
|
5052 |
_proto._hideModal = function _hideModal() {
|
5053 |
+
var _this8 = this;
|
5054 |
|
5055 |
this._element.style.display = 'none';
|
5056 |
|
5063 |
this._showBackdrop(function () {
|
5064 |
$(document.body).removeClass(ClassName$5.OPEN);
|
5065 |
|
5066 |
+
_this8._resetAdjustments();
|
5067 |
|
5068 |
+
_this8._resetScrollbar();
|
5069 |
|
5070 |
+
$(_this8._element).trigger(Event$5.HIDDEN);
|
5071 |
});
|
5072 |
};
|
5073 |
|
5079 |
};
|
5080 |
|
5081 |
_proto._showBackdrop = function _showBackdrop(callback) {
|
5082 |
+
var _this9 = this;
|
5083 |
|
5084 |
var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
|
5085 |
|
5093 |
|
5094 |
$(this._backdrop).appendTo(document.body);
|
5095 |
$(this._element).on(Event$5.CLICK_DISMISS, function (event) {
|
5096 |
+
if (_this9._ignoreBackdropClick) {
|
5097 |
+
_this9._ignoreBackdropClick = false;
|
5098 |
return;
|
5099 |
}
|
5100 |
|
5102 |
return;
|
5103 |
}
|
5104 |
|
5105 |
+
_this9._triggerBackdropTransition();
|
|
|
|
|
|
|
|
|
5106 |
});
|
5107 |
|
5108 |
if (animate) {
|
5126 |
$(this._backdrop).removeClass(ClassName$5.SHOW);
|
5127 |
|
5128 |
var callbackRemove = function callbackRemove() {
|
5129 |
+
_this9._removeBackdrop();
|
5130 |
|
5131 |
if (callback) {
|
5132 |
callback();
|
5173 |
};
|
5174 |
|
5175 |
_proto._setScrollbar = function _setScrollbar() {
|
5176 |
+
var _this10 = this;
|
5177 |
|
5178 |
if (this._isBodyOverflowing) {
|
5179 |
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
5184 |
$(fixedContent).each(function (index, element) {
|
5185 |
var actualPadding = element.style.paddingRight;
|
5186 |
var calculatedPadding = $(element).css('padding-right');
|
5187 |
+
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
|
5188 |
}); // Adjust sticky content margin
|
5189 |
|
5190 |
$(stickyContent).each(function (index, element) {
|
5191 |
var actualMargin = element.style.marginRight;
|
5192 |
var calculatedMargin = $(element).css('margin-right');
|
5193 |
+
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
|
5194 |
}); // Adjust body padding
|
5195 |
|
5196 |
var actualPadding = document.body.style.paddingRight;
|
5239 |
return this.each(function () {
|
5240 |
var data = $(this).data(DATA_KEY$5);
|
5241 |
|
5242 |
+
var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
|
5243 |
|
5244 |
if (!data) {
|
5245 |
data = new Modal(this, _config);
|
5280 |
|
5281 |
|
5282 |
$(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
|
5283 |
+
var _this11 = this;
|
5284 |
|
5285 |
var target;
|
5286 |
var selector = Util.getSelectorFromElement(this);
|
5289 |
target = document.querySelector(selector);
|
5290 |
}
|
5291 |
|
5292 |
+
var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
|
5293 |
|
5294 |
if (this.tagName === 'A' || this.tagName === 'AREA') {
|
5295 |
event.preventDefault();
|
5302 |
}
|
5303 |
|
5304 |
$target.one(Event$5.HIDDEN, function () {
|
5305 |
+
if ($(_this11).is(':visible')) {
|
5306 |
+
_this11.focus();
|
5307 |
}
|
5308 |
});
|
5309 |
});
|
5326 |
|
5327 |
/**
|
5328 |
* --------------------------------------------------------------------------
|
5329 |
+
* Bootstrap (v4.4.1): tools/sanitizer.js
|
5330 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5331 |
* --------------------------------------------------------------------------
|
5332 |
*/
|
5364 |
strong: [],
|
5365 |
u: [],
|
5366 |
ul: []
|
|
|
|
|
|
|
|
|
|
|
|
|
5367 |
};
|
5368 |
+
/**
|
5369 |
+
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
5370 |
+
*
|
5371 |
+
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
5372 |
+
*/
|
5373 |
+
|
5374 |
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
|
5375 |
/**
|
5376 |
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
5437 |
};
|
5438 |
|
5439 |
for (var i = 0, len = elements.length; i < len; i++) {
|
5440 |
+
var _ret = _loop(i);
|
5441 |
|
5442 |
if (_ret === "continue") continue;
|
5443 |
}
|
5452 |
*/
|
5453 |
|
5454 |
var NAME$6 = 'tooltip';
|
5455 |
+
var VERSION$6 = '4.4.1';
|
5456 |
var DATA_KEY$6 = 'bs.tooltip';
|
5457 |
var EVENT_KEY$6 = "." + DATA_KEY$6;
|
5458 |
var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
|
5474 |
boundary: '(string|element)',
|
5475 |
sanitize: 'boolean',
|
5476 |
sanitizeFn: '(null|function)',
|
5477 |
+
whiteList: 'object',
|
5478 |
+
popperConfig: '(null|object)'
|
5479 |
};
|
5480 |
var AttachmentMap$1 = {
|
5481 |
AUTO: 'auto',
|
5499 |
boundary: 'scrollParent',
|
5500 |
sanitize: true,
|
5501 |
sanitizeFn: null,
|
5502 |
+
whiteList: DefaultWhitelist,
|
5503 |
+
popperConfig: null
|
5504 |
};
|
5505 |
var HoverState = {
|
5506 |
SHOW: 'show',
|
5532 |
FOCUS: 'focus',
|
5533 |
CLICK: 'click',
|
5534 |
MANUAL: 'manual'
|
|
|
|
|
|
|
|
|
|
|
|
|
5535 |
};
|
5536 |
+
/**
|
5537 |
+
* ------------------------------------------------------------------------
|
5538 |
+
* Class Definition
|
5539 |
+
* ------------------------------------------------------------------------
|
5540 |
+
*/
|
5541 |
|
5542 |
var Tooltip =
|
5543 |
/*#__PURE__*/
|
5544 |
function () {
|
5545 |
function Tooltip(element, config) {
|
|
|
|
|
|
|
|
|
5546 |
if (typeof Popper === 'undefined') {
|
5547 |
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
|
5548 |
} // private
|
5613 |
clearTimeout(this._timeout);
|
5614 |
$.removeData(this.element, this.constructor.DATA_KEY);
|
5615 |
$(this.element).off(this.constructor.EVENT_KEY);
|
5616 |
+
$(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
|
5617 |
|
5618 |
if (this.tip) {
|
5619 |
$(this.tip).remove();
|
5624 |
this._hoverState = null;
|
5625 |
this._activeTrigger = null;
|
5626 |
|
5627 |
+
if (this._popper) {
|
5628 |
this._popper.destroy();
|
5629 |
}
|
5630 |
|
5677 |
}
|
5678 |
|
5679 |
$(this.element).trigger(this.constructor.Event.INSERTED);
|
5680 |
+
this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5681 |
$(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
|
5682 |
// empty mouseover listeners to the body's immediate children;
|
5683 |
// only needed because of broken event delegation on iOS
|
5825 |
} // Private
|
5826 |
;
|
5827 |
|
5828 |
+
_proto._getPopperConfig = function _getPopperConfig(attachment) {
|
5829 |
var _this3 = this;
|
5830 |
|
5831 |
+
var defaultBsConfig = {
|
5832 |
+
placement: attachment,
|
5833 |
+
modifiers: {
|
5834 |
+
offset: this._getOffset(),
|
5835 |
+
flip: {
|
5836 |
+
behavior: this.config.fallbackPlacement
|
5837 |
+
},
|
5838 |
+
arrow: {
|
5839 |
+
element: Selector$6.ARROW
|
5840 |
+
},
|
5841 |
+
preventOverflow: {
|
5842 |
+
boundariesElement: this.config.boundary
|
5843 |
+
}
|
5844 |
+
},
|
5845 |
+
onCreate: function onCreate(data) {
|
5846 |
+
if (data.originalPlacement !== data.placement) {
|
5847 |
+
_this3._handlePopperPlacementChange(data);
|
5848 |
+
}
|
5849 |
+
},
|
5850 |
+
onUpdate: function onUpdate(data) {
|
5851 |
+
return _this3._handlePopperPlacementChange(data);
|
5852 |
+
}
|
5853 |
+
};
|
5854 |
+
return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
|
5855 |
+
};
|
5856 |
+
|
5857 |
+
_proto._getOffset = function _getOffset() {
|
5858 |
+
var _this4 = this;
|
5859 |
+
|
5860 |
var offset = {};
|
5861 |
|
5862 |
if (typeof this.config.offset === 'function') {
|
5863 |
offset.fn = function (data) {
|
5864 |
+
data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
|
5865 |
return data;
|
5866 |
};
|
5867 |
} else {
|
5888 |
};
|
5889 |
|
5890 |
_proto._setListeners = function _setListeners() {
|
5891 |
+
var _this5 = this;
|
5892 |
|
5893 |
var triggers = this.config.trigger.split(' ');
|
5894 |
triggers.forEach(function (trigger) {
|
5895 |
if (trigger === 'click') {
|
5896 |
+
$(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
|
5897 |
+
return _this5.toggle(event);
|
5898 |
});
|
5899 |
} else if (trigger !== Trigger.MANUAL) {
|
5900 |
+
var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
|
5901 |
+
var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
|
5902 |
+
$(_this5.element).on(eventIn, _this5.config.selector, function (event) {
|
5903 |
+
return _this5._enter(event);
|
5904 |
+
}).on(eventOut, _this5.config.selector, function (event) {
|
5905 |
+
return _this5._leave(event);
|
5906 |
});
|
5907 |
}
|
5908 |
});
|
5909 |
+
|
5910 |
+
this._hideModalHandler = function () {
|
5911 |
+
if (_this5.element) {
|
5912 |
+
_this5.hide();
|
5913 |
}
|
5914 |
+
};
|
5915 |
+
|
5916 |
+
$(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
|
5917 |
|
5918 |
if (this.config.selector) {
|
5919 |
+
this.config = _objectSpread2({}, this.config, {
|
5920 |
trigger: 'manual',
|
5921 |
selector: ''
|
5922 |
});
|
6016 |
delete dataAttributes[dataAttr];
|
6017 |
}
|
6018 |
});
|
6019 |
+
config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
|
6020 |
|
6021 |
if (typeof config.delay === 'number') {
|
6022 |
config.delay = {
|
6176 |
*/
|
6177 |
|
6178 |
var NAME$7 = 'popover';
|
6179 |
+
var VERSION$7 = '4.4.1';
|
6180 |
var DATA_KEY$7 = 'bs.popover';
|
6181 |
var EVENT_KEY$7 = "." + DATA_KEY$7;
|
6182 |
var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
|
6183 |
var CLASS_PREFIX$1 = 'bs-popover';
|
6184 |
var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
|
6185 |
|
6186 |
+
var Default$5 = _objectSpread2({}, Tooltip.Default, {
|
6187 |
placement: 'right',
|
6188 |
trigger: 'click',
|
6189 |
content: '',
|
6190 |
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
|
6191 |
});
|
6192 |
|
6193 |
+
var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, {
|
6194 |
content: '(string|element|function)'
|
6195 |
});
|
6196 |
|
6213 |
FOCUSOUT: "focusout" + EVENT_KEY$7,
|
6214 |
MOUSEENTER: "mouseenter" + EVENT_KEY$7,
|
6215 |
MOUSELEAVE: "mouseleave" + EVENT_KEY$7
|
|
|
|
|
|
|
|
|
|
|
|
|
6216 |
};
|
6217 |
+
/**
|
6218 |
+
* ------------------------------------------------------------------------
|
6219 |
+
* Class Definition
|
6220 |
+
* ------------------------------------------------------------------------
|
6221 |
+
*/
|
6222 |
|
6223 |
var Popover =
|
6224 |
/*#__PURE__*/
|
6362 |
*/
|
6363 |
|
6364 |
var NAME$8 = 'scrollspy';
|
6365 |
+
var VERSION$8 = '4.4.1';
|
6366 |
var DATA_KEY$8 = 'bs.scrollspy';
|
6367 |
var EVENT_KEY$8 = "." + DATA_KEY$8;
|
6368 |
var DATA_API_KEY$6 = '.data-api';
|
6401 |
var OffsetMethod = {
|
6402 |
OFFSET: 'offset',
|
6403 |
POSITION: 'position'
|
|
|
|
|
|
|
|
|
|
|
|
|
6404 |
};
|
6405 |
+
/**
|
6406 |
+
* ------------------------------------------------------------------------
|
6407 |
+
* Class Definition
|
6408 |
+
* ------------------------------------------------------------------------
|
6409 |
+
*/
|
6410 |
|
6411 |
var ScrollSpy =
|
6412 |
/*#__PURE__*/
|
6488 |
;
|
6489 |
|
6490 |
_proto._getConfig = function _getConfig(config) {
|
6491 |
+
config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {});
|
6492 |
|
6493 |
if (typeof config.target !== 'string') {
|
6494 |
var id = $(config.target).attr('id');
|
6668 |
*/
|
6669 |
|
6670 |
var NAME$9 = 'tab';
|
6671 |
+
var VERSION$9 = '4.4.1';
|
6672 |
var DATA_KEY$9 = 'bs.tab';
|
6673 |
var EVENT_KEY$9 = "." + DATA_KEY$9;
|
6674 |
var DATA_API_KEY$7 = '.data-api';
|
6695 |
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
|
6696 |
DROPDOWN_TOGGLE: '.dropdown-toggle',
|
6697 |
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
|
|
|
|
|
|
|
|
|
|
|
|
6698 |
};
|
6699 |
+
/**
|
6700 |
+
* ------------------------------------------------------------------------
|
6701 |
+
* Class Definition
|
6702 |
+
* ------------------------------------------------------------------------
|
6703 |
+
*/
|
6704 |
|
6705 |
var Tab =
|
6706 |
/*#__PURE__*/
|
6902 |
*/
|
6903 |
|
6904 |
var NAME$a = 'toast';
|
6905 |
+
var VERSION$a = '4.4.1';
|
6906 |
var DATA_KEY$a = 'bs.toast';
|
6907 |
var EVENT_KEY$a = "." + DATA_KEY$a;
|
6908 |
var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
|
6931 |
};
|
6932 |
var Selector$a = {
|
6933 |
DATA_DISMISS: '[data-dismiss="toast"]'
|
|
|
|
|
|
|
|
|
|
|
|
|
6934 |
};
|
6935 |
+
/**
|
6936 |
+
* ------------------------------------------------------------------------
|
6937 |
+
* Class Definition
|
6938 |
+
* ------------------------------------------------------------------------
|
6939 |
+
*/
|
6940 |
|
6941 |
var Toast =
|
6942 |
/*#__PURE__*/
|
6956 |
_proto.show = function show() {
|
6957 |
var _this = this;
|
6958 |
|
6959 |
+
var showEvent = $.Event(Event$a.SHOW);
|
6960 |
+
$(this._element).trigger(showEvent);
|
6961 |
+
|
6962 |
+
if (showEvent.isDefaultPrevented()) {
|
6963 |
+
return;
|
6964 |
+
}
|
6965 |
|
6966 |
if (this._config.animation) {
|
6967 |
this._element.classList.add(ClassName$a.FADE);
|
6975 |
$(_this._element).trigger(Event$a.SHOWN);
|
6976 |
|
6977 |
if (_this._config.autohide) {
|
6978 |
+
_this._timeout = setTimeout(function () {
|
6979 |
+
_this.hide();
|
6980 |
+
}, _this._config.delay);
|
6981 |
}
|
6982 |
};
|
6983 |
|
6984 |
this._element.classList.remove(ClassName$a.HIDE);
|
6985 |
|
6986 |
+
Util.reflow(this._element);
|
6987 |
+
|
6988 |
this._element.classList.add(ClassName$a.SHOWING);
|
6989 |
|
6990 |
if (this._config.animation) {
|
6995 |
}
|
6996 |
};
|
6997 |
|
6998 |
+
_proto.hide = function hide() {
|
|
|
|
|
6999 |
if (!this._element.classList.contains(ClassName$a.SHOW)) {
|
7000 |
return;
|
7001 |
}
|
7002 |
|
7003 |
+
var hideEvent = $.Event(Event$a.HIDE);
|
7004 |
+
$(this._element).trigger(hideEvent);
|
7005 |
|
7006 |
+
if (hideEvent.isDefaultPrevented()) {
|
7007 |
+
return;
|
|
|
|
|
|
|
|
|
7008 |
}
|
7009 |
+
|
7010 |
+
this._close();
|
7011 |
};
|
7012 |
|
7013 |
_proto.dispose = function dispose() {
|
7026 |
;
|
7027 |
|
7028 |
_proto._getConfig = function _getConfig(config) {
|
7029 |
+
config = _objectSpread2({}, Default$7, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
|
7030 |
Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
|
7031 |
return config;
|
7032 |
};
|
7033 |
|
7034 |
_proto._setListeners = function _setListeners() {
|
7035 |
+
var _this2 = this;
|
7036 |
|
7037 |
$(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
|
7038 |
+
return _this2.hide();
|
7039 |
});
|
7040 |
};
|
7041 |
|
7042 |
_proto._close = function _close() {
|
7043 |
+
var _this3 = this;
|
7044 |
|
7045 |
var complete = function complete() {
|
7046 |
+
_this3._element.classList.add(ClassName$a.HIDE);
|
7047 |
|
7048 |
+
$(_this3._element).trigger(Event$a.HIDDEN);
|
7049 |
};
|
7050 |
|
7051 |
this._element.classList.remove(ClassName$a.SHOW);
|
7115 |
return Toast._jQueryInterface;
|
7116 |
};
|
7117 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7118 |
exports.Alert = Alert;
|
7119 |
exports.Button = Button;
|
7120 |
exports.Carousel = Carousel;
|
7126 |
exports.Tab = Tab;
|
7127 |
exports.Toast = Toast;
|
7128 |
exports.Tooltip = Tooltip;
|
7129 |
+
exports.Util = Util;
|
7130 |
|
7131 |
Object.defineProperty(exports, '__esModule', { value: true });
|
7132 |
|
7133 |
+
})));
|
7134 |
//# sourceMappingURL=bootstrap.bundle.js.map
|
resources/js/bootstrap4.bundle.min.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
6 |
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e((t=t||self).bootstrap={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}p=p&&p.hasOwnProperty("default")?p.default:p;var e="transitionend";function n(t){var e=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(e)},t),this}var m={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=p(t).css("transition-duration"),n=p(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){p(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&m.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?m.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};p.fn.emulateTransitionEnd=n,p.event.special[m.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(p(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=p.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},u="alert",f="fade",d="show",g=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){p.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=m.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p(t).closest("."+u)[0]),n},t._triggerCloseEvent=function(t){var e=p.Event(h.CLOSE);return p(t).trigger(e),e},t._removeElement=function(e){var n=this;if(p(e).removeClass(d),p(e).hasClass(f)){var t=m.getTransitionDurationFromElement(e);p(e).one(m.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){p(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),p.fn[o]=g._jQueryInterface,p.fn[o].Constructor=g,p.fn[o].noConflict=function(){return p.fn[o]=c,g._jQueryInterface};var _="button",v="bs.button",y="."+v,E=".data-api",b=p.fn[_],w="active",C="btn",T="focus",S='[data-toggle^="button"]',D='[data-toggle="buttons"]',I='input:not([type="hidden"])',A=".active",O=".btn",N={CLICK_DATA_API:"click"+y+E,FOCUS_BLUR_DATA_API:"focus"+y+E+" blur"+y+E},k=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=this._element.querySelector(I);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(w))t=!1;else{var o=n.querySelector(A);o&&p(o).removeClass(w)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(w),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(w)),t&&p(this._element).toggleClass(w)},t.dispose=function(){p.removeData(this._element,v),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(v);t||(t=new n(this),p(this).data(v,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();p(document).on(N.CLICK_DATA_API,S,function(t){t.preventDefault();var e=t.target;p(e).hasClass(C)||(e=p(e).closest(O)),k._jQueryInterface.call(p(e),"toggle")}).on(N.FOCUS_BLUR_DATA_API,S,function(t){var e=p(t.target).closest(O)[0];p(e).toggleClass(T,/^focus(in)?$/.test(t.type))}),p.fn[_]=k._jQueryInterface,p.fn[_].Constructor=k,p.fn[_].noConflict=function(){return p.fn[_]=b,k._jQueryInterface};var L="carousel",x="bs.carousel",P="."+x,H=".data-api",j=p.fn[L],R={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},F={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},M="next",W="prev",U="left",B="right",q={SLIDE:"slide"+P,SLID:"slid"+P,KEYDOWN:"keydown"+P,MOUSEENTER:"mouseenter"+P,MOUSELEAVE:"mouseleave"+P,TOUCHSTART:"touchstart"+P,TOUCHMOVE:"touchmove"+P,TOUCHEND:"touchend"+P,POINTERDOWN:"pointerdown"+P,POINTERUP:"pointerup"+P,DRAG_START:"dragstart"+P,LOAD_DATA_API:"load"+P+H,CLICK_DATA_API:"click"+P+H},K="carousel",Q="active",V="slide",Y="carousel-item-right",z="carousel-item-left",X="carousel-item-next",G="carousel-item-prev",$="pointer-event",J=".active",Z=".active.carousel-item",tt=".carousel-item",et=".carousel-item img",nt=".carousel-item-next, .carousel-item-prev",it=".carousel-indicators",ot="[data-slide], [data-slide-to]",rt='[data-ride="carousel"]',st={TOUCH:"touch",PEN:"pen"},at=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(it),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(M)},t.nextWhenVisible=function(){!document.hidden&&p(this._element).is(":visible")&&"hidden"!==p(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(W)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(nt)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(Z);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?M:W;this._slide(i,this._items[t])}},t.dispose=function(){p(this._element).off(P),p.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},R,t),m.typeCheckConfig(L,t,F),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&p(this._element).on(q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&p(this._element).on(q.MOUSEENTER,function(t){return e.pause(t)}).on(q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&st[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};p(this._element.querySelectorAll(et)).on(q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(p(this._element).on(q.POINTERDOWN,function(t){return e(t)}),p(this._element).on(q.POINTERUP,function(t){return i(t)}),this._element.classList.add($)):(p(this._element).on(q.TOUCHSTART,function(t){return e(t)}),p(this._element).on(q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),p(this._element).on(q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(tt)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===M,i=t===W,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===W?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(Z)),o=p.Event(q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return p(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(J));p(e).removeClass(Q);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p(n).addClass(Q)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(Z),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===M?(n=z,i=X,U):(n=Y,i=G,B),l&&p(l).hasClass(Q))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(V)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+" "+i).addClass(Q),p(s).removeClass(Q+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(Q),p(l).addClass(Q),this._isSliding=!1,p(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=p(this).data(x),e=l({},R,p(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),p(this).data(x,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=m.getSelectorFromElement(this);if(e){var n=p(e)[0];if(n&&p(n).hasClass(K)){var i=l({},p(n).data(),p(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return R}}]),r}();p(document).on(q.CLICK_DATA_API,ot,at._dataApiClickHandler),p(window).on(q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(rt)),e=0,n=t.length;e<n;e++){var i=p(t[e]);at._jQueryInterface.call(i,i.data())}}),p.fn[L]=at._jQueryInterface,p.fn[L].Constructor=at,p.fn[L].noConflict=function(){return p.fn[L]=j,at._jQueryInterface};var lt="collapse",ct="bs.collapse",ht="."+ct,ut=p.fn[lt],ft={toggle:!0,parent:""},dt={toggle:"boolean",parent:"(string|element)"},pt={SHOW:"show"+ht,SHOWN:"shown"+ht,HIDE:"hide"+ht,HIDDEN:"hidden"+ht,CLICK_DATA_API:"click"+ht+".data-api"},mt="show",gt="collapse",_t="collapsing",vt="collapsed",yt="width",Et="height",bt=".show, .collapsing",wt='[data-toggle="collapse"]',Ct=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(wt)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){p(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(bt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(gt)})).length&&(t=null),!(t&&(e=p(t).not(this._selector).data(ct))&&e._isTransitioning))){var i=p.Event(pt.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(p(t).not(this._selector),"hide"),e||p(t).data(ct,null));var o=this._getDimension();p(this._element).removeClass(gt).addClass(_t),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(vt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(_t).addClass(gt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),p(n._element).trigger(pt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&p(this._element).hasClass(mt)){var e=p.Event(pt.HIDE);if(p(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",m.reflow(this._element),p(this._element).addClass(_t).removeClass(gt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(mt)||p(r).addClass(vt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){t.setTransitioning(!1),p(t._element).removeClass(_t).addClass(gt).trigger(pt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){p.removeData(this._element,ct),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},ft,t)).toggle=Boolean(t.toggle),m.typeCheckConfig(lt,t,dt),t},t._getDimension=function(){return p(this._element).hasClass(yt)?yt:Et},t._getParent=function(){var t,n=this;m.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return p(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=p(t).hasClass(mt);e.length&&p(e).toggleClass(vt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=m.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=p(this),e=t.data(ct),n=l({},ft,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ct,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ft}}]),a}();p(document).on(pt.CLICK_DATA_API,wt,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=p(this),e=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));p(i).each(function(){var t=p(this),e=t.data(ct)?"toggle":n.data();Ct._jQueryInterface.call(t,e)})}),p.fn[lt]=Ct._jQueryInterface,p.fn[lt].Constructor=Ct,p.fn[lt].noConflict=function(){return p.fn[lt]=ut,Ct._jQueryInterface};for(var Tt="undefined"!=typeof window&&"undefined"!=typeof document,St=["Edge","Trident","Firefox"],Dt=0,It=0;It<St.length;It+=1)if(Tt&&0<=navigator.userAgent.indexOf(St[It])){Dt=1;break}var At=Tt&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then(function(){e=!1,t()}))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout(function(){e=!1,t()},Dt))}};function Ot(t){return t&&"[object Function]"==={}.toString.call(t)}function Nt(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function kt(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function Lt(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=Nt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:Lt(kt(t))}var xt=Tt&&!(!window.MSInputMethodContext||!document.documentMode),Pt=Tt&&/MSIE 10/.test(navigator.userAgent);function Ht(t){return 11===t?xt:10===t?Pt:xt||Pt}function jt(t){if(!t)return document.documentElement;for(var e=Ht(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===Nt(n,"position")?jt(n):n:t?t.ownerDocument.documentElement:document.documentElement}function Rt(t){return null!==t.parentNode?Rt(t.parentNode):t}function Ft(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s,a,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(a=(s=l).nodeName)||"HTML"!==a&&jt(s.firstElementChild)!==s?jt(l):l;var c=Rt(t);return c.host?Ft(c.host,e):Ft(t,Rt(e).host)}function Mt(t){var e="top"===(1<arguments.length&&void 0!==arguments[1]?arguments[1]:"top")?"scrollTop":"scrollLeft",n=t.nodeName;if("BODY"!==n&&"HTML"!==n)return t[e];var i=t.ownerDocument.documentElement;return(t.ownerDocument.scrollingElement||i)[e]}function Wt(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"],10)+parseFloat(t["border"+i+"Width"],10)}function Ut(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],Ht(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function Bt(t){var e=t.body,n=t.documentElement,i=Ht(10)&&getComputedStyle(n);return{height:Ut("Height",e,n,i),width:Ut("Width",e,n,i)}}var qt=function(){function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}}(),Kt=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t},Qt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t};function Vt(t){return Qt({},t,{right:t.left+t.width,bottom:t.top+t.height})}function Yt(t){var e={};try{if(Ht(10)){e=t.getBoundingClientRect();var n=Mt(t,"top"),i=Mt(t,"left");e.top+=n,e.left+=i,e.bottom+=n,e.right+=i}else e=t.getBoundingClientRect()}catch(t){}var o={left:e.left,top:e.top,width:e.right-e.left,height:e.bottom-e.top},r="HTML"===t.nodeName?Bt(t.ownerDocument):{},s=r.width||t.clientWidth||o.right-o.left,a=r.height||t.clientHeight||o.bottom-o.top,l=t.offsetWidth-s,c=t.offsetHeight-a;if(l||c){var h=Nt(t);l-=Wt(h,"x"),c-=Wt(h,"y"),o.width-=l,o.height-=c}return Vt(o)}function zt(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Ht(10),o="HTML"===e.nodeName,r=Yt(t),s=Yt(e),a=Lt(t),l=Nt(e),c=parseFloat(l.borderTopWidth,10),h=parseFloat(l.borderLeftWidth,10);n&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var u=Vt({top:r.top-s.top-c,left:r.left-s.left-h,width:r.width,height:r.height});if(u.marginTop=0,u.marginLeft=0,!i&&o){var f=parseFloat(l.marginTop,10),d=parseFloat(l.marginLeft,10);u.top-=c-f,u.bottom-=c-f,u.left-=h-d,u.right-=h-d,u.marginTop=f,u.marginLeft=d}return(i&&!n?e.contains(a):e===a&&"BODY"!==a.nodeName)&&(u=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=Mt(e,"top"),o=Mt(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}(u,e)),u}function Xt(t){if(!t||!t.parentElement||Ht())return document.documentElement;for(var e=t.parentElement;e&&"none"===Nt(e,"transform");)e=e.parentElement;return e||document.documentElement}function Gt(t,e,n,i){var o=4<arguments.length&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},s=o?Xt(t):Ft(t,e);if("viewport"===i)r=function(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=zt(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),s=e?0:Mt(n),a=e?0:Mt(n,"left");return Vt({top:s-i.top+i.marginTop,left:a-i.left+i.marginLeft,width:o,height:r})}(s,o);else{var a=void 0;"scrollParent"===i?"BODY"===(a=Lt(kt(e))).nodeName&&(a=t.ownerDocument.documentElement):a="window"===i?t.ownerDocument.documentElement:i;var l=zt(a,s,o);if("HTML"!==a.nodeName||function t(e){var n=e.nodeName;if("BODY"===n||"HTML"===n)return!1;if("fixed"===Nt(e,"position"))return!0;var i=kt(e);return!!i&&t(i)}(s))r=l;else{var c=Bt(t.ownerDocument),h=c.height,u=c.width;r.top+=l.top-l.marginTop,r.bottom=h+l.top,r.left+=l.left-l.marginLeft,r.right=u+l.left}}var f="number"==typeof(n=n||0);return r.left+=f?n:n.left||0,r.top+=f?n:n.top||0,r.right-=f?n:n.right||0,r.bottom-=f?n:n.bottom||0,r}function $t(t,e,i,n,o){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var s=Gt(i,n,r,o),a={top:{width:s.width,height:e.top-s.top},right:{width:s.right-e.right,height:s.height},bottom:{width:s.width,height:s.bottom-e.bottom},left:{width:e.left-s.left,height:s.height}},l=Object.keys(a).map(function(t){return Qt({key:t},a[t],{area:(e=a[t],e.width*e.height)});var e}).sort(function(t,e){return e.area-t.area}),c=l.filter(function(t){var e=t.width,n=t.height;return e>=i.clientWidth&&n>=i.clientHeight}),h=0<c.length?c[0].key:l[0].key,u=t.split("-")[1];return h+(u?"-"+u:"")}function Jt(t,e,n){var i=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return zt(n,i?Xt(e):Ft(e,n),i)}function Zt(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function te(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,function(t){return e[t]})}function ee(t,e,n){n=n.split("-")[0];var i=Zt(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=e[s]+e[l]/2-i[l]/2,o[a]=n===a?e[a]-i[c]:e[te(a)],o}function ne(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function ie(t,n,e){return(void 0===e?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex(function(t){return t[e]===n});var i=ne(t,function(t){return t[e]===n});return t.indexOf(i)}(t,"name",e))).forEach(function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var e=t.function||t.fn;t.enabled&&Ot(e)&&(n.offsets.popper=Vt(n.offsets.popper),n.offsets.reference=Vt(n.offsets.reference),n=e(n,t))}),n}function oe(t,n){return t.some(function(t){var e=t.name;return t.enabled&&e===n})}function re(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<e.length;i++){var o=e[i],r=o?""+o+n:t;if("undefined"!=typeof document.body.style[r])return r}return null}function se(t){var e=t.ownerDocument;return e?e.defaultView:window}function ae(t,e,n,i){n.updateBound=i,se(t).addEventListener("resize",n.updateBound,{passive:!0});var o=Lt(t);return function t(e,n,i,o){var r="BODY"===e.nodeName,s=r?e.ownerDocument.defaultView:e;s.addEventListener(n,i,{passive:!0}),r||t(Lt(s.parentNode),n,i,o),o.push(s)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function le(){var t,e;this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=(t=this.reference,e=this.state,se(t).removeEventListener("resize",e.updateBound),e.scrollParents.forEach(function(t){t.removeEventListener("scroll",e.updateBound)}),e.updateBound=null,e.scrollParents=[],e.scrollElement=null,e.eventsEnabled=!1,e))}function ce(t){return""!==t&&!isNaN(parseFloat(t))&&isFinite(t)}function he(n,i){Object.keys(i).forEach(function(t){var e="";-1!==["width","height","top","right","bottom","left"].indexOf(t)&&ce(i[t])&&(e="px"),n.style[t]=i[t]+e})}var ue=Tt&&/Firefox/i.test(navigator.userAgent);function fe(t,e,n){var i=ne(t,function(t){return t.name===e}),o=!!i&&t.some(function(t){return t.name===n&&t.enabled&&t.order<i.order});if(!o){var r="`"+e+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+r+" modifier in order to work, be sure to include it before "+r+"!")}return o}var de=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],pe=de.slice(3);function me(t){var e=1<arguments.length&&void 0!==arguments[1]&&arguments[1],n=pe.indexOf(t),i=pe.slice(n+1).concat(pe.slice(0,n));return e?i.reverse():i}var ge="flip",_e="clockwise",ve="counterclockwise";function ye(t,o,r,e){var s=[0,0],a=-1!==["right","left"].indexOf(e),n=t.split(/(\+|\-)/).map(function(t){return t.trim()}),i=n.indexOf(ne(n,function(t){return-1!==t.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(t,e){var n=(1===e?!a:a)?"height":"width",i=!1;return t.reduce(function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,i=!0,t):i?(t[t.length-1]+=e,i=!1,t):t.concat(e)},[]).map(function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return t;if(0!==s.indexOf("%"))return"vh"!==s&&"vw"!==s?r:("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Vt(a)[e]/100*r}(t,n,o,r)})})).forEach(function(n,i){n.forEach(function(t,e){ce(t)&&(s[i]+=t*("-"===n[e-1]?-1:1))})}),s}var Ee={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",h={start:Kt({},l,r[l]),end:Kt({},l,r[l]+r[c]-s[c])};t.offsets.popper=Qt({},s,h[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=ce(+n)?[+n,0]:ye(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,i){var e=i.boundariesElement||jt(t.instance.popper);t.instance.reference===e&&(e=jt(e));var n=re("transform"),o=t.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Gt(t.instance.popper,t.instance.reference,i.padding,e,t.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,h=t.offsets.popper,u={primary:function(t){var e=h[t];return h[t]<l[t]&&!i.escapeWithReference&&(e=Math.max(h[t],l[t])),Kt({},t,e)},secondary:function(t){var e="right"===t?"left":"top",n=h[e];return h[t]>l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-("right"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<r(i[l])&&(t.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=Zt(i)[c];a[d]-p<s[u]&&(t.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Vt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=te(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split("-")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s="left"===_&&r(i.right)>r(o.left)||"right"===_&&r(i.left)<r(o.right)||"top"===_&&r(i.bottom)>r(o.top)||"bottom"===_&&r(i.top)<r(o.bottom),a=r(i.left)<r(g.left),l=r(i.right)>r(g.right),c=r(i.top)<r(g.top),h=r(i.bottom)>r(g.bottom),u="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&h,f=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&l||!f&&"start"===y&&c||!f&&"end"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Vt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottom<n.top||e.left>n.right||e.top>n.bottom||e.right<n.left){if(!0===t.hide)return t;t.hide=!0,t.attributes["x-out-of-boundaries"]=""}else{if(!1===t.hide)return t;t.hide=!1,t.attributes["x-out-of-boundaries"]=!1}return t}},computeStyle:{order:850,enabled:!0,fn:function(t,e){var n=e.x,i=e.y,o=t.offsets.popper,r=ne(t.instance.modifiers,function(t){return"applyStyle"===t.name}).gpuAcceleration;void 0!==r&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s,a,l,c,h,u,f,d,p,m,g,_,v,y,E=void 0!==r?r:e.gpuAcceleration,b=jt(t.instance.popper),w=Yt(b),C={position:o.position},T=(s=t,a=window.devicePixelRatio<2||!ue,l=s.offsets,c=l.popper,h=l.reference,u=Math.round,f=Math.floor,d=function(t){return t},p=u(h.width),m=u(c.width),g=-1!==["left","right"].indexOf(s.placement),_=-1!==s.placement.indexOf("-"),y=a?u:d,{left:(v=a?g||_||p%2==m%2?u:f:d)(p%2==1&&m%2==1&&!_&&a?c.left-1:c.left),top:y(c.top),bottom:y(c.bottom),right:v(c.right)}),S="bottom"===n?"top":"bottom",D="right"===i?"left":"right",I=re("transform"),A=void 0,O=void 0;if(O="bottom"===S?"HTML"===b.nodeName?-b.clientHeight+T.bottom:-w.height+T.bottom:T.top,A="right"===D?"HTML"===b.nodeName?-b.clientWidth+T.right:-w.width+T.right:T.left,E&&I)C[I]="translate3d("+A+"px, "+O+"px, 0)",C[S]=0,C[D]=0,C.willChange="transform";else{var N="bottom"===S?-1:1,k="right"===D?-1:1;C[S]=O*N,C[D]=A*k,C.willChange=S+", "+D}var L={"x-placement":t.placement};return t.attributes=Qt({},L,t.attributes),t.styles=Qt({},C,t.styles),t.arrowStyles=Qt({},t.offsets.arrow,t.arrowStyles),t},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(t){var e,n;return he(t.instance.popper,t.styles),e=t.instance.popper,n=t.attributes,Object.keys(n).forEach(function(t){!1!==n[t]?e.setAttribute(t,n[t]):e.removeAttribute(t)}),t.arrowElement&&Object.keys(t.arrowStyles).length&&he(t.arrowElement,t.arrowStyles),t},onLoad:function(t,e,n,i,o){var r=Jt(o,e,t,n.positionFixed),s=$t(n.placement,r,e,t,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return e.setAttribute("x-placement",s),he(e,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},be=function(){function r(t,e){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,r),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=At(this.update.bind(this)),this.options=Qt({},r.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=t&&t.jquery?t[0]:t,this.popper=e&&e.jquery?e[0]:e,this.options.modifiers={},Object.keys(Qt({},r.Defaults.modifiers,i.modifiers)).forEach(function(t){n.options.modifiers[t]=Qt({},r.Defaults.modifiers[t]||{},i.modifiers?i.modifiers[t]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(t){return Qt({name:t},n.options.modifiers[t])}).sort(function(t,e){return t.order-e.order}),this.modifiers.forEach(function(t){t.enabled&&Ot(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}return qt(r,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=Jt(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=$t(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=ee(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=ie(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,oe(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[re("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ae(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return le.call(this)}}]),r}();be.Utils=("undefined"!=typeof window?window:global).PopperUtils,be.placements=de,be.Defaults=Ee;var we="dropdown",Ce="bs.dropdown",Te="."+Ce,Se=".data-api",De=p.fn[we],Ie=new RegExp("38|40|27"),Ae={HIDE:"hide"+Te,HIDDEN:"hidden"+Te,SHOW:"show"+Te,SHOWN:"shown"+Te,CLICK:"click"+Te,CLICK_DATA_API:"click"+Te+Se,KEYDOWN_DATA_API:"keydown"+Te+Se,KEYUP_DATA_API:"keyup"+Te+Se},Oe="disabled",Ne="show",ke="dropup",Le="dropright",xe="dropleft",Pe="dropdown-menu-right",He="position-static",je='[data-toggle="dropdown"]',Re=".dropdown form",Fe=".dropdown-menu",Me=".navbar-nav",We=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Ue="top-start",Be="top-end",qe="bottom-start",Ke="bottom-end",Qe="right-start",Ve="left-start",Ye={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},ze={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Xe=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)){var t=c._getParentFromElement(this._element),e=p(this._menu).hasClass(Ne);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=p.Event(Ae.SHOW,n);if(p(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof be)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:m.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&p(t).addClass(He),this._popper=new be(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===p(t).closest(Me).length&&p(document.body).children().on("mouseover",null,p.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),p(this._menu).toggleClass(Ne),p(t).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||p(this._element).hasClass(Oe)||p(this._menu).hasClass(Ne))){var t={relatedTarget:this._element},e=p.Event(Ae.SHOW,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(Oe)&&p(this._menu).hasClass(Ne)){var t={relatedTarget:this._element},e=p.Event(Ae.HIDE,t),n=c._getParentFromElement(this._element);p(n).trigger(e),e.isDefaultPrevented()||(p(this._menu).toggleClass(Ne),p(n).toggleClass(Ne).trigger(p.Event(Ae.HIDDEN,t)))}},t.dispose=function(){p.removeData(this._element,Ce),p(this._element).off(Te),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;p(this._element).on(Ae.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,p(this._element).data(),t),m.typeCheckConfig(we,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Fe))}return this._menu},t._getPlacement=function(){var t=p(this._element.parentNode),e=qe;return t.hasClass(ke)?(e=Ue,p(this._menu).hasClass(Pe)&&(e=Be)):t.hasClass(Le)?e=Qe:t.hasClass(xe)?e=Ve:p(this._menu).hasClass(Pe)&&(e=Ke),e},t._detectNavbar=function(){return 0<p(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(Ce);if(t||(t=new c(this,"object"==typeof e?e:null),p(this).data(Ce,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(je)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=p(e[n]).data(Ce),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(p(o).hasClass(Ne)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&p.contains(o,t.target))){var l=p.Event(Ae.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),e[n].setAttribute("aria-expanded","false"),p(a).removeClass(Ne),p(o).removeClass(Ne).trigger(p.Event(Ae.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=m.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||p(t.target).closest(Fe).length)):Ie.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!p(this).hasClass(Oe))){var e=c._getParentFromElement(this),n=p(e).hasClass(Ne);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(We));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(je);p(r).trigger("focus")}p(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Ye}},{key:"DefaultType",get:function(){return ze}}]),c}();p(document).on(Ae.KEYDOWN_DATA_API,je,Xe._dataApiKeydownHandler).on(Ae.KEYDOWN_DATA_API,Fe,Xe._dataApiKeydownHandler).on(Ae.CLICK_DATA_API+" "+Ae.KEYUP_DATA_API,Xe._clearMenus).on(Ae.CLICK_DATA_API,je,function(t){t.preventDefault(),t.stopPropagation(),Xe._jQueryInterface.call(p(this),"toggle")}).on(Ae.CLICK_DATA_API,Re,function(t){t.stopPropagation()}),p.fn[we]=Xe._jQueryInterface,p.fn[we].Constructor=Xe,p.fn[we].noConflict=function(){return p.fn[we]=De,Xe._jQueryInterface};var Ge="modal",$e="bs.modal",Je="."+$e,Ze=p.fn[Ge],tn={backdrop:!0,keyboard:!0,focus:!0,show:!0},en={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},nn={HIDE:"hide"+Je,HIDDEN:"hidden"+Je,SHOW:"show"+Je,SHOWN:"shown"+Je,FOCUSIN:"focusin"+Je,RESIZE:"resize"+Je,CLICK_DISMISS:"click.dismiss"+Je,KEYDOWN_DISMISS:"keydown.dismiss"+Je,MOUSEUP_DISMISS:"mouseup.dismiss"+Je,MOUSEDOWN_DISMISS:"mousedown.dismiss"+Je,CLICK_DATA_API:"click"+Je+".data-api"},on="modal-dialog-scrollable",rn="modal-scrollbar-measure",sn="modal-backdrop",an="modal-open",ln="fade",cn="show",hn=".modal-dialog",un=".modal-body",fn='[data-toggle="modal"]',dn='[data-dismiss="modal"]',pn=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",mn=".sticky-top",gn=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(hn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(ln)&&(this._isTransitioning=!0);var n=p.Event(nn.SHOW,{relatedTarget:t});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),p(this._element).on(nn.CLICK_DISMISS,dn,function(t){return e.hide(t)}),p(this._dialog).on(nn.MOUSEDOWN_DISMISS,function(){p(e._element).one(nn.MOUSEUP_DISMISS,function(t){p(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(nn.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(ln);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),p(document).off(nn.FOCUSIN),p(this._element).removeClass(cn),p(this._element).off(nn.CLICK_DISMISS),p(this._dialog).off(nn.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return p(t).off(Je)}),p(document).off(nn.FOCUSIN),p.removeData(this._element,$e),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},tn,t),m.typeCheckConfig(Ge,t,en),t},t._showElement=function(t){var e=this,n=p(this._element).hasClass(ln);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),p(this._dialog).hasClass(on)?this._dialog.querySelector(un).scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(cn),this._config.focus&&this._enforceFocus();var i=p.Event(nn.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p(e._element).trigger(i)};if(n){var r=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;p(document).off(nn.FOCUSIN).on(nn.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===p(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?p(this._element).on(nn.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||p(this._element).off(nn.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?p(window).on(nn.RESIZE,function(t){return e.handleUpdate(t)}):p(window).off(nn.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(an),t._resetAdjustments(),t._resetScrollbar(),p(t._element).trigger(nn.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=p(this._element).hasClass(ln)?ln:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=sn,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(nn.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(cn),!t)return;if(!n)return void t();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(cn);var o=function(){e._removeBackdrop(),t&&t()};if(p(this._element).hasClass(ln)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(pn)),e=[].slice.call(document.querySelectorAll(mn));p(t).each(function(t,e){var n=e.style.paddingRight,i=p(e).css("padding-right");p(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),p(e).each(function(t,e){var n=e.style.marginRight,i=p(e).css("margin-right");p(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=p(document.body).css("padding-right");p(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}p(document.body).addClass(an)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(pn));p(t).each(function(t,e){var n=p(e).data("padding-right");p(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+mn));p(e).each(function(t,e){var n=p(e).data("margin-right");"undefined"!=typeof n&&p(e).css("margin-right",n).removeData("margin-right")});var n=p(document.body).data("padding-right");p(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=rn,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=p(this).data($e),e=l({},tn,p(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),p(this).data($e,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return tn}}]),o}();p(document).on(nn.CLICK_DATA_API,fn,function(t){var e,n=this,i=m.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=p(e).data($e)?"toggle":l({},p(e).data(),p(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=p(e).one(nn.SHOW,function(t){t.isDefaultPrevented()||r.one(nn.HIDDEN,function(){p(n).is(":visible")&&n.focus()})});gn._jQueryInterface.call(p(e),o,this)}),p.fn[Ge]=gn._jQueryInterface,p.fn[Ge].Constructor=gn,p.fn[Ge].noConflict=function(){return p.fn[Ge]=Ze,gn._jQueryInterface};var _n=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},yn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,En=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function bn(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===_n.indexOf(n)||Boolean(t.nodeValue.match(yn)||t.nodeValue.match(En));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var wn="tooltip",Cn="bs.tooltip",Tn="."+Cn,Sn=p.fn[wn],Dn="bs-tooltip",In=new RegExp("(^|\\s)"+Dn+"\\S+","g"),An=["sanitize","whiteList","sanitizeFn"],On={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},Nn={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},kn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:vn},Ln="show",xn="out",Pn={HIDE:"hide"+Tn,HIDDEN:"hidden"+Tn,SHOW:"show"+Tn,SHOWN:"shown"+Tn,INSERTED:"inserted"+Tn,CLICK:"click"+Tn,FOCUSIN:"focusin"+Tn,FOCUSOUT:"focusout"+Tn,MOUSEENTER:"mouseenter"+Tn,MOUSELEAVE:"mouseleave"+Tn},Hn="fade",jn="show",Rn=".tooltip-inner",Fn=".arrow",Mn="hover",Wn="focus",Un="click",Bn="manual",qn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(jn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Hn);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Fn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===xn&&e._leave(null,e)};if(p(this.tip).hasClass(Hn)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Ln&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Un]=!1,this._activeTrigger[Wn]=!1,this._activeTrigger[Mn]=!1,p(this.tip).hasClass(Hn)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Dn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(Rn)),this.getTitle()),p(t).removeClass(Hn+" "+jn)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=bn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return Nn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Bn){var e=t===Mn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Mn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Wn:Mn]=!0),p(e.getTipElement()).hasClass(jn)||e._hoverState===Ln?e._hoverState=Ln:(clearTimeout(e._timeout),e._hoverState=Ln,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Ln&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Wn:Mn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=xn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===xn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==An.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(wn,t,this.constructor.DefaultType),t.sanitize&&(t.template=bn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(In);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(Hn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Cn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Cn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return kn}},{key:"NAME",get:function(){return wn}},{key:"DATA_KEY",get:function(){return Cn}},{key:"Event",get:function(){return Pn}},{key:"EVENT_KEY",get:function(){return Tn}},{key:"DefaultType",get:function(){return On}}]),i}();p.fn[wn]=qn._jQueryInterface,p.fn[wn].Constructor=qn,p.fn[wn].noConflict=function(){return p.fn[wn]=Sn,qn._jQueryInterface};var Kn="popover",Qn="bs.popover",Vn="."+Qn,Yn=p.fn[Kn],zn="bs-popover",Xn=new RegExp("(^|\\s)"+zn+"\\S+","g"),Gn=l({},qn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),$n=l({},qn.DefaultType,{content:"(string|element|function)"}),Jn="fade",Zn="show",ti=".popover-header",ei=".popover-body",ni={HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn,INSERTED:"inserted"+Vn,CLICK:"click"+Vn,FOCUSIN:"focusin"+Vn,FOCUSOUT:"focusout"+Vn,MOUSEENTER:"mouseenter"+Vn,MOUSELEAVE:"mouseleave"+Vn},ii=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(zn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(ti),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ei),e),t.removeClass(Jn+" "+Zn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Xn);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Qn),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Qn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Gn}},{key:"NAME",get:function(){return Kn}},{key:"DATA_KEY",get:function(){return Qn}},{key:"Event",get:function(){return ni}},{key:"EVENT_KEY",get:function(){return Vn}},{key:"DefaultType",get:function(){return $n}}]),i}(qn);p.fn[Kn]=ii._jQueryInterface,p.fn[Kn].Constructor=ii,p.fn[Kn].noConflict=function(){return p.fn[Kn]=Yn,ii._jQueryInterface};var oi="scrollspy",ri="bs.scrollspy",si="."+ri,ai=p.fn[oi],li={offset:10,method:"auto",target:""},ci={offset:"number",method:"string",target:"(string|element)"},hi={ACTIVATE:"activate"+si,SCROLL:"scroll"+si,LOAD_DATA_API:"load"+si+".data-api"},ui="dropdown-item",fi="active",di='[data-spy="scroll"]',pi=".nav, .list-group",mi=".nav-link",gi=".nav-item",_i=".list-group-item",vi=".dropdown",yi=".dropdown-item",Ei=".dropdown-toggle",bi="offset",wi="position",Ci=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+mi+","+this._config.target+" "+_i+","+this._config.target+" "+yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(hi.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bi:wi,o="auto"===this._config.method?t:this._config.method,r=o===wi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=m.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[p(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){p.removeData(this._element,ri),p(this._scrollElement).off(si),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},li,"object"==typeof t&&t?t:{})).target){var e=p(t.target).attr("id");e||(e=m.getUID(oi),p(t.target).attr("id",e)),t.target="#"+e}return m.typeCheckConfig(oi,t,ci),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=p([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(ui)?(n.closest(vi).find(Ei).addClass(fi),n.addClass(fi)):(n.addClass(fi),n.parents(pi).prev(mi+", "+_i).addClass(fi),n.parents(pi).prev(gi).children(mi).addClass(fi)),p(this._scrollElement).trigger(hi.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(fi)}).forEach(function(t){return t.classList.remove(fi)})},n._jQueryInterface=function(e){return this.each(function(){var t=p(this).data(ri);if(t||(t=new n(this,"object"==typeof e&&e),p(this).data(ri,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return li}}]),n}();p(window).on(hi.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(di)),e=t.length;e--;){var n=p(t[e]);Ci._jQueryInterface.call(n,n.data())}}),p.fn[oi]=Ci._jQueryInterface,p.fn[oi].Constructor=Ci,p.fn[oi].noConflict=function(){return p.fn[oi]=ai,Ci._jQueryInterface};var Ti="bs.tab",Si="."+Ti,Di=p.fn.tab,Ii={HIDE:"hide"+Si,HIDDEN:"hidden"+Si,SHOW:"show"+Si,SHOWN:"shown"+Si,CLICK_DATA_API:"click"+Si+".data-api"},Ai="dropdown-menu",Oi="active",Ni="disabled",ki="fade",Li="show",xi=".dropdown",Pi=".nav, .list-group",Hi=".active",ji="> li > .active",Ri='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Fi=".dropdown-toggle",Mi="> .dropdown-menu .active",Wi=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(Oi)||p(this._element).hasClass(Ni))){var t,i,e=p(this._element).closest(Pi)[0],o=m.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?ji:Hi;i=(i=p.makeArray(p(e).find(r)))[i.length-1]}var s=p.Event(Ii.HIDE,{relatedTarget:this._element}),a=p.Event(Ii.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=p.Event(Ii.HIDDEN,{relatedTarget:n._element}),e=p.Event(Ii.SHOWN,{relatedTarget:i});p(i).trigger(t),p(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){p.removeData(this._element,Ti),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?p(e).children(Hi):p(e).find(ji))[0],r=n&&o&&p(o).hasClass(ki),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=m.getTransitionDurationFromElement(o);p(o).removeClass(Li).one(m.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){p(e).removeClass(Oi);var i=p(e.parentNode).find(Mi)[0];i&&p(i).removeClass(Oi),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(p(t).addClass(Oi),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m.reflow(t),t.classList.contains(ki)&&t.classList.add(Li),t.parentNode&&p(t.parentNode).hasClass(Ai)){var o=p(t).closest(xi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Fi));p(r).addClass(Oi)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Ti);if(e||(e=new i(this),t.data(Ti,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();p(document).on(Ii.CLICK_DATA_API,Ri,function(t){t.preventDefault(),Wi._jQueryInterface.call(p(this),"show")}),p.fn.tab=Wi._jQueryInterface,p.fn.tab.Constructor=Wi,p.fn.tab.noConflict=function(){return p.fn.tab=Di,Wi._jQueryInterface};var Ui="toast",Bi="bs.toast",qi="."+Bi,Ki=p.fn[Ui],Qi={CLICK_DISMISS:"click.dismiss"+qi,HIDE:"hide"+qi,HIDDEN:"hidden"+qi,SHOW:"show"+qi,SHOWN:"shown"+qi},Vi="fade",Yi="hide",zi="show",Xi="showing",Gi={animation:"boolean",autohide:"boolean",delay:"number"},$i={animation:!0,autohide:!0,delay:500},Ji='[data-dismiss="toast"]',Zi=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;p(this._element).trigger(Qi.SHOW),this._config.animation&&this._element.classList.add(Vi);var e=function(){t._element.classList.remove(Xi),t._element.classList.add(zi),p(t._element).trigger(Qi.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove(Yi),this._element.classList.add(Xi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(zi)&&(p(this._element).trigger(Qi.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(zi)&&this._element.classList.remove(zi),p(this._element).off(Qi.CLICK_DISMISS),p.removeData(this._element,Bi),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},$i,p(this._element).data(),"object"==typeof t&&t?t:{}),m.typeCheckConfig(Ui,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;p(this._element).on(Qi.CLICK_DISMISS,Ji,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add(Yi),p(t._element).trigger(Qi.HIDDEN)};if(this._element.classList.remove(zi),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=p(this),e=t.data(Bi);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bi,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Gi}},{key:"Default",get:function(){return $i}}]),i}();p.fn[Ui]=Zi._jQueryInterface,p.fn[Ui].Constructor=Zi,p.fn[Ui].noConflict=function(){return p.fn[Ui]=Ki,Zi._jQueryInterface},function(){if("undefined"==typeof p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=p.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=m,t.Alert=g,t.Button=k,t.Carousel=at,t.Collapse=Ct,t.Dropdown=Xe,t.Modal=gn,t.Popover=ii,t.Scrollspy=Ci,t.Tab=Wi,t.Toast=Zi,t.Tooltip=qn,Object.defineProperty(t,"__esModule",{value:!0})});
|
7 |
//# sourceMappingURL=bootstrap.bundle.min.js.map
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
6 |
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self).bootstrap={},e.jQuery)}(this,function(e,p){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function s(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}function t(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function l(o){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?t(Object(r),!0).forEach(function(e){var t,n,i;t=o,i=r[n=e],n in t?Object.defineProperty(t,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach(function(e){Object.defineProperty(o,e,Object.getOwnPropertyDescriptor(r,e))})}return o}p=p&&p.hasOwnProperty("default")?p.default:p;var n="transitionend";function o(e){var t=this,n=!1;return p(this).one(m.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||m.triggerTransitionEnd(t)},e),this}var m={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");if(!t||"#"===t){var n=e.getAttribute("href");t=n&&"#"!==n?n.trim():""}try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=p(e).css("transition-duration"),n=p(e).css("transition-delay"),i=parseFloat(t),o=parseFloat(n);return i||o?(t=t.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(t)+parseFloat(n))):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){p(e).trigger(n)},supportsTransitionEnd:function(){return Boolean(n)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=t[i],s=r&&m.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(e){if(!document.documentElement.attachShadow)return null;if("function"!=typeof e.getRootNode)return e instanceof ShadowRoot?e:e.parentNode?m.findShadowRoot(e.parentNode):null;var t=e.getRootNode();return t instanceof ShadowRoot?t:null},jQueryDetection:function(){if("undefined"==typeof p)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=p.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||4<=e[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};m.jQueryDetection(),p.fn.emulateTransitionEnd=o,p.event.special[m.TRANSITION_END]={bindType:n,delegateType:n,handle:function(e){if(p(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}};var r="alert",a="bs.alert",c="."+a,h=p.fn[r],u={CLOSE:"close"+c,CLOSED:"closed"+c,CLICK_DATA_API:"click"+c+".data-api"},f="alert",d="fade",g="show",_=function(){function i(e){this._element=e}var e=i.prototype;return e.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},e.dispose=function(){p.removeData(this._element,a),this._element=null},e._getRootElement=function(e){var t=m.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n=n||p(e).closest("."+f)[0]},e._triggerCloseEvent=function(e){var t=p.Event(u.CLOSE);return p(e).trigger(t),t},e._removeElement=function(t){var n=this;if(p(t).removeClass(g),p(t).hasClass(d)){var e=m.getTransitionDurationFromElement(t);p(t).one(m.TRANSITION_END,function(e){return n._destroyElement(t,e)}).emulateTransitionEnd(e)}else this._destroyElement(t)},e._destroyElement=function(e){p(e).detach().trigger(u.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(a);t||(t=new i(this),e.data(a,t)),"close"===n&&t[n](this)})},i._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();p(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',_._handleDismiss(new _)),p.fn[r]=_._jQueryInterface,p.fn[r].Constructor=_,p.fn[r].noConflict=function(){return p.fn[r]=h,_._jQueryInterface};var v="button",y="bs.button",E="."+y,b=".data-api",w=p.fn[v],T="active",C="btn",S="focus",D='[data-toggle^="button"]',I='[data-toggle="buttons"]',A='[data-toggle="button"]',O='[data-toggle="buttons"] .btn',N='input:not([type="hidden"])',k=".active",L=".btn",P={CLICK_DATA_API:"click"+E+b,FOCUS_BLUR_DATA_API:"focus"+E+b+" blur"+E+b,LOAD_DATA_API:"load"+E+b},x=function(){function n(e){this._element=e}var e=n.prototype;return e.toggle=function(){var e=!0,t=!0,n=p(this._element).closest(I)[0];if(n){var i=this._element.querySelector(N);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(T))e=!1;else{var o=n.querySelector(k);o&&p(o).removeClass(T)}else"checkbox"===i.type?"LABEL"===this._element.tagName&&i.checked===this._element.classList.contains(T)&&(e=!1):e=!1;e&&(i.checked=!this._element.classList.contains(T),p(i).trigger("change")),i.focus(),t=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(T)),e&&p(this._element).toggleClass(T))},e.dispose=function(){p.removeData(this._element,y),this._element=null},n._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(y);e||(e=new n(this),p(this).data(y,e)),"toggle"===t&&e[t]()})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),n}();p(document).on(P.CLICK_DATA_API,D,function(e){var t=e.target;if(p(t).hasClass(C)||(t=p(t).closest(L)[0]),!t||t.hasAttribute("disabled")||t.classList.contains("disabled"))e.preventDefault();else{var n=t.querySelector(N);if(n&&(n.hasAttribute("disabled")||n.classList.contains("disabled")))return void e.preventDefault();x._jQueryInterface.call(p(t),"toggle")}}).on(P.FOCUS_BLUR_DATA_API,D,function(e){var t=p(e.target).closest(L)[0];p(t).toggleClass(S,/^focus(in)?$/.test(e.type))}),p(window).on(P.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(O)),t=0,n=e.length;t<n;t++){var i=e[t],o=i.querySelector(N);o.checked||o.hasAttribute("checked")?i.classList.add(T):i.classList.remove(T)}for(var r=0,s=(e=[].slice.call(document.querySelectorAll(A))).length;r<s;r++){var a=e[r];"true"===a.getAttribute("aria-pressed")?a.classList.add(T):a.classList.remove(T)}}),p.fn[v]=x._jQueryInterface,p.fn[v].Constructor=x,p.fn[v].noConflict=function(){return p.fn[v]=w,x._jQueryInterface};var j="carousel",H="bs.carousel",R="."+H,F=".data-api",M=p.fn[j],W={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},U={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},B="next",q="prev",K="left",Q="right",V={SLIDE:"slide"+R,SLID:"slid"+R,KEYDOWN:"keydown"+R,MOUSEENTER:"mouseenter"+R,MOUSELEAVE:"mouseleave"+R,TOUCHSTART:"touchstart"+R,TOUCHMOVE:"touchmove"+R,TOUCHEND:"touchend"+R,POINTERDOWN:"pointerdown"+R,POINTERUP:"pointerup"+R,DRAG_START:"dragstart"+R,LOAD_DATA_API:"load"+R+F,CLICK_DATA_API:"click"+R+F},Y="carousel",z="active",X="slide",G="carousel-item-right",$="carousel-item-left",J="carousel-item-next",Z="carousel-item-prev",ee="pointer-event",te=".active",ne=".active.carousel-item",ie=".carousel-item",oe=".carousel-item img",re=".carousel-item-next, .carousel-item-prev",se=".carousel-indicators",ae="[data-slide], [data-slide-to]",le='[data-ride="carousel"]',ce={TOUCH:"touch",PEN:"pen"},he=function(){function r(e,t){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._element=e,this._indicatorsElement=this._element.querySelector(se),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=r.prototype;return e.next=function(){this._isSliding||this._slide(B)},e.nextWhenVisible=function(){!document.hidden&&p(this._element).is(":visible")&&"hidden"!==p(this._element).css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(q)},e.pause=function(e){e||(this._isPaused=!0),this._element.querySelector(re)&&(m.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(e){var t=this;this._activeElement=this._element.querySelector(ne);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)p(this._element).one(V.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n<e?B:q;this._slide(i,this._items[e])}},e.dispose=function(){p(this._element).off(R),p.removeData(this._element,H),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(e){return e=l({},W,{},e),m.typeCheckConfig(j,e,U),e},e._handleSwipe=function(){var e=Math.abs(this.touchDeltaX);if(!(e<=40)){var t=e/this.touchDeltaX;(this.touchDeltaX=0)<t&&this.prev(),t<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&p(this._element).on(V.KEYDOWN,function(e){return t._keydown(e)}),"hover"===this._config.pause&&p(this._element).on(V.MOUSEENTER,function(e){return t.pause(e)}).on(V.MOUSELEAVE,function(e){return t.cycle(e)}),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&ce[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&ce[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout(function(e){return t.cycle(e)},500+t._config.interval))};p(this._element.querySelectorAll(oe)).on(V.DRAG_START,function(e){return e.preventDefault()}),this._pointerEvent?(p(this._element).on(V.POINTERDOWN,function(e){return n(e)}),p(this._element).on(V.POINTERUP,function(e){return i(e)}),this._element.classList.add(ee)):(p(this._element).on(V.TOUCHSTART,function(e){return n(e)}),p(this._element).on(V.TOUCHMOVE,function(e){return function(e){e.originalEvent.touches&&1<e.originalEvent.touches.length?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)}),p(this._element).on(V.TOUCHEND,function(e){return i(e)}))}},e._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case 37:e.preventDefault(),this.prev();break;case 39:e.preventDefault(),this.next()}},e._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll(ie)):[],this._items.indexOf(e)},e._getItemByDirection=function(e,t){var n=e===B,i=e===q,o=this._getItemIndex(t),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return t;var s=(o+(e===q?-1:1))%this._items.length;return-1==s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(ne)),o=p.Event(V.SLIDE,{relatedTarget:e,direction:t,from:i,to:n});return p(this._element).trigger(o),o},e._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(te));p(t).removeClass(z);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&p(n).addClass(z)}},e._slide=function(e,t){var n,i,o,r=this,s=this._element.querySelector(ne),a=this._getItemIndex(s),l=t||s&&this._getItemByDirection(e,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=e===B?(n=$,i=J,K):(n=G,i=Z,Q),l&&p(l).hasClass(z))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=p.Event(V.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(p(this._element).hasClass(X)){p(l).addClass(i),m.reflow(l),p(s).addClass(n),p(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=f):this._config.interval=this._config.defaultInterval||this._config.interval;var d=m.getTransitionDurationFromElement(s);p(s).one(m.TRANSITION_END,function(){p(l).removeClass(n+" "+i).addClass(z),p(s).removeClass(z+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return p(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else p(s).removeClass(z),p(l).addClass(z),this._isSliding=!1,p(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var e=p(this).data(H),t=l({},W,{},p(this).data());"object"==typeof i&&(t=l({},t,{},i));var n="string"==typeof i?i:t.slide;if(e||(e=new r(this,t),p(this).data(H,e)),"number"==typeof i)e.to(i);else if("string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}else t.interval&&t.ride&&(e.pause(),e.cycle())})},r._dataApiClickHandler=function(e){var t=m.getSelectorFromElement(this);if(t){var n=p(t)[0];if(n&&p(n).hasClass(Y)){var i=l({},p(n).data(),{},p(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(p(n),i),o&&p(n).data(H).to(o),e.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return W}}]),r}();p(document).on(V.CLICK_DATA_API,ae,he._dataApiClickHandler),p(window).on(V.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(le)),t=0,n=e.length;t<n;t++){var i=p(e[t]);he._jQueryInterface.call(i,i.data())}}),p.fn[j]=he._jQueryInterface,p.fn[j].Constructor=he,p.fn[j].noConflict=function(){return p.fn[j]=M,he._jQueryInterface};var ue="collapse",fe="bs.collapse",de="."+fe,pe=p.fn[ue],me={toggle:!0,parent:""},ge={toggle:"boolean",parent:"(string|element)"},_e={SHOW:"show"+de,SHOWN:"shown"+de,HIDE:"hide"+de,HIDDEN:"hidden"+de,CLICK_DATA_API:"click"+de+".data-api"},ve="show",ye="collapse",Ee="collapsing",be="collapsed",we="width",Te="height",Ce=".show, .collapsing",Se='[data-toggle="collapse"]',De=function(){function a(t,e){this._isTransitioning=!1,this._element=t,this._config=this._getConfig(e),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(Se)),i=0,o=n.length;i<o;i++){var r=n[i],s=m.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(e){return e===t});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=a.prototype;return e.toggle=function(){p(this._element).hasClass(ve)?this.hide():this.show()},e.show=function(){var e,t,n=this;if(!this._isTransitioning&&!p(this._element).hasClass(ve)&&(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(Ce)).filter(function(e){return"string"==typeof n._config.parent?e.getAttribute("data-parent")===n._config.parent:e.classList.contains(ye)})).length&&(e=null),!(e&&(t=p(e).not(this._selector).data(fe))&&t._isTransitioning))){var i=p.Event(_e.SHOW);if(p(this._element).trigger(i),!i.isDefaultPrevented()){e&&(a._jQueryInterface.call(p(e).not(this._selector),"hide"),t||p(e).data(fe,null));var o=this._getDimension();p(this._element).removeClass(ye).addClass(Ee),this._element.style[o]=0,this._triggerArray.length&&p(this._triggerArray).removeClass(be).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){p(n._element).removeClass(Ee).addClass(ye).addClass(ve),n._element.style[o]="",n.setTransitioning(!1),p(n._element).trigger(_e.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},e.hide=function(){var e=this;if(!this._isTransitioning&&p(this._element).hasClass(ve)){var t=p.Event(_e.HIDE);if(p(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",m.reflow(this._element),p(this._element).addClass(Ee).removeClass(ye).removeClass(ve);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=m.getSelectorFromElement(r);if(null!==s)p([].slice.call(document.querySelectorAll(s))).hasClass(ve)||p(r).addClass(be).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){e.setTransitioning(!1),p(e._element).removeClass(Ee).addClass(ye).trigger(_e.HIDDEN)}).emulateTransitionEnd(a)}}},e.setTransitioning=function(e){this._isTransitioning=e},e.dispose=function(){p.removeData(this._element,fe),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},e._getConfig=function(e){return(e=l({},me,{},e)).toggle=Boolean(e.toggle),m.typeCheckConfig(ue,e,ge),e},e._getDimension=function(){return p(this._element).hasClass(we)?we:Te},e._getParent=function(){var e,n=this;m.isElement(this._config.parent)?(e=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(e=this._config.parent[0])):e=document.querySelector(this._config.parent);var t='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(e.querySelectorAll(t));return p(i).each(function(e,t){n._addAriaAndCollapsedClass(a._getTargetFromElement(t),[t])}),e},e._addAriaAndCollapsedClass=function(e,t){var n=p(e).hasClass(ve);t.length&&p(t).toggleClass(be,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(e){var t=m.getSelectorFromElement(e);return t?document.querySelector(t):null},a._jQueryInterface=function(i){return this.each(function(){var e=p(this),t=e.data(fe),n=l({},me,{},e.data(),{},"object"==typeof i&&i?i:{});if(!t&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),t||(t=new a(this,n),e.data(fe,t)),"string"==typeof i){if("undefined"==typeof t[i])throw new TypeError('No method named "'+i+'"');t[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return me}}]),a}();p(document).on(_e.CLICK_DATA_API,Se,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var n=p(this),t=m.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(t));p(i).each(function(){var e=p(this),t=e.data(fe)?"toggle":n.data();De._jQueryInterface.call(e,t)})}),p.fn[ue]=De._jQueryInterface,p.fn[ue].Constructor=De,p.fn[ue].noConflict=function(){return p.fn[ue]=pe,De._jQueryInterface};var Ie="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,Ae=function(){for(var e=["Edge","Trident","Firefox"],t=0;t<e.length;t+=1)if(Ie&&0<=navigator.userAgent.indexOf(e[t]))return 1;return 0}();var Oe=Ie&&window.Promise?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},Ae))}};function Ne(e){return e&&"[object Function]"==={}.toString.call(e)}function ke(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.defaultView.getComputedStyle(e,null);return t?n[t]:n}function Le(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}function Pe(e){if(!e)return document.body;switch(e.nodeName){case"HTML":case"BODY":return e.ownerDocument.body;case"#document":return e.body}var t=ke(e),n=t.overflow,i=t.overflowX,o=t.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?e:Pe(Le(e))}function xe(e){return e&&e.referenceNode?e.referenceNode:e}var je=Ie&&!(!window.MSInputMethodContext||!document.documentMode),He=Ie&&/MSIE 10/.test(navigator.userAgent);function Re(e){return 11===e?je:10===e?He:je||He}function Fe(e){if(!e)return document.documentElement;for(var t=Re(10)?document.body:null,n=e.offsetParent||null;n===t&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===ke(n,"position")?Fe(n):n:e?e.ownerDocument.documentElement:document.documentElement}function Me(e){return null!==e.parentNode?Me(e.parentNode):e}function We(e,t){if(!(e&&e.nodeType&&t&&t.nodeType))return document.documentElement;var n=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?e:t,o=n?t:e,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var s=r.commonAncestorContainer;if(e!==s&&t!==s||i.contains(o))return function(e){var t=e.nodeName;return"BODY"!==t&&("HTML"===t||Fe(e.firstElementChild)===e)}(s)?s:Fe(s);var a=Me(e);return a.host?We(a.host,t):We(e,Me(t).host)}function Ue(e,t){var n="top"===(1<arguments.length&&void 0!==t?t:"top")?"scrollTop":"scrollLeft",i=e.nodeName;if("BODY"!==i&&"HTML"!==i)return e[n];var o=e.ownerDocument.documentElement;return(e.ownerDocument.scrollingElement||o)[n]}function Be(e,t){var n="x"===t?"Left":"Top",i="Left"==n?"Right":"Bottom";return parseFloat(e["border"+n+"Width"],10)+parseFloat(e["border"+i+"Width"],10)}function qe(e,t,n,i){return Math.max(t["offset"+e],t["scroll"+e],n["client"+e],n["offset"+e],n["scroll"+e],Re(10)?parseInt(n["offset"+e])+parseInt(i["margin"+("Height"===e?"Top":"Left")])+parseInt(i["margin"+("Height"===e?"Bottom":"Right")]):0)}function Ke(e){var t=e.body,n=e.documentElement,i=Re(10)&&getComputedStyle(n);return{height:qe("Height",t,n,i),width:qe("Width",t,n,i)}}var Qe=function(e,t,n){return t&&Ve(e.prototype,t),n&&Ve(e,n),e};function Ve(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function Ye(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ze=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])}return e};function Xe(e){return ze({},e,{right:e.left+e.width,bottom:e.top+e.height})}function Ge(e){var t={};try{if(Re(10)){t=e.getBoundingClientRect();var n=Ue(e,"top"),i=Ue(e,"left");t.top+=n,t.left+=i,t.bottom+=n,t.right+=i}else t=e.getBoundingClientRect()}catch(e){}var o={left:t.left,top:t.top,width:t.right-t.left,height:t.bottom-t.top},r="HTML"===e.nodeName?Ke(e.ownerDocument):{},s=r.width||e.clientWidth||o.width,a=r.height||e.clientHeight||o.height,l=e.offsetWidth-s,c=e.offsetHeight-a;if(l||c){var h=ke(e);l-=Be(h,"x"),c-=Be(h,"y"),o.width-=l,o.height-=c}return Xe(o)}function $e(e,t,n){var i=2<arguments.length&&void 0!==n&&n,o=Re(10),r="HTML"===t.nodeName,s=Ge(e),a=Ge(t),l=Pe(e),c=ke(t),h=parseFloat(c.borderTopWidth,10),u=parseFloat(c.borderLeftWidth,10);i&&r&&(a.top=Math.max(a.top,0),a.left=Math.max(a.left,0));var f=Xe({top:s.top-a.top-h,left:s.left-a.left-u,width:s.width,height:s.height});if(f.marginTop=0,f.marginLeft=0,!o&&r){var d=parseFloat(c.marginTop,10),p=parseFloat(c.marginLeft,10);f.top-=h-d,f.bottom-=h-d,f.left-=u-p,f.right-=u-p,f.marginTop=d,f.marginLeft=p}return(o&&!i?t.contains(l):t===l&&"BODY"!==l.nodeName)&&(f=function(e,t,n){var i=2<arguments.length&&void 0!==n&&n,o=Ue(t,"top"),r=Ue(t,"left"),s=i?-1:1;return e.top+=o*s,e.bottom+=o*s,e.left+=r*s,e.right+=r*s,e}(f,t)),f}function Je(e){if(!e||!e.parentElement||Re())return document.documentElement;for(var t=e.parentElement;t&&"none"===ke(t,"transform");)t=t.parentElement;return t||document.documentElement}function Ze(e,t,n,i,o){var r=4<arguments.length&&void 0!==o&&o,s={top:0,left:0},a=r?Je(e):We(e,xe(t));if("viewport"===i)s=function(e,t){var n=1<arguments.length&&void 0!==t&&t,i=e.ownerDocument.documentElement,o=$e(e,i),r=Math.max(i.clientWidth,window.innerWidth||0),s=Math.max(i.clientHeight,window.innerHeight||0),a=n?0:Ue(i),l=n?0:Ue(i,"left");return Xe({top:a-o.top+o.marginTop,left:l-o.left+o.marginLeft,width:r,height:s})}(a,r);else{var l=void 0;"scrollParent"===i?"BODY"===(l=Pe(Le(t))).nodeName&&(l=e.ownerDocument.documentElement):l="window"===i?e.ownerDocument.documentElement:i;var c=$e(l,a,r);if("HTML"!==l.nodeName||function e(t){var n=t.nodeName;if("BODY"===n||"HTML"===n)return!1;if("fixed"===ke(t,"position"))return!0;var i=Le(t);return!!i&&e(i)}(a))s=c;else{var h=Ke(e.ownerDocument),u=h.height,f=h.width;s.top+=c.top-c.marginTop,s.bottom=u+c.top,s.left+=c.left-c.marginLeft,s.right=f+c.left}}var d="number"==typeof(n=n||0);return s.left+=d?n:n.left||0,s.top+=d?n:n.top||0,s.right-=d?n:n.right||0,s.bottom-=d?n:n.bottom||0,s}function et(e,t,i,n,o,r){var s=5<arguments.length&&void 0!==r?r:0;if(-1===e.indexOf("auto"))return e;var a=Ze(i,n,s,o),l={top:{width:a.width,height:t.top-a.top},right:{width:a.right-t.right,height:a.height},bottom:{width:a.width,height:a.bottom-t.bottom},left:{width:t.left-a.left,height:a.height}},c=Object.keys(l).map(function(e){return ze({key:e},l[e],{area:function(e){return e.width*e.height}(l[e])})}).sort(function(e,t){return t.area-e.area}),h=c.filter(function(e){var t=e.width,n=e.height;return t>=i.clientWidth&&n>=i.clientHeight}),u=0<h.length?h[0].key:c[0].key,f=e.split("-")[1];return u+(f?"-"+f:"")}function tt(e,t,n,i){var o=3<arguments.length&&void 0!==i?i:null;return $e(n,o?Je(t):We(t,xe(n)),o)}function nt(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=parseFloat(t.marginTop||0)+parseFloat(t.marginBottom||0),i=parseFloat(t.marginLeft||0)+parseFloat(t.marginRight||0);return{width:e.offsetWidth+i,height:e.offsetHeight+n}}function it(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function ot(e,t,n){n=n.split("-")[0];var i=nt(e),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),s=r?"top":"left",a=r?"left":"top",l=r?"height":"width",c=r?"width":"height";return o[s]=t[s]+t[l]/2-i[l]/2,o[a]=n===a?t[a]-i[c]:t[it(a)],o}function rt(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function st(e,n,t){return(void 0===t?e:e.slice(0,function(e,t,n){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===n});var i=rt(e,function(e){return e[t]===n});return e.indexOf(i)}(e,"name",t))).forEach(function(e){e.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var t=e.function||e.fn;e.enabled&&Ne(t)&&(n.offsets.popper=Xe(n.offsets.popper),n.offsets.reference=Xe(n.offsets.reference),n=t(n,e))}),n}function at(e,n){return e.some(function(e){var t=e.name;return e.enabled&&t===n})}function lt(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpperCase()+e.slice(1),i=0;i<t.length;i++){var o=t[i],r=o?""+o+n:e;if("undefined"!=typeof document.body.style[r])return r}return null}function ct(e){var t=e.ownerDocument;return t?t.defaultView:window}function ht(e,t,n,i){n.updateBound=i,ct(e).addEventListener("resize",n.updateBound,{passive:!0});var o=Pe(e);return function e(t,n,i,o){var r="BODY"===t.nodeName,s=r?t.ownerDocument.defaultView:t;s.addEventListener(n,i,{passive:!0}),r||e(Pe(s.parentNode),n,i,o),o.push(s)}(o,"scroll",n.updateBound,n.scrollParents),n.scrollElement=o,n.eventsEnabled=!0,n}function ut(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=function(e,t){return ct(e).removeEventListener("resize",t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener("scroll",t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}(this.reference,this.state))}function ft(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function dt(n,i){Object.keys(i).forEach(function(e){var t="";-1!==["width","height","top","right","bottom","left"].indexOf(e)&&ft(i[e])&&(t="px"),n.style[e]=i[e]+t})}function pt(e,t){function n(e){return e}var i=e.offsets,o=i.popper,r=i.reference,s=Math.round,a=Math.floor,l=s(r.width),c=s(o.width),h=-1!==["left","right"].indexOf(e.placement),u=-1!==e.placement.indexOf("-"),f=t?h||u||l%2==c%2?s:a:n,d=t?s:n;return{left:f(l%2==1&&c%2==1&&!u&&t?o.left-1:o.left),top:d(o.top),bottom:d(o.bottom),right:f(o.right)}}var mt=Ie&&/Firefox/i.test(navigator.userAgent);function gt(e,t,n){var i=rt(e,function(e){return e.name===t}),o=!!i&&e.some(function(e){return e.name===n&&e.enabled&&e.order<i.order});if(!o){var r="`"+t+"`",s="`"+n+"`";console.warn(s+" modifier is required by "+r+" modifier in order to work, be sure to include it before "+r+"!")}return o}var _t=["auto-start","auto","auto-end","top-start","top","top-end","right-start","right","right-end","bottom-end","bottom","bottom-start","left-end","left","left-start"],vt=_t.slice(3);function yt(e,t){var n=1<arguments.length&&void 0!==t&&t,i=vt.indexOf(e),o=vt.slice(i+1).concat(vt.slice(0,i));return n?o.reverse():o}var Et="flip",bt="clockwise",wt="counterclockwise";function Tt(e,o,r,t){var s=[0,0],a=-1!==["right","left"].indexOf(t),n=e.split(/(\+|\-)/).map(function(e){return e.trim()}),i=n.indexOf(rt(n,function(e){return-1!==e.search(/,|\s/)}));n[i]&&-1===n[i].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,c=-1!==i?[n.slice(0,i).concat([n[i].split(l)[0]]),[n[i].split(l)[1]].concat(n.slice(i+1))]:[n];return(c=c.map(function(e,t){var n=(1===t?!a:a)?"height":"width",i=!1;return e.reduce(function(e,t){return""===e[e.length-1]&&-1!==["+","-"].indexOf(t)?(e[e.length-1]=t,i=!0,e):i?(e[e.length-1]+=t,i=!1,e):e.concat(t)},[]).map(function(e){return function(e,t,n,i){var o=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],s=o[2];if(!r)return e;if(0!==s.indexOf("%"))return"vh"!==s&&"vw"!==s?r:("vh"===s?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r;var a=void 0;switch(s){case"%p":a=n;break;case"%":case"%r":default:a=i}return Xe(a)[t]/100*r}(e,n,o,r)})})).forEach(function(n,i){n.forEach(function(e,t){ft(e)&&(s[i]+=e*("-"===n[t-1]?-1:1))})}),s}var Ct={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,n=t.split("-")[0],i=t.split("-")[1];if(i){var o=e.offsets,r=o.reference,s=o.popper,a=-1!==["bottom","top"].indexOf(n),l=a?"left":"top",c=a?"width":"height",h={start:Ye({},l,r[l]),end:Ye({},l,r[l]+r[c]-s[c])};e.offsets.popper=ze({},s,h[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var n=t.offset,i=e.placement,o=e.offsets,r=o.popper,s=o.reference,a=i.split("-")[0],l=void 0;return l=ft(+n)?[+n,0]:Tt(n,r,s,a),"left"===a?(r.top+=l[0],r.left-=l[1]):"right"===a?(r.top+=l[0],r.left+=l[1]):"top"===a?(r.left+=l[0],r.top-=l[1]):"bottom"===a&&(r.left+=l[0],r.top+=l[1]),e.popper=r,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,i){var t=i.boundariesElement||Fe(e.instance.popper);e.instance.reference===t&&(t=Fe(t));var n=lt("transform"),o=e.instance.popper.style,r=o.top,s=o.left,a=o[n];o.top="",o.left="",o[n]="";var l=Ze(e.instance.popper,e.instance.reference,i.padding,t,e.positionFixed);o.top=r,o.left=s,o[n]=a,i.boundaries=l;var c=i.priority,h=e.offsets.popper,u={primary:function(e){var t=h[e];return h[e]<l[e]&&!i.escapeWithReference&&(t=Math.max(h[e],l[e])),Ye({},e,t)},secondary:function(e){var t="right"===e?"left":"top",n=h[t];return h[e]>l[e]&&!i.escapeWithReference&&(n=Math.min(h[t],l[e]-("right"===e?h.width:h.height))),Ye({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";h=ze({},h,u[t](e))}),e.offsets.popper=h,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,o=e.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]<r(i[l])&&(e.offsets.popper[l]=r(i[l])-n[c]),n[l]>r(i[a])&&(e.offsets.popper[l]=r(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!gt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-p<s[u]&&(e.offsets.popper[u]-=s[u]-(a[d]-p)),a[u]+p>s[d]&&(e.offsets.popper[u]+=a[u]+p-s[d]),e.offsets.popper=Xe(e.offsets.popper);var m=a[u]+a[c]/2-p/2,g=ke(e.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-e.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ye(n={},u,Math.round(y)),Ye(n,f,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(m,g){if(at(m.instance.modifiers,"inner"))return m;if(m.flipped&&m.placement===m.originalPlacement)return m;var _=Ze(m.instance.popper,m.instance.reference,g.padding,g.boundariesElement,m.positionFixed),v=m.placement.split("-")[0],y=it(v),E=m.placement.split("-")[1]||"",b=[];switch(g.behavior){case Et:b=[v,y];break;case bt:b=yt(v);break;case wt:b=yt(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return m;v=m.placement.split("-")[0],y=it(v);var n=m.offsets.popper,i=m.offsets.reference,o=Math.floor,r="left"===v&&o(n.right)>o(i.left)||"right"===v&&o(n.left)<o(i.right)||"top"===v&&o(n.bottom)>o(i.top)||"bottom"===v&&o(n.top)<o(i.bottom),s=o(n.left)<o(_.left),a=o(n.right)>o(_.right),l=o(n.top)<o(_.top),c=o(n.bottom)>o(_.bottom),h="left"===v&&s||"right"===v&&a||"top"===v&&l||"bottom"===v&&c,u=-1!==["top","bottom"].indexOf(v),f=!!g.flipVariations&&(u&&"start"===E&&s||u&&"end"===E&&a||!u&&"start"===E&&l||!u&&"end"===E&&c),d=!!g.flipVariationsByContent&&(u&&"start"===E&&a||u&&"end"===E&&s||!u&&"start"===E&&c||!u&&"end"===E&&l),p=f||d;(r||h||p)&&(m.flipped=!0,(r||h)&&(v=b[t+1]),p&&(E=function(e){return"end"===e?"start":"start"===e?"end":e}(E)),m.placement=v+(E?"-"+E:""),m.offsets.popper=ze({},m.offsets.popper,ot(m.instance.popper,m.offsets.reference,m.placement)),m=st(m.instance.modifiers,m,"flip"))}),m},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Xe(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!gt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=rt(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottom<n.top||t.left>n.right||t.top>n.bottom||t.right<n.left){if(!0===e.hide)return e;e.hide=!0,e.attributes["x-out-of-boundaries"]=""}else{if(!1===e.hide)return e;e.hide=!1,e.attributes["x-out-of-boundaries"]=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var n=t.x,i=t.y,o=e.offsets.popper,r=rt(e.instance.modifiers,function(e){return"applyStyle"===e.name}).gpuAcceleration;void 0!==r&&console.warn("WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!");var s=void 0!==r?r:t.gpuAcceleration,a=Fe(e.instance.popper),l=Ge(a),c={position:o.position},h=pt(e,window.devicePixelRatio<2||!mt),u="bottom"===n?"top":"bottom",f="right"===i?"left":"right",d=lt("transform"),p=void 0,m=void 0;if(m="bottom"==u?"HTML"===a.nodeName?-a.clientHeight+h.bottom:-l.height+h.bottom:h.top,p="right"==f?"HTML"===a.nodeName?-a.clientWidth+h.right:-l.width+h.right:h.left,s&&d)c[d]="translate3d("+p+"px, "+m+"px, 0)",c[u]=0,c[f]=0,c.willChange="transform";else{var g="bottom"==u?-1:1,_="right"==f?-1:1;c[u]=m*g,c[f]=p*_,c.willChange=u+", "+f}var v={"x-placement":e.placement};return e.attributes=ze({},v,e.attributes),e.styles=ze({},c,e.styles),e.arrowStyles=ze({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:"bottom",y:"right"},applyStyle:{order:900,enabled:!0,fn:function(e){return dt(e.instance.popper,e.styles),function(t,n){Object.keys(n).forEach(function(e){!1!==n[e]?t.setAttribute(e,n[e]):t.removeAttribute(e)})}(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&dt(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,n,i,o){var r=tt(o,t,e,n.positionFixed),s=et(n.placement,r,t,e,n.modifiers.flip.boundariesElement,n.modifiers.flip.padding);return t.setAttribute("x-placement",s),dt(t,{position:n.positionFixed?"fixed":"absolute"}),n},gpuAcceleration:void 0}}},St=(Qe(Dt,[{key:"update",value:function(){return function(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=tt(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=et(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=ot(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",e=st(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}.call(this)}},{key:"destroy",value:function(){return function(){return this.state.isDestroyed=!0,at(this.modifiers,"applyStyle")&&(this.popper.removeAttribute("x-placement"),this.popper.style.position="",this.popper.style.top="",this.popper.style.left="",this.popper.style.right="",this.popper.style.bottom="",this.popper.style.willChange="",this.popper.style[lt("transform")]=""),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}.call(this)}},{key:"enableEventListeners",value:function(){return function(){this.state.eventsEnabled||(this.state=ht(this.reference,this.options,this.state,this.scheduleUpdate))}.call(this)}},{key:"disableEventListeners",value:function(){return ut.call(this)}}]),Dt);function Dt(e,t){var n=this,i=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,Dt),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=Oe(this.update.bind(this)),this.options=ze({},Dt.Defaults,i),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=t&&t.jquery?t[0]:t,this.options.modifiers={},Object.keys(ze({},Dt.Defaults.modifiers,i.modifiers)).forEach(function(e){n.options.modifiers[e]=ze({},Dt.Defaults.modifiers[e]||{},i.modifiers?i.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return ze({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(e){e.enabled&&Ne(e.onLoad)&&e.onLoad(n.reference,n.popper,n.options,e,n.state)}),this.update();var o=this.options.eventsEnabled;o&&this.enableEventListeners(),this.state.eventsEnabled=o}St.Utils=("undefined"!=typeof window?window:global).PopperUtils,St.placements=_t,St.Defaults=Ct;var It="dropdown",At="bs.dropdown",Ot="."+At,Nt=".data-api",kt=p.fn[It],Lt=new RegExp("38|40|27"),Pt={HIDE:"hide"+Ot,HIDDEN:"hidden"+Ot,SHOW:"show"+Ot,SHOWN:"shown"+Ot,CLICK:"click"+Ot,CLICK_DATA_API:"click"+Ot+Nt,KEYDOWN_DATA_API:"keydown"+Ot+Nt,KEYUP_DATA_API:"keyup"+Ot+Nt},xt="disabled",jt="show",Ht="dropup",Rt="dropright",Ft="dropleft",Mt="dropdown-menu-right",Wt="position-static",Ut='[data-toggle="dropdown"]',Bt=".dropdown form",qt=".dropdown-menu",Kt=".navbar-nav",Qt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Vt="top-start",Yt="top-end",zt="bottom-start",Xt="bottom-end",Gt="right-start",$t="left-start",Jt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},Zt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},en=function(){function c(e,t){this._element=e,this._popper=null,this._config=this._getConfig(t),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var e=c.prototype;return e.toggle=function(){if(!this._element.disabled&&!p(this._element).hasClass(xt)){var e=p(this._menu).hasClass(jt);c._clearMenus(),e||this.show(!0)}},e.show=function(e){if(void 0===e&&(e=!1),!(this._element.disabled||p(this._element).hasClass(xt)||p(this._menu).hasClass(jt))){var t={relatedTarget:this._element},n=p.Event(Pt.SHOW,t),i=c._getParentFromElement(this._element);if(p(i).trigger(n),!n.isDefaultPrevented()){if(!this._inNavbar&&e){if("undefined"==typeof St)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=i:m.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&p(i).addClass(Wt),this._popper=new St(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===p(i).closest(Kt).length&&p(document.body).children().on("mouseover",null,p.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),p(this._menu).toggleClass(jt),p(i).toggleClass(jt).trigger(p.Event(Pt.SHOWN,t))}}},e.hide=function(){if(!this._element.disabled&&!p(this._element).hasClass(xt)&&p(this._menu).hasClass(jt)){var e={relatedTarget:this._element},t=p.Event(Pt.HIDE,e),n=c._getParentFromElement(this._element);p(n).trigger(t),t.isDefaultPrevented()||(this._popper&&this._popper.destroy(),p(this._menu).toggleClass(jt),p(n).toggleClass(jt).trigger(p.Event(Pt.HIDDEN,e)))}},e.dispose=function(){p.removeData(this._element,At),p(this._element).off(Ot),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},e.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},e._addEventListeners=function(){var t=this;p(this._element).on(Pt.CLICK,function(e){e.preventDefault(),e.stopPropagation(),t.toggle()})},e._getConfig=function(e){return e=l({},this.constructor.Default,{},p(this._element).data(),{},e),m.typeCheckConfig(It,e,this.constructor.DefaultType),e},e._getMenuElement=function(){if(!this._menu){var e=c._getParentFromElement(this._element);e&&(this._menu=e.querySelector(qt))}return this._menu},e._getPlacement=function(){var e=p(this._element.parentNode),t=zt;return e.hasClass(Ht)?(t=Vt,p(this._menu).hasClass(Mt)&&(t=Yt)):e.hasClass(Rt)?t=Gt:e.hasClass(Ft)?t=$t:p(this._menu).hasClass(Mt)&&(t=Xt),t},e._detectNavbar=function(){return 0<p(this._element).closest(".navbar").length},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var e={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(e.modifiers.applyStyle={enabled:!1}),l({},e,{},this._config.popperConfig)},c._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(At);if(e||(e=new c(this,"object"==typeof t?t:null),p(this).data(At,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},c._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var t=[].slice.call(document.querySelectorAll(Ut)),n=0,i=t.length;n<i;n++){var o=c._getParentFromElement(t[n]),r=p(t[n]).data(At),s={relatedTarget:t[n]};if(e&&"click"===e.type&&(s.clickEvent=e),r){var a=r._menu;if(p(o).hasClass(jt)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&p.contains(o,e.target))){var l=p.Event(Pt.HIDE,s);p(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),t[n].setAttribute("aria-expanded","false"),r._popper&&r._popper.destroy(),p(a).removeClass(jt),p(o).removeClass(jt).trigger(p.Event(Pt.HIDDEN,s)))}}}},c._getParentFromElement=function(e){var t,n=m.getSelectorFromElement(e);return n&&(t=document.querySelector(n)),t||e.parentNode},c._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||p(e.target).closest(qt).length)):Lt.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!p(this).hasClass(xt))){var t=c._getParentFromElement(this),n=p(t).hasClass(jt);if(n||27!==e.which)if(n&&(!n||27!==e.which&&32!==e.which)){var i=[].slice.call(t.querySelectorAll(Qt)).filter(function(e){return p(e).is(":visible")});if(0!==i.length){var o=i.indexOf(e.target);38===e.which&&0<o&&o--,40===e.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===e.which){var r=t.querySelector(Ut);p(r).trigger("focus")}p(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Jt}},{key:"DefaultType",get:function(){return Zt}}]),c}();p(document).on(Pt.KEYDOWN_DATA_API,Ut,en._dataApiKeydownHandler).on(Pt.KEYDOWN_DATA_API,qt,en._dataApiKeydownHandler).on(Pt.CLICK_DATA_API+" "+Pt.KEYUP_DATA_API,en._clearMenus).on(Pt.CLICK_DATA_API,Ut,function(e){e.preventDefault(),e.stopPropagation(),en._jQueryInterface.call(p(this),"toggle")}).on(Pt.CLICK_DATA_API,Bt,function(e){e.stopPropagation()}),p.fn[It]=en._jQueryInterface,p.fn[It].Constructor=en,p.fn[It].noConflict=function(){return p.fn[It]=kt,en._jQueryInterface};var tn="modal",nn="bs.modal",on="."+nn,rn=p.fn[tn],sn={backdrop:!0,keyboard:!0,focus:!0,show:!0},an={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},ln={HIDE:"hide"+on,HIDE_PREVENTED:"hidePrevented"+on,HIDDEN:"hidden"+on,SHOW:"show"+on,SHOWN:"shown"+on,FOCUSIN:"focusin"+on,RESIZE:"resize"+on,CLICK_DISMISS:"click.dismiss"+on,KEYDOWN_DISMISS:"keydown.dismiss"+on,MOUSEUP_DISMISS:"mouseup.dismiss"+on,MOUSEDOWN_DISMISS:"mousedown.dismiss"+on,CLICK_DATA_API:"click"+on+".data-api"},cn="modal-dialog-scrollable",hn="modal-scrollbar-measure",un="modal-backdrop",fn="modal-open",dn="fade",pn="show",mn="modal-static",gn=".modal-dialog",_n=".modal-body",vn='[data-toggle="modal"]',yn='[data-dismiss="modal"]',En=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",bn=".sticky-top",wn=function(){function o(e,t){this._config=this._getConfig(t),this._element=e,this._dialog=e.querySelector(gn),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var e=o.prototype;return e.toggle=function(e){return this._isShown?this.hide():this.show(e)},e.show=function(e){var t=this;if(!this._isShown&&!this._isTransitioning){p(this._element).hasClass(dn)&&(this._isTransitioning=!0);var n=p.Event(ln.SHOW,{relatedTarget:e});p(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),p(this._element).on(ln.CLICK_DISMISS,yn,function(e){return t.hide(e)}),p(this._dialog).on(ln.MOUSEDOWN_DISMISS,function(){p(t._element).one(ln.MOUSEUP_DISMISS,function(e){p(e.target).is(t._element)&&(t._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return t._showElement(e)}))}},e.hide=function(e){var t=this;if(e&&e.preventDefault(),this._isShown&&!this._isTransitioning){var n=p.Event(ln.HIDE);if(p(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=p(this._element).hasClass(dn);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),p(document).off(ln.FOCUSIN),p(this._element).removeClass(pn),p(this._element).off(ln.CLICK_DISMISS),p(this._dialog).off(ln.MOUSEDOWN_DISMISS),i){var o=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(e){return t._hideModal(e)}).emulateTransitionEnd(o)}else this._hideModal()}}},e.dispose=function(){[window,this._element,this._dialog].forEach(function(e){return p(e).off(on)}),p(document).off(ln.FOCUSIN),p.removeData(this._element,nn),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},e.handleUpdate=function(){this._adjustDialog()},e._getConfig=function(e){return e=l({},sn,{},e),m.typeCheckConfig(tn,e,an),e},e._triggerBackdropTransition=function(){var e=this;if("static"===this._config.backdrop){var t=p.Event(ln.HIDE_PREVENTED);if(p(this._element).trigger(t),t.defaultPrevented)return;this._element.classList.add(mn);var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,function(){e._element.classList.remove(mn)}).emulateTransitionEnd(n),this._element.focus()}else this.hide()},e._showElement=function(e){var t=this,n=p(this._element).hasClass(dn),i=this._dialog?this._dialog.querySelector(_n):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),p(this._dialog).hasClass(cn)&&i?i.scrollTop=0:this._element.scrollTop=0,n&&m.reflow(this._element),p(this._element).addClass(pn),this._config.focus&&this._enforceFocus();function o(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,p(t._element).trigger(r)}var r=p.Event(ln.SHOWN,{relatedTarget:e});if(n){var s=m.getTransitionDurationFromElement(this._dialog);p(this._dialog).one(m.TRANSITION_END,o).emulateTransitionEnd(s)}else o()},e._enforceFocus=function(){var t=this;p(document).off(ln.FOCUSIN).on(ln.FOCUSIN,function(e){document!==e.target&&t._element!==e.target&&0===p(t._element).has(e.target).length&&t._element.focus()})},e._setEscapeEvent=function(){var t=this;this._isShown&&this._config.keyboard?p(this._element).on(ln.KEYDOWN_DISMISS,function(e){27===e.which&&t._triggerBackdropTransition()}):this._isShown||p(this._element).off(ln.KEYDOWN_DISMISS)},e._setResizeEvent=function(){var t=this;this._isShown?p(window).on(ln.RESIZE,function(e){return t.handleUpdate(e)}):p(window).off(ln.RESIZE)},e._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){p(document.body).removeClass(fn),e._resetAdjustments(),e._resetScrollbar(),p(e._element).trigger(ln.HIDDEN)})},e._removeBackdrop=function(){this._backdrop&&(p(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(e){var t=this,n=p(this._element).hasClass(dn)?dn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=un,n&&this._backdrop.classList.add(n),p(this._backdrop).appendTo(document.body),p(this._element).on(ln.CLICK_DISMISS,function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&t._triggerBackdropTransition()}),n&&m.reflow(this._backdrop),p(this._backdrop).addClass(pn),!e)return;if(!n)return void e();var i=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){p(this._backdrop).removeClass(pn);var o=function(){t._removeBackdrop(),e&&e()};if(p(this._element).hasClass(dn)){var r=m.getTransitionDurationFromElement(this._backdrop);p(this._backdrop).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else e&&e()},e._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},e._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var e=[].slice.call(document.querySelectorAll(En)),t=[].slice.call(document.querySelectorAll(bn));p(e).each(function(e,t){var n=t.style.paddingRight,i=p(t).css("padding-right");p(t).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),p(t).each(function(e,t){var n=t.style.marginRight,i=p(t).css("margin-right");p(t).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=p(document.body).css("padding-right");p(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}p(document.body).addClass(fn)},e._resetScrollbar=function(){var e=[].slice.call(document.querySelectorAll(En));p(e).each(function(e,t){var n=p(t).data("padding-right");p(t).removeData("padding-right"),t.style.paddingRight=n||""});var t=[].slice.call(document.querySelectorAll(""+bn));p(t).each(function(e,t){var n=p(t).data("margin-right");"undefined"!=typeof n&&p(t).css("margin-right",n).removeData("margin-right")});var n=p(document.body).data("padding-right");p(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},e._getScrollbarWidth=function(){var e=document.createElement("div");e.className=hn,document.body.appendChild(e);var t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t},o._jQueryInterface=function(n,i){return this.each(function(){var e=p(this).data(nn),t=l({},sn,{},p(this).data(),{},"object"==typeof n&&n?n:{});if(e||(e=new o(this,t),p(this).data(nn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}else t.show&&e.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return sn}}]),o}();p(document).on(ln.CLICK_DATA_API,vn,function(e){var t,n=this,i=m.getSelectorFromElement(this);i&&(t=document.querySelector(i));var o=p(t).data(nn)?"toggle":l({},p(t).data(),{},p(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var r=p(t).one(ln.SHOW,function(e){e.isDefaultPrevented()||r.one(ln.HIDDEN,function(){p(n).is(":visible")&&n.focus()})});wn._jQueryInterface.call(p(t),o,this)}),p.fn[tn]=wn._jQueryInterface,p.fn[tn].Constructor=wn,p.fn[tn].noConflict=function(){return p.fn[tn]=rn,wn._jQueryInterface};var Tn=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Cn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Sn=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Dn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function In(e,r,t){if(0===e.length)return e;if(t&&"function"==typeof t)return t(e);for(var n=(new window.DOMParser).parseFromString(e,"text/html"),s=Object.keys(r),a=[].slice.call(n.body.querySelectorAll("*")),i=function(e){var t=a[e],n=t.nodeName.toLowerCase();if(-1===s.indexOf(t.nodeName.toLowerCase()))return t.parentNode.removeChild(t),"continue";var i=[].slice.call(t.attributes),o=[].concat(r["*"]||[],r[n]||[]);i.forEach(function(e){!function(e,t){var n=e.nodeName.toLowerCase();if(-1!==t.indexOf(n))return-1===Tn.indexOf(n)||Boolean(e.nodeValue.match(Sn)||e.nodeValue.match(Dn));for(var i=t.filter(function(e){return e instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1}(e,o)&&t.removeAttribute(e.nodeName)})},o=0,l=a.length;o<l;o++)i(o);return n.body.innerHTML}var An="tooltip",On="bs.tooltip",Nn="."+On,kn=p.fn[An],Ln="bs-tooltip",Pn=new RegExp("(^|\\s)"+Ln+"\\S+","g"),xn=["sanitize","whiteList","sanitizeFn"],jn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Hn={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Rn={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0<t.length&&e.removeClass(t.join(""))},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data($n),t="object"==typeof n?n:null;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data($n,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return ni}},{key:"NAME",get:function(){return Gn}},{key:"DATA_KEY",get:function(){return $n}},{key:"Event",get:function(){return li}},{key:"EVENT_KEY",get:function(){return Jn}},{key:"DefaultType",get:function(){return ii}}]),i}(Xn);p.fn[Gn]=ci._jQueryInterface,p.fn[Gn].Constructor=ci,p.fn[Gn].noConflict=function(){return p.fn[Gn]=Zn,ci._jQueryInterface};var hi="scrollspy",ui="bs.scrollspy",fi="."+ui,di=p.fn[hi],pi={offset:10,method:"auto",target:""},mi={offset:"number",method:"string",target:"(string|element)"},gi={ACTIVATE:"activate"+fi,SCROLL:"scroll"+fi,LOAD_DATA_API:"load"+fi+".data-api"},_i="dropdown-item",vi="active",yi='[data-spy="scroll"]',Ei=".nav, .list-group",bi=".nav-link",wi=".nav-item",Ti=".list-group-item",Ci=".dropdown",Si=".dropdown-item",Di=".dropdown-toggle",Ii="offset",Ai="position",Oi=function(){function n(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+bi+","+this._config.target+" "+Ti+","+this._config.target+" "+Si,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p(this._scrollElement).on(gi.SCROLL,function(e){return n._process(e)}),this.refresh(),this._process()}var e=n.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?Ii:Ai,o="auto"===this._config.method?e:this._config.method,r=o===Ai?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(e){var t,n=m.getSelectorFromElement(e);if(n&&(t=document.querySelector(n)),t){var i=t.getBoundingClientRect();if(i.width||i.height)return[p(t)[o]().top+r,n]}return null}).filter(function(e){return e}).sort(function(e,t){return e[0]-t[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},e.dispose=function(){p.removeData(this._element,ui),p(this._scrollElement).off(fi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(e){if("string"!=typeof(e=l({},pi,{},"object"==typeof e&&e?e:{})).target){var t=p(e.target).attr("id");t||(t=m.getUID(hi),p(e.target).attr("id",t)),e.target="#"+t}return m.typeCheckConfig(hi,e,mi),e},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),n<=e){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&e>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||e<this._offsets[o+1])&&this._activate(this._targets[o])}}},e._activate=function(t){this._activeTarget=t,this._clear();var e=this._selector.split(",").map(function(e){return e+'[data-target="'+t+'"],'+e+'[href="'+t+'"]'}),n=p([].slice.call(document.querySelectorAll(e.join(","))));n.hasClass(_i)?(n.closest(Ci).find(Di).addClass(vi),n.addClass(vi)):(n.addClass(vi),n.parents(Ei).prev(bi+", "+Ti).addClass(vi),n.parents(Ei).prev(wi).children(bi).addClass(vi)),p(this._scrollElement).trigger(gi.ACTIVATE,{relatedTarget:t})},e._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(e){return e.classList.contains(vi)}).forEach(function(e){return e.classList.remove(vi)})},n._jQueryInterface=function(t){return this.each(function(){var e=p(this).data(ui);if(e||(e=new n(this,"object"==typeof t&&t),p(this).data(ui,e)),"string"==typeof t){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return pi}}]),n}();p(window).on(gi.LOAD_DATA_API,function(){for(var e=[].slice.call(document.querySelectorAll(yi)),t=e.length;t--;){var n=p(e[t]);Oi._jQueryInterface.call(n,n.data())}}),p.fn[hi]=Oi._jQueryInterface,p.fn[hi].Constructor=Oi,p.fn[hi].noConflict=function(){return p.fn[hi]=di,Oi._jQueryInterface};var Ni="bs.tab",ki="."+Ni,Li=p.fn.tab,Pi={HIDE:"hide"+ki,HIDDEN:"hidden"+ki,SHOW:"show"+ki,SHOWN:"shown"+ki,CLICK_DATA_API:"click"+ki+".data-api"},xi="dropdown-menu",ji="active",Hi="disabled",Ri="fade",Fi="show",Mi=".dropdown",Wi=".nav, .list-group",Ui=".active",Bi="> li > .active",qi='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Ki=".dropdown-toggle",Qi="> .dropdown-menu .active",Vi=function(){function i(e){this._element=e}var e=i.prototype;return e.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&p(this._element).hasClass(ji)||p(this._element).hasClass(Hi))){var e,i,t=p(this._element).closest(Wi)[0],o=m.getSelectorFromElement(this._element);if(t){var r="UL"===t.nodeName||"OL"===t.nodeName?Bi:Ui;i=(i=p.makeArray(p(t).find(r)))[i.length-1]}var s=p.Event(Pi.HIDE,{relatedTarget:this._element}),a=p.Event(Pi.SHOW,{relatedTarget:i});if(i&&p(i).trigger(s),p(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(e=document.querySelector(o)),this._activate(this._element,t);var l=function(){var e=p.Event(Pi.HIDDEN,{relatedTarget:n._element}),t=p.Event(Pi.SHOWN,{relatedTarget:i});p(i).trigger(e),p(n._element).trigger(t)};e?this._activate(e,e.parentNode,l):l()}}},e.dispose=function(){p.removeData(this._element,Ni),this._element=null},e._activate=function(e,t,n){function i(){return o._transitionComplete(e,r,n)}var o=this,r=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?p(t).children(Ui):p(t).find(Bi))[0],s=n&&r&&p(r).hasClass(Ri);if(r&&s){var a=m.getTransitionDurationFromElement(r);p(r).removeClass(Fi).one(m.TRANSITION_END,i).emulateTransitionEnd(a)}else i()},e._transitionComplete=function(e,t,n){if(t){p(t).removeClass(ji);var i=p(t.parentNode).find(Qi)[0];i&&p(i).removeClass(ji),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}if(p(e).addClass(ji),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),m.reflow(e),e.classList.contains(Ri)&&e.classList.add(Fi),e.parentNode&&p(e.parentNode).hasClass(xi)){var o=p(e).closest(Mi)[0];if(o){var r=[].slice.call(o.querySelectorAll(Ki));p(r).addClass(ji)}e.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(Ni);if(t||(t=new i(this),e.data(Ni,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();p(document).on(Pi.CLICK_DATA_API,qi,function(e){e.preventDefault(),Vi._jQueryInterface.call(p(this),"show")}),p.fn.tab=Vi._jQueryInterface,p.fn.tab.Constructor=Vi,p.fn.tab.noConflict=function(){return p.fn.tab=Li,Vi._jQueryInterface};var Yi="toast",zi="bs.toast",Xi="."+zi,Gi=p.fn[Yi],$i={CLICK_DISMISS:"click.dismiss"+Xi,HIDE:"hide"+Xi,HIDDEN:"hidden"+Xi,SHOW:"show"+Xi,SHOWN:"shown"+Xi},Ji="fade",Zi="hide",eo="show",to="showing",no={animation:"boolean",autohide:"boolean",delay:"number"},io={animation:!0,autohide:!0,delay:500},oo='[data-dismiss="toast"]',ro=function(){function i(e,t){this._element=e,this._config=this._getConfig(t),this._timeout=null,this._setListeners()}var e=i.prototype;return e.show=function(){var e=this,t=p.Event($i.SHOW);if(p(this._element).trigger(t),!t.isDefaultPrevented()){this._config.animation&&this._element.classList.add(Ji);var n=function(){e._element.classList.remove(to),e._element.classList.add(eo),p(e._element).trigger($i.SHOWN),e._config.autohide&&(e._timeout=setTimeout(function(){e.hide()},e._config.delay))};if(this._element.classList.remove(Zi),m.reflow(this._element),this._element.classList.add(to),this._config.animation){var i=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(eo)){var e=p.Event($i.HIDE);p(this._element).trigger(e),e.isDefaultPrevented()||this._close()}},e.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(eo)&&this._element.classList.remove(eo),p(this._element).off($i.CLICK_DISMISS),p.removeData(this._element,zi),this._element=null,this._config=null},e._getConfig=function(e){return e=l({},io,{},p(this._element).data(),{},"object"==typeof e&&e?e:{}),m.typeCheckConfig(Yi,e,this.constructor.DefaultType),e},e._setListeners=function(){var e=this;p(this._element).on($i.CLICK_DISMISS,oo,function(){return e.hide()})},e._close=function(){function e(){t._element.classList.add(Zi),p(t._element).trigger($i.HIDDEN)}var t=this;if(this._element.classList.remove(eo),this._config.animation){var n=m.getTransitionDurationFromElement(this._element);p(this._element).one(m.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var e=p(this),t=e.data(zi);if(t||(t=new i(this,"object"==typeof n&&n),e.data(zi,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"DefaultType",get:function(){return no}},{key:"Default",get:function(){return io}}]),i}();p.fn[Yi]=ro._jQueryInterface,p.fn[Yi].Constructor=ro,p.fn[Yi].noConflict=function(){return p.fn[Yi]=Gi,ro._jQueryInterface},e.Alert=_,e.Button=x,e.Carousel=he,e.Collapse=De,e.Dropdown=en,e.Modal=wn,e.Popover=ci,e.Scrollspy=Oi,e.Tab=Vi,e.Toast=ro,e.Tooltip=Xn,e.Util=m,Object.defineProperty(e,"__esModule",{value:!0})});
|
7 |
//# sourceMappingURL=bootstrap.bundle.min.js.map
|
resources/js/bootstrap4.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
@@ -7,7 +7,7 @@
|
|
7 |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
|
8 |
typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
|
9 |
(global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
|
10 |
-
}(this, function (exports, $, Popper) { 'use strict';
|
11 |
|
12 |
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
13 |
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
|
@@ -43,20 +43,35 @@
|
|
43 |
return obj;
|
44 |
}
|
45 |
|
46 |
-
function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
for (var i = 1; i < arguments.length; i++) {
|
48 |
var source = arguments[i] != null ? arguments[i] : {};
|
49 |
-
var ownKeys = Object.keys(source);
|
50 |
|
51 |
-
if (
|
52 |
-
ownKeys
|
53 |
-
|
54 |
-
})
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
}
|
56 |
-
|
57 |
-
ownKeys.forEach(function (key) {
|
58 |
-
_defineProperty(target, key, source[key]);
|
59 |
-
});
|
60 |
}
|
61 |
|
62 |
return target;
|
@@ -70,7 +85,7 @@
|
|
70 |
|
71 |
/**
|
72 |
* --------------------------------------------------------------------------
|
73 |
-
* Bootstrap (v4.
|
74 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
75 |
* --------------------------------------------------------------------------
|
76 |
*/
|
@@ -219,8 +234,25 @@
|
|
219 |
}
|
220 |
|
221 |
return Util.findShadowRoot(element.parentNode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
}
|
223 |
};
|
|
|
224 |
setTransitionEndSupport();
|
225 |
|
226 |
/**
|
@@ -230,7 +262,7 @@
|
|
230 |
*/
|
231 |
|
232 |
var NAME = 'alert';
|
233 |
-
var VERSION = '4.
|
234 |
var DATA_KEY = 'bs.alert';
|
235 |
var EVENT_KEY = "." + DATA_KEY;
|
236 |
var DATA_API_KEY = '.data-api';
|
@@ -247,13 +279,12 @@
|
|
247 |
ALERT: 'alert',
|
248 |
FADE: 'fade',
|
249 |
SHOW: 'show'
|
250 |
-
/**
|
251 |
-
* ------------------------------------------------------------------------
|
252 |
-
* Class Definition
|
253 |
-
* ------------------------------------------------------------------------
|
254 |
-
*/
|
255 |
-
|
256 |
};
|
|
|
|
|
|
|
|
|
|
|
257 |
|
258 |
var Alert =
|
259 |
/*#__PURE__*/
|
@@ -395,7 +426,7 @@
|
|
395 |
*/
|
396 |
|
397 |
var NAME$1 = 'button';
|
398 |
-
var VERSION$1 = '4.
|
399 |
var DATA_KEY$1 = 'bs.button';
|
400 |
var EVENT_KEY$1 = "." + DATA_KEY$1;
|
401 |
var DATA_API_KEY$1 = '.data-api';
|
@@ -407,21 +438,23 @@
|
|
407 |
};
|
408 |
var Selector$1 = {
|
409 |
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
410 |
-
|
|
|
|
|
411 |
INPUT: 'input:not([type="hidden"])',
|
412 |
ACTIVE: '.active',
|
413 |
BUTTON: '.btn'
|
414 |
};
|
415 |
var Event$1 = {
|
416 |
CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
|
417 |
-
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1)
|
418 |
-
|
419 |
-
* ------------------------------------------------------------------------
|
420 |
-
* Class Definition
|
421 |
-
* ------------------------------------------------------------------------
|
422 |
-
*/
|
423 |
-
|
424 |
};
|
|
|
|
|
|
|
|
|
|
|
425 |
|
426 |
var Button =
|
427 |
/*#__PURE__*/
|
@@ -437,7 +470,7 @@
|
|
437 |
_proto.toggle = function toggle() {
|
438 |
var triggerChangeEvent = true;
|
439 |
var addAriaPressed = true;
|
440 |
-
var rootElement = $(this._element).closest(Selector$1.
|
441 |
|
442 |
if (rootElement) {
|
443 |
var input = this._element.querySelector(Selector$1.INPUT);
|
@@ -453,13 +486,16 @@
|
|
453 |
$(activeElement).removeClass(ClassName$1.ACTIVE);
|
454 |
}
|
455 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
456 |
}
|
457 |
|
458 |
if (triggerChangeEvent) {
|
459 |
-
if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
|
460 |
-
return;
|
461 |
-
}
|
462 |
-
|
463 |
input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
|
464 |
$(input).trigger('change');
|
465 |
}
|
@@ -469,12 +505,14 @@
|
|
469 |
}
|
470 |
}
|
471 |
|
472 |
-
if (
|
473 |
-
|
474 |
-
|
|
|
475 |
|
476 |
-
|
477 |
-
|
|
|
478 |
}
|
479 |
};
|
480 |
|
@@ -516,18 +554,58 @@
|
|
516 |
|
517 |
|
518 |
$(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
519 |
-
event.preventDefault();
|
520 |
var button = event.target;
|
521 |
|
522 |
if (!$(button).hasClass(ClassName$1.BUTTON)) {
|
523 |
-
button = $(button).closest(Selector$1.BUTTON);
|
524 |
}
|
525 |
|
526 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
527 |
}).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
528 |
var button = $(event.target).closest(Selector$1.BUTTON)[0];
|
529 |
$(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
|
530 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
531 |
/**
|
532 |
* ------------------------------------------------------------------------
|
533 |
* jQuery
|
@@ -549,7 +627,7 @@
|
|
549 |
*/
|
550 |
|
551 |
var NAME$2 = 'carousel';
|
552 |
-
var VERSION$2 = '4.
|
553 |
var DATA_KEY$2 = 'bs.carousel';
|
554 |
var EVENT_KEY$2 = "." + DATA_KEY$2;
|
555 |
var DATA_API_KEY$2 = '.data-api';
|
@@ -622,13 +700,12 @@
|
|
622 |
var PointerType = {
|
623 |
TOUCH: 'touch',
|
624 |
PEN: 'pen'
|
625 |
-
/**
|
626 |
-
* ------------------------------------------------------------------------
|
627 |
-
* Class Definition
|
628 |
-
* ------------------------------------------------------------------------
|
629 |
-
*/
|
630 |
-
|
631 |
};
|
|
|
|
|
|
|
|
|
|
|
632 |
|
633 |
var Carousel =
|
634 |
/*#__PURE__*/
|
@@ -748,7 +825,7 @@
|
|
748 |
;
|
749 |
|
750 |
_proto._getConfig = function _getConfig(config) {
|
751 |
-
config =
|
752 |
Util.typeCheckConfig(NAME$2, config, DefaultType);
|
753 |
return config;
|
754 |
};
|
@@ -760,7 +837,8 @@
|
|
760 |
return;
|
761 |
}
|
762 |
|
763 |
-
var direction = absDeltax / this.touchDeltaX;
|
|
|
764 |
|
765 |
if (direction > 0) {
|
766 |
this.prev();
|
@@ -886,8 +964,6 @@
|
|
886 |
event.preventDefault();
|
887 |
this.next();
|
888 |
break;
|
889 |
-
|
890 |
-
default:
|
891 |
}
|
892 |
};
|
893 |
|
@@ -1039,10 +1115,10 @@
|
|
1039 |
return this.each(function () {
|
1040 |
var data = $(this).data(DATA_KEY$2);
|
1041 |
|
1042 |
-
var _config =
|
1043 |
|
1044 |
if (typeof config === 'object') {
|
1045 |
-
_config =
|
1046 |
}
|
1047 |
|
1048 |
var action = typeof config === 'string' ? config : _config.slide;
|
@@ -1080,7 +1156,7 @@
|
|
1080 |
return;
|
1081 |
}
|
1082 |
|
1083 |
-
var config =
|
1084 |
|
1085 |
var slideIndex = this.getAttribute('data-slide-to');
|
1086 |
|
@@ -1149,7 +1225,7 @@
|
|
1149 |
*/
|
1150 |
|
1151 |
var NAME$3 = 'collapse';
|
1152 |
-
var VERSION$3 = '4.
|
1153 |
var DATA_KEY$3 = 'bs.collapse';
|
1154 |
var EVENT_KEY$3 = "." + DATA_KEY$3;
|
1155 |
var DATA_API_KEY$3 = '.data-api';
|
@@ -1182,13 +1258,12 @@
|
|
1182 |
var Selector$3 = {
|
1183 |
ACTIVES: '.show, .collapsing',
|
1184 |
DATA_TOGGLE: '[data-toggle="collapse"]'
|
1185 |
-
/**
|
1186 |
-
* ------------------------------------------------------------------------
|
1187 |
-
* Class Definition
|
1188 |
-
* ------------------------------------------------------------------------
|
1189 |
-
*/
|
1190 |
-
|
1191 |
};
|
|
|
|
|
|
|
|
|
|
|
1192 |
|
1193 |
var Collapse =
|
1194 |
/*#__PURE__*/
|
@@ -1375,7 +1450,7 @@
|
|
1375 |
;
|
1376 |
|
1377 |
_proto._getConfig = function _getConfig(config) {
|
1378 |
-
config =
|
1379 |
config.toggle = Boolean(config.toggle); // Coerce string values
|
1380 |
|
1381 |
Util.typeCheckConfig(NAME$3, config, DefaultType$1);
|
@@ -1429,7 +1504,7 @@
|
|
1429 |
var $this = $(this);
|
1430 |
var data = $this.data(DATA_KEY$3);
|
1431 |
|
1432 |
-
var _config =
|
1433 |
|
1434 |
if (!data && _config.toggle && /show|hide/.test(config)) {
|
1435 |
_config.toggle = false;
|
@@ -1509,7 +1584,7 @@
|
|
1509 |
*/
|
1510 |
|
1511 |
var NAME$4 = 'dropdown';
|
1512 |
-
var VERSION$4 = '4.
|
1513 |
var DATA_KEY$4 = 'bs.dropdown';
|
1514 |
var EVENT_KEY$4 = "." + DATA_KEY$4;
|
1515 |
var DATA_API_KEY$4 = '.data-api';
|
@@ -1569,21 +1644,22 @@
|
|
1569 |
flip: true,
|
1570 |
boundary: 'scrollParent',
|
1571 |
reference: 'toggle',
|
1572 |
-
display: 'dynamic'
|
|
|
1573 |
};
|
1574 |
var DefaultType$2 = {
|
1575 |
offset: '(number|string|function)',
|
1576 |
flip: 'boolean',
|
1577 |
boundary: '(string|element)',
|
1578 |
reference: '(string|element)',
|
1579 |
-
display: 'string'
|
1580 |
-
|
1581 |
-
* ------------------------------------------------------------------------
|
1582 |
-
* Class Definition
|
1583 |
-
* ------------------------------------------------------------------------
|
1584 |
-
*/
|
1585 |
-
|
1586 |
};
|
|
|
|
|
|
|
|
|
|
|
1587 |
|
1588 |
var Dropdown =
|
1589 |
/*#__PURE__*/
|
@@ -1607,8 +1683,6 @@
|
|
1607 |
return;
|
1608 |
}
|
1609 |
|
1610 |
-
var parent = Dropdown._getParentFromElement(this._element);
|
1611 |
-
|
1612 |
var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
|
1613 |
|
1614 |
Dropdown._clearMenus();
|
@@ -1617,10 +1691,25 @@
|
|
1617 |
return;
|
1618 |
}
|
1619 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1620 |
var relatedTarget = {
|
1621 |
relatedTarget: this._element
|
1622 |
};
|
1623 |
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
|
|
|
|
|
|
1624 |
$(parent).trigger(showEvent);
|
1625 |
|
1626 |
if (showEvent.isDefaultPrevented()) {
|
@@ -1628,7 +1717,7 @@
|
|
1628 |
} // Disable totally Popper.js for Dropdown in Navbar
|
1629 |
|
1630 |
|
1631 |
-
if (!this._inNavbar) {
|
1632 |
/**
|
1633 |
* Check for Popper dependency
|
1634 |
* Popper - https://popper.js.org
|
@@ -1675,28 +1764,6 @@
|
|
1675 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
1676 |
};
|
1677 |
|
1678 |
-
_proto.show = function show() {
|
1679 |
-
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
|
1680 |
-
return;
|
1681 |
-
}
|
1682 |
-
|
1683 |
-
var relatedTarget = {
|
1684 |
-
relatedTarget: this._element
|
1685 |
-
};
|
1686 |
-
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
1687 |
-
|
1688 |
-
var parent = Dropdown._getParentFromElement(this._element);
|
1689 |
-
|
1690 |
-
$(parent).trigger(showEvent);
|
1691 |
-
|
1692 |
-
if (showEvent.isDefaultPrevented()) {
|
1693 |
-
return;
|
1694 |
-
}
|
1695 |
-
|
1696 |
-
$(this._menu).toggleClass(ClassName$4.SHOW);
|
1697 |
-
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
1698 |
-
};
|
1699 |
-
|
1700 |
_proto.hide = function hide() {
|
1701 |
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
|
1702 |
return;
|
@@ -1715,6 +1782,10 @@
|
|
1715 |
return;
|
1716 |
}
|
1717 |
|
|
|
|
|
|
|
|
|
1718 |
$(this._menu).toggleClass(ClassName$4.SHOW);
|
1719 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
1720 |
};
|
@@ -1753,7 +1824,7 @@
|
|
1753 |
};
|
1754 |
|
1755 |
_proto._getConfig = function _getConfig(config) {
|
1756 |
-
config =
|
1757 |
Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
|
1758 |
return config;
|
1759 |
};
|
@@ -1802,7 +1873,7 @@
|
|
1802 |
|
1803 |
if (typeof this._config.offset === 'function') {
|
1804 |
offset.fn = function (data) {
|
1805 |
-
data.offsets =
|
1806 |
return data;
|
1807 |
};
|
1808 |
} else {
|
@@ -1823,9 +1894,8 @@
|
|
1823 |
preventOverflow: {
|
1824 |
boundariesElement: this._config.boundary
|
1825 |
}
|
1826 |
-
}
|
1827 |
-
|
1828 |
-
};
|
1829 |
|
1830 |
if (this._config.display === 'static') {
|
1831 |
popperConfig.modifiers.applyStyle = {
|
@@ -1833,7 +1903,7 @@
|
|
1833 |
};
|
1834 |
}
|
1835 |
|
1836 |
-
return popperConfig;
|
1837 |
} // Static
|
1838 |
;
|
1839 |
|
@@ -1905,6 +1975,11 @@
|
|
1905 |
}
|
1906 |
|
1907 |
toggles[i].setAttribute('aria-expanded', 'false');
|
|
|
|
|
|
|
|
|
|
|
1908 |
$(dropdownMenu).removeClass(ClassName$4.SHOW);
|
1909 |
$(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
1910 |
}
|
@@ -1945,6 +2020,10 @@
|
|
1945 |
|
1946 |
var isActive = $(parent).hasClass(ClassName$4.SHOW);
|
1947 |
|
|
|
|
|
|
|
|
|
1948 |
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
1949 |
if (event.which === ESCAPE_KEYCODE) {
|
1950 |
var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
|
@@ -1955,7 +2034,9 @@
|
|
1955 |
return;
|
1956 |
}
|
1957 |
|
1958 |
-
var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS))
|
|
|
|
|
1959 |
|
1960 |
if (items.length === 0) {
|
1961 |
return;
|
@@ -2035,7 +2116,7 @@
|
|
2035 |
*/
|
2036 |
|
2037 |
var NAME$5 = 'modal';
|
2038 |
-
var VERSION$5 = '4.
|
2039 |
var DATA_KEY$5 = 'bs.modal';
|
2040 |
var EVENT_KEY$5 = "." + DATA_KEY$5;
|
2041 |
var DATA_API_KEY$5 = '.data-api';
|
@@ -2056,6 +2137,7 @@
|
|
2056 |
};
|
2057 |
var Event$5 = {
|
2058 |
HIDE: "hide" + EVENT_KEY$5,
|
|
|
2059 |
HIDDEN: "hidden" + EVENT_KEY$5,
|
2060 |
SHOW: "show" + EVENT_KEY$5,
|
2061 |
SHOWN: "shown" + EVENT_KEY$5,
|
@@ -2073,7 +2155,8 @@
|
|
2073 |
BACKDROP: 'modal-backdrop',
|
2074 |
OPEN: 'modal-open',
|
2075 |
FADE: 'fade',
|
2076 |
-
SHOW: 'show'
|
|
|
2077 |
};
|
2078 |
var Selector$5 = {
|
2079 |
DIALOG: '.modal-dialog',
|
@@ -2082,13 +2165,12 @@
|
|
2082 |
DATA_DISMISS: '[data-dismiss="modal"]',
|
2083 |
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
2084 |
STICKY_CONTENT: '.sticky-top'
|
2085 |
-
/**
|
2086 |
-
* ------------------------------------------------------------------------
|
2087 |
-
* Class Definition
|
2088 |
-
* ------------------------------------------------------------------------
|
2089 |
-
*/
|
2090 |
-
|
2091 |
};
|
|
|
|
|
|
|
|
|
|
|
2092 |
|
2093 |
var Modal =
|
2094 |
/*#__PURE__*/
|
@@ -2234,15 +2316,40 @@
|
|
2234 |
;
|
2235 |
|
2236 |
_proto._getConfig = function _getConfig(config) {
|
2237 |
-
config =
|
2238 |
Util.typeCheckConfig(NAME$5, config, DefaultType$3);
|
2239 |
return config;
|
2240 |
};
|
2241 |
|
2242 |
-
_proto.
|
2243 |
var _this3 = this;
|
2244 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2245 |
var transition = $(this._element).hasClass(ClassName$5.FADE);
|
|
|
2246 |
|
2247 |
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
2248 |
// Don't move modal's DOM position
|
@@ -2255,8 +2362,8 @@
|
|
2255 |
|
2256 |
this._element.setAttribute('aria-modal', true);
|
2257 |
|
2258 |
-
if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {
|
2259 |
-
|
2260 |
} else {
|
2261 |
this._element.scrollTop = 0;
|
2262 |
}
|
@@ -2276,12 +2383,12 @@
|
|
2276 |
});
|
2277 |
|
2278 |
var transitionComplete = function transitionComplete() {
|
2279 |
-
if (
|
2280 |
-
|
2281 |
}
|
2282 |
|
2283 |
-
|
2284 |
-
$(
|
2285 |
};
|
2286 |
|
2287 |
if (transition) {
|
@@ -2293,25 +2400,23 @@
|
|
2293 |
};
|
2294 |
|
2295 |
_proto._enforceFocus = function _enforceFocus() {
|
2296 |
-
var
|
2297 |
|
2298 |
$(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
|
2299 |
.on(Event$5.FOCUSIN, function (event) {
|
2300 |
-
if (document !== event.target &&
|
2301 |
-
|
2302 |
}
|
2303 |
});
|
2304 |
};
|
2305 |
|
2306 |
_proto._setEscapeEvent = function _setEscapeEvent() {
|
2307 |
-
var
|
2308 |
|
2309 |
if (this._isShown && this._config.keyboard) {
|
2310 |
$(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
|
2311 |
if (event.which === ESCAPE_KEYCODE$1) {
|
2312 |
-
|
2313 |
-
|
2314 |
-
_this5.hide();
|
2315 |
}
|
2316 |
});
|
2317 |
} else if (!this._isShown) {
|
@@ -2320,11 +2425,11 @@
|
|
2320 |
};
|
2321 |
|
2322 |
_proto._setResizeEvent = function _setResizeEvent() {
|
2323 |
-
var
|
2324 |
|
2325 |
if (this._isShown) {
|
2326 |
$(window).on(Event$5.RESIZE, function (event) {
|
2327 |
-
return
|
2328 |
});
|
2329 |
} else {
|
2330 |
$(window).off(Event$5.RESIZE);
|
@@ -2332,7 +2437,7 @@
|
|
2332 |
};
|
2333 |
|
2334 |
_proto._hideModal = function _hideModal() {
|
2335 |
-
var
|
2336 |
|
2337 |
this._element.style.display = 'none';
|
2338 |
|
@@ -2345,11 +2450,11 @@
|
|
2345 |
this._showBackdrop(function () {
|
2346 |
$(document.body).removeClass(ClassName$5.OPEN);
|
2347 |
|
2348 |
-
|
2349 |
|
2350 |
-
|
2351 |
|
2352 |
-
$(
|
2353 |
});
|
2354 |
};
|
2355 |
|
@@ -2361,7 +2466,7 @@
|
|
2361 |
};
|
2362 |
|
2363 |
_proto._showBackdrop = function _showBackdrop(callback) {
|
2364 |
-
var
|
2365 |
|
2366 |
var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
|
2367 |
|
@@ -2375,8 +2480,8 @@
|
|
2375 |
|
2376 |
$(this._backdrop).appendTo(document.body);
|
2377 |
$(this._element).on(Event$5.CLICK_DISMISS, function (event) {
|
2378 |
-
if (
|
2379 |
-
|
2380 |
return;
|
2381 |
}
|
2382 |
|
@@ -2384,11 +2489,7 @@
|
|
2384 |
return;
|
2385 |
}
|
2386 |
|
2387 |
-
|
2388 |
-
_this8._element.focus();
|
2389 |
-
} else {
|
2390 |
-
_this8.hide();
|
2391 |
-
}
|
2392 |
});
|
2393 |
|
2394 |
if (animate) {
|
@@ -2412,7 +2513,7 @@
|
|
2412 |
$(this._backdrop).removeClass(ClassName$5.SHOW);
|
2413 |
|
2414 |
var callbackRemove = function callbackRemove() {
|
2415 |
-
|
2416 |
|
2417 |
if (callback) {
|
2418 |
callback();
|
@@ -2459,7 +2560,7 @@
|
|
2459 |
};
|
2460 |
|
2461 |
_proto._setScrollbar = function _setScrollbar() {
|
2462 |
-
var
|
2463 |
|
2464 |
if (this._isBodyOverflowing) {
|
2465 |
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
@@ -2470,13 +2571,13 @@
|
|
2470 |
$(fixedContent).each(function (index, element) {
|
2471 |
var actualPadding = element.style.paddingRight;
|
2472 |
var calculatedPadding = $(element).css('padding-right');
|
2473 |
-
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) +
|
2474 |
}); // Adjust sticky content margin
|
2475 |
|
2476 |
$(stickyContent).each(function (index, element) {
|
2477 |
var actualMargin = element.style.marginRight;
|
2478 |
var calculatedMargin = $(element).css('margin-right');
|
2479 |
-
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) -
|
2480 |
}); // Adjust body padding
|
2481 |
|
2482 |
var actualPadding = document.body.style.paddingRight;
|
@@ -2525,7 +2626,7 @@
|
|
2525 |
return this.each(function () {
|
2526 |
var data = $(this).data(DATA_KEY$5);
|
2527 |
|
2528 |
-
var _config =
|
2529 |
|
2530 |
if (!data) {
|
2531 |
data = new Modal(this, _config);
|
@@ -2566,7 +2667,7 @@
|
|
2566 |
|
2567 |
|
2568 |
$(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
|
2569 |
-
var
|
2570 |
|
2571 |
var target;
|
2572 |
var selector = Util.getSelectorFromElement(this);
|
@@ -2575,7 +2676,7 @@
|
|
2575 |
target = document.querySelector(selector);
|
2576 |
}
|
2577 |
|
2578 |
-
var config = $(target).data(DATA_KEY$5) ? 'toggle' :
|
2579 |
|
2580 |
if (this.tagName === 'A' || this.tagName === 'AREA') {
|
2581 |
event.preventDefault();
|
@@ -2588,8 +2689,8 @@
|
|
2588 |
}
|
2589 |
|
2590 |
$target.one(Event$5.HIDDEN, function () {
|
2591 |
-
if ($(
|
2592 |
-
|
2593 |
}
|
2594 |
});
|
2595 |
});
|
@@ -2612,7 +2713,7 @@
|
|
2612 |
|
2613 |
/**
|
2614 |
* --------------------------------------------------------------------------
|
2615 |
-
* Bootstrap (v4.
|
2616 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
2617 |
* --------------------------------------------------------------------------
|
2618 |
*/
|
@@ -2650,13 +2751,13 @@
|
|
2650 |
strong: [],
|
2651 |
u: [],
|
2652 |
ul: []
|
2653 |
-
/**
|
2654 |
-
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
2655 |
-
*
|
2656 |
-
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
2657 |
-
*/
|
2658 |
-
|
2659 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2660 |
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
|
2661 |
/**
|
2662 |
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
@@ -2723,7 +2824,7 @@
|
|
2723 |
};
|
2724 |
|
2725 |
for (var i = 0, len = elements.length; i < len; i++) {
|
2726 |
-
var _ret = _loop(i
|
2727 |
|
2728 |
if (_ret === "continue") continue;
|
2729 |
}
|
@@ -2738,7 +2839,7 @@
|
|
2738 |
*/
|
2739 |
|
2740 |
var NAME$6 = 'tooltip';
|
2741 |
-
var VERSION$6 = '4.
|
2742 |
var DATA_KEY$6 = 'bs.tooltip';
|
2743 |
var EVENT_KEY$6 = "." + DATA_KEY$6;
|
2744 |
var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
|
@@ -2760,7 +2861,8 @@
|
|
2760 |
boundary: '(string|element)',
|
2761 |
sanitize: 'boolean',
|
2762 |
sanitizeFn: '(null|function)',
|
2763 |
-
whiteList: 'object'
|
|
|
2764 |
};
|
2765 |
var AttachmentMap$1 = {
|
2766 |
AUTO: 'auto',
|
@@ -2784,7 +2886,8 @@
|
|
2784 |
boundary: 'scrollParent',
|
2785 |
sanitize: true,
|
2786 |
sanitizeFn: null,
|
2787 |
-
whiteList: DefaultWhitelist
|
|
|
2788 |
};
|
2789 |
var HoverState = {
|
2790 |
SHOW: 'show',
|
@@ -2816,22 +2919,17 @@
|
|
2816 |
FOCUS: 'focus',
|
2817 |
CLICK: 'click',
|
2818 |
MANUAL: 'manual'
|
2819 |
-
/**
|
2820 |
-
* ------------------------------------------------------------------------
|
2821 |
-
* Class Definition
|
2822 |
-
* ------------------------------------------------------------------------
|
2823 |
-
*/
|
2824 |
-
|
2825 |
};
|
|
|
|
|
|
|
|
|
|
|
2826 |
|
2827 |
var Tooltip =
|
2828 |
/*#__PURE__*/
|
2829 |
function () {
|
2830 |
function Tooltip(element, config) {
|
2831 |
-
/**
|
2832 |
-
* Check for Popper dependency
|
2833 |
-
* Popper - https://popper.js.org
|
2834 |
-
*/
|
2835 |
if (typeof Popper === 'undefined') {
|
2836 |
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
|
2837 |
} // private
|
@@ -2902,7 +3000,7 @@
|
|
2902 |
clearTimeout(this._timeout);
|
2903 |
$.removeData(this.element, this.constructor.DATA_KEY);
|
2904 |
$(this.element).off(this.constructor.EVENT_KEY);
|
2905 |
-
$(this.element).closest('.modal').off('hide.bs.modal');
|
2906 |
|
2907 |
if (this.tip) {
|
2908 |
$(this.tip).remove();
|
@@ -2913,7 +3011,7 @@
|
|
2913 |
this._hoverState = null;
|
2914 |
this._activeTrigger = null;
|
2915 |
|
2916 |
-
if (this._popper
|
2917 |
this._popper.destroy();
|
2918 |
}
|
2919 |
|
@@ -2966,29 +3064,7 @@
|
|
2966 |
}
|
2967 |
|
2968 |
$(this.element).trigger(this.constructor.Event.INSERTED);
|
2969 |
-
this._popper = new Popper(this.element, tip,
|
2970 |
-
placement: attachment,
|
2971 |
-
modifiers: {
|
2972 |
-
offset: this._getOffset(),
|
2973 |
-
flip: {
|
2974 |
-
behavior: this.config.fallbackPlacement
|
2975 |
-
},
|
2976 |
-
arrow: {
|
2977 |
-
element: Selector$6.ARROW
|
2978 |
-
},
|
2979 |
-
preventOverflow: {
|
2980 |
-
boundariesElement: this.config.boundary
|
2981 |
-
}
|
2982 |
-
},
|
2983 |
-
onCreate: function onCreate(data) {
|
2984 |
-
if (data.originalPlacement !== data.placement) {
|
2985 |
-
_this._handlePopperPlacementChange(data);
|
2986 |
-
}
|
2987 |
-
},
|
2988 |
-
onUpdate: function onUpdate(data) {
|
2989 |
-
return _this._handlePopperPlacementChange(data);
|
2990 |
-
}
|
2991 |
-
});
|
2992 |
$(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
|
2993 |
// empty mouseover listeners to the body's immediate children;
|
2994 |
// only needed because of broken event delegation on iOS
|
@@ -3136,14 +3212,43 @@
|
|
3136 |
} // Private
|
3137 |
;
|
3138 |
|
3139 |
-
_proto.
|
3140 |
var _this3 = this;
|
3141 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3142 |
var offset = {};
|
3143 |
|
3144 |
if (typeof this.config.offset === 'function') {
|
3145 |
offset.fn = function (data) {
|
3146 |
-
data.offsets =
|
3147 |
return data;
|
3148 |
};
|
3149 |
} else {
|
@@ -3170,32 +3275,35 @@
|
|
3170 |
};
|
3171 |
|
3172 |
_proto._setListeners = function _setListeners() {
|
3173 |
-
var
|
3174 |
|
3175 |
var triggers = this.config.trigger.split(' ');
|
3176 |
triggers.forEach(function (trigger) {
|
3177 |
if (trigger === 'click') {
|
3178 |
-
$(
|
3179 |
-
return
|
3180 |
});
|
3181 |
} else if (trigger !== Trigger.MANUAL) {
|
3182 |
-
var eventIn = trigger === Trigger.HOVER ?
|
3183 |
-
var eventOut = trigger === Trigger.HOVER ?
|
3184 |
-
$(
|
3185 |
-
return
|
3186 |
-
}).on(eventOut,
|
3187 |
-
return
|
3188 |
});
|
3189 |
}
|
3190 |
});
|
3191 |
-
|
3192 |
-
|
3193 |
-
|
|
|
3194 |
}
|
3195 |
-
}
|
|
|
|
|
3196 |
|
3197 |
if (this.config.selector) {
|
3198 |
-
this.config =
|
3199 |
trigger: 'manual',
|
3200 |
selector: ''
|
3201 |
});
|
@@ -3295,7 +3403,7 @@
|
|
3295 |
delete dataAttributes[dataAttr];
|
3296 |
}
|
3297 |
});
|
3298 |
-
config =
|
3299 |
|
3300 |
if (typeof config.delay === 'number') {
|
3301 |
config.delay = {
|
@@ -3455,21 +3563,21 @@
|
|
3455 |
*/
|
3456 |
|
3457 |
var NAME$7 = 'popover';
|
3458 |
-
var VERSION$7 = '4.
|
3459 |
var DATA_KEY$7 = 'bs.popover';
|
3460 |
var EVENT_KEY$7 = "." + DATA_KEY$7;
|
3461 |
var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
|
3462 |
var CLASS_PREFIX$1 = 'bs-popover';
|
3463 |
var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
|
3464 |
|
3465 |
-
var Default$5 =
|
3466 |
placement: 'right',
|
3467 |
trigger: 'click',
|
3468 |
content: '',
|
3469 |
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
|
3470 |
});
|
3471 |
|
3472 |
-
var DefaultType$5 =
|
3473 |
content: '(string|element|function)'
|
3474 |
});
|
3475 |
|
@@ -3492,13 +3600,12 @@
|
|
3492 |
FOCUSOUT: "focusout" + EVENT_KEY$7,
|
3493 |
MOUSEENTER: "mouseenter" + EVENT_KEY$7,
|
3494 |
MOUSELEAVE: "mouseleave" + EVENT_KEY$7
|
3495 |
-
/**
|
3496 |
-
* ------------------------------------------------------------------------
|
3497 |
-
* Class Definition
|
3498 |
-
* ------------------------------------------------------------------------
|
3499 |
-
*/
|
3500 |
-
|
3501 |
};
|
|
|
|
|
|
|
|
|
|
|
3502 |
|
3503 |
var Popover =
|
3504 |
/*#__PURE__*/
|
@@ -3642,7 +3749,7 @@
|
|
3642 |
*/
|
3643 |
|
3644 |
var NAME$8 = 'scrollspy';
|
3645 |
-
var VERSION$8 = '4.
|
3646 |
var DATA_KEY$8 = 'bs.scrollspy';
|
3647 |
var EVENT_KEY$8 = "." + DATA_KEY$8;
|
3648 |
var DATA_API_KEY$6 = '.data-api';
|
@@ -3681,13 +3788,12 @@
|
|
3681 |
var OffsetMethod = {
|
3682 |
OFFSET: 'offset',
|
3683 |
POSITION: 'position'
|
3684 |
-
/**
|
3685 |
-
* ------------------------------------------------------------------------
|
3686 |
-
* Class Definition
|
3687 |
-
* ------------------------------------------------------------------------
|
3688 |
-
*/
|
3689 |
-
|
3690 |
};
|
|
|
|
|
|
|
|
|
|
|
3691 |
|
3692 |
var ScrollSpy =
|
3693 |
/*#__PURE__*/
|
@@ -3769,7 +3875,7 @@
|
|
3769 |
;
|
3770 |
|
3771 |
_proto._getConfig = function _getConfig(config) {
|
3772 |
-
config =
|
3773 |
|
3774 |
if (typeof config.target !== 'string') {
|
3775 |
var id = $(config.target).attr('id');
|
@@ -3949,7 +4055,7 @@
|
|
3949 |
*/
|
3950 |
|
3951 |
var NAME$9 = 'tab';
|
3952 |
-
var VERSION$9 = '4.
|
3953 |
var DATA_KEY$9 = 'bs.tab';
|
3954 |
var EVENT_KEY$9 = "." + DATA_KEY$9;
|
3955 |
var DATA_API_KEY$7 = '.data-api';
|
@@ -3976,13 +4082,12 @@
|
|
3976 |
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
|
3977 |
DROPDOWN_TOGGLE: '.dropdown-toggle',
|
3978 |
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
3979 |
-
/**
|
3980 |
-
* ------------------------------------------------------------------------
|
3981 |
-
* Class Definition
|
3982 |
-
* ------------------------------------------------------------------------
|
3983 |
-
*/
|
3984 |
-
|
3985 |
};
|
|
|
|
|
|
|
|
|
|
|
3986 |
|
3987 |
var Tab =
|
3988 |
/*#__PURE__*/
|
@@ -4184,7 +4289,7 @@
|
|
4184 |
*/
|
4185 |
|
4186 |
var NAME$a = 'toast';
|
4187 |
-
var VERSION$a = '4.
|
4188 |
var DATA_KEY$a = 'bs.toast';
|
4189 |
var EVENT_KEY$a = "." + DATA_KEY$a;
|
4190 |
var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
|
@@ -4213,13 +4318,12 @@
|
|
4213 |
};
|
4214 |
var Selector$a = {
|
4215 |
DATA_DISMISS: '[data-dismiss="toast"]'
|
4216 |
-
/**
|
4217 |
-
* ------------------------------------------------------------------------
|
4218 |
-
* Class Definition
|
4219 |
-
* ------------------------------------------------------------------------
|
4220 |
-
*/
|
4221 |
-
|
4222 |
};
|
|
|
|
|
|
|
|
|
|
|
4223 |
|
4224 |
var Toast =
|
4225 |
/*#__PURE__*/
|
@@ -4239,7 +4343,12 @@
|
|
4239 |
_proto.show = function show() {
|
4240 |
var _this = this;
|
4241 |
|
4242 |
-
|
|
|
|
|
|
|
|
|
|
|
4243 |
|
4244 |
if (this._config.animation) {
|
4245 |
this._element.classList.add(ClassName$a.FADE);
|
@@ -4253,12 +4362,16 @@
|
|
4253 |
$(_this._element).trigger(Event$a.SHOWN);
|
4254 |
|
4255 |
if (_this._config.autohide) {
|
4256 |
-
_this.
|
|
|
|
|
4257 |
}
|
4258 |
};
|
4259 |
|
4260 |
this._element.classList.remove(ClassName$a.HIDE);
|
4261 |
|
|
|
|
|
4262 |
this._element.classList.add(ClassName$a.SHOWING);
|
4263 |
|
4264 |
if (this._config.animation) {
|
@@ -4269,22 +4382,19 @@
|
|
4269 |
}
|
4270 |
};
|
4271 |
|
4272 |
-
_proto.hide = function hide(
|
4273 |
-
var _this2 = this;
|
4274 |
-
|
4275 |
if (!this._element.classList.contains(ClassName$a.SHOW)) {
|
4276 |
return;
|
4277 |
}
|
4278 |
|
4279 |
-
|
|
|
4280 |
|
4281 |
-
if (
|
4282 |
-
|
4283 |
-
} else {
|
4284 |
-
this._timeout = setTimeout(function () {
|
4285 |
-
_this2._close();
|
4286 |
-
}, this._config.delay);
|
4287 |
}
|
|
|
|
|
4288 |
};
|
4289 |
|
4290 |
_proto.dispose = function dispose() {
|
@@ -4303,26 +4413,26 @@
|
|
4303 |
;
|
4304 |
|
4305 |
_proto._getConfig = function _getConfig(config) {
|
4306 |
-
config =
|
4307 |
Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
|
4308 |
return config;
|
4309 |
};
|
4310 |
|
4311 |
_proto._setListeners = function _setListeners() {
|
4312 |
-
var
|
4313 |
|
4314 |
$(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
|
4315 |
-
return
|
4316 |
});
|
4317 |
};
|
4318 |
|
4319 |
_proto._close = function _close() {
|
4320 |
-
var
|
4321 |
|
4322 |
var complete = function complete() {
|
4323 |
-
|
4324 |
|
4325 |
-
$(
|
4326 |
};
|
4327 |
|
4328 |
this._element.classList.remove(ClassName$a.SHOW);
|
@@ -4392,31 +4502,6 @@
|
|
4392 |
return Toast._jQueryInterface;
|
4393 |
};
|
4394 |
|
4395 |
-
/**
|
4396 |
-
* --------------------------------------------------------------------------
|
4397 |
-
* Bootstrap (v4.3.1): index.js
|
4398 |
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
4399 |
-
* --------------------------------------------------------------------------
|
4400 |
-
*/
|
4401 |
-
|
4402 |
-
(function () {
|
4403 |
-
if (typeof $ === 'undefined') {
|
4404 |
-
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
|
4405 |
-
}
|
4406 |
-
|
4407 |
-
var version = $.fn.jquery.split(' ')[0].split('.');
|
4408 |
-
var minMajor = 1;
|
4409 |
-
var ltMajor = 2;
|
4410 |
-
var minMinor = 9;
|
4411 |
-
var minPatch = 1;
|
4412 |
-
var maxMajor = 4;
|
4413 |
-
|
4414 |
-
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
|
4415 |
-
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
|
4416 |
-
}
|
4417 |
-
})();
|
4418 |
-
|
4419 |
-
exports.Util = Util;
|
4420 |
exports.Alert = Alert;
|
4421 |
exports.Button = Button;
|
4422 |
exports.Carousel = Carousel;
|
@@ -4428,8 +4513,9 @@
|
|
4428 |
exports.Tab = Tab;
|
4429 |
exports.Toast = Toast;
|
4430 |
exports.Tooltip = Tooltip;
|
|
|
4431 |
|
4432 |
Object.defineProperty(exports, '__esModule', { value: true });
|
4433 |
|
4434 |
-
}));
|
4435 |
//# sourceMappingURL=bootstrap.js.map
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
7 |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :
|
8 |
typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
|
9 |
(global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));
|
10 |
+
}(this, (function (exports, $, Popper) { 'use strict';
|
11 |
|
12 |
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;
|
13 |
Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
|
43 |
return obj;
|
44 |
}
|
45 |
|
46 |
+
function ownKeys(object, enumerableOnly) {
|
47 |
+
var keys = Object.keys(object);
|
48 |
+
|
49 |
+
if (Object.getOwnPropertySymbols) {
|
50 |
+
var symbols = Object.getOwnPropertySymbols(object);
|
51 |
+
if (enumerableOnly) symbols = symbols.filter(function (sym) {
|
52 |
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
53 |
+
});
|
54 |
+
keys.push.apply(keys, symbols);
|
55 |
+
}
|
56 |
+
|
57 |
+
return keys;
|
58 |
+
}
|
59 |
+
|
60 |
+
function _objectSpread2(target) {
|
61 |
for (var i = 1; i < arguments.length; i++) {
|
62 |
var source = arguments[i] != null ? arguments[i] : {};
|
|
|
63 |
|
64 |
+
if (i % 2) {
|
65 |
+
ownKeys(Object(source), true).forEach(function (key) {
|
66 |
+
_defineProperty(target, key, source[key]);
|
67 |
+
});
|
68 |
+
} else if (Object.getOwnPropertyDescriptors) {
|
69 |
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
70 |
+
} else {
|
71 |
+
ownKeys(Object(source)).forEach(function (key) {
|
72 |
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
73 |
+
});
|
74 |
}
|
|
|
|
|
|
|
|
|
75 |
}
|
76 |
|
77 |
return target;
|
85 |
|
86 |
/**
|
87 |
* --------------------------------------------------------------------------
|
88 |
+
* Bootstrap (v4.4.1): util.js
|
89 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
90 |
* --------------------------------------------------------------------------
|
91 |
*/
|
234 |
}
|
235 |
|
236 |
return Util.findShadowRoot(element.parentNode);
|
237 |
+
},
|
238 |
+
jQueryDetection: function jQueryDetection() {
|
239 |
+
if (typeof $ === 'undefined') {
|
240 |
+
throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
|
241 |
+
}
|
242 |
+
|
243 |
+
var version = $.fn.jquery.split(' ')[0].split('.');
|
244 |
+
var minMajor = 1;
|
245 |
+
var ltMajor = 2;
|
246 |
+
var minMinor = 9;
|
247 |
+
var minPatch = 1;
|
248 |
+
var maxMajor = 4;
|
249 |
+
|
250 |
+
if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
|
251 |
+
throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
|
252 |
+
}
|
253 |
}
|
254 |
};
|
255 |
+
Util.jQueryDetection();
|
256 |
setTransitionEndSupport();
|
257 |
|
258 |
/**
|
262 |
*/
|
263 |
|
264 |
var NAME = 'alert';
|
265 |
+
var VERSION = '4.4.1';
|
266 |
var DATA_KEY = 'bs.alert';
|
267 |
var EVENT_KEY = "." + DATA_KEY;
|
268 |
var DATA_API_KEY = '.data-api';
|
279 |
ALERT: 'alert',
|
280 |
FADE: 'fade',
|
281 |
SHOW: 'show'
|
|
|
|
|
|
|
|
|
|
|
|
|
282 |
};
|
283 |
+
/**
|
284 |
+
* ------------------------------------------------------------------------
|
285 |
+
* Class Definition
|
286 |
+
* ------------------------------------------------------------------------
|
287 |
+
*/
|
288 |
|
289 |
var Alert =
|
290 |
/*#__PURE__*/
|
426 |
*/
|
427 |
|
428 |
var NAME$1 = 'button';
|
429 |
+
var VERSION$1 = '4.4.1';
|
430 |
var DATA_KEY$1 = 'bs.button';
|
431 |
var EVENT_KEY$1 = "." + DATA_KEY$1;
|
432 |
var DATA_API_KEY$1 = '.data-api';
|
438 |
};
|
439 |
var Selector$1 = {
|
440 |
DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
|
441 |
+
DATA_TOGGLES: '[data-toggle="buttons"]',
|
442 |
+
DATA_TOGGLE: '[data-toggle="button"]',
|
443 |
+
DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
|
444 |
INPUT: 'input:not([type="hidden"])',
|
445 |
ACTIVE: '.active',
|
446 |
BUTTON: '.btn'
|
447 |
};
|
448 |
var Event$1 = {
|
449 |
CLICK_DATA_API: "click" + EVENT_KEY$1 + DATA_API_KEY$1,
|
450 |
+
FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1),
|
451 |
+
LOAD_DATA_API: "load" + EVENT_KEY$1 + DATA_API_KEY$1
|
|
|
|
|
|
|
|
|
|
|
452 |
};
|
453 |
+
/**
|
454 |
+
* ------------------------------------------------------------------------
|
455 |
+
* Class Definition
|
456 |
+
* ------------------------------------------------------------------------
|
457 |
+
*/
|
458 |
|
459 |
var Button =
|
460 |
/*#__PURE__*/
|
470 |
_proto.toggle = function toggle() {
|
471 |
var triggerChangeEvent = true;
|
472 |
var addAriaPressed = true;
|
473 |
+
var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLES)[0];
|
474 |
|
475 |
if (rootElement) {
|
476 |
var input = this._element.querySelector(Selector$1.INPUT);
|
486 |
$(activeElement).removeClass(ClassName$1.ACTIVE);
|
487 |
}
|
488 |
}
|
489 |
+
} else if (input.type === 'checkbox') {
|
490 |
+
if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName$1.ACTIVE)) {
|
491 |
+
triggerChangeEvent = false;
|
492 |
+
}
|
493 |
+
} else {
|
494 |
+
// if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
|
495 |
+
triggerChangeEvent = false;
|
496 |
}
|
497 |
|
498 |
if (triggerChangeEvent) {
|
|
|
|
|
|
|
|
|
499 |
input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);
|
500 |
$(input).trigger('change');
|
501 |
}
|
505 |
}
|
506 |
}
|
507 |
|
508 |
+
if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
|
509 |
+
if (addAriaPressed) {
|
510 |
+
this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));
|
511 |
+
}
|
512 |
|
513 |
+
if (triggerChangeEvent) {
|
514 |
+
$(this._element).toggleClass(ClassName$1.ACTIVE);
|
515 |
+
}
|
516 |
}
|
517 |
};
|
518 |
|
554 |
|
555 |
|
556 |
$(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
|
|
557 |
var button = event.target;
|
558 |
|
559 |
if (!$(button).hasClass(ClassName$1.BUTTON)) {
|
560 |
+
button = $(button).closest(Selector$1.BUTTON)[0];
|
561 |
}
|
562 |
|
563 |
+
if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
|
564 |
+
event.preventDefault(); // work around Firefox bug #1540995
|
565 |
+
} else {
|
566 |
+
var inputBtn = button.querySelector(Selector$1.INPUT);
|
567 |
+
|
568 |
+
if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
|
569 |
+
event.preventDefault(); // work around Firefox bug #1540995
|
570 |
+
|
571 |
+
return;
|
572 |
+
}
|
573 |
+
|
574 |
+
Button._jQueryInterface.call($(button), 'toggle');
|
575 |
+
}
|
576 |
}).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {
|
577 |
var button = $(event.target).closest(Selector$1.BUTTON)[0];
|
578 |
$(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));
|
579 |
});
|
580 |
+
$(window).on(Event$1.LOAD_DATA_API, function () {
|
581 |
+
// ensure correct active class is set to match the controls' actual values/states
|
582 |
+
// find all checkboxes/readio buttons inside data-toggle groups
|
583 |
+
var buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLES_BUTTONS));
|
584 |
+
|
585 |
+
for (var i = 0, len = buttons.length; i < len; i++) {
|
586 |
+
var button = buttons[i];
|
587 |
+
var input = button.querySelector(Selector$1.INPUT);
|
588 |
+
|
589 |
+
if (input.checked || input.hasAttribute('checked')) {
|
590 |
+
button.classList.add(ClassName$1.ACTIVE);
|
591 |
+
} else {
|
592 |
+
button.classList.remove(ClassName$1.ACTIVE);
|
593 |
+
}
|
594 |
+
} // find all button toggles
|
595 |
+
|
596 |
+
|
597 |
+
buttons = [].slice.call(document.querySelectorAll(Selector$1.DATA_TOGGLE));
|
598 |
+
|
599 |
+
for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
|
600 |
+
var _button = buttons[_i];
|
601 |
+
|
602 |
+
if (_button.getAttribute('aria-pressed') === 'true') {
|
603 |
+
_button.classList.add(ClassName$1.ACTIVE);
|
604 |
+
} else {
|
605 |
+
_button.classList.remove(ClassName$1.ACTIVE);
|
606 |
+
}
|
607 |
+
}
|
608 |
+
});
|
609 |
/**
|
610 |
* ------------------------------------------------------------------------
|
611 |
* jQuery
|
627 |
*/
|
628 |
|
629 |
var NAME$2 = 'carousel';
|
630 |
+
var VERSION$2 = '4.4.1';
|
631 |
var DATA_KEY$2 = 'bs.carousel';
|
632 |
var EVENT_KEY$2 = "." + DATA_KEY$2;
|
633 |
var DATA_API_KEY$2 = '.data-api';
|
700 |
var PointerType = {
|
701 |
TOUCH: 'touch',
|
702 |
PEN: 'pen'
|
|
|
|
|
|
|
|
|
|
|
|
|
703 |
};
|
704 |
+
/**
|
705 |
+
* ------------------------------------------------------------------------
|
706 |
+
* Class Definition
|
707 |
+
* ------------------------------------------------------------------------
|
708 |
+
*/
|
709 |
|
710 |
var Carousel =
|
711 |
/*#__PURE__*/
|
825 |
;
|
826 |
|
827 |
_proto._getConfig = function _getConfig(config) {
|
828 |
+
config = _objectSpread2({}, Default, {}, config);
|
829 |
Util.typeCheckConfig(NAME$2, config, DefaultType);
|
830 |
return config;
|
831 |
};
|
837 |
return;
|
838 |
}
|
839 |
|
840 |
+
var direction = absDeltax / this.touchDeltaX;
|
841 |
+
this.touchDeltaX = 0; // swipe left
|
842 |
|
843 |
if (direction > 0) {
|
844 |
this.prev();
|
964 |
event.preventDefault();
|
965 |
this.next();
|
966 |
break;
|
|
|
|
|
967 |
}
|
968 |
};
|
969 |
|
1115 |
return this.each(function () {
|
1116 |
var data = $(this).data(DATA_KEY$2);
|
1117 |
|
1118 |
+
var _config = _objectSpread2({}, Default, {}, $(this).data());
|
1119 |
|
1120 |
if (typeof config === 'object') {
|
1121 |
+
_config = _objectSpread2({}, _config, {}, config);
|
1122 |
}
|
1123 |
|
1124 |
var action = typeof config === 'string' ? config : _config.slide;
|
1156 |
return;
|
1157 |
}
|
1158 |
|
1159 |
+
var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
|
1160 |
|
1161 |
var slideIndex = this.getAttribute('data-slide-to');
|
1162 |
|
1225 |
*/
|
1226 |
|
1227 |
var NAME$3 = 'collapse';
|
1228 |
+
var VERSION$3 = '4.4.1';
|
1229 |
var DATA_KEY$3 = 'bs.collapse';
|
1230 |
var EVENT_KEY$3 = "." + DATA_KEY$3;
|
1231 |
var DATA_API_KEY$3 = '.data-api';
|
1258 |
var Selector$3 = {
|
1259 |
ACTIVES: '.show, .collapsing',
|
1260 |
DATA_TOGGLE: '[data-toggle="collapse"]'
|
|
|
|
|
|
|
|
|
|
|
|
|
1261 |
};
|
1262 |
+
/**
|
1263 |
+
* ------------------------------------------------------------------------
|
1264 |
+
* Class Definition
|
1265 |
+
* ------------------------------------------------------------------------
|
1266 |
+
*/
|
1267 |
|
1268 |
var Collapse =
|
1269 |
/*#__PURE__*/
|
1450 |
;
|
1451 |
|
1452 |
_proto._getConfig = function _getConfig(config) {
|
1453 |
+
config = _objectSpread2({}, Default$1, {}, config);
|
1454 |
config.toggle = Boolean(config.toggle); // Coerce string values
|
1455 |
|
1456 |
Util.typeCheckConfig(NAME$3, config, DefaultType$1);
|
1504 |
var $this = $(this);
|
1505 |
var data = $this.data(DATA_KEY$3);
|
1506 |
|
1507 |
+
var _config = _objectSpread2({}, Default$1, {}, $this.data(), {}, typeof config === 'object' && config ? config : {});
|
1508 |
|
1509 |
if (!data && _config.toggle && /show|hide/.test(config)) {
|
1510 |
_config.toggle = false;
|
1584 |
*/
|
1585 |
|
1586 |
var NAME$4 = 'dropdown';
|
1587 |
+
var VERSION$4 = '4.4.1';
|
1588 |
var DATA_KEY$4 = 'bs.dropdown';
|
1589 |
var EVENT_KEY$4 = "." + DATA_KEY$4;
|
1590 |
var DATA_API_KEY$4 = '.data-api';
|
1644 |
flip: true,
|
1645 |
boundary: 'scrollParent',
|
1646 |
reference: 'toggle',
|
1647 |
+
display: 'dynamic',
|
1648 |
+
popperConfig: null
|
1649 |
};
|
1650 |
var DefaultType$2 = {
|
1651 |
offset: '(number|string|function)',
|
1652 |
flip: 'boolean',
|
1653 |
boundary: '(string|element)',
|
1654 |
reference: '(string|element)',
|
1655 |
+
display: 'string',
|
1656 |
+
popperConfig: '(null|object)'
|
|
|
|
|
|
|
|
|
|
|
1657 |
};
|
1658 |
+
/**
|
1659 |
+
* ------------------------------------------------------------------------
|
1660 |
+
* Class Definition
|
1661 |
+
* ------------------------------------------------------------------------
|
1662 |
+
*/
|
1663 |
|
1664 |
var Dropdown =
|
1665 |
/*#__PURE__*/
|
1683 |
return;
|
1684 |
}
|
1685 |
|
|
|
|
|
1686 |
var isActive = $(this._menu).hasClass(ClassName$4.SHOW);
|
1687 |
|
1688 |
Dropdown._clearMenus();
|
1691 |
return;
|
1692 |
}
|
1693 |
|
1694 |
+
this.show(true);
|
1695 |
+
};
|
1696 |
+
|
1697 |
+
_proto.show = function show(usePopper) {
|
1698 |
+
if (usePopper === void 0) {
|
1699 |
+
usePopper = false;
|
1700 |
+
}
|
1701 |
+
|
1702 |
+
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {
|
1703 |
+
return;
|
1704 |
+
}
|
1705 |
+
|
1706 |
var relatedTarget = {
|
1707 |
relatedTarget: this._element
|
1708 |
};
|
1709 |
var showEvent = $.Event(Event$4.SHOW, relatedTarget);
|
1710 |
+
|
1711 |
+
var parent = Dropdown._getParentFromElement(this._element);
|
1712 |
+
|
1713 |
$(parent).trigger(showEvent);
|
1714 |
|
1715 |
if (showEvent.isDefaultPrevented()) {
|
1717 |
} // Disable totally Popper.js for Dropdown in Navbar
|
1718 |
|
1719 |
|
1720 |
+
if (!this._inNavbar && usePopper) {
|
1721 |
/**
|
1722 |
* Check for Popper dependency
|
1723 |
* Popper - https://popper.js.org
|
1764 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));
|
1765 |
};
|
1766 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1767 |
_proto.hide = function hide() {
|
1768 |
if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {
|
1769 |
return;
|
1782 |
return;
|
1783 |
}
|
1784 |
|
1785 |
+
if (this._popper) {
|
1786 |
+
this._popper.destroy();
|
1787 |
+
}
|
1788 |
+
|
1789 |
$(this._menu).toggleClass(ClassName$4.SHOW);
|
1790 |
$(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
1791 |
};
|
1824 |
};
|
1825 |
|
1826 |
_proto._getConfig = function _getConfig(config) {
|
1827 |
+
config = _objectSpread2({}, this.constructor.Default, {}, $(this._element).data(), {}, config);
|
1828 |
Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
|
1829 |
return config;
|
1830 |
};
|
1873 |
|
1874 |
if (typeof this._config.offset === 'function') {
|
1875 |
offset.fn = function (data) {
|
1876 |
+
data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
|
1877 |
return data;
|
1878 |
};
|
1879 |
} else {
|
1894 |
preventOverflow: {
|
1895 |
boundariesElement: this._config.boundary
|
1896 |
}
|
1897 |
+
}
|
1898 |
+
}; // Disable Popper.js if we have a static display
|
|
|
1899 |
|
1900 |
if (this._config.display === 'static') {
|
1901 |
popperConfig.modifiers.applyStyle = {
|
1903 |
};
|
1904 |
}
|
1905 |
|
1906 |
+
return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
|
1907 |
} // Static
|
1908 |
;
|
1909 |
|
1975 |
}
|
1976 |
|
1977 |
toggles[i].setAttribute('aria-expanded', 'false');
|
1978 |
+
|
1979 |
+
if (context._popper) {
|
1980 |
+
context._popper.destroy();
|
1981 |
+
}
|
1982 |
+
|
1983 |
$(dropdownMenu).removeClass(ClassName$4.SHOW);
|
1984 |
$(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));
|
1985 |
}
|
2020 |
|
2021 |
var isActive = $(parent).hasClass(ClassName$4.SHOW);
|
2022 |
|
2023 |
+
if (!isActive && event.which === ESCAPE_KEYCODE) {
|
2024 |
+
return;
|
2025 |
+
}
|
2026 |
+
|
2027 |
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
2028 |
if (event.which === ESCAPE_KEYCODE) {
|
2029 |
var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);
|
2034 |
return;
|
2035 |
}
|
2036 |
|
2037 |
+
var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS)).filter(function (item) {
|
2038 |
+
return $(item).is(':visible');
|
2039 |
+
});
|
2040 |
|
2041 |
if (items.length === 0) {
|
2042 |
return;
|
2116 |
*/
|
2117 |
|
2118 |
var NAME$5 = 'modal';
|
2119 |
+
var VERSION$5 = '4.4.1';
|
2120 |
var DATA_KEY$5 = 'bs.modal';
|
2121 |
var EVENT_KEY$5 = "." + DATA_KEY$5;
|
2122 |
var DATA_API_KEY$5 = '.data-api';
|
2137 |
};
|
2138 |
var Event$5 = {
|
2139 |
HIDE: "hide" + EVENT_KEY$5,
|
2140 |
+
HIDE_PREVENTED: "hidePrevented" + EVENT_KEY$5,
|
2141 |
HIDDEN: "hidden" + EVENT_KEY$5,
|
2142 |
SHOW: "show" + EVENT_KEY$5,
|
2143 |
SHOWN: "shown" + EVENT_KEY$5,
|
2155 |
BACKDROP: 'modal-backdrop',
|
2156 |
OPEN: 'modal-open',
|
2157 |
FADE: 'fade',
|
2158 |
+
SHOW: 'show',
|
2159 |
+
STATIC: 'modal-static'
|
2160 |
};
|
2161 |
var Selector$5 = {
|
2162 |
DIALOG: '.modal-dialog',
|
2165 |
DATA_DISMISS: '[data-dismiss="modal"]',
|
2166 |
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
2167 |
STICKY_CONTENT: '.sticky-top'
|
|
|
|
|
|
|
|
|
|
|
|
|
2168 |
};
|
2169 |
+
/**
|
2170 |
+
* ------------------------------------------------------------------------
|
2171 |
+
* Class Definition
|
2172 |
+
* ------------------------------------------------------------------------
|
2173 |
+
*/
|
2174 |
|
2175 |
var Modal =
|
2176 |
/*#__PURE__*/
|
2316 |
;
|
2317 |
|
2318 |
_proto._getConfig = function _getConfig(config) {
|
2319 |
+
config = _objectSpread2({}, Default$3, {}, config);
|
2320 |
Util.typeCheckConfig(NAME$5, config, DefaultType$3);
|
2321 |
return config;
|
2322 |
};
|
2323 |
|
2324 |
+
_proto._triggerBackdropTransition = function _triggerBackdropTransition() {
|
2325 |
var _this3 = this;
|
2326 |
|
2327 |
+
if (this._config.backdrop === 'static') {
|
2328 |
+
var hideEventPrevented = $.Event(Event$5.HIDE_PREVENTED);
|
2329 |
+
$(this._element).trigger(hideEventPrevented);
|
2330 |
+
|
2331 |
+
if (hideEventPrevented.defaultPrevented) {
|
2332 |
+
return;
|
2333 |
+
}
|
2334 |
+
|
2335 |
+
this._element.classList.add(ClassName$5.STATIC);
|
2336 |
+
|
2337 |
+
var modalTransitionDuration = Util.getTransitionDurationFromElement(this._element);
|
2338 |
+
$(this._element).one(Util.TRANSITION_END, function () {
|
2339 |
+
_this3._element.classList.remove(ClassName$5.STATIC);
|
2340 |
+
}).emulateTransitionEnd(modalTransitionDuration);
|
2341 |
+
|
2342 |
+
this._element.focus();
|
2343 |
+
} else {
|
2344 |
+
this.hide();
|
2345 |
+
}
|
2346 |
+
};
|
2347 |
+
|
2348 |
+
_proto._showElement = function _showElement(relatedTarget) {
|
2349 |
+
var _this4 = this;
|
2350 |
+
|
2351 |
var transition = $(this._element).hasClass(ClassName$5.FADE);
|
2352 |
+
var modalBody = this._dialog ? this._dialog.querySelector(Selector$5.MODAL_BODY) : null;
|
2353 |
|
2354 |
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
2355 |
// Don't move modal's DOM position
|
2362 |
|
2363 |
this._element.setAttribute('aria-modal', true);
|
2364 |
|
2365 |
+
if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE) && modalBody) {
|
2366 |
+
modalBody.scrollTop = 0;
|
2367 |
} else {
|
2368 |
this._element.scrollTop = 0;
|
2369 |
}
|
2383 |
});
|
2384 |
|
2385 |
var transitionComplete = function transitionComplete() {
|
2386 |
+
if (_this4._config.focus) {
|
2387 |
+
_this4._element.focus();
|
2388 |
}
|
2389 |
|
2390 |
+
_this4._isTransitioning = false;
|
2391 |
+
$(_this4._element).trigger(shownEvent);
|
2392 |
};
|
2393 |
|
2394 |
if (transition) {
|
2400 |
};
|
2401 |
|
2402 |
_proto._enforceFocus = function _enforceFocus() {
|
2403 |
+
var _this5 = this;
|
2404 |
|
2405 |
$(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop
|
2406 |
.on(Event$5.FOCUSIN, function (event) {
|
2407 |
+
if (document !== event.target && _this5._element !== event.target && $(_this5._element).has(event.target).length === 0) {
|
2408 |
+
_this5._element.focus();
|
2409 |
}
|
2410 |
});
|
2411 |
};
|
2412 |
|
2413 |
_proto._setEscapeEvent = function _setEscapeEvent() {
|
2414 |
+
var _this6 = this;
|
2415 |
|
2416 |
if (this._isShown && this._config.keyboard) {
|
2417 |
$(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {
|
2418 |
if (event.which === ESCAPE_KEYCODE$1) {
|
2419 |
+
_this6._triggerBackdropTransition();
|
|
|
|
|
2420 |
}
|
2421 |
});
|
2422 |
} else if (!this._isShown) {
|
2425 |
};
|
2426 |
|
2427 |
_proto._setResizeEvent = function _setResizeEvent() {
|
2428 |
+
var _this7 = this;
|
2429 |
|
2430 |
if (this._isShown) {
|
2431 |
$(window).on(Event$5.RESIZE, function (event) {
|
2432 |
+
return _this7.handleUpdate(event);
|
2433 |
});
|
2434 |
} else {
|
2435 |
$(window).off(Event$5.RESIZE);
|
2437 |
};
|
2438 |
|
2439 |
_proto._hideModal = function _hideModal() {
|
2440 |
+
var _this8 = this;
|
2441 |
|
2442 |
this._element.style.display = 'none';
|
2443 |
|
2450 |
this._showBackdrop(function () {
|
2451 |
$(document.body).removeClass(ClassName$5.OPEN);
|
2452 |
|
2453 |
+
_this8._resetAdjustments();
|
2454 |
|
2455 |
+
_this8._resetScrollbar();
|
2456 |
|
2457 |
+
$(_this8._element).trigger(Event$5.HIDDEN);
|
2458 |
});
|
2459 |
};
|
2460 |
|
2466 |
};
|
2467 |
|
2468 |
_proto._showBackdrop = function _showBackdrop(callback) {
|
2469 |
+
var _this9 = this;
|
2470 |
|
2471 |
var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';
|
2472 |
|
2480 |
|
2481 |
$(this._backdrop).appendTo(document.body);
|
2482 |
$(this._element).on(Event$5.CLICK_DISMISS, function (event) {
|
2483 |
+
if (_this9._ignoreBackdropClick) {
|
2484 |
+
_this9._ignoreBackdropClick = false;
|
2485 |
return;
|
2486 |
}
|
2487 |
|
2489 |
return;
|
2490 |
}
|
2491 |
|
2492 |
+
_this9._triggerBackdropTransition();
|
|
|
|
|
|
|
|
|
2493 |
});
|
2494 |
|
2495 |
if (animate) {
|
2513 |
$(this._backdrop).removeClass(ClassName$5.SHOW);
|
2514 |
|
2515 |
var callbackRemove = function callbackRemove() {
|
2516 |
+
_this9._removeBackdrop();
|
2517 |
|
2518 |
if (callback) {
|
2519 |
callback();
|
2560 |
};
|
2561 |
|
2562 |
_proto._setScrollbar = function _setScrollbar() {
|
2563 |
+
var _this10 = this;
|
2564 |
|
2565 |
if (this._isBodyOverflowing) {
|
2566 |
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
2571 |
$(fixedContent).each(function (index, element) {
|
2572 |
var actualPadding = element.style.paddingRight;
|
2573 |
var calculatedPadding = $(element).css('padding-right');
|
2574 |
+
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
|
2575 |
}); // Adjust sticky content margin
|
2576 |
|
2577 |
$(stickyContent).each(function (index, element) {
|
2578 |
var actualMargin = element.style.marginRight;
|
2579 |
var calculatedMargin = $(element).css('margin-right');
|
2580 |
+
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
|
2581 |
}); // Adjust body padding
|
2582 |
|
2583 |
var actualPadding = document.body.style.paddingRight;
|
2626 |
return this.each(function () {
|
2627 |
var data = $(this).data(DATA_KEY$5);
|
2628 |
|
2629 |
+
var _config = _objectSpread2({}, Default$3, {}, $(this).data(), {}, typeof config === 'object' && config ? config : {});
|
2630 |
|
2631 |
if (!data) {
|
2632 |
data = new Modal(this, _config);
|
2667 |
|
2668 |
|
2669 |
$(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {
|
2670 |
+
var _this11 = this;
|
2671 |
|
2672 |
var target;
|
2673 |
var selector = Util.getSelectorFromElement(this);
|
2676 |
target = document.querySelector(selector);
|
2677 |
}
|
2678 |
|
2679 |
+
var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread2({}, $(target).data(), {}, $(this).data());
|
2680 |
|
2681 |
if (this.tagName === 'A' || this.tagName === 'AREA') {
|
2682 |
event.preventDefault();
|
2689 |
}
|
2690 |
|
2691 |
$target.one(Event$5.HIDDEN, function () {
|
2692 |
+
if ($(_this11).is(':visible')) {
|
2693 |
+
_this11.focus();
|
2694 |
}
|
2695 |
});
|
2696 |
});
|
2713 |
|
2714 |
/**
|
2715 |
* --------------------------------------------------------------------------
|
2716 |
+
* Bootstrap (v4.4.1): tools/sanitizer.js
|
2717 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
2718 |
* --------------------------------------------------------------------------
|
2719 |
*/
|
2751 |
strong: [],
|
2752 |
u: [],
|
2753 |
ul: []
|
|
|
|
|
|
|
|
|
|
|
|
|
2754 |
};
|
2755 |
+
/**
|
2756 |
+
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
2757 |
+
*
|
2758 |
+
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
2759 |
+
*/
|
2760 |
+
|
2761 |
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
|
2762 |
/**
|
2763 |
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
2824 |
};
|
2825 |
|
2826 |
for (var i = 0, len = elements.length; i < len; i++) {
|
2827 |
+
var _ret = _loop(i);
|
2828 |
|
2829 |
if (_ret === "continue") continue;
|
2830 |
}
|
2839 |
*/
|
2840 |
|
2841 |
var NAME$6 = 'tooltip';
|
2842 |
+
var VERSION$6 = '4.4.1';
|
2843 |
var DATA_KEY$6 = 'bs.tooltip';
|
2844 |
var EVENT_KEY$6 = "." + DATA_KEY$6;
|
2845 |
var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];
|
2861 |
boundary: '(string|element)',
|
2862 |
sanitize: 'boolean',
|
2863 |
sanitizeFn: '(null|function)',
|
2864 |
+
whiteList: 'object',
|
2865 |
+
popperConfig: '(null|object)'
|
2866 |
};
|
2867 |
var AttachmentMap$1 = {
|
2868 |
AUTO: 'auto',
|
2886 |
boundary: 'scrollParent',
|
2887 |
sanitize: true,
|
2888 |
sanitizeFn: null,
|
2889 |
+
whiteList: DefaultWhitelist,
|
2890 |
+
popperConfig: null
|
2891 |
};
|
2892 |
var HoverState = {
|
2893 |
SHOW: 'show',
|
2919 |
FOCUS: 'focus',
|
2920 |
CLICK: 'click',
|
2921 |
MANUAL: 'manual'
|
|
|
|
|
|
|
|
|
|
|
|
|
2922 |
};
|
2923 |
+
/**
|
2924 |
+
* ------------------------------------------------------------------------
|
2925 |
+
* Class Definition
|
2926 |
+
* ------------------------------------------------------------------------
|
2927 |
+
*/
|
2928 |
|
2929 |
var Tooltip =
|
2930 |
/*#__PURE__*/
|
2931 |
function () {
|
2932 |
function Tooltip(element, config) {
|
|
|
|
|
|
|
|
|
2933 |
if (typeof Popper === 'undefined') {
|
2934 |
throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)');
|
2935 |
} // private
|
3000 |
clearTimeout(this._timeout);
|
3001 |
$.removeData(this.element, this.constructor.DATA_KEY);
|
3002 |
$(this.element).off(this.constructor.EVENT_KEY);
|
3003 |
+
$(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
|
3004 |
|
3005 |
if (this.tip) {
|
3006 |
$(this.tip).remove();
|
3011 |
this._hoverState = null;
|
3012 |
this._activeTrigger = null;
|
3013 |
|
3014 |
+
if (this._popper) {
|
3015 |
this._popper.destroy();
|
3016 |
}
|
3017 |
|
3064 |
}
|
3065 |
|
3066 |
$(this.element).trigger(this.constructor.Event.INSERTED);
|
3067 |
+
this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3068 |
$(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra
|
3069 |
// empty mouseover listeners to the body's immediate children;
|
3070 |
// only needed because of broken event delegation on iOS
|
3212 |
} // Private
|
3213 |
;
|
3214 |
|
3215 |
+
_proto._getPopperConfig = function _getPopperConfig(attachment) {
|
3216 |
var _this3 = this;
|
3217 |
|
3218 |
+
var defaultBsConfig = {
|
3219 |
+
placement: attachment,
|
3220 |
+
modifiers: {
|
3221 |
+
offset: this._getOffset(),
|
3222 |
+
flip: {
|
3223 |
+
behavior: this.config.fallbackPlacement
|
3224 |
+
},
|
3225 |
+
arrow: {
|
3226 |
+
element: Selector$6.ARROW
|
3227 |
+
},
|
3228 |
+
preventOverflow: {
|
3229 |
+
boundariesElement: this.config.boundary
|
3230 |
+
}
|
3231 |
+
},
|
3232 |
+
onCreate: function onCreate(data) {
|
3233 |
+
if (data.originalPlacement !== data.placement) {
|
3234 |
+
_this3._handlePopperPlacementChange(data);
|
3235 |
+
}
|
3236 |
+
},
|
3237 |
+
onUpdate: function onUpdate(data) {
|
3238 |
+
return _this3._handlePopperPlacementChange(data);
|
3239 |
+
}
|
3240 |
+
};
|
3241 |
+
return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
|
3242 |
+
};
|
3243 |
+
|
3244 |
+
_proto._getOffset = function _getOffset() {
|
3245 |
+
var _this4 = this;
|
3246 |
+
|
3247 |
var offset = {};
|
3248 |
|
3249 |
if (typeof this.config.offset === 'function') {
|
3250 |
offset.fn = function (data) {
|
3251 |
+
data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
|
3252 |
return data;
|
3253 |
};
|
3254 |
} else {
|
3275 |
};
|
3276 |
|
3277 |
_proto._setListeners = function _setListeners() {
|
3278 |
+
var _this5 = this;
|
3279 |
|
3280 |
var triggers = this.config.trigger.split(' ');
|
3281 |
triggers.forEach(function (trigger) {
|
3282 |
if (trigger === 'click') {
|
3283 |
+
$(_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
|
3284 |
+
return _this5.toggle(event);
|
3285 |
});
|
3286 |
} else if (trigger !== Trigger.MANUAL) {
|
3287 |
+
var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
|
3288 |
+
var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
|
3289 |
+
$(_this5.element).on(eventIn, _this5.config.selector, function (event) {
|
3290 |
+
return _this5._enter(event);
|
3291 |
+
}).on(eventOut, _this5.config.selector, function (event) {
|
3292 |
+
return _this5._leave(event);
|
3293 |
});
|
3294 |
}
|
3295 |
});
|
3296 |
+
|
3297 |
+
this._hideModalHandler = function () {
|
3298 |
+
if (_this5.element) {
|
3299 |
+
_this5.hide();
|
3300 |
}
|
3301 |
+
};
|
3302 |
+
|
3303 |
+
$(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler);
|
3304 |
|
3305 |
if (this.config.selector) {
|
3306 |
+
this.config = _objectSpread2({}, this.config, {
|
3307 |
trigger: 'manual',
|
3308 |
selector: ''
|
3309 |
});
|
3403 |
delete dataAttributes[dataAttr];
|
3404 |
}
|
3405 |
});
|
3406 |
+
config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
|
3407 |
|
3408 |
if (typeof config.delay === 'number') {
|
3409 |
config.delay = {
|
3563 |
*/
|
3564 |
|
3565 |
var NAME$7 = 'popover';
|
3566 |
+
var VERSION$7 = '4.4.1';
|
3567 |
var DATA_KEY$7 = 'bs.popover';
|
3568 |
var EVENT_KEY$7 = "." + DATA_KEY$7;
|
3569 |
var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];
|
3570 |
var CLASS_PREFIX$1 = 'bs-popover';
|
3571 |
var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g');
|
3572 |
|
3573 |
+
var Default$5 = _objectSpread2({}, Tooltip.Default, {
|
3574 |
placement: 'right',
|
3575 |
trigger: 'click',
|
3576 |
content: '',
|
3577 |
template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
|
3578 |
});
|
3579 |
|
3580 |
+
var DefaultType$5 = _objectSpread2({}, Tooltip.DefaultType, {
|
3581 |
content: '(string|element|function)'
|
3582 |
});
|
3583 |
|
3600 |
FOCUSOUT: "focusout" + EVENT_KEY$7,
|
3601 |
MOUSEENTER: "mouseenter" + EVENT_KEY$7,
|
3602 |
MOUSELEAVE: "mouseleave" + EVENT_KEY$7
|
|
|
|
|
|
|
|
|
|
|
|
|
3603 |
};
|
3604 |
+
/**
|
3605 |
+
* ------------------------------------------------------------------------
|
3606 |
+
* Class Definition
|
3607 |
+
* ------------------------------------------------------------------------
|
3608 |
+
*/
|
3609 |
|
3610 |
var Popover =
|
3611 |
/*#__PURE__*/
|
3749 |
*/
|
3750 |
|
3751 |
var NAME$8 = 'scrollspy';
|
3752 |
+
var VERSION$8 = '4.4.1';
|
3753 |
var DATA_KEY$8 = 'bs.scrollspy';
|
3754 |
var EVENT_KEY$8 = "." + DATA_KEY$8;
|
3755 |
var DATA_API_KEY$6 = '.data-api';
|
3788 |
var OffsetMethod = {
|
3789 |
OFFSET: 'offset',
|
3790 |
POSITION: 'position'
|
|
|
|
|
|
|
|
|
|
|
|
|
3791 |
};
|
3792 |
+
/**
|
3793 |
+
* ------------------------------------------------------------------------
|
3794 |
+
* Class Definition
|
3795 |
+
* ------------------------------------------------------------------------
|
3796 |
+
*/
|
3797 |
|
3798 |
var ScrollSpy =
|
3799 |
/*#__PURE__*/
|
3875 |
;
|
3876 |
|
3877 |
_proto._getConfig = function _getConfig(config) {
|
3878 |
+
config = _objectSpread2({}, Default$6, {}, typeof config === 'object' && config ? config : {});
|
3879 |
|
3880 |
if (typeof config.target !== 'string') {
|
3881 |
var id = $(config.target).attr('id');
|
4055 |
*/
|
4056 |
|
4057 |
var NAME$9 = 'tab';
|
4058 |
+
var VERSION$9 = '4.4.1';
|
4059 |
var DATA_KEY$9 = 'bs.tab';
|
4060 |
var EVENT_KEY$9 = "." + DATA_KEY$9;
|
4061 |
var DATA_API_KEY$7 = '.data-api';
|
4082 |
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
|
4083 |
DROPDOWN_TOGGLE: '.dropdown-toggle',
|
4084 |
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
|
|
|
|
|
|
|
|
|
|
|
|
4085 |
};
|
4086 |
+
/**
|
4087 |
+
* ------------------------------------------------------------------------
|
4088 |
+
* Class Definition
|
4089 |
+
* ------------------------------------------------------------------------
|
4090 |
+
*/
|
4091 |
|
4092 |
var Tab =
|
4093 |
/*#__PURE__*/
|
4289 |
*/
|
4290 |
|
4291 |
var NAME$a = 'toast';
|
4292 |
+
var VERSION$a = '4.4.1';
|
4293 |
var DATA_KEY$a = 'bs.toast';
|
4294 |
var EVENT_KEY$a = "." + DATA_KEY$a;
|
4295 |
var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];
|
4318 |
};
|
4319 |
var Selector$a = {
|
4320 |
DATA_DISMISS: '[data-dismiss="toast"]'
|
|
|
|
|
|
|
|
|
|
|
|
|
4321 |
};
|
4322 |
+
/**
|
4323 |
+
* ------------------------------------------------------------------------
|
4324 |
+
* Class Definition
|
4325 |
+
* ------------------------------------------------------------------------
|
4326 |
+
*/
|
4327 |
|
4328 |
var Toast =
|
4329 |
/*#__PURE__*/
|
4343 |
_proto.show = function show() {
|
4344 |
var _this = this;
|
4345 |
|
4346 |
+
var showEvent = $.Event(Event$a.SHOW);
|
4347 |
+
$(this._element).trigger(showEvent);
|
4348 |
+
|
4349 |
+
if (showEvent.isDefaultPrevented()) {
|
4350 |
+
return;
|
4351 |
+
}
|
4352 |
|
4353 |
if (this._config.animation) {
|
4354 |
this._element.classList.add(ClassName$a.FADE);
|
4362 |
$(_this._element).trigger(Event$a.SHOWN);
|
4363 |
|
4364 |
if (_this._config.autohide) {
|
4365 |
+
_this._timeout = setTimeout(function () {
|
4366 |
+
_this.hide();
|
4367 |
+
}, _this._config.delay);
|
4368 |
}
|
4369 |
};
|
4370 |
|
4371 |
this._element.classList.remove(ClassName$a.HIDE);
|
4372 |
|
4373 |
+
Util.reflow(this._element);
|
4374 |
+
|
4375 |
this._element.classList.add(ClassName$a.SHOWING);
|
4376 |
|
4377 |
if (this._config.animation) {
|
4382 |
}
|
4383 |
};
|
4384 |
|
4385 |
+
_proto.hide = function hide() {
|
|
|
|
|
4386 |
if (!this._element.classList.contains(ClassName$a.SHOW)) {
|
4387 |
return;
|
4388 |
}
|
4389 |
|
4390 |
+
var hideEvent = $.Event(Event$a.HIDE);
|
4391 |
+
$(this._element).trigger(hideEvent);
|
4392 |
|
4393 |
+
if (hideEvent.isDefaultPrevented()) {
|
4394 |
+
return;
|
|
|
|
|
|
|
|
|
4395 |
}
|
4396 |
+
|
4397 |
+
this._close();
|
4398 |
};
|
4399 |
|
4400 |
_proto.dispose = function dispose() {
|
4413 |
;
|
4414 |
|
4415 |
_proto._getConfig = function _getConfig(config) {
|
4416 |
+
config = _objectSpread2({}, Default$7, {}, $(this._element).data(), {}, typeof config === 'object' && config ? config : {});
|
4417 |
Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);
|
4418 |
return config;
|
4419 |
};
|
4420 |
|
4421 |
_proto._setListeners = function _setListeners() {
|
4422 |
+
var _this2 = this;
|
4423 |
|
4424 |
$(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {
|
4425 |
+
return _this2.hide();
|
4426 |
});
|
4427 |
};
|
4428 |
|
4429 |
_proto._close = function _close() {
|
4430 |
+
var _this3 = this;
|
4431 |
|
4432 |
var complete = function complete() {
|
4433 |
+
_this3._element.classList.add(ClassName$a.HIDE);
|
4434 |
|
4435 |
+
$(_this3._element).trigger(Event$a.HIDDEN);
|
4436 |
};
|
4437 |
|
4438 |
this._element.classList.remove(ClassName$a.SHOW);
|
4502 |
return Toast._jQueryInterface;
|
4503 |
};
|
4504 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4505 |
exports.Alert = Alert;
|
4506 |
exports.Button = Button;
|
4507 |
exports.Carousel = Carousel;
|
4513 |
exports.Tab = Tab;
|
4514 |
exports.Toast = Toast;
|
4515 |
exports.Tooltip = Tooltip;
|
4516 |
+
exports.Util = Util;
|
4517 |
|
4518 |
Object.defineProperty(exports, '__esModule', { value: true });
|
4519 |
|
4520 |
+
})));
|
4521 |
//# sourceMappingURL=bootstrap.js.map
|
resources/js/bootstrap4.min.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
/*!
|
2 |
-
* Bootstrap v4.
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
6 |
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},e=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(r).filter(function(t){return Object.getOwnPropertyDescriptor(r,t).enumerable}))),e.forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,u=u&&u.hasOwnProperty("default")?u.default:u;var e="transitionend";function n(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(e)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null}};g.fn.emulateTransitionEnd=n,g.event.special[_.TRANSITION_END]={bindType:e,delegateType:e,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var o="alert",r="bs.alert",a="."+r,c=g.fn[o],h={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+".data-api"},f="alert",d="fade",m="show",p=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,r),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=g(t).closest("."+f)[0]),n},t._triggerCloseEvent=function(t){var e=g.Event(h.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(m),g(e).hasClass(d)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(h.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(r);e||(e=new i(this),t.data(r,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(h.CLICK_DATA_API,'[data-dismiss="alert"]',p._handleDismiss(new p)),g.fn[o]=p._jQueryInterface,g.fn[o].Constructor=p,g.fn[o].noConflict=function(){return g.fn[o]=c,p._jQueryInterface};var v="button",y="bs.button",E="."+y,C=".data-api",T=g.fn[v],S="active",b="btn",I="focus",D='[data-toggle^="button"]',w='[data-toggle="buttons"]',A='input:not([type="hidden"])',N=".active",O=".btn",k={CLICK_DATA_API:"click"+E+C,FOCUS_BLUR_DATA_API:"focus"+E+C+" blur"+E+C},P=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(w)[0];if(n){var i=this._element.querySelector(A);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(N);o&&g(o).removeClass(S)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!this._element.classList.contains(S),g(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S)},t.dispose=function(){g.removeData(this._element,y),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(y);t||(t=new n(this),g(this).data(y,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),n}();g(document).on(k.CLICK_DATA_API,D,function(t){t.preventDefault();var e=t.target;g(e).hasClass(b)||(e=g(e).closest(O)),P._jQueryInterface.call(g(e),"toggle")}).on(k.FOCUS_BLUR_DATA_API,D,function(t){var e=g(t.target).closest(O)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g.fn[v]=P._jQueryInterface,g.fn[v].Constructor=P,g.fn[v].noConflict=function(){return g.fn[v]=T,P._jQueryInterface};var L="carousel",j="bs.carousel",H="."+j,R=".data-api",x=g.fn[L],F={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},U={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},W="next",q="prev",M="left",K="right",Q={SLIDE:"slide"+H,SLID:"slid"+H,KEYDOWN:"keydown"+H,MOUSEENTER:"mouseenter"+H,MOUSELEAVE:"mouseleave"+H,TOUCHSTART:"touchstart"+H,TOUCHMOVE:"touchmove"+H,TOUCHEND:"touchend"+H,POINTERDOWN:"pointerdown"+H,POINTERUP:"pointerup"+H,DRAG_START:"dragstart"+H,LOAD_DATA_API:"load"+H+R,CLICK_DATA_API:"click"+H+R},B="carousel",V="active",Y="slide",z="carousel-item-right",X="carousel-item-left",$="carousel-item-next",G="carousel-item-prev",J="pointer-event",Z=".active",tt=".active.carousel-item",et=".carousel-item",nt=".carousel-item img",it=".carousel-item-next, .carousel-item-prev",ot=".carousel-indicators",rt="[data-slide], [data-slide-to]",st='[data-ride="carousel"]',at={TOUCH:"touch",PEN:"pen"},lt=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(ot),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(W)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(it)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(tt);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?W:q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(H),g.removeData(this._element,j),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},F,t),_.typeCheckConfig(L,t,U),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;0<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Q.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(Q.MOUSEENTER,function(t){return e.pause(t)}).on(Q.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var n=this;if(this._touchSupported){var e=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]?n.touchStartX=t.originalEvent.clientX:n._pointerEvent||(n.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){n._pointerEvent&&at[t.originalEvent.pointerType.toUpperCase()]&&(n.touchDeltaX=t.originalEvent.clientX-n.touchStartX),n._handleSwipe(),"hover"===n._config.pause&&(n.pause(),n.touchTimeout&&clearTimeout(n.touchTimeout),n.touchTimeout=setTimeout(function(t){return n.cycle(t)},500+n._config.interval))};g(this._element.querySelectorAll(nt)).on(Q.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Q.POINTERDOWN,function(t){return e(t)}),g(this._element).on(Q.POINTERUP,function(t){return i(t)}),this._element.classList.add(J)):(g(this._element).on(Q.TOUCHSTART,function(t){return e(t)}),g(this._element).on(Q.TOUCHMOVE,function(t){var e;(e=t).originalEvent.touches&&1<e.originalEvent.touches.length?n.touchDeltaX=0:n.touchDeltaX=e.originalEvent.touches[0].clientX-n.touchStartX}),g(this._element).on(Q.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(et)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===W,i=t===q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===q?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(tt)),o=g.Event(Q.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(Z));g(e).removeClass(V);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(V)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(tt),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===W?(n=X,i=$,M):(n=z,i=G,K),l&&g(l).hasClass(V))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Q.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass(Y)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);this._config.interval=f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,f):this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass(V),g(s).removeClass(V+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(V),g(l).addClass(V),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(j),e=l({},F,g(this).data());"object"==typeof i&&(e=l({},e,i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(j,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(B)){var i=l({},g(n).data(),g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(j).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return F}}]),r}();g(document).on(Q.CLICK_DATA_API,rt,lt._dataApiClickHandler),g(window).on(Q.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(st)),e=0,n=t.length;e<n;e++){var i=g(t[e]);lt._jQueryInterface.call(i,i.data())}}),g.fn[L]=lt._jQueryInterface,g.fn[L].Constructor=lt,g.fn[L].noConflict=function(){return g.fn[L]=x,lt._jQueryInterface};var ct="collapse",ht="bs.collapse",ut="."+ht,ft=g.fn[ct],dt={toggle:!0,parent:""},gt={toggle:"boolean",parent:"(string|element)"},_t={SHOW:"show"+ut,SHOWN:"shown"+ut,HIDE:"hide"+ut,HIDDEN:"hidden"+ut,CLICK_DATA_API:"click"+ut+".data-api"},mt="show",pt="collapse",vt="collapsing",yt="collapsed",Et="width",Ct="height",Tt=".show, .collapsing",St='[data-toggle="collapse"]',bt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(St)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(mt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(mt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Tt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(pt)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(ht))&&e._isTransitioning))){var i=g.Event(_t.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(ht,null));var o=this._getDimension();g(this._element).removeClass(pt).addClass(vt),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(yt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(vt).addClass(pt).addClass(mt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(_t.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(mt)){var e=g.Event(_t.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(vt).removeClass(pt).removeClass(mt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(mt)||g(r).addClass(yt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(vt).addClass(pt).trigger(_t.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,ht),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},dt,t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ct,t,gt),t},t._getDimension=function(){return g(this._element).hasClass(Et)?Et:Ct},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(mt);e.length&&g(e).toggleClass(yt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(ht),n=l({},dt,t.data(),"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(ht,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return dt}}]),a}();g(document).on(_t.CLICK_DATA_API,St,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(ht)?"toggle":n.data();bt._jQueryInterface.call(t,e)})}),g.fn[ct]=bt._jQueryInterface,g.fn[ct].Constructor=bt,g.fn[ct].noConflict=function(){return g.fn[ct]=ft,bt._jQueryInterface};var It="dropdown",Dt="bs.dropdown",wt="."+Dt,At=".data-api",Nt=g.fn[It],Ot=new RegExp("38|40|27"),kt={HIDE:"hide"+wt,HIDDEN:"hidden"+wt,SHOW:"show"+wt,SHOWN:"shown"+wt,CLICK:"click"+wt,CLICK_DATA_API:"click"+wt+At,KEYDOWN_DATA_API:"keydown"+wt+At,KEYUP_DATA_API:"keyup"+wt+At},Pt="disabled",Lt="show",jt="dropup",Ht="dropright",Rt="dropleft",xt="dropdown-menu-right",Ft="position-static",Ut='[data-toggle="dropdown"]',Wt=".dropdown form",qt=".dropdown-menu",Mt=".navbar-nav",Kt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Qt="top-start",Bt="top-end",Vt="bottom-start",Yt="bottom-end",zt="right-start",Xt="left-start",$t={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic"},Gt={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string"},Jt=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)){var t=c._getParentFromElement(this._element),e=g(this._menu).hasClass(Lt);if(c._clearMenus(),!e){var n={relatedTarget:this._element},i=g.Event(kt.SHOW,n);if(g(t).trigger(i),!i.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof u)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=t:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(t).addClass(Ft),this._popper=new u(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(t).closest(Mt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Lt),g(t).toggleClass(Lt).trigger(g.Event(kt.SHOWN,n))}}}},t.show=function(){if(!(this._element.disabled||g(this._element).hasClass(Pt)||g(this._menu).hasClass(Lt))){var t={relatedTarget:this._element},e=g.Event(kt.SHOW,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.SHOWN,t)))}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Pt)&&g(this._menu).hasClass(Lt)){var t={relatedTarget:this._element},e=g.Event(kt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(g(this._menu).toggleClass(Lt),g(n).toggleClass(Lt).trigger(g.Event(kt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Dt),g(this._element).off(wt),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(kt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,g(this._element).data(),t),_.typeCheckConfig(It,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Vt;return t.hasClass(jt)?(e=Qt,g(this._menu).hasClass(xt)&&(e=Bt)):t.hasClass(Ht)?e=zt:t.hasClass(Rt)?e=Xt:g(this._menu).hasClass(xt)&&(e=Yt),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),t},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Dt);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(Dt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Ut)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Dt),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Lt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(kt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),g(a).removeClass(Lt),g(o).removeClass(Lt).trigger(g.Event(kt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(qt).length)):Ot.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Pt))){var e=c._getParentFromElement(this),n=g(e).hasClass(Lt);if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Kt));if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Ut);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return $t}},{key:"DefaultType",get:function(){return Gt}}]),c}();g(document).on(kt.KEYDOWN_DATA_API,Ut,Jt._dataApiKeydownHandler).on(kt.KEYDOWN_DATA_API,qt,Jt._dataApiKeydownHandler).on(kt.CLICK_DATA_API+" "+kt.KEYUP_DATA_API,Jt._clearMenus).on(kt.CLICK_DATA_API,Ut,function(t){t.preventDefault(),t.stopPropagation(),Jt._jQueryInterface.call(g(this),"toggle")}).on(kt.CLICK_DATA_API,Wt,function(t){t.stopPropagation()}),g.fn[It]=Jt._jQueryInterface,g.fn[It].Constructor=Jt,g.fn[It].noConflict=function(){return g.fn[It]=Nt,Jt._jQueryInterface};var Zt="modal",te="bs.modal",ee="."+te,ne=g.fn[Zt],ie={backdrop:!0,keyboard:!0,focus:!0,show:!0},oe={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},re={HIDE:"hide"+ee,HIDDEN:"hidden"+ee,SHOW:"show"+ee,SHOWN:"shown"+ee,FOCUSIN:"focusin"+ee,RESIZE:"resize"+ee,CLICK_DISMISS:"click.dismiss"+ee,KEYDOWN_DISMISS:"keydown.dismiss"+ee,MOUSEUP_DISMISS:"mouseup.dismiss"+ee,MOUSEDOWN_DISMISS:"mousedown.dismiss"+ee,CLICK_DATA_API:"click"+ee+".data-api"},se="modal-dialog-scrollable",ae="modal-scrollbar-measure",le="modal-backdrop",ce="modal-open",he="fade",ue="show",fe=".modal-dialog",de=".modal-body",ge='[data-toggle="modal"]',_e='[data-dismiss="modal"]',me=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",pe=".sticky-top",ve=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(fe),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(he)&&(this._isTransitioning=!0);var n=g.Event(re.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(re.CLICK_DISMISS,_e,function(t){return e.hide(t)}),g(this._dialog).on(re.MOUSEDOWN_DISMISS,function(){g(e._element).one(re.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(re.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(he);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(re.FOCUSIN),g(this._element).removeClass(ue),g(this._element).off(re.CLICK_DISMISS),g(this._dialog).off(re.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(ee)}),g(document).off(re.FOCUSIN),g.removeData(this._element,te),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},ie,t),_.typeCheckConfig(Zt,t,oe),t},t._showElement=function(t){var e=this,n=g(this._element).hasClass(he);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(se)?this._dialog.querySelector(de).scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ue),this._config.focus&&this._enforceFocus();var i=g.Event(re.SHOWN,{relatedTarget:t}),o=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(i)};if(n){var r=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()},t._enforceFocus=function(){var e=this;g(document).off(re.FOCUSIN).on(re.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(re.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||g(this._element).off(re.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(re.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(re.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(ce),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(re.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(he)?he:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=le,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(re.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._element.focus():e.hide())}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ue),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ue);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(he)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(me)),e=[].slice.call(document.querySelectorAll(pe));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css("padding-right");g(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css("margin-right");g(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=g(document.body).css("padding-right");g(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}g(document.body).addClass(ce)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(me));g(t).each(function(t,e){var n=g(e).data("padding-right");g(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+pe));g(e).each(function(t,e){var n=g(e).data("margin-right");"undefined"!=typeof n&&g(e).css("margin-right",n).removeData("margin-right")});var n=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=ae,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(te),e=l({},ie,g(this).data(),"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(te,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return ie}}]),o}();g(document).on(re.CLICK_DATA_API,ge,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(te)?"toggle":l({},g(e).data(),g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(re.SHOW,function(t){t.isDefaultPrevented()||r.one(re.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});ve._jQueryInterface.call(g(e),o,this)}),g.fn[Zt]=ve._jQueryInterface,g.fn[Zt].Constructor=ve,g.fn[Zt].noConflict=function(){return g.fn[Zt]=ne,ve._jQueryInterface};var ye=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Ee={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Ce=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Te=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function Se(t,s,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),a=Object.keys(s),l=[].slice.call(n.body.querySelectorAll("*")),i=function(t,e){var n=l[t],i=n.nodeName.toLowerCase();if(-1===a.indexOf(n.nodeName.toLowerCase()))return n.parentNode.removeChild(n),"continue";var o=[].slice.call(n.attributes),r=[].concat(s["*"]||[],s[i]||[]);o.forEach(function(t){(function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===ye.indexOf(n)||Boolean(t.nodeValue.match(Ce)||t.nodeValue.match(Te));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1})(t,r)||n.removeAttribute(t.nodeName)})},o=0,r=l.length;o<r;o++)i(o);return n.body.innerHTML}var be="tooltip",Ie="bs.tooltip",De="."+Ie,we=g.fn[be],Ae="bs-tooltip",Ne=new RegExp("(^|\\s)"+Ae+"\\S+","g"),Oe=["sanitize","whiteList","sanitizeFn"],ke={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object"},Pe={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},Le={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ye),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ye,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Je}},{key:"NAME",get:function(){return Ve}},{key:"DATA_KEY",get:function(){return Ye}},{key:"Event",get:function(){return rn}},{key:"EVENT_KEY",get:function(){return ze}},{key:"DefaultType",get:function(){return Ze}}]),i}(Be);g.fn[Ve]=sn._jQueryInterface,g.fn[Ve].Constructor=sn,g.fn[Ve].noConflict=function(){return g.fn[Ve]=Xe,sn._jQueryInterface};var an="scrollspy",ln="bs.scrollspy",cn="."+ln,hn=g.fn[an],un={offset:10,method:"auto",target:""},fn={offset:"number",method:"string",target:"(string|element)"},dn={ACTIVATE:"activate"+cn,SCROLL:"scroll"+cn,LOAD_DATA_API:"load"+cn+".data-api"},gn="dropdown-item",_n="active",mn='[data-spy="scroll"]',pn=".nav, .list-group",vn=".nav-link",yn=".nav-item",En=".list-group-item",Cn=".dropdown",Tn=".dropdown-item",Sn=".dropdown-toggle",bn="offset",In="position",Dn=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+vn+","+this._config.target+" "+En+","+this._config.target+" "+Tn,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(dn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?bn:In,o="auto"===this._config.method?t:this._config.method,r=o===In?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,ln),g(this._scrollElement).off(cn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},un,"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(an),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(an,t,fn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(gn)?(n.closest(Cn).find(Sn).addClass(_n),n.addClass(_n)):(n.addClass(_n),n.parents(pn).prev(vn+", "+En).addClass(_n),n.parents(pn).prev(yn).children(vn).addClass(_n)),g(this._scrollElement).trigger(dn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(_n)}).forEach(function(t){return t.classList.remove(_n)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(ln);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(ln,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return un}}]),n}();g(window).on(dn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(mn)),e=t.length;e--;){var n=g(t[e]);Dn._jQueryInterface.call(n,n.data())}}),g.fn[an]=Dn._jQueryInterface,g.fn[an].Constructor=Dn,g.fn[an].noConflict=function(){return g.fn[an]=hn,Dn._jQueryInterface};var wn="bs.tab",An="."+wn,Nn=g.fn.tab,On={HIDE:"hide"+An,HIDDEN:"hidden"+An,SHOW:"show"+An,SHOWN:"shown"+An,CLICK_DATA_API:"click"+An+".data-api"},kn="dropdown-menu",Pn="active",Ln="disabled",jn="fade",Hn="show",Rn=".dropdown",xn=".nav, .list-group",Fn=".active",Un="> li > .active",Wn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',qn=".dropdown-toggle",Mn="> .dropdown-menu .active",Kn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Pn)||g(this._element).hasClass(Ln))){var t,i,e=g(this._element).closest(xn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Un:Fn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(On.HIDE,{relatedTarget:this._element}),a=g.Event(On.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(On.HIDDEN,{relatedTarget:n._element}),e=g.Event(On.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,wn),this._element=null},t._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Fn):g(e).find(Un))[0],r=n&&o&&g(o).hasClass(jn),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=_.getTransitionDurationFromElement(o);g(o).removeClass(Hn).one(_.TRANSITION_END,s).emulateTransitionEnd(a)}else s()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Pn);var i=g(e.parentNode).find(Mn)[0];i&&g(i).removeClass(Pn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Pn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(jn)&&t.classList.add(Hn),t.parentNode&&g(t.parentNode).hasClass(kn)){var o=g(t).closest(Rn)[0];if(o){var r=[].slice.call(o.querySelectorAll(qn));g(r).addClass(Pn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(wn);if(e||(e=new i(this),t.data(wn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}}]),i}();g(document).on(On.CLICK_DATA_API,Wn,function(t){t.preventDefault(),Kn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Kn._jQueryInterface,g.fn.tab.Constructor=Kn,g.fn.tab.noConflict=function(){return g.fn.tab=Nn,Kn._jQueryInterface};var Qn="toast",Bn="bs.toast",Vn="."+Bn,Yn=g.fn[Qn],zn={CLICK_DISMISS:"click.dismiss"+Vn,HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn},Xn="fade",$n="hide",Gn="show",Jn="showing",Zn={animation:"boolean",autohide:"boolean",delay:"number"},ti={animation:!0,autohide:!0,delay:500},ei='[data-dismiss="toast"]',ni=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this;g(this._element).trigger(zn.SHOW),this._config.animation&&this._element.classList.add(Xn);var e=function(){t._element.classList.remove(Jn),t._element.classList.add(Gn),g(t._element).trigger(zn.SHOWN),t._config.autohide&&t.hide()};if(this._element.classList.remove($n),this._element.classList.add(Jn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},t.hide=function(t){var e=this;this._element.classList.contains(Gn)&&(g(this._element).trigger(zn.HIDE),t?this._close():this._timeout=setTimeout(function(){e._close()},this._config.delay))},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(Gn)&&this._element.classList.remove(Gn),g(this._element).off(zn.CLICK_DISMISS),g.removeData(this._element,Bn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},ti,g(this._element).data(),"object"==typeof t&&t?t:{}),_.typeCheckConfig(Qn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(zn.CLICK_DISMISS,ei,function(){return t.hide(!0)})},t._close=function(){var t=this,e=function(){t._element.classList.add($n),g(t._element).trigger(zn.HIDDEN)};if(this._element.classList.remove(Gn),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Bn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Bn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"DefaultType",get:function(){return Zn}},{key:"Default",get:function(){return ti}}]),i}();g.fn[Qn]=ni._jQueryInterface,g.fn[Qn].Constructor=ni,g.fn[Qn].noConflict=function(){return g.fn[Qn]=Yn,ni._jQueryInterface},function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),t.Util=_,t.Alert=p,t.Button=P,t.Carousel=lt,t.Collapse=bt,t.Dropdown=Jt,t.Modal=ve,t.Popover=sn,t.Scrollspy=Dn,t.Tab=Kn,t.Toast=ni,t.Tooltip=Be,Object.defineProperty(t,"__esModule",{value:!0})});
|
7 |
//# sourceMappingURL=bootstrap.min.js.map
|
1 |
/*!
|
2 |
+
* Bootstrap v4.4.1 (https://getbootstrap.com/)
|
3 |
* Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
4 |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
*/
|
6 |
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)}return n}function l(o){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?e(Object(r),!0).forEach(function(t){var e,n,i;e=o,i=r[n=t],n in e?Object.defineProperty(e,n,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[n]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(o,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach(function(t){Object.defineProperty(o,t,Object.getOwnPropertyDescriptor(r,t))})}return o}g=g&&g.hasOwnProperty("default")?g.default:g,u=u&&u.hasOwnProperty("default")?u.default:u;var n="transitionend";function o(t){var e=this,n=!1;return g(this).one(_.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||_.triggerTransitionEnd(e)},t),this}var _={TRANSITION_END:"bsTransitionEnd",getUID:function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");if(!e||"#"===e){var n=t.getAttribute("href");e=n&&"#"!==n?n.trim():""}try{return document.querySelector(e)?e:null}catch(t){return null}},getTransitionDurationFromElement:function(t){if(!t)return 0;var e=g(t).css("transition-duration"),n=g(t).css("transition-delay"),i=parseFloat(e),o=parseFloat(n);return i||o?(e=e.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(e)+parseFloat(n))):0},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(t){g(t).trigger(n)},supportsTransitionEnd:function(){return Boolean(n)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var o=n[i],r=e[i],s=r&&_.isElement(r)?"element":(a=r,{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(o).test(s))throw new Error(t.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+o+'".')}var a},findShadowRoot:function(t){if(!document.documentElement.attachShadow)return null;if("function"!=typeof t.getRootNode)return t instanceof ShadowRoot?t:t.parentNode?_.findShadowRoot(t.parentNode):null;var e=t.getRootNode();return e instanceof ShadowRoot?e:null},jQueryDetection:function(){if("undefined"==typeof g)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=g.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1===t[0]&&9===t[1]&&t[2]<1||4<=t[0])throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};_.jQueryDetection(),g.fn.emulateTransitionEnd=o,g.event.special[_.TRANSITION_END]={bindType:n,delegateType:n,handle:function(t){if(g(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var r="alert",a="bs.alert",c="."+a,h=g.fn[r],f={CLOSE:"close"+c,CLOSED:"closed"+c,CLICK_DATA_API:"click"+c+".data-api"},d="alert",m="fade",p="show",v=function(){function i(t){this._element=t}var t=i.prototype;return t.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},t.dispose=function(){g.removeData(this._element,a),this._element=null},t._getRootElement=function(t){var e=_.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n=n||g(t).closest("."+d)[0]},t._triggerCloseEvent=function(t){var e=g.Event(f.CLOSE);return g(t).trigger(e),e},t._removeElement=function(e){var n=this;if(g(e).removeClass(p),g(e).hasClass(m)){var t=_.getTransitionDurationFromElement(e);g(e).one(_.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(t)}else this._destroyElement(e)},t._destroyElement=function(t){g(t).detach().trigger(f.CLOSED).remove()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(a);e||(e=new i(this),t.data(a,e)),"close"===n&&e[n](this)})},i._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();g(document).on(f.CLICK_DATA_API,'[data-dismiss="alert"]',v._handleDismiss(new v)),g.fn[r]=v._jQueryInterface,g.fn[r].Constructor=v,g.fn[r].noConflict=function(){return g.fn[r]=h,v._jQueryInterface};var y="button",E="bs.button",C="."+E,T=".data-api",b=g.fn[y],S="active",D="btn",I="focus",w='[data-toggle^="button"]',A='[data-toggle="buttons"]',N='[data-toggle="button"]',O='[data-toggle="buttons"] .btn',k='input:not([type="hidden"])',P=".active",L=".btn",j={CLICK_DATA_API:"click"+C+T,FOCUS_BLUR_DATA_API:"focus"+C+T+" blur"+C+T,LOAD_DATA_API:"load"+C+T},H=function(){function n(t){this._element=t}var t=n.prototype;return t.toggle=function(){var t=!0,e=!0,n=g(this._element).closest(A)[0];if(n){var i=this._element.querySelector(k);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(S))t=!1;else{var o=n.querySelector(P);o&&g(o).removeClass(S)}else"checkbox"===i.type?"LABEL"===this._element.tagName&&i.checked===this._element.classList.contains(S)&&(t=!1):t=!1;t&&(i.checked=!this._element.classList.contains(S),g(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(S)),t&&g(this._element).toggleClass(S))},t.dispose=function(){g.removeData(this._element,E),this._element=null},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(E);t||(t=new n(this),g(this).data(E,t)),"toggle"===e&&t[e]()})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),n}();g(document).on(j.CLICK_DATA_API,w,function(t){var e=t.target;if(g(e).hasClass(D)||(e=g(e).closest(L)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var n=e.querySelector(k);if(n&&(n.hasAttribute("disabled")||n.classList.contains("disabled")))return void t.preventDefault();H._jQueryInterface.call(g(e),"toggle")}}).on(j.FOCUS_BLUR_DATA_API,w,function(t){var e=g(t.target).closest(L)[0];g(e).toggleClass(I,/^focus(in)?$/.test(t.type))}),g(window).on(j.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(O)),e=0,n=t.length;e<n;e++){var i=t[e],o=i.querySelector(k);o.checked||o.hasAttribute("checked")?i.classList.add(S):i.classList.remove(S)}for(var r=0,s=(t=[].slice.call(document.querySelectorAll(N))).length;r<s;r++){var a=t[r];"true"===a.getAttribute("aria-pressed")?a.classList.add(S):a.classList.remove(S)}}),g.fn[y]=H._jQueryInterface,g.fn[y].Constructor=H,g.fn[y].noConflict=function(){return g.fn[y]=b,H._jQueryInterface};var R="carousel",x="bs.carousel",F="."+x,U=".data-api",W=g.fn[R],q={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},M={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",Q="prev",B="left",V="right",Y={SLIDE:"slide"+F,SLID:"slid"+F,KEYDOWN:"keydown"+F,MOUSEENTER:"mouseenter"+F,MOUSELEAVE:"mouseleave"+F,TOUCHSTART:"touchstart"+F,TOUCHMOVE:"touchmove"+F,TOUCHEND:"touchend"+F,POINTERDOWN:"pointerdown"+F,POINTERUP:"pointerup"+F,DRAG_START:"dragstart"+F,LOAD_DATA_API:"load"+F+U,CLICK_DATA_API:"click"+F+U},z="carousel",X="active",$="slide",G="carousel-item-right",J="carousel-item-left",Z="carousel-item-next",tt="carousel-item-prev",et="pointer-event",nt=".active",it=".active.carousel-item",ot=".carousel-item",rt=".carousel-item img",st=".carousel-item-next, .carousel-item-prev",at=".carousel-indicators",lt="[data-slide], [data-slide-to]",ct='[data-ride="carousel"]',ht={TOUCH:"touch",PEN:"pen"},ut=function(){function r(t,e){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._element=t,this._indicatorsElement=this._element.querySelector(at),this._touchSupported="ontouchstart"in document.documentElement||0<navigator.maxTouchPoints,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=r.prototype;return t.next=function(){this._isSliding||this._slide(K)},t.nextWhenVisible=function(){!document.hidden&&g(this._element).is(":visible")&&"hidden"!==g(this._element).css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(Q)},t.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(st)&&(_.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(t){var e=this;this._activeElement=this._element.querySelector(it);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)g(this._element).one(Y.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n<t?K:Q;this._slide(i,this._items[t])}},t.dispose=function(){g(this._element).off(F),g.removeData(this._element,x),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(t){return t=l({},q,{},t),_.typeCheckConfig(R,t,M),t},t._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;(this.touchDeltaX=0)<e&&this.prev(),e<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&g(this._element).on(Y.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&g(this._element).on(Y.MOUSEENTER,function(t){return e.pause(t)}).on(Y.MOUSELEAVE,function(t){return e.cycle(t)}),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var e=this;if(this._touchSupported){var n=function(t){e._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()]?e.touchStartX=t.originalEvent.clientX:e._pointerEvent||(e.touchStartX=t.originalEvent.touches[0].clientX)},i=function(t){e._pointerEvent&&ht[t.originalEvent.pointerType.toUpperCase()]&&(e.touchDeltaX=t.originalEvent.clientX-e.touchStartX),e._handleSwipe(),"hover"===e._config.pause&&(e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval))};g(this._element.querySelectorAll(rt)).on(Y.DRAG_START,function(t){return t.preventDefault()}),this._pointerEvent?(g(this._element).on(Y.POINTERDOWN,function(t){return n(t)}),g(this._element).on(Y.POINTERUP,function(t){return i(t)}),this._element.classList.add(et)):(g(this._element).on(Y.TOUCHSTART,function(t){return n(t)}),g(this._element).on(Y.TOUCHMOVE,function(t){return function(t){t.originalEvent.touches&&1<t.originalEvent.touches.length?e.touchDeltaX=0:e.touchDeltaX=t.originalEvent.touches[0].clientX-e.touchStartX}(t)}),g(this._element).on(Y.TOUCHEND,function(t){return i(t)}))}},t._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},t._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(ot)):[],this._items.indexOf(t)},t._getItemByDirection=function(t,e){var n=t===K,i=t===Q,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===Q?-1:1))%this._items.length;return-1==s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(it)),o=g.Event(Y.SLIDE,{relatedTarget:t,direction:e,from:i,to:n});return g(this._element).trigger(o),o},t._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(nt));g(e).removeClass(X);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&g(n).addClass(X)}},t._slide=function(t,e){var n,i,o,r=this,s=this._element.querySelector(it),a=this._getItemIndex(s),l=e||s&&this._getItemByDirection(t,s),c=this._getItemIndex(l),h=Boolean(this._interval);if(o=t===K?(n=J,i=Z,B):(n=G,i=tt,V),l&&g(l).hasClass(X))this._isSliding=!1;else if(!this._triggerSlideEvent(l,o).isDefaultPrevented()&&s&&l){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(l);var u=g.Event(Y.SLID,{relatedTarget:l,direction:o,from:a,to:c});if(g(this._element).hasClass($)){g(l).addClass(i),_.reflow(l),g(s).addClass(n),g(l).addClass(n);var f=parseInt(l.getAttribute("data-interval"),10);f?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=f):this._config.interval=this._config.defaultInterval||this._config.interval;var d=_.getTransitionDurationFromElement(s);g(s).one(_.TRANSITION_END,function(){g(l).removeClass(n+" "+i).addClass(X),g(s).removeClass(X+" "+i+" "+n),r._isSliding=!1,setTimeout(function(){return g(r._element).trigger(u)},0)}).emulateTransitionEnd(d)}else g(s).removeClass(X),g(l).addClass(X),this._isSliding=!1,g(this._element).trigger(u);h&&this.cycle()}},r._jQueryInterface=function(i){return this.each(function(){var t=g(this).data(x),e=l({},q,{},g(this).data());"object"==typeof i&&(e=l({},e,{},i));var n="string"==typeof i?i:e.slide;if(t||(t=new r(this,e),g(this).data(x,t)),"number"==typeof i)t.to(i);else if("string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}else e.interval&&e.ride&&(t.pause(),t.cycle())})},r._dataApiClickHandler=function(t){var e=_.getSelectorFromElement(this);if(e){var n=g(e)[0];if(n&&g(n).hasClass(z)){var i=l({},g(n).data(),{},g(this).data()),o=this.getAttribute("data-slide-to");o&&(i.interval=!1),r._jQueryInterface.call(g(n),i),o&&g(n).data(x).to(o),t.preventDefault()}}},s(r,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return q}}]),r}();g(document).on(Y.CLICK_DATA_API,lt,ut._dataApiClickHandler),g(window).on(Y.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(ct)),e=0,n=t.length;e<n;e++){var i=g(t[e]);ut._jQueryInterface.call(i,i.data())}}),g.fn[R]=ut._jQueryInterface,g.fn[R].Constructor=ut,g.fn[R].noConflict=function(){return g.fn[R]=W,ut._jQueryInterface};var ft="collapse",dt="bs.collapse",gt="."+dt,_t=g.fn[ft],mt={toggle:!0,parent:""},pt={toggle:"boolean",parent:"(string|element)"},vt={SHOW:"show"+gt,SHOWN:"shown"+gt,HIDE:"hide"+gt,HIDDEN:"hidden"+gt,CLICK_DATA_API:"click"+gt+".data-api"},yt="show",Et="collapse",Ct="collapsing",Tt="collapsed",bt="width",St="height",Dt=".show, .collapsing",It='[data-toggle="collapse"]',wt=function(){function a(e,t){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(t),this._triggerArray=[].slice.call(document.querySelectorAll('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var n=[].slice.call(document.querySelectorAll(It)),i=0,o=n.length;i<o;i++){var r=n[i],s=_.getSelectorFromElement(r),a=[].slice.call(document.querySelectorAll(s)).filter(function(t){return t===e});null!==s&&0<a.length&&(this._selector=s,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=a.prototype;return t.toggle=function(){g(this._element).hasClass(yt)?this.hide():this.show()},t.show=function(){var t,e,n=this;if(!this._isTransitioning&&!g(this._element).hasClass(yt)&&(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(Dt)).filter(function(t){return"string"==typeof n._config.parent?t.getAttribute("data-parent")===n._config.parent:t.classList.contains(Et)})).length&&(t=null),!(t&&(e=g(t).not(this._selector).data(dt))&&e._isTransitioning))){var i=g.Event(vt.SHOW);if(g(this._element).trigger(i),!i.isDefaultPrevented()){t&&(a._jQueryInterface.call(g(t).not(this._selector),"hide"),e||g(t).data(dt,null));var o=this._getDimension();g(this._element).removeClass(Et).addClass(Ct),this._element.style[o]=0,this._triggerArray.length&&g(this._triggerArray).removeClass(Tt).attr("aria-expanded",!0),this.setTransitioning(!0);var r="scroll"+(o[0].toUpperCase()+o.slice(1)),s=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){g(n._element).removeClass(Ct).addClass(Et).addClass(yt),n._element.style[o]="",n.setTransitioning(!1),g(n._element).trigger(vt.SHOWN)}).emulateTransitionEnd(s),this._element.style[o]=this._element[r]+"px"}}},t.hide=function(){var t=this;if(!this._isTransitioning&&g(this._element).hasClass(yt)){var e=g.Event(vt.HIDE);if(g(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",_.reflow(this._element),g(this._element).addClass(Ct).removeClass(Et).removeClass(yt);var i=this._triggerArray.length;if(0<i)for(var o=0;o<i;o++){var r=this._triggerArray[o],s=_.getSelectorFromElement(r);if(null!==s)g([].slice.call(document.querySelectorAll(s))).hasClass(yt)||g(r).addClass(Tt).attr("aria-expanded",!1)}this.setTransitioning(!0);this._element.style[n]="";var a=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t.setTransitioning(!1),g(t._element).removeClass(Ct).addClass(Et).trigger(vt.HIDDEN)}).emulateTransitionEnd(a)}}},t.setTransitioning=function(t){this._isTransitioning=t},t.dispose=function(){g.removeData(this._element,dt),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},t._getConfig=function(t){return(t=l({},mt,{},t)).toggle=Boolean(t.toggle),_.typeCheckConfig(ft,t,pt),t},t._getDimension=function(){return g(this._element).hasClass(bt)?bt:St},t._getParent=function(){var t,n=this;_.isElement(this._config.parent)?(t=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(t=this._config.parent[0])):t=document.querySelector(this._config.parent);var e='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]',i=[].slice.call(t.querySelectorAll(e));return g(i).each(function(t,e){n._addAriaAndCollapsedClass(a._getTargetFromElement(e),[e])}),t},t._addAriaAndCollapsedClass=function(t,e){var n=g(t).hasClass(yt);e.length&&g(e).toggleClass(Tt,!n).attr("aria-expanded",n)},a._getTargetFromElement=function(t){var e=_.getSelectorFromElement(t);return e?document.querySelector(e):null},a._jQueryInterface=function(i){return this.each(function(){var t=g(this),e=t.data(dt),n=l({},mt,{},t.data(),{},"object"==typeof i&&i?i:{});if(!e&&n.toggle&&/show|hide/.test(i)&&(n.toggle=!1),e||(e=new a(this,n),t.data(dt,e)),"string"==typeof i){if("undefined"==typeof e[i])throw new TypeError('No method named "'+i+'"');e[i]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return mt}}]),a}();g(document).on(vt.CLICK_DATA_API,It,function(t){"A"===t.currentTarget.tagName&&t.preventDefault();var n=g(this),e=_.getSelectorFromElement(this),i=[].slice.call(document.querySelectorAll(e));g(i).each(function(){var t=g(this),e=t.data(dt)?"toggle":n.data();wt._jQueryInterface.call(t,e)})}),g.fn[ft]=wt._jQueryInterface,g.fn[ft].Constructor=wt,g.fn[ft].noConflict=function(){return g.fn[ft]=_t,wt._jQueryInterface};var At="dropdown",Nt="bs.dropdown",Ot="."+Nt,kt=".data-api",Pt=g.fn[At],Lt=new RegExp("38|40|27"),jt={HIDE:"hide"+Ot,HIDDEN:"hidden"+Ot,SHOW:"show"+Ot,SHOWN:"shown"+Ot,CLICK:"click"+Ot,CLICK_DATA_API:"click"+Ot+kt,KEYDOWN_DATA_API:"keydown"+Ot+kt,KEYUP_DATA_API:"keyup"+Ot+kt},Ht="disabled",Rt="show",xt="dropup",Ft="dropright",Ut="dropleft",Wt="dropdown-menu-right",qt="position-static",Mt='[data-toggle="dropdown"]',Kt=".dropdown form",Qt=".dropdown-menu",Bt=".navbar-nav",Vt=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Yt="top-start",zt="top-end",Xt="bottom-start",$t="bottom-end",Gt="right-start",Jt="left-start",Zt={offset:0,flip:!0,boundary:"scrollParent",reference:"toggle",display:"dynamic",popperConfig:null},te={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)",reference:"(string|element)",display:"string",popperConfig:"(null|object)"},ee=function(){function c(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var t=c.prototype;return t.toggle=function(){if(!this._element.disabled&&!g(this._element).hasClass(Ht)){var t=g(this._menu).hasClass(Rt);c._clearMenus(),t||this.show(!0)}},t.show=function(t){if(void 0===t&&(t=!1),!(this._element.disabled||g(this._element).hasClass(Ht)||g(this._menu).hasClass(Rt))){var e={relatedTarget:this._element},n=g.Event(jt.SHOW,e),i=c._getParentFromElement(this._element);if(g(i).trigger(n),!n.isDefaultPrevented()){if(!this._inNavbar&&t){if("undefined"==typeof u)throw new TypeError("Bootstrap's dropdowns require Popper.js (https://popper.js.org/)");var o=this._element;"parent"===this._config.reference?o=i:_.isElement(this._config.reference)&&(o=this._config.reference,"undefined"!=typeof this._config.reference.jquery&&(o=this._config.reference[0])),"scrollParent"!==this._config.boundary&&g(i).addClass(qt),this._popper=new u(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===g(i).closest(Bt).length&&g(document.body).children().on("mouseover",null,g.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),g(this._menu).toggleClass(Rt),g(i).toggleClass(Rt).trigger(g.Event(jt.SHOWN,e))}}},t.hide=function(){if(!this._element.disabled&&!g(this._element).hasClass(Ht)&&g(this._menu).hasClass(Rt)){var t={relatedTarget:this._element},e=g.Event(jt.HIDE,t),n=c._getParentFromElement(this._element);g(n).trigger(e),e.isDefaultPrevented()||(this._popper&&this._popper.destroy(),g(this._menu).toggleClass(Rt),g(n).toggleClass(Rt).trigger(g.Event(jt.HIDDEN,t)))}},t.dispose=function(){g.removeData(this._element,Nt),g(this._element).off(Ot),this._element=null,(this._menu=null)!==this._popper&&(this._popper.destroy(),this._popper=null)},t.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},t._addEventListeners=function(){var e=this;g(this._element).on(jt.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},t._getConfig=function(t){return t=l({},this.constructor.Default,{},g(this._element).data(),{},t),_.typeCheckConfig(At,t,this.constructor.DefaultType),t},t._getMenuElement=function(){if(!this._menu){var t=c._getParentFromElement(this._element);t&&(this._menu=t.querySelector(Qt))}return this._menu},t._getPlacement=function(){var t=g(this._element.parentNode),e=Xt;return t.hasClass(xt)?(e=Yt,g(this._menu).hasClass(Wt)&&(e=zt)):t.hasClass(Ft)?e=Gt:t.hasClass(Ut)?e=Jt:g(this._menu).hasClass(Wt)&&(e=$t),e},t._detectNavbar=function(){return 0<g(this._element).closest(".navbar").length},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,{},e._config.offset(t.offsets,e._element)||{}),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),l({},t,{},this._config.popperConfig)},c._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(Nt);if(t||(t=new c(this,"object"==typeof e?e:null),g(this).data(Nt,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},c._clearMenus=function(t){if(!t||3!==t.which&&("keyup"!==t.type||9===t.which))for(var e=[].slice.call(document.querySelectorAll(Mt)),n=0,i=e.length;n<i;n++){var o=c._getParentFromElement(e[n]),r=g(e[n]).data(Nt),s={relatedTarget:e[n]};if(t&&"click"===t.type&&(s.clickEvent=t),r){var a=r._menu;if(g(o).hasClass(Rt)&&!(t&&("click"===t.type&&/input|textarea/i.test(t.target.tagName)||"keyup"===t.type&&9===t.which)&&g.contains(o,t.target))){var l=g.Event(jt.HIDE,s);g(o).trigger(l),l.isDefaultPrevented()||("ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),e[n].setAttribute("aria-expanded","false"),r._popper&&r._popper.destroy(),g(a).removeClass(Rt),g(o).removeClass(Rt).trigger(g.Event(jt.HIDDEN,s)))}}}},c._getParentFromElement=function(t){var e,n=_.getSelectorFromElement(t);return n&&(e=document.querySelector(n)),e||t.parentNode},c._dataApiKeydownHandler=function(t){if((/input|textarea/i.test(t.target.tagName)?!(32===t.which||27!==t.which&&(40!==t.which&&38!==t.which||g(t.target).closest(Qt).length)):Lt.test(t.which))&&(t.preventDefault(),t.stopPropagation(),!this.disabled&&!g(this).hasClass(Ht))){var e=c._getParentFromElement(this),n=g(e).hasClass(Rt);if(n||27!==t.which)if(n&&(!n||27!==t.which&&32!==t.which)){var i=[].slice.call(e.querySelectorAll(Vt)).filter(function(t){return g(t).is(":visible")});if(0!==i.length){var o=i.indexOf(t.target);38===t.which&&0<o&&o--,40===t.which&&o<i.length-1&&o++,o<0&&(o=0),i[o].focus()}}else{if(27===t.which){var r=e.querySelector(Mt);g(r).trigger("focus")}g(this).trigger("click")}}},s(c,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Zt}},{key:"DefaultType",get:function(){return te}}]),c}();g(document).on(jt.KEYDOWN_DATA_API,Mt,ee._dataApiKeydownHandler).on(jt.KEYDOWN_DATA_API,Qt,ee._dataApiKeydownHandler).on(jt.CLICK_DATA_API+" "+jt.KEYUP_DATA_API,ee._clearMenus).on(jt.CLICK_DATA_API,Mt,function(t){t.preventDefault(),t.stopPropagation(),ee._jQueryInterface.call(g(this),"toggle")}).on(jt.CLICK_DATA_API,Kt,function(t){t.stopPropagation()}),g.fn[At]=ee._jQueryInterface,g.fn[At].Constructor=ee,g.fn[At].noConflict=function(){return g.fn[At]=Pt,ee._jQueryInterface};var ne="modal",ie="bs.modal",oe="."+ie,re=g.fn[ne],se={backdrop:!0,keyboard:!0,focus:!0,show:!0},ae={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},le={HIDE:"hide"+oe,HIDE_PREVENTED:"hidePrevented"+oe,HIDDEN:"hidden"+oe,SHOW:"show"+oe,SHOWN:"shown"+oe,FOCUSIN:"focusin"+oe,RESIZE:"resize"+oe,CLICK_DISMISS:"click.dismiss"+oe,KEYDOWN_DISMISS:"keydown.dismiss"+oe,MOUSEUP_DISMISS:"mouseup.dismiss"+oe,MOUSEDOWN_DISMISS:"mousedown.dismiss"+oe,CLICK_DATA_API:"click"+oe+".data-api"},ce="modal-dialog-scrollable",he="modal-scrollbar-measure",ue="modal-backdrop",fe="modal-open",de="fade",ge="show",_e="modal-static",me=".modal-dialog",pe=".modal-body",ve='[data-toggle="modal"]',ye='[data-dismiss="modal"]',Ee=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ce=".sticky-top",Te=function(){function o(t,e){this._config=this._getConfig(e),this._element=t,this._dialog=t.querySelector(me),this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollbarWidth=0}var t=o.prototype;return t.toggle=function(t){return this._isShown?this.hide():this.show(t)},t.show=function(t){var e=this;if(!this._isShown&&!this._isTransitioning){g(this._element).hasClass(de)&&(this._isTransitioning=!0);var n=g.Event(le.SHOW,{relatedTarget:t});g(this._element).trigger(n),this._isShown||n.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),g(this._element).on(le.CLICK_DISMISS,ye,function(t){return e.hide(t)}),g(this._dialog).on(le.MOUSEDOWN_DISMISS,function(){g(e._element).one(le.MOUSEUP_DISMISS,function(t){g(t.target).is(e._element)&&(e._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return e._showElement(t)}))}},t.hide=function(t){var e=this;if(t&&t.preventDefault(),this._isShown&&!this._isTransitioning){var n=g.Event(le.HIDE);if(g(this._element).trigger(n),this._isShown&&!n.isDefaultPrevented()){this._isShown=!1;var i=g(this._element).hasClass(de);if(i&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),g(document).off(le.FOCUSIN),g(this._element).removeClass(ge),g(this._element).off(le.CLICK_DISMISS),g(this._dialog).off(le.MOUSEDOWN_DISMISS),i){var o=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(t){return e._hideModal(t)}).emulateTransitionEnd(o)}else this._hideModal()}}},t.dispose=function(){[window,this._element,this._dialog].forEach(function(t){return g(t).off(oe)}),g(document).off(le.FOCUSIN),g.removeData(this._element,ie),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._isTransitioning=null,this._scrollbarWidth=null},t.handleUpdate=function(){this._adjustDialog()},t._getConfig=function(t){return t=l({},se,{},t),_.typeCheckConfig(ne,t,ae),t},t._triggerBackdropTransition=function(){var t=this;if("static"===this._config.backdrop){var e=g.Event(le.HIDE_PREVENTED);if(g(this._element).trigger(e),e.defaultPrevented)return;this._element.classList.add(_e);var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,function(){t._element.classList.remove(_e)}).emulateTransitionEnd(n),this._element.focus()}else this.hide()},t._showElement=function(t){var e=this,n=g(this._element).hasClass(de),i=this._dialog?this._dialog.querySelector(pe):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),g(this._dialog).hasClass(ce)&&i?i.scrollTop=0:this._element.scrollTop=0,n&&_.reflow(this._element),g(this._element).addClass(ge),this._config.focus&&this._enforceFocus();function o(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,g(e._element).trigger(r)}var r=g.Event(le.SHOWN,{relatedTarget:t});if(n){var s=_.getTransitionDurationFromElement(this._dialog);g(this._dialog).one(_.TRANSITION_END,o).emulateTransitionEnd(s)}else o()},t._enforceFocus=function(){var e=this;g(document).off(le.FOCUSIN).on(le.FOCUSIN,function(t){document!==t.target&&e._element!==t.target&&0===g(e._element).has(t.target).length&&e._element.focus()})},t._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?g(this._element).on(le.KEYDOWN_DISMISS,function(t){27===t.which&&e._triggerBackdropTransition()}):this._isShown||g(this._element).off(le.KEYDOWN_DISMISS)},t._setResizeEvent=function(){var e=this;this._isShown?g(window).on(le.RESIZE,function(t){return e.handleUpdate(t)}):g(window).off(le.RESIZE)},t._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._isTransitioning=!1,this._showBackdrop(function(){g(document.body).removeClass(fe),t._resetAdjustments(),t._resetScrollbar(),g(t._element).trigger(le.HIDDEN)})},t._removeBackdrop=function(){this._backdrop&&(g(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(t){var e=this,n=g(this._element).hasClass(de)?de:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=ue,n&&this._backdrop.classList.add(n),g(this._backdrop).appendTo(document.body),g(this._element).on(le.CLICK_DISMISS,function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&e._triggerBackdropTransition()}),n&&_.reflow(this._backdrop),g(this._backdrop).addClass(ge),!t)return;if(!n)return void t();var i=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){g(this._backdrop).removeClass(ge);var o=function(){e._removeBackdrop(),t&&t()};if(g(this._element).hasClass(de)){var r=_.getTransitionDurationFromElement(this._backdrop);g(this._backdrop).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o()}else t&&t()},t._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},t._setScrollbar=function(){var o=this;if(this._isBodyOverflowing){var t=[].slice.call(document.querySelectorAll(Ee)),e=[].slice.call(document.querySelectorAll(Ce));g(t).each(function(t,e){var n=e.style.paddingRight,i=g(e).css("padding-right");g(e).data("padding-right",n).css("padding-right",parseFloat(i)+o._scrollbarWidth+"px")}),g(e).each(function(t,e){var n=e.style.marginRight,i=g(e).css("margin-right");g(e).data("margin-right",n).css("margin-right",parseFloat(i)-o._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=g(document.body).css("padding-right");g(document.body).data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}g(document.body).addClass(fe)},t._resetScrollbar=function(){var t=[].slice.call(document.querySelectorAll(Ee));g(t).each(function(t,e){var n=g(e).data("padding-right");g(e).removeData("padding-right"),e.style.paddingRight=n||""});var e=[].slice.call(document.querySelectorAll(""+Ce));g(e).each(function(t,e){var n=g(e).data("margin-right");"undefined"!=typeof n&&g(e).css("margin-right",n).removeData("margin-right")});var n=g(document.body).data("padding-right");g(document.body).removeData("padding-right"),document.body.style.paddingRight=n||""},t._getScrollbarWidth=function(){var t=document.createElement("div");t.className=he,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(n,i){return this.each(function(){var t=g(this).data(ie),e=l({},se,{},g(this).data(),{},"object"==typeof n&&n?n:{});if(t||(t=new o(this,e),g(this).data(ie,t)),"string"==typeof n){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n](i)}else e.show&&t.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return se}}]),o}();g(document).on(le.CLICK_DATA_API,ve,function(t){var e,n=this,i=_.getSelectorFromElement(this);i&&(e=document.querySelector(i));var o=g(e).data(ie)?"toggle":l({},g(e).data(),{},g(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||t.preventDefault();var r=g(e).one(le.SHOW,function(t){t.isDefaultPrevented()||r.one(le.HIDDEN,function(){g(n).is(":visible")&&n.focus()})});Te._jQueryInterface.call(g(e),o,this)}),g.fn[ne]=Te._jQueryInterface,g.fn[ne].Constructor=Te,g.fn[ne].noConflict=function(){return g.fn[ne]=re,Te._jQueryInterface};var be=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],Se={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},De=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Ie=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function we(t,r,e){if(0===t.length)return t;if(e&&"function"==typeof e)return e(t);for(var n=(new window.DOMParser).parseFromString(t,"text/html"),s=Object.keys(r),a=[].slice.call(n.body.querySelectorAll("*")),i=function(t){var e=a[t],n=e.nodeName.toLowerCase();if(-1===s.indexOf(e.nodeName.toLowerCase()))return e.parentNode.removeChild(e),"continue";var i=[].slice.call(e.attributes),o=[].concat(r["*"]||[],r[n]||[]);i.forEach(function(t){!function(t,e){var n=t.nodeName.toLowerCase();if(-1!==e.indexOf(n))return-1===be.indexOf(n)||Boolean(t.nodeValue.match(De)||t.nodeValue.match(Ie));for(var i=e.filter(function(t){return t instanceof RegExp}),o=0,r=i.length;o<r;o++)if(n.match(i[o]))return!0;return!1}(t,o)&&e.removeAttribute(t.nodeName)})},o=0,l=a.length;o<l;o++)i(o);return n.body.innerHTML}var Ae="tooltip",Ne="bs.tooltip",Oe="."+Ne,ke=g.fn[Ae],Pe="bs-tooltip",Le=new RegExp("(^|\\s)"+Pe+"\\S+","g"),je=["sanitize","whiteList","sanitizeFn"],He={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Re={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},xe={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Se,popperConfig:null},Fe="show",Ue="out",We={HIDE:"hide"+Oe,HIDDEN:"hidden"+Oe,SHOW:"show"+Oe,SHOWN:"shown"+Oe,INSERTED:"inserted"+Oe,CLICK:"click"+Oe,FOCUSIN:"focusin"+Oe,FOCUSOUT:"focusout"+Oe,MOUSEENTER:"mouseenter"+Oe,MOUSELEAVE:"mouseleave"+Oe},qe="fade",Me="show",Ke=".tooltip-inner",Qe=".arrow",Be="hover",Ve="focus",Ye="click",ze="manual",Xe=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Me))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(qe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,this._getPopperConfig(a)),g(o).addClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===Ue&&e._leave(null,e)};if(g(this.tip).hasClass(qe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){function e(){n._hoverState!==Fe&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),g(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()}var n=this,i=this.getTipElement(),o=g.Event(this.constructor.Event.HIDE);if(g(this.element).trigger(o),!o.isDefaultPrevented()){if(g(i).removeClass(Me),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ye]=!1,this._activeTrigger[Ve]=!1,this._activeTrigger[Be]=!1,g(this.tip).hasClass(qe)){var r=_.getTransitionDurationFromElement(i);g(i).one(_.TRANSITION_END,e).emulateTransitionEnd(r)}else e();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Pe+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ke)),this.getTitle()),g(t).removeClass(qe+" "+Me)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=we(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t=t||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},t._getPopperConfig=function(t){var e=this;return l({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Qe},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},{},this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,{},e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Re[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==ze){var e=t===Be?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Be?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),this._hideModalHandler=function(){i.element&&i.hide()},g(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==t||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ve:Be]=!0),g(e.getTipElement()).hasClass(Me)||e._hoverState===Fe?e._hoverState=Fe:(clearTimeout(e._timeout),e._hoverState=Fe,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Fe&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ve:Be]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Ue,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===Ue&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==je.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,{},e,{},"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(Ae,t,this.constructor.DefaultType),t.sanitize&&(t.template=we(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Le);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(qe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ne),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ne,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return xe}},{key:"NAME",get:function(){return Ae}},{key:"DATA_KEY",get:function(){return Ne}},{key:"Event",get:function(){return We}},{key:"EVENT_KEY",get:function(){return Oe}},{key:"DefaultType",get:function(){return He}}]),i}();g.fn[Ae]=Xe._jQueryInterface,g.fn[Ae].Constructor=Xe,g.fn[Ae].noConflict=function(){return g.fn[Ae]=ke,Xe._jQueryInterface};var $e="popover",Ge="bs.popover",Je="."+Ge,Ze=g.fn[$e],tn="bs-popover",en=new RegExp("(^|\\s)"+tn+"\\S+","g"),nn=l({},Xe.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),on=l({},Xe.DefaultType,{content:"(string|element|function)"}),rn="fade",sn="show",an=".popover-header",ln=".popover-body",cn={HIDE:"hide"+Je,HIDDEN:"hidden"+Je,SHOW:"show"+Je,SHOWN:"shown"+Je,INSERTED:"inserted"+Je,CLICK:"click"+Je,FOCUSIN:"focusin"+Je,FOCUSOUT:"focusout"+Je,MOUSEENTER:"mouseenter"+Je,MOUSELEAVE:"mouseleave"+Je},hn=function(t){function i(){return t.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}(i,t);var e=i.prototype;return e.isWithContent=function(){return this.getTitle()||this._getContent()},e.addAttachmentClass=function(t){g(this.getTipElement()).addClass(tn+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},e.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(an),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ln),e),t.removeClass(rn+" "+sn)},e._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},e._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(en);null!==e&&0<e.length&&t.removeClass(e.join(""))},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ge),e="object"==typeof n?n:null;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ge,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return nn}},{key:"NAME",get:function(){return $e}},{key:"DATA_KEY",get:function(){return Ge}},{key:"Event",get:function(){return cn}},{key:"EVENT_KEY",get:function(){return Je}},{key:"DefaultType",get:function(){return on}}]),i}(Xe);g.fn[$e]=hn._jQueryInterface,g.fn[$e].Constructor=hn,g.fn[$e].noConflict=function(){return g.fn[$e]=Ze,hn._jQueryInterface};var un="scrollspy",fn="bs.scrollspy",dn="."+fn,gn=g.fn[un],_n={offset:10,method:"auto",target:""},mn={offset:"number",method:"string",target:"(string|element)"},pn={ACTIVATE:"activate"+dn,SCROLL:"scroll"+dn,LOAD_DATA_API:"load"+dn+".data-api"},vn="dropdown-item",yn="active",En='[data-spy="scroll"]',Cn=".nav, .list-group",Tn=".nav-link",bn=".nav-item",Sn=".list-group-item",Dn=".dropdown",In=".dropdown-item",wn=".dropdown-toggle",An="offset",Nn="position",On=function(){function n(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+Tn+","+this._config.target+" "+Sn+","+this._config.target+" "+In,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,g(this._scrollElement).on(pn.SCROLL,function(t){return n._process(t)}),this.refresh(),this._process()}var t=n.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?An:Nn,o="auto"===this._config.method?t:this._config.method,r=o===Nn?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map(function(t){var e,n=_.getSelectorFromElement(t);if(n&&(e=document.querySelector(n)),e){var i=e.getBoundingClientRect();if(i.width||i.height)return[g(e)[o]().top+r,n]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},t.dispose=function(){g.removeData(this._element,fn),g(this._scrollElement).off(dn),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(t){if("string"!=typeof(t=l({},_n,{},"object"==typeof t&&t?t:{})).target){var e=g(t.target).attr("id");e||(e=_.getUID(un),g(t.target).attr("id",e)),t.target="#"+e}return _.typeCheckConfig(un,t,mn),t},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),n<=t){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&0<this._offsets[0])return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}}},t._activate=function(e){this._activeTarget=e,this._clear();var t=this._selector.split(",").map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'}),n=g([].slice.call(document.querySelectorAll(t.join(","))));n.hasClass(vn)?(n.closest(Dn).find(wn).addClass(yn),n.addClass(yn)):(n.addClass(yn),n.parents(Cn).prev(Tn+", "+Sn).addClass(yn),n.parents(Cn).prev(bn).children(Tn).addClass(yn)),g(this._scrollElement).trigger(pn.ACTIVATE,{relatedTarget:e})},t._clear=function(){[].slice.call(document.querySelectorAll(this._selector)).filter(function(t){return t.classList.contains(yn)}).forEach(function(t){return t.classList.remove(yn)})},n._jQueryInterface=function(e){return this.each(function(){var t=g(this).data(fn);if(t||(t=new n(this,"object"==typeof e&&e),g(this).data(fn,t)),"string"==typeof e){if("undefined"==typeof t[e])throw new TypeError('No method named "'+e+'"');t[e]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return _n}}]),n}();g(window).on(pn.LOAD_DATA_API,function(){for(var t=[].slice.call(document.querySelectorAll(En)),e=t.length;e--;){var n=g(t[e]);On._jQueryInterface.call(n,n.data())}}),g.fn[un]=On._jQueryInterface,g.fn[un].Constructor=On,g.fn[un].noConflict=function(){return g.fn[un]=gn,On._jQueryInterface};var kn="bs.tab",Pn="."+kn,Ln=g.fn.tab,jn={HIDE:"hide"+Pn,HIDDEN:"hidden"+Pn,SHOW:"show"+Pn,SHOWN:"shown"+Pn,CLICK_DATA_API:"click"+Pn+".data-api"},Hn="dropdown-menu",Rn="active",xn="disabled",Fn="fade",Un="show",Wn=".dropdown",qn=".nav, .list-group",Mn=".active",Kn="> li > .active",Qn='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',Bn=".dropdown-toggle",Vn="> .dropdown-menu .active",Yn=function(){function i(t){this._element=t}var t=i.prototype;return t.show=function(){var n=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&g(this._element).hasClass(Rn)||g(this._element).hasClass(xn))){var t,i,e=g(this._element).closest(qn)[0],o=_.getSelectorFromElement(this._element);if(e){var r="UL"===e.nodeName||"OL"===e.nodeName?Kn:Mn;i=(i=g.makeArray(g(e).find(r)))[i.length-1]}var s=g.Event(jn.HIDE,{relatedTarget:this._element}),a=g.Event(jn.SHOW,{relatedTarget:i});if(i&&g(i).trigger(s),g(this._element).trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){o&&(t=document.querySelector(o)),this._activate(this._element,e);var l=function(){var t=g.Event(jn.HIDDEN,{relatedTarget:n._element}),e=g.Event(jn.SHOWN,{relatedTarget:i});g(i).trigger(t),g(n._element).trigger(e)};t?this._activate(t,t.parentNode,l):l()}}},t.dispose=function(){g.removeData(this._element,kn),this._element=null},t._activate=function(t,e,n){function i(){return o._transitionComplete(t,r,n)}var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?g(e).children(Mn):g(e).find(Kn))[0],s=n&&r&&g(r).hasClass(Fn);if(r&&s){var a=_.getTransitionDurationFromElement(r);g(r).removeClass(Un).one(_.TRANSITION_END,i).emulateTransitionEnd(a)}else i()},t._transitionComplete=function(t,e,n){if(e){g(e).removeClass(Rn);var i=g(e.parentNode).find(Vn)[0];i&&g(i).removeClass(Rn),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(g(t).addClass(Rn),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),_.reflow(t),t.classList.contains(Fn)&&t.classList.add(Un),t.parentNode&&g(t.parentNode).hasClass(Hn)){var o=g(t).closest(Wn)[0];if(o){var r=[].slice.call(o.querySelectorAll(Bn));g(r).addClass(Rn)}t.setAttribute("aria-expanded",!0)}n&&n()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(kn);if(e||(e=new i(this),t.data(kn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}}]),i}();g(document).on(jn.CLICK_DATA_API,Qn,function(t){t.preventDefault(),Yn._jQueryInterface.call(g(this),"show")}),g.fn.tab=Yn._jQueryInterface,g.fn.tab.Constructor=Yn,g.fn.tab.noConflict=function(){return g.fn.tab=Ln,Yn._jQueryInterface};var zn="toast",Xn="bs.toast",$n="."+Xn,Gn=g.fn[zn],Jn={CLICK_DISMISS:"click.dismiss"+$n,HIDE:"hide"+$n,HIDDEN:"hidden"+$n,SHOW:"show"+$n,SHOWN:"shown"+$n},Zn="fade",ti="hide",ei="show",ni="showing",ii={animation:"boolean",autohide:"boolean",delay:"number"},oi={animation:!0,autohide:!0,delay:500},ri='[data-dismiss="toast"]',si=function(){function i(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var t=i.prototype;return t.show=function(){var t=this,e=g.Event(Jn.SHOW);if(g(this._element).trigger(e),!e.isDefaultPrevented()){this._config.animation&&this._element.classList.add(Zn);var n=function(){t._element.classList.remove(ni),t._element.classList.add(ei),g(t._element).trigger(Jn.SHOWN),t._config.autohide&&(t._timeout=setTimeout(function(){t.hide()},t._config.delay))};if(this._element.classList.remove(ti),_.reflow(this._element),this._element.classList.add(ni),this._config.animation){var i=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},t.hide=function(){if(this._element.classList.contains(ei)){var t=g.Event(Jn.HIDE);g(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},t.dispose=function(){clearTimeout(this._timeout),this._timeout=null,this._element.classList.contains(ei)&&this._element.classList.remove(ei),g(this._element).off(Jn.CLICK_DISMISS),g.removeData(this._element,Xn),this._element=null,this._config=null},t._getConfig=function(t){return t=l({},oi,{},g(this._element).data(),{},"object"==typeof t&&t?t:{}),_.typeCheckConfig(zn,t,this.constructor.DefaultType),t},t._setListeners=function(){var t=this;g(this._element).on(Jn.CLICK_DISMISS,ri,function(){return t.hide()})},t._close=function(){function t(){e._element.classList.add(ti),g(e._element).trigger(Jn.HIDDEN)}var e=this;if(this._element.classList.remove(ei),this._config.animation){var n=_.getTransitionDurationFromElement(this._element);g(this._element).one(_.TRANSITION_END,t).emulateTransitionEnd(n)}else t()},i._jQueryInterface=function(n){return this.each(function(){var t=g(this),e=t.data(Xn);if(e||(e=new i(this,"object"==typeof n&&n),t.data(Xn,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](this)}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"DefaultType",get:function(){return ii}},{key:"Default",get:function(){return oi}}]),i}();g.fn[zn]=si._jQueryInterface,g.fn[zn].Constructor=si,g.fn[zn].noConflict=function(){return g.fn[zn]=Gn,si._jQueryInterface},t.Alert=v,t.Button=H,t.Carousel=ut,t.Collapse=wt,t.Dropdown=ee,t.Modal=Te,t.Popover=hn,t.Scrollspy=On,t.Tab=Yn,t.Toast=si,t.Tooltip=Xe,t.Util=_,Object.defineProperty(t,"__esModule",{value:!0})});
|
7 |
//# sourceMappingURL=bootstrap.min.js.map
|
resources/js/global-plugin.js
CHANGED
@@ -22,6 +22,18 @@ var iCWP_WPSF_SecurityAdmin = new function () {
|
|
22 |
return false;
|
23 |
}
|
24 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
} );
|
26 |
};
|
27 |
}();
|
22 |
return false;
|
23 |
}
|
24 |
);
|
25 |
+
|
26 |
+
if ( typeof icwp_wpsf_vars_secadmin !== 'undefined' ) {
|
27 |
+
jQuery( document ).on( "click", '#SecAdminRemoveConfirmEmail',
|
28 |
+
function ( event ) {
|
29 |
+
event.preventDefault();
|
30 |
+
if ( confirm( icwp_wpsf_vars_secadmin.strings.are_you_sure ) ) {
|
31 |
+
iCWP_WPSF_StandardAjax.send_ajax_req( icwp_wpsf_vars_secadmin.ajax.req_email_remove );
|
32 |
+
}
|
33 |
+
return false;
|
34 |
+
}
|
35 |
+
);
|
36 |
+
}
|
37 |
} );
|
38 |
};
|
39 |
}();
|
resources/js/introjs.min.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t(),module.exports.introJs=function(){return console.warn('Deprecated: please use require("intro.js") directly, instead of the introJs method of the function'),t().apply(this,arguments)};else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).introJs=t()}}(function(){function n(t){this._targetElement=t,this._introItems=[],this._options={nextLabel:"Next →",prevLabel:"← Back",skipLabel:"Skip",doneLabel:"Done",hidePrev:!1,hideNext:!1,tooltipPosition:"bottom",tooltipClass:"",highlightClass:"",exitOnEsc:!0,exitOnOverlayClick:!0,showStepNumbers:!0,keyboardNavigation:!0,showButtons:!0,showBullets:!0,showProgress:!1,scrollToElement:!0,scrollTo:"element",scrollPadding:30,overlayOpacity:.8,positionPrecedence:["bottom","top","right","left"],disableInteraction:!1,helperElementPadding:10,hintPosition:"top-middle",hintButtonLabel:"Got it",hintAnimation:!0,buttonClass:"introjs-button"}}function e(t,i){var e=t.querySelectorAll("*[data-intro]"),n=[];if(this._options.steps)B(this._options.steps,function(t){var e=h(t);if(e.step=n.length+1,"string"==typeof e.element&&(e.element=document.querySelector(e.element)),void 0===e.element||null===e.element){var i=document.querySelector(".introjsFloatingElement");null===i&&((i=document.createElement("div")).className="introjsFloatingElement",document.body.appendChild(i)),e.element=i,e.position="floating"}e.scrollTo=e.scrollTo||this._options.scrollTo,void 0===e.disableInteraction&&(e.disableInteraction=this._options.disableInteraction),null!==e.element&&n.push(e)}.bind(this));else{var o;if(e.length<1)return!1;B(e,function(t){if((!i||t.getAttribute("data-intro-group")===i)&&"none"!==t.style.display){var e=parseInt(t.getAttribute("data-step"),10);o=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,0<e&&(n[e-1]={element:t,intro:t.getAttribute("data-intro"),step:parseInt(t.getAttribute("data-step"),10),tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:o})}}.bind(this));var s=0;B(e,function(t){if((!i||t.getAttribute("data-intro-group")===i)&&null===t.getAttribute("data-step")){for(;void 0!==n[s];)s++;o=void 0!==t.getAttribute("data-disable-interaction")?!!t.getAttribute("data-disable-interaction"):this._options.disableInteraction,n[s]={element:t,intro:t.getAttribute("data-intro"),step:s+1,tooltipClass:t.getAttribute("data-tooltipclass"),highlightClass:t.getAttribute("data-highlightclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition,scrollTo:t.getAttribute("data-scrollto")||this._options.scrollTo,disableInteraction:o}}}.bind(this))}for(var l=[],r=0;r<n.length;r++)n[r]&&l.push(n[r]);return(n=l).sort(function(t,e){return t.step-e.step}),this._introItems=n,function(t){var e=document.createElement("div"),i="",n=this;if(e.className="introjs-overlay",t.tagName&&"body"!==t.tagName.toLowerCase()){var o=k(t);o&&(i+="width: "+o.width+"px; height:"+o.height+"px; top:"+o.top+"px;left: "+o.left+"px;",e.style.cssText=i)}else i+="top: 0;bottom: 0; left: 0;right: 0;position: fixed;",e.style.cssText=i;return t.appendChild(e),e.onclick=function(){!0===n._options.exitOnOverlayClick&&A.call(n,t)},window.setTimeout(function(){i+="opacity: "+n._options.overlayOpacity.toString()+";",e.style.cssText=i},10),!0}.call(this,t)&&(E.call(this),this._options.keyboardNavigation&&u.on(window,"keydown",c,this,!0),u.on(window,"resize",a,this,!0)),!1}function a(){this.refresh.call(this)}function c(t){var e=null===t.code?t.which:t.code;if(null===e&&(e=null===t.charCode?t.keyCode:t.charCode),"Escape"!==e&&27!==e||!0!==this._options.exitOnEsc){if("ArrowLeft"===e||37===e)N.call(this);else if("ArrowRight"===e||39===e)E.call(this);else if("Enter"===e||13===e){var i=t.target||t.srcElement;i&&i.className.match("introjs-prevbutton")?N.call(this):i&&i.className.match("introjs-skipbutton")?(this._introItems.length-1===this._currentStep&&"function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),A.call(this,this._targetElement)):i&&i.getAttribute("data-stepnumber")?i.click():E.call(this),t.preventDefault?t.preventDefault():t.returnValue=!1}}else A.call(this,this._targetElement)}function h(t){if(null===t||"object"!=typeof t||void 0!==t.nodeType)return t;var e={};for(var i in t)void 0!==window.jQuery&&t[i]instanceof window.jQuery?e[i]=t[i]:e[i]=h(t[i]);return e}function E(){this._direction="forward",void 0!==this._currentStepNumber&&B(this._introItems,function(t,e){t.step===this._currentStepNumber&&(this._currentStep=e-1,this._currentStepNumber=void 0)}.bind(this)),void 0===this._currentStep?this._currentStep=0:++this._currentStep;var t=this._introItems[this._currentStep],e=!0;return void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e?(--this._currentStep,!1):this._introItems.length<=this._currentStep?("function"==typeof this._introCompleteCallback&&this._introCompleteCallback.call(this),void A.call(this,this._targetElement)):void i.call(this,t)}function N(){if(this._direction="backward",0===this._currentStep)return!1;--this._currentStep;var t=this._introItems[this._currentStep],e=!0;if(void 0!==this._introBeforeChangeCallback&&(e=this._introBeforeChangeCallback.call(this,t.element)),!1===e)return++this._currentStep,!1;i.call(this,t)}function A(t,e){var i=!0;if(void 0!==this._introBeforeExitCallback&&(i=this._introBeforeExitCallback.call(this)),e||!1!==i){var n=t.querySelectorAll(".introjs-overlay");n&&n.length&&B(n,function(t){t.style.opacity=0,window.setTimeout(function(){this.parentNode&&this.parentNode.removeChild(this)}.bind(t),500)}.bind(this));var o=t.querySelector(".introjs-helperLayer");o&&o.parentNode.removeChild(o);var s=t.querySelector(".introjs-tooltipReferenceLayer");s&&s.parentNode.removeChild(s);var l=t.querySelector(".introjs-disableInteraction");l&&l.parentNode.removeChild(l);var r=document.querySelector(".introjsFloatingElement");r&&r.parentNode.removeChild(r),q(),B(document.querySelectorAll(".introjs-fixParent"),function(t){O(t,/introjs-fixParent/g)}),u.off(window,"keydown",c,this,!0),u.off(window,"resize",a,this,!0),void 0!==this._introExitCallback&&this._introExitCallback.call(this),this._currentStep=void 0}}function L(t,e,i,n,o){var s,l,r,a,c,h="";if(o=o||!1,e.style.top=null,e.style.right=null,e.style.bottom=null,e.style.left=null,e.style.marginLeft=null,e.style.marginTop=null,i.style.display="inherit",null!=n&&(n.style.top=null,n.style.left=null),this._introItems[this._currentStep])switch(h="string"==typeof(s=this._introItems[this._currentStep]).tooltipClass?s.tooltipClass:this._options.tooltipClass,e.className=("introjs-tooltip "+h).replace(/^\s+|\s+$/g,""),e.setAttribute("role","dialog"),"floating"!==(c=this._introItems[this._currentStep].position)&&(c=function(t,e,i){var n=this._options.positionPrecedence.slice(),o=b(),s=k(e).height+10,l=k(e).width+20,r=t.getBoundingClientRect(),a="floating";r.bottom+s+s>o.height&&m(n,"bottom");r.top-s<0&&m(n,"top");r.right+l>o.width&&m(n,"right");r.left-l<0&&m(n,"left");var c=(h=i||"",u=h.indexOf("-"),-1!==u?h.substr(u):"");var h,u;i&&(i=i.split("-")[0]);n.length&&(a="auto"!==i&&-1<n.indexOf(i)?i:n[0]);-1!==["top","bottom"].indexOf(a)&&(a+=function(t,e,i,n){var o=e/2,s=Math.min(i.width,window.screen.width),l=["-left-aligned","-middle-aligned","-right-aligned"],r="";s-t<e&&m(l,"-left-aligned");(t<o||s-t<o)&&m(l,"-middle-aligned");t<e&&m(l,"-right-aligned");r=l.length?-1!==l.indexOf(n)?n:l[0]:"-middle-aligned";return r}(r.left,l,o,c));return a}.call(this,t,e,c)),r=k(t),l=k(e),a=b(),H(e,"introjs-"+c),c){case"top-right-aligned":i.className="introjs-arrow bottom-right";var u=0;f(r,u,l,e),e.style.bottom=r.height+20+"px";break;case"top-middle-aligned":i.className="introjs-arrow bottom-middle";var d=r.width/2-l.width/2;o&&(d+=5),f(r,d,l,e)&&(e.style.right=null,p(r,d,l,a,e)),e.style.bottom=r.height+20+"px";break;case"top-left-aligned":case"top":i.className="introjs-arrow bottom",p(r,o?0:15,l,a,e),e.style.bottom=r.height+20+"px";break;case"right":e.style.left=r.width+20+"px",r.top+l.height>a.height?(i.className="introjs-arrow left-bottom",e.style.top="-"+(l.height-r.height-20)+"px"):i.className="introjs-arrow left";break;case"left":o||!0!==this._options.showStepNumbers||(e.style.top="15px"),r.top+l.height>a.height?(e.style.top="-"+(l.height-r.height-20)+"px",i.className="introjs-arrow right-bottom"):i.className="introjs-arrow right",e.style.right=r.width+20+"px";break;case"floating":i.style.display="none",e.style.left="50%",e.style.top="50%",e.style.marginLeft="-"+l.width/2+"px",e.style.marginTop="-"+l.height/2+"px",null!=n&&(n.style.left="-"+(l.width/2+18)+"px",n.style.top="-"+(l.height/2+18)+"px");break;case"bottom-right-aligned":i.className="introjs-arrow top-right",f(r,u=0,l,e),e.style.top=r.height+20+"px";break;case"bottom-middle-aligned":i.className="introjs-arrow top-middle",d=r.width/2-l.width/2,o&&(d+=5),f(r,d,l,e)&&(e.style.right=null,p(r,d,l,a,e)),e.style.top=r.height+20+"px";break;default:i.className="introjs-arrow top",p(r,0,l,a,e),e.style.top=r.height+20+"px"}}function p(t,e,i,n,o){return t.left+e+i.width>n.width?(o.style.left=n.width-i.width-t.left+"px",!1):(o.style.left=e+"px",!0)}function f(t,e,i,n){return t.left+t.width-e-i.width<0?(n.style.left=-t.left+"px",!1):(n.style.right=e+"px",!0)}function m(t,e){-1<t.indexOf(e)&&t.splice(t.indexOf(e),1)}function T(t){if(t){if(!this._introItems[this._currentStep])return;var e=this._introItems[this._currentStep],i=k(e.element),n=this._options.helperElementPadding;d(e.element)?H(t,"introjs-fixedTooltip"):O(t,"introjs-fixedTooltip"),"floating"===e.position&&(n=0),t.style.cssText="width: "+(i.width+n)+"px; height:"+(i.height+n)+"px; top:"+(i.top-n/2)+"px;left: "+(i.left-n/2)+"px;"}}function I(t){t.setAttribute("role","button"),t.tabIndex=0}function i(o){void 0!==this._introChangeCallback&&this._introChangeCallback.call(this,o.element);var t,e,i,n,s=this,l=document.querySelector(".introjs-helperLayer"),r=document.querySelector(".introjs-tooltipReferenceLayer"),a="introjs-helperLayer";if("string"==typeof o.highlightClass&&(a+=" "+o.highlightClass),"string"==typeof this._options.highlightClass&&(a+=" "+this._options.highlightClass),null!==l){var c=r.querySelector(".introjs-helperNumberLayer"),h=r.querySelector(".introjs-tooltiptext"),u=r.querySelector(".introjs-arrow"),d=r.querySelector(".introjs-tooltip");if(i=r.querySelector(".introjs-skipbutton"),e=r.querySelector(".introjs-prevbutton"),t=r.querySelector(".introjs-nextbutton"),l.className=a,d.style.opacity=0,d.style.display="none",null!==c){var p=this._introItems[0<=o.step-2?o.step-2:0];(null!==p&&"forward"===this._direction&&"floating"===p.position||"backward"===this._direction&&"floating"===o.position)&&(c.style.opacity=0)}(n=R(o.element))!==document.body&&V(n,o.element),T.call(s,l),T.call(s,r),B(document.querySelectorAll(".introjs-fixParent"),function(t){O(t,/introjs-fixParent/g)}),q(),s._lastShowElementTimer&&window.clearTimeout(s._lastShowElementTimer),s._lastShowElementTimer=window.setTimeout(function(){null!==c&&(c.innerHTML=o.step),h.innerHTML=o.intro,d.style.display="block",L.call(s,o.element,d,u,c),s._options.showBullets&&(r.querySelector(".introjs-bullets li > a.active").className="",r.querySelector('.introjs-bullets li > a[data-stepnumber="'+o.step+'"]').className="active"),r.querySelector(".introjs-progress .introjs-progressbar").style.cssText="width:"+z.call(s)+"%;",r.querySelector(".introjs-progress .introjs-progressbar").setAttribute("aria-valuenow",z.call(s)),d.style.opacity=1,c&&(c.style.opacity=1),null!=i&&/introjs-donebutton/gi.test(i.className)?i.focus():null!=t&&t.focus(),P.call(s,o.scrollTo,o,h)},350)}else{var f=document.createElement("div"),m=document.createElement("div"),b=document.createElement("div"),g=document.createElement("div"),y=document.createElement("div"),v=document.createElement("div"),_=document.createElement("div"),w=document.createElement("div");f.className=a,m.className="introjs-tooltipReferenceLayer",(n=R(o.element))!==document.body&&V(n,o.element),T.call(s,f),T.call(s,m),this._targetElement.appendChild(f),this._targetElement.appendChild(m),b.className="introjs-arrow",y.className="introjs-tooltiptext",y.innerHTML=o.intro,!(v.className="introjs-bullets")===this._options.showBullets&&(v.style.display="none");var C=document.createElement("ul");C.setAttribute("role","tablist");var j=function(){s.goToStep(this.getAttribute("data-stepnumber"))};B(this._introItems,function(t,e){var i=document.createElement("li"),n=document.createElement("a");i.setAttribute("role","presentation"),n.setAttribute("role","tab"),n.onclick=j,e===o.step-1&&(n.className="active"),I(n),n.innerHTML=" ",n.setAttribute("data-stepnumber",t.step),i.appendChild(n),C.appendChild(i)}),v.appendChild(C),!(_.className="introjs-progress")===this._options.showProgress&&(_.style.display="none");var k=document.createElement("div");k.className="introjs-progressbar",k.setAttribute("role","progress"),k.setAttribute("aria-valuemin",0),k.setAttribute("aria-valuemax",100),k.setAttribute("aria-valuenow",z.call(this)),k.style.cssText="width:"+z.call(this)+"%;",_.appendChild(k),!(w.className="introjs-tooltipbuttons")===this._options.showButtons&&(w.style.display="none"),g.className="introjs-tooltip",g.appendChild(y),g.appendChild(v),g.appendChild(_);var x=document.createElement("span");!0===this._options.showStepNumbers&&(x.className="introjs-helperNumberLayer",x.innerHTML=o.step,m.appendChild(x)),g.appendChild(b),m.appendChild(g),(t=document.createElement("a")).onclick=function(){s._introItems.length-1!==s._currentStep&&E.call(s)},I(t),t.innerHTML=this._options.nextLabel,(e=document.createElement("a")).onclick=function(){0!==s._currentStep&&N.call(s)},I(e),e.innerHTML=this._options.prevLabel,(i=document.createElement("a")).className=this._options.buttonClass+" introjs-skipbutton ",I(i),i.innerHTML=this._options.skipLabel,i.onclick=function(){s._introItems.length-1===s._currentStep&&"function"==typeof s._introCompleteCallback&&s._introCompleteCallback.call(s),s._introItems.length-1!==s._currentStep&&"function"==typeof s._introExitCallback&&s._introExitCallback.call(s),"function"==typeof s._introSkipCallback&&s._introSkipCallback.call(s),A.call(s,s._targetElement)},w.appendChild(i),1<this._introItems.length&&(w.appendChild(e),w.appendChild(t)),g.appendChild(w),L.call(s,o.element,g,b,x),P.call(this,o.scrollTo,o,g)}var S=s._targetElement.querySelector(".introjs-disableInteraction");S&&S.parentNode.removeChild(S),o.disableInteraction&&function(){var t=document.querySelector(".introjs-disableInteraction");null===t&&((t=document.createElement("div")).className="introjs-disableInteraction",this._targetElement.appendChild(t)),T.call(this,t)}.call(s),0===this._currentStep&&1<this._introItems.length?(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton"),!0===this._options.hidePrev?(null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton introjs-hidden"),null!=t&&H(t,"introjs-fullbutton")):null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton introjs-disabled"),null!=i&&(i.innerHTML=this._options.skipLabel)):this._introItems.length-1===this._currentStep||1===this._introItems.length?(null!=i&&(i.innerHTML=this._options.doneLabel,H(i,"introjs-donebutton")),null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton"),!0===this._options.hideNext?(null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton introjs-hidden"),null!=e&&H(e,"introjs-fullbutton")):null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton introjs-disabled")):(null!=i&&(i.className=this._options.buttonClass+" introjs-skipbutton"),null!=e&&(e.className=this._options.buttonClass+" introjs-prevbutton"),null!=t&&(t.className=this._options.buttonClass+" introjs-nextbutton"),null!=i&&(i.innerHTML=this._options.skipLabel)),e.setAttribute("role","button"),t.setAttribute("role","button"),i.setAttribute("role","button"),null!=t&&t.focus(),function(t){var e;if(t.element instanceof SVGElement)for(e=t.element.parentNode;null!==t.element.parentNode&&e.tagName&&"body"!==e.tagName.toLowerCase();)"svg"===e.tagName.toLowerCase()&&H(e,"introjs-showElement introjs-relativePosition"),e=e.parentNode;H(t.element,"introjs-showElement");var i=M(t.element,"position");"absolute"!==i&&"relative"!==i&&"fixed"!==i&&H(t.element,"introjs-relativePosition");e=t.element.parentNode;for(;null!==e&&e.tagName&&"body"!==e.tagName.toLowerCase();){var n=M(e,"z-index"),o=parseFloat(M(e,"opacity")),s=M(e,"transform")||M(e,"-webkit-transform")||M(e,"-moz-transform")||M(e,"-ms-transform")||M(e,"-o-transform");(/[0-9]+/.test(n)||o<1||"none"!==s&&void 0!==s)&&H(e,"introjs-fixParent"),e=e.parentNode}}(o),void 0!==this._introAfterChangeCallback&&this._introAfterChangeCallback.call(this,o.element)}function P(t,e,i){var n,o,s;if("off"!==t&&(this._options.scrollToElement&&(n="tooltip"===t?i.getBoundingClientRect():e.element.getBoundingClientRect(),o=e.element,!(0<=(s=o.getBoundingClientRect()).top&&0<=s.left&&s.bottom+80<=window.innerHeight&&s.right<=window.innerWidth)))){var l=b().height;n.bottom-(n.bottom-n.top)<0||e.element.clientHeight>l?window.scrollBy(0,n.top-(l/2-n.height/2)-this._options.scrollPadding):window.scrollBy(0,n.top-(l/2-n.height/2)+this._options.scrollPadding)}}function q(){B(document.querySelectorAll(".introjs-showElement"),function(t){O(t,/introjs-[a-zA-Z]+/g)})}function B(t,e,i){if(t)for(var n=0,o=t.length;n<o;n++)e(t[n],n);"function"==typeof i&&i()}var o,s=(o={},function(t,e){return o[e=e||"introjs-stamp"]=o[e]||0,void 0===t[e]&&(t[e]=o[e]++),t[e]}),u=new function(){var r="introjs_event";this._id=function(t,e,i,n){return e+s(i)+(n?"_"+s(n):"")},this.on=function(e,t,i,n,o){var s=this._id.apply(this,arguments),l=function(t){return i.call(n||e,t||window.event)};"addEventListener"in e?e.addEventListener(t,l,o):"attachEvent"in e&&e.attachEvent("on"+t,l),e[r]=e[r]||{},e[r][s]=l},this.off=function(t,e,i,n,o){var s=this._id.apply(this,arguments),l=t[r]&&t[r][s];l&&("removeEventListener"in t?t.removeEventListener(e,l,o):"detachEvent"in t&&t.detachEvent("on"+e,l),t[r][s]=null)}};function H(e,t){if(e instanceof SVGElement){var i=e.getAttribute("class")||"";e.setAttribute("class",i+" "+t)}else{if(void 0!==e.classList)B(t.split(" "),function(t){e.classList.add(t)});else e.className.match(t)||(e.className+=" "+t)}}function O(t,e){if(t instanceof SVGElement){var i=t.getAttribute("class")||"";t.setAttribute("class",i.replace(e,"").replace(/^\s+|\s+$/g,""))}else t.className=t.className.replace(e,"").replace(/^\s+|\s+$/g,"")}function M(t,e){var i="";return t.currentStyle?i=t.currentStyle[e]:document.defaultView&&document.defaultView.getComputedStyle&&(i=document.defaultView.getComputedStyle(t,null).getPropertyValue(e)),i&&i.toLowerCase?i.toLowerCase():i}function d(t){var e=t.parentNode;return!(!e||"HTML"===e.nodeName)&&("fixed"===M(t,"position")||d(e))}function b(){if(void 0!==window.innerWidth)return{width:window.innerWidth,height:window.innerHeight};var t=document.documentElement;return{width:t.clientWidth,height:t.clientHeight}}function g(){var t=document.querySelector(".introjs-hintReference");if(t){var e=t.getAttribute("data-step");return t.parentNode.removeChild(t),e}}function l(t){if(this._introItems=[],this._options.hints)B(this._options.hints,function(t){var e=h(t);"string"==typeof e.element&&(e.element=document.querySelector(e.element)),e.hintPosition=e.hintPosition||this._options.hintPosition,e.hintAnimation=e.hintAnimation||this._options.hintAnimation,null!==e.element&&this._introItems.push(e)}.bind(this));else{var e=t.querySelectorAll("*[data-hint]");if(!e||!e.length)return!1;B(e,function(t){var e=t.getAttribute("data-hintanimation");e=e?"true"===e:this._options.hintAnimation,this._introItems.push({element:t,hint:t.getAttribute("data-hint"),hintPosition:t.getAttribute("data-hintposition")||this._options.hintPosition,hintAnimation:e,tooltipClass:t.getAttribute("data-tooltipclass"),position:t.getAttribute("data-position")||this._options.tooltipPosition})}.bind(this))}(function(){var l=this,r=document.querySelector(".introjs-hints");null===r&&((r=document.createElement("div")).className="introjs-hints");B(this._introItems,function(t,e){if(!document.querySelector('.introjs-hint[data-step="'+e+'"]')){var i,n=document.createElement("a");I(n),n.onclick=(i=e,function(t){var e=t||window.event;e.stopPropagation&&e.stopPropagation(),null!==e.cancelBubble&&(e.cancelBubble=!0),j.call(l,i)}),n.className="introjs-hint",t.hintAnimation||H(n,"introjs-hint-no-anim"),d(t.element)&&H(n,"introjs-fixedhint");var o=document.createElement("div");o.className="introjs-hint-dot";var s=document.createElement("div");s.className="introjs-hint-pulse",n.appendChild(o),n.appendChild(s),n.setAttribute("data-step",e),t.targetElement=t.element,t.element=n,C.call(this,t.hintPosition,n,t.targetElement),r.appendChild(n)}}.bind(this)),document.body.appendChild(r),void 0!==this._hintsAddedCallback&&this._hintsAddedCallback.call(this)}).call(this),u.on(document,"click",g,this,!1),u.on(window,"resize",r,this,!0)}function r(){B(this._introItems,function(t){void 0!==t.targetElement&&C.call(this,t.hintPosition,t.element,t.targetElement)}.bind(this))}function y(t){var e=document.querySelector(".introjs-hints");return e?e.querySelectorAll(t):[]}function v(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];g.call(this),e&&H(e,"introjs-hidehint"),void 0!==this._hintCloseCallback&&this._hintCloseCallback.call(this,t)}function _(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];e&&O(e,/introjs-hidehint/g)}function w(t){var e=y('.introjs-hint[data-step="'+t+'"]')[0];e&&e.parentNode.removeChild(e)}function C(t,e,i){var n=k.call(this,i);switch(t){default:case"top-left":e.style.left=n.left+"px",e.style.top=n.top+"px";break;case"top-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+"px";break;case"bottom-left":e.style.left=n.left+"px",e.style.top=n.top+n.height-20+"px";break;case"bottom-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+n.height-20+"px";break;case"middle-left":e.style.left=n.left+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"middle-right":e.style.left=n.left+n.width-20+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"middle-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+(n.height-20)/2+"px";break;case"bottom-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+n.height-20+"px";break;case"top-middle":e.style.left=n.left+(n.width-20)/2+"px",e.style.top=n.top+"px"}}function j(t){var e=document.querySelector('.introjs-hint[data-step="'+t+'"]'),i=this._introItems[t];void 0!==this._hintClickCallback&&this._hintClickCallback.call(this,e,i,t);var n=g.call(this);if(parseInt(n,10)!==t){var o=document.createElement("div"),s=document.createElement("div"),l=document.createElement("div"),r=document.createElement("div");o.className="introjs-tooltip",o.onclick=function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0},s.className="introjs-tooltiptext";var a=document.createElement("p");a.innerHTML=i.hint;var c=document.createElement("a");c.className=this._options.buttonClass,c.setAttribute("role","button"),c.innerHTML=this._options.hintButtonLabel,c.onclick=v.bind(this,t),s.appendChild(a),s.appendChild(c),l.className="introjs-arrow",o.appendChild(l),o.appendChild(s),this._currentStep=e.getAttribute("data-step"),r.className="introjs-tooltipReferenceLayer introjs-hintReference",r.setAttribute("data-step",e.getAttribute("data-step")),T.call(this,r),r.appendChild(o),document.body.appendChild(r),L.call(this,e,o,l,null,!0)}}function k(t){var e=document.body,i=document.documentElement,n=window.pageYOffset||i.scrollTop||e.scrollTop,o=window.pageXOffset||i.scrollLeft||e.scrollLeft,s=t.getBoundingClientRect();return{top:s.top+n,width:s.width,height:s.height,left:s.left+o}}function R(t){var e=window.getComputedStyle(t),i="absolute"===e.position,n=/(auto|scroll)/;if("fixed"===e.position)return document.body;for(var o=t;o=o.parentElement;)if(e=window.getComputedStyle(o),(!i||"static"!==e.position)&&n.test(e.overflow+e.overflowY+e.overflowX))return o;return document.body}function V(t,e){t.scrollTop=e.offsetTop-t.offsetTop}function z(){return parseInt(this._currentStep+1,10)/this._introItems.length*100}var x=function(t){var e;if("object"==typeof t)e=new n(t);else if("string"==typeof t){var i=document.querySelector(t);if(!i)throw new Error("There is no element with given selector.");e=new n(i)}else e=new n(document.body);return x.instances[s(e,"introjs-instance")]=e};return x.version="2.9.3",x.instances={},x.fn=n.prototype={clone:function(){return new n(this)},setOption:function(t,e){return this._options[t]=e,this},setOptions:function(t){return this._options=function(t,e){var i,n={};for(i in t)n[i]=t[i];for(i in e)n[i]=e[i];return n}(this._options,t),this},start:function(t){return e.call(this,this._targetElement,t),this},goToStep:function(t){return function(t){this._currentStep=t-2,void 0!==this._introItems&&E.call(this)}.call(this,t),this},addStep:function(t){return this._options.steps||(this._options.steps=[]),this._options.steps.push(t),this},addSteps:function(t){if(t.length){for(var e=0;e<t.length;e++)this.addStep(t[e]);return this}},goToStepNumber:function(t){return function(t){this._currentStepNumber=t,void 0!==this._introItems&&E.call(this)}.call(this,t),this},nextStep:function(){return E.call(this),this},previousStep:function(){return N.call(this),this},exit:function(t){return A.call(this,this._targetElement,t),this},refresh:function(){return function(){if(T.call(this,document.querySelector(".introjs-helperLayer")),T.call(this,document.querySelector(".introjs-tooltipReferenceLayer")),T.call(this,document.querySelector(".introjs-disableInteraction")),void 0!==this._currentStep&&null!==this._currentStep){var t=document.querySelector(".introjs-helperNumberLayer"),e=document.querySelector(".introjs-arrow"),i=document.querySelector(".introjs-tooltip");L.call(this,this._introItems[this._currentStep].element,i,e,t)}return r.call(this),this}.call(this),this},onbeforechange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforechange was not a function");return this._introBeforeChangeCallback=t,this},onchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onchange was not a function.");return this._introChangeCallback=t,this},onafterchange:function(t){if("function"!=typeof t)throw new Error("Provided callback for onafterchange was not a function");return this._introAfterChangeCallback=t,this},oncomplete:function(t){if("function"!=typeof t)throw new Error("Provided callback for oncomplete was not a function.");return this._introCompleteCallback=t,this},onhintsadded:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintsadded was not a function.");return this._hintsAddedCallback=t,this},onhintclick:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclick was not a function.");return this._hintClickCallback=t,this},onhintclose:function(t){if("function"!=typeof t)throw new Error("Provided callback for onhintclose was not a function.");return this._hintCloseCallback=t,this},onexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onexit was not a function.");return this._introExitCallback=t,this},onskip:function(t){if("function"!=typeof t)throw new Error("Provided callback for onskip was not a function.");return this._introSkipCallback=t,this},onbeforeexit:function(t){if("function"!=typeof t)throw new Error("Provided callback for onbeforeexit was not a function.");return this._introBeforeExitCallback=t,this},addHints:function(){return l.call(this,this._targetElement),this},hideHint:function(t){return v.call(this,t),this},hideHints:function(){return function(){B(y(".introjs-hint"),function(t){v.call(this,t.getAttribute("data-step"))}.bind(this))}.call(this),this},showHint:function(t){return _.call(this,t),this},showHints:function(){return function(){var t=y(".introjs-hint");t&&t.length?B(t,function(t){_.call(this,t.getAttribute("data-step"))}.bind(this)):l.call(this,this._targetElement)}.call(this),this},removeHints:function(){return function(){B(y(".introjs-hint"),function(t){w.call(this,t.getAttribute("data-step"))}.bind(this))}.call(this),this},removeHint:function(t){return w.call(this,t),this},showHintDialog:function(t){return j.call(this,t),this}},x});
|
resources/js/plugin.js
CHANGED
@@ -52,6 +52,15 @@ let iCWP_WPSF_OptsPageRender = new function () {
|
|
52 |
};
|
53 |
}();
|
54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
var iCWP_WPSF_Toaster = new function () {
|
56 |
|
57 |
this.showMessage = function ( sMessage, bSuccess ) {
|
@@ -214,7 +223,7 @@ if ( typeof icwp_wpsf_vars_secadmin !== 'undefined' && icwp_wpsf_vars_secadmin.t
|
|
214 |
|
215 |
bCheckInPlace = false;
|
216 |
|
217 |
-
jQuery.post( ajaxurl, icwp_wpsf_vars_secadmin.
|
218 |
function ( oResponse ) {
|
219 |
if ( oResponse.data.success ) {
|
220 |
var nLeft = oResponse.data.timeleft;
|
52 |
};
|
53 |
}();
|
54 |
|
55 |
+
if ( typeof icwp_wpsf_vars_tourmanager !== 'undefined' ) {
|
56 |
+
var iCWP_WPSF_MarkTourFinished = new function () {
|
57 |
+
this.finishedTour = function ( sTourKey ) {
|
58 |
+
icwp_wpsf_vars_tourmanager.ajax[ 'tour_key' ] = sTourKey;
|
59 |
+
jQuery.post( ajaxurl, icwp_wpsf_vars_tourmanager.ajax ).always();
|
60 |
+
};
|
61 |
+
}();
|
62 |
+
}
|
63 |
+
|
64 |
var iCWP_WPSF_Toaster = new function () {
|
65 |
|
66 |
this.showMessage = function ( sMessage, bSuccess ) {
|
223 |
|
224 |
bCheckInPlace = false;
|
225 |
|
226 |
+
jQuery.post( ajaxurl, icwp_wpsf_vars_secadmin.ajax.check,
|
227 |
function ( oResponse ) {
|
228 |
if ( oResponse.data.success ) {
|
229 |
var nLeft = oResponse.data.timeleft;
|
resources/js/shield-tables.js
CHANGED
@@ -118,6 +118,17 @@ jQuery.fn.icwpWpsfTableWithFilter = function ( aOptions ) {
|
|
118 |
}
|
119 |
);
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
plugin.$element.on(
|
122 |
'click' + '.' + plugin._name,
|
123 |
'.tablenav.top input[type=submit].button.action',
|
@@ -218,6 +229,13 @@ jQuery.fn.icwpWpsfTableWithFilter = function ( aOptions ) {
|
|
218 |
this.sendReq( aRequestData );
|
219 |
},
|
220 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
customAction: function () {
|
222 |
this.sendReq( this.options[ 'working_custom_action' ] );
|
223 |
},
|
118 |
}
|
119 |
);
|
120 |
|
121 |
+
plugin.$element.on(
|
122 |
+
'click' + '.' + plugin._name,
|
123 |
+
'button.action.item_action',
|
124 |
+
function ( evt ) {
|
125 |
+
evt.preventDefault();
|
126 |
+
plugin.options[ 'working_rid' ] = $( this ).data( 'rid' );
|
127 |
+
plugin.options[ 'working_item_action' ] = $( this ).data( 'item_action' );
|
128 |
+
plugin.itemAction.call( plugin );
|
129 |
+
}
|
130 |
+
);
|
131 |
+
|
132 |
plugin.$element.on(
|
133 |
'click' + '.' + plugin._name,
|
134 |
'.tablenav.top input[type=submit].button.action',
|
229 |
this.sendReq( aRequestData );
|
230 |
},
|
231 |
|
232 |
+
itemAction: function () {
|
233 |
+
let aRequestData = this.options[ 'ajax_item_action' ];
|
234 |
+
aRequestData[ 'rid' ] = this.options[ 'working_rid' ];
|
235 |
+
aRequestData[ 'item_action' ] = this.options[ 'working_item_action' ];
|
236 |
+
this.sendReq( aRequestData );
|
237 |
+
},
|
238 |
+
|
239 |
customAction: function () {
|
240 |
this.sendReq( this.options[ 'working_custom_action' ] );
|
241 |
},
|
src/common/icwp-data.php
DELETED
@@ -1,606 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class ICWP_WPSF_DataProcessor extends ICWP_WPSF_Foundation {
|
4 |
-
|
5 |
-
/**
|
6 |
-
* @var ICWP_WPSF_DataProcessor
|
7 |
-
*/
|
8 |
-
protected static $oInstance = null;
|
9 |
-
|
10 |
-
/**
|
11 |
-
* @var int
|
12 |
-
*/
|
13 |
-
protected static $nRequestTime = null;
|
14 |
-
|
15 |
-
protected function __construct() {
|
16 |
-
}
|
17 |
-
|
18 |
-
/**
|
19 |
-
* @return ICWP_WPSF_DataProcessor
|
20 |
-
*/
|
21 |
-
public static function GetInstance() {
|
22 |
-
if ( is_null( self::$oInstance ) ) {
|
23 |
-
self::$oInstance = new self();
|
24 |
-
}
|
25 |
-
return self::$oInstance;
|
26 |
-
}
|
27 |
-
|
28 |
-
/**
|
29 |
-
* @param array $aA
|
30 |
-
* @return array
|
31 |
-
*/
|
32 |
-
public function shuffleArray( $aA ) {
|
33 |
-
$aKeys = array_keys( $aA );
|
34 |
-
shuffle( $aKeys );
|
35 |
-
return array_merge( array_flip( $aKeys ), $aA );
|
36 |
-
}
|
37 |
-
|
38 |
-
/**
|
39 |
-
* @param array $aArray1
|
40 |
-
* @param array $aArray2
|
41 |
-
* @return array
|
42 |
-
*/
|
43 |
-
public function mergeArraysRecursive( $aArray1, $aArray2 ) {
|
44 |
-
foreach ( $aArray2 as $key => $Value ) {
|
45 |
-
if ( array_key_exists( $key, $aArray1 ) && is_array( $Value ) ) {
|
46 |
-
$aArray1[ $key ] = $this->mergeArraysRecursive( $aArray1[ $key ], $aArray2[ $key ] );
|
47 |
-
}
|
48 |
-
else {
|
49 |
-
$aArray1[ $key ] = $Value;
|
50 |
-
}
|
51 |
-
}
|
52 |
-
return $aArray1;
|
53 |
-
}
|
54 |
-
|
55 |
-
/**
|
56 |
-
* @param string $sPath
|
57 |
-
* @param string $sExtensionToAdd
|
58 |
-
* @return string
|
59 |
-
*/
|
60 |
-
public function addExtensionToFilePath( $sPath, $sExtensionToAdd ) {
|
61 |
-
|
62 |
-
if ( strpos( $sExtensionToAdd, '.' ) === false ) {
|
63 |
-
$sExtensionToAdd = '.'.$sExtensionToAdd;
|
64 |
-
}
|
65 |
-
|
66 |
-
if ( !$this->getIfStringEndsIn( $sPath, $sExtensionToAdd ) ) {
|
67 |
-
$sPath = $sPath.$sExtensionToAdd;
|
68 |
-
}
|
69 |
-
return $sPath;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* @param string $sHaystack
|
74 |
-
* @param string $sNeedle
|
75 |
-
* @return bool
|
76 |
-
*/
|
77 |
-
public function getIfStringEndsIn( $sHaystack, $sNeedle ) {
|
78 |
-
$nNeedleLength = strlen( $sNeedle );
|
79 |
-
$sStringEndsIn = substr( $sHaystack, strlen( $sHaystack ) - $nNeedleLength, $nNeedleLength );
|
80 |
-
return ( $sStringEndsIn == $sNeedle );
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* @param string $sPath
|
85 |
-
* @return string
|
86 |
-
*/
|
87 |
-
public function getExtension( $sPath ) {
|
88 |
-
$nLastPeriod = strrpos( $sPath, '.' );
|
89 |
-
return ( $nLastPeriod === false ) ? $sPath : str_replace( '.', '', substr( $sPath, $nLastPeriod ) );
|
90 |
-
}
|
91 |
-
|
92 |
-
/**
|
93 |
-
* @return bool
|
94 |
-
*/
|
95 |
-
public function isWindows() {
|
96 |
-
return strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN';
|
97 |
-
}
|
98 |
-
|
99 |
-
/**
|
100 |
-
* @param string $sPrevious
|
101 |
-
* @param string $sNew
|
102 |
-
* @param string $sQueryType
|
103 |
-
* @return bool
|
104 |
-
* @throws \Exception
|
105 |
-
*/
|
106 |
-
public function isNewVersion( $sPrevious, $sNew, $sQueryType = 'minor' ) {
|
107 |
-
if ( substr_count( $sPrevious, '.' ) !== 2 || substr_count( $sNew, '.' ) !== 2 ) {
|
108 |
-
throw new \Exception( 'Version not of support type' );
|
109 |
-
}
|
110 |
-
$sPreviousBranch = implode( '.', array_slice( preg_split( '/[.-]/', $sPrevious ), 0, 2 ) ); // x.y
|
111 |
-
$sNewBranch = implode( '.', array_slice( preg_split( '/[.-]/', $sNew ), 0, 2 ) ); // x.y
|
112 |
-
|
113 |
-
$bIsType = false;
|
114 |
-
switch ( $sQueryType ) {
|
115 |
-
case 'minor':
|
116 |
-
$bIsType = ( $sPreviousBranch == $sNew );
|
117 |
-
break;
|
118 |
-
case 'major':
|
119 |
-
$bIsType = version_compare( $sPreviousBranch, $sNewBranch, '<' );
|
120 |
-
break;
|
121 |
-
}
|
122 |
-
return $bIsType;
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* @param string $sUrl
|
127 |
-
* @return string
|
128 |
-
*/
|
129 |
-
public function urlStripQueryPart( $sUrl ) {
|
130 |
-
return preg_replace( '#\s?\?.*$#', '', $sUrl );
|
131 |
-
}
|
132 |
-
|
133 |
-
/**
|
134 |
-
* @param string $sUrl
|
135 |
-
* @return string
|
136 |
-
*/
|
137 |
-
public function urlStripSchema( $sUrl ) {
|
138 |
-
return preg_replace( '#^((http|https):)?//#i', '', $sUrl );
|
139 |
-
}
|
140 |
-
|
141 |
-
/**
|
142 |
-
* Will strip everything from a URL except Scheme+Host and requires that Scheme+Host be present
|
143 |
-
* @return string|false
|
144 |
-
*/
|
145 |
-
public function validateSimpleHttpUrl( $sUrl ) {
|
146 |
-
$sValidatedUrl = false;
|
147 |
-
|
148 |
-
$sUrl = trim( $this->urlStripQueryPart( $sUrl ) );
|
149 |
-
if ( filter_var( $sUrl, FILTER_VALIDATE_URL ) ) { // we have a scheme+host
|
150 |
-
if ( in_array( parse_url( $sUrl, PHP_URL_SCHEME ), [ 'http', 'https' ] ) ) {
|
151 |
-
$sValidatedUrl = rtrim( $sUrl, '/' );
|
152 |
-
}
|
153 |
-
}
|
154 |
-
|
155 |
-
return $sValidatedUrl;
|
156 |
-
}
|
157 |
-
|
158 |
-
/**
|
159 |
-
* @param string $sEmail
|
160 |
-
* @return boolean
|
161 |
-
*/
|
162 |
-
public function validEmail( $sEmail ) {
|
163 |
-
return ( !empty( $sEmail ) && function_exists( 'is_email' ) && is_email( $sEmail ) );
|
164 |
-
}
|
165 |
-
|
166 |
-
/**
|
167 |
-
* @param string $sUrl
|
168 |
-
* @param bool $bVerify
|
169 |
-
* @return bool
|
170 |
-
*/
|
171 |
-
public function isValidUrl( $sUrl, $bVerify = false ) {
|
172 |
-
$bValid = filter_var( $sUrl, FILTER_VALIDATE_URL );
|
173 |
-
if ( $bValid && $bVerify ) {
|
174 |
-
$mRes = $this->loadFS()->getUrl( $sUrl );
|
175 |
-
if ( is_array( $mRes ) && isset( $mRes[ 'http_response' ] ) ) {
|
176 |
-
/** @var WP_HTTP_Requests_Response $oResp */
|
177 |
-
$oResp = $mRes[ 'http_response' ];
|
178 |
-
$bValid = $oResp->get_status() >= 200 && $oResp->get_status() < 300;
|
179 |
-
}
|
180 |
-
}
|
181 |
-
return $bValid;
|
182 |
-
}
|
183 |
-
|
184 |
-
/**
|
185 |
-
* @param string $sRawList
|
186 |
-
* @return array
|
187 |
-
*/
|
188 |
-
public function extractCommaSeparatedList( $sRawList = '' ) {
|
189 |
-
|
190 |
-
$aRawList = [];
|
191 |
-
if ( empty( $sRawList ) ) {
|
192 |
-
return $aRawList;
|
193 |
-
}
|
194 |
-
|
195 |
-
$aRawList = array_map( 'trim', preg_split( '/\r\n|\r|\n/', $sRawList ) );
|
196 |
-
$aNewList = [];
|
197 |
-
$bHadStar = false;
|
198 |
-
foreach ( $aRawList as $sKey => $sRawLine ) {
|
199 |
-
|
200 |
-
if ( empty( $sRawLine ) ) {
|
201 |
-
continue;
|
202 |
-
}
|
203 |
-
$sRawLine = str_replace( ' ', '', $sRawLine );
|
204 |
-
$aParts = explode( ',', $sRawLine, 2 );
|
205 |
-
// we only permit 1x line beginning with *
|
206 |
-
if ( $aParts[ 0 ] == '*' ) {
|
207 |
-
if ( $bHadStar ) {
|
208 |
-
continue;
|
209 |
-
}
|
210 |
-
$bHadStar = true;
|
211 |
-
}
|
212 |
-
else {
|
213 |
-
//If there's only 1 item on the line, we assume it to be a global
|
214 |
-
// parameter rule
|
215 |
-
if ( count( $aParts ) == 1 || empty( $aParts[ 1 ] ) ) { // there was no comma in this line in the first place
|
216 |
-
array_unshift( $aParts, '*' );
|
217 |
-
}
|
218 |
-
}
|
219 |
-
|
220 |
-
$aParams = empty( $aParts[ 1 ] ) ? [] : explode( ',', $aParts[ 1 ] );
|
221 |
-
$aNewList[ $aParts[ 0 ] ] = $aParams;
|
222 |
-
}
|
223 |
-
return $aNewList;
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Strength can be 1, 3, 7, 15
|
228 |
-
* @param integer $nLength
|
229 |
-
* @param integer $nStrength
|
230 |
-
* @param boolean $bIgnoreAmb
|
231 |
-
* @return string
|
232 |
-
*/
|
233 |
-
public function generateRandomString( $nLength = 10, $nStrength = 7, $bIgnoreAmb = true ) {
|
234 |
-
$aChars = [ 'abcdefghijkmnopqrstuvwxyz' ];
|
235 |
-
|
236 |
-
if ( $nStrength & 2 ) {
|
237 |
-
$aChars[] = '023456789';
|
238 |
-
}
|
239 |
-
|
240 |
-
if ( $nStrength & 4 ) {
|
241 |
-
$aChars[] = 'ABCDEFGHJKLMNPQRSTUVWXYZ';
|
242 |
-
}
|
243 |
-
|
244 |
-
if ( $nStrength & 8 ) {
|
245 |
-
$aChars[] = '$%^&*#';
|
246 |
-
}
|
247 |
-
|
248 |
-
if ( !$bIgnoreAmb ) {
|
249 |
-
$aChars[] = 'OOlI1';
|
250 |
-
}
|
251 |
-
|
252 |
-
$sPassword = '';
|
253 |
-
$sCharset = implode( '', $aChars );
|
254 |
-
for ( $i = 0 ; $i < $nLength ; $i++ ) {
|
255 |
-
$sPassword .= $sCharset[ ( rand()%strlen( $sCharset ) ) ];
|
256 |
-
}
|
257 |
-
return $sPassword;
|
258 |
-
}
|
259 |
-
|
260 |
-
/**
|
261 |
-
* @return string
|
262 |
-
*/
|
263 |
-
public function generateRandomLetter() {
|
264 |
-
$sAtoZ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
265 |
-
return $sAtoZ[ wp_rand( 0, ( strlen( $sAtoZ ) - 1 ) ) ];
|
266 |
-
}
|
267 |
-
|
268 |
-
/**
|
269 |
-
* @param array $aA
|
270 |
-
* @param string $sKey
|
271 |
-
* @param mixed $mDefault
|
272 |
-
* @return mixed|null
|
273 |
-
*/
|
274 |
-
public function arrayFetch( &$aA, $sKey, $mDefault = null ) {
|
275 |
-
return isset( $aA[ $sKey ] ) ? $aA[ $sKey ] : $mDefault;
|
276 |
-
}
|
277 |
-
|
278 |
-
/**
|
279 |
-
* @param string $sStringContent
|
280 |
-
* @param string $sFilename
|
281 |
-
*/
|
282 |
-
public function downloadStringAsFile( $sStringContent, $sFilename ) {
|
283 |
-
header( "Content-type: application/octet-stream" );
|
284 |
-
header( "Content-disposition: attachment; filename=".$sFilename );
|
285 |
-
header( "Content-Transfer-Encoding: binary" );
|
286 |
-
header( "Content-Length: ".strlen( $sStringContent ) );
|
287 |
-
echo $sStringContent;
|
288 |
-
die();
|
289 |
-
}
|
290 |
-
|
291 |
-
/**
|
292 |
-
* Use this to reliably read the contents of a PHP file that doesn't have executable
|
293 |
-
* PHP Code.
|
294 |
-
* Why use this? In the name of naive security, silly web hosts can prevent reading the contents of
|
295 |
-
* non-PHP files so we simply put the content we want to have read into a php file and then "include" it.
|
296 |
-
* @param string $sFile
|
297 |
-
* @return string
|
298 |
-
*/
|
299 |
-
public function readFileContentsUsingInclude( $sFile ) {
|
300 |
-
ob_start();
|
301 |
-
include( $sFile );
|
302 |
-
return ob_get_clean();
|
303 |
-
}
|
304 |
-
|
305 |
-
/**
|
306 |
-
* @return string
|
307 |
-
*/
|
308 |
-
public function getPhpVersion() {
|
309 |
-
return ( defined( 'PHP_VERSION' ) ? PHP_VERSION : phpversion() );
|
310 |
-
}
|
311 |
-
|
312 |
-
/**
|
313 |
-
* Cleans out any of the junk that can appear in a PHP version and returns just the 5.4.45
|
314 |
-
* e.g. 5.4.45-0+deb7u5
|
315 |
-
* @return string
|
316 |
-
*/
|
317 |
-
public function getPhpVersionCleaned() {
|
318 |
-
$sVersion = $this->getPhpVersion();
|
319 |
-
if ( preg_match( '#^[0-9]{1}\.[0-9]{1}(\.[0-9]{1,3})?#', $sVersion, $aMatches ) ) {
|
320 |
-
return $aMatches[ 0 ];
|
321 |
-
}
|
322 |
-
else {
|
323 |
-
return $sVersion;
|
324 |
-
}
|
325 |
-
}
|
326 |
-
|
327 |
-
/**
|
328 |
-
* @param string $sAtLeastVersion
|
329 |
-
* @return bool
|
330 |
-
*/
|
331 |
-
public function getPhpVersionIsAtLeast( $sAtLeastVersion ) {
|
332 |
-
return version_compare( $this->getPhpVersion(), $sAtLeastVersion, '>=' );
|
333 |
-
}
|
334 |
-
|
335 |
-
/**
|
336 |
-
* @return bool
|
337 |
-
*/
|
338 |
-
public function getPhpSupportsNamespaces() {
|
339 |
-
return $this->getPhpVersionIsAtLeast( '5.3' );
|
340 |
-
}
|
341 |
-
|
342 |
-
/**
|
343 |
-
* @return bool
|
344 |
-
*/
|
345 |
-
public function getCanOpensslSign() {
|
346 |
-
return function_exists( 'base64_decode' )
|
347 |
-
&& function_exists( 'openssl_sign' )
|
348 |
-
&& function_exists( 'openssl_verify' )
|
349 |
-
&& defined( 'OPENSSL_ALGO_SHA1' );
|
350 |
-
}
|
351 |
-
|
352 |
-
/**
|
353 |
-
* @param array $aArray
|
354 |
-
* @return stdClass
|
355 |
-
*/
|
356 |
-
public function convertArrayToStdClass( $aArray ) {
|
357 |
-
$oObject = new stdClass();
|
358 |
-
if ( !empty( $aArray ) && is_array( $aArray ) ) {
|
359 |
-
foreach ( $aArray as $sKey => $mValue ) {
|
360 |
-
$oObject->{$sKey} = $mValue;
|
361 |
-
}
|
362 |
-
}
|
363 |
-
return $oObject;
|
364 |
-
}
|
365 |
-
|
366 |
-
/**
|
367 |
-
* @param stdClass $oStdClass
|
368 |
-
* @return array
|
369 |
-
*/
|
370 |
-
public function convertStdClassToArray( $oStdClass ) {
|
371 |
-
return json_decode( json_encode( $oStdClass ), true );
|
372 |
-
}
|
373 |
-
|
374 |
-
/**
|
375 |
-
* @param array $aSubjectArray
|
376 |
-
* @param mixed $mValue
|
377 |
-
* @param int $nDesiredPosition
|
378 |
-
* @return array
|
379 |
-
*/
|
380 |
-
public function setArrayValueToPosition( $aSubjectArray, $mValue, $nDesiredPosition ) {
|
381 |
-
|
382 |
-
if ( $nDesiredPosition < 0 ) {
|
383 |
-
return $aSubjectArray;
|
384 |
-
}
|
385 |
-
|
386 |
-
$nMaxPossiblePosition = count( $aSubjectArray ) - 1;
|
387 |
-
if ( $nDesiredPosition > $nMaxPossiblePosition ) {
|
388 |
-
$nDesiredPosition = $nMaxPossiblePosition;
|
389 |
-
}
|
390 |
-
|
391 |
-
$nPosition = array_search( $mValue, $aSubjectArray );
|
392 |
-
if ( $nPosition !== false && $nPosition != $nDesiredPosition ) {
|
393 |
-
|
394 |
-
// remove existing and reset index
|
395 |
-
unset( $aSubjectArray[ $nPosition ] );
|
396 |
-
$aSubjectArray = array_values( $aSubjectArray );
|
397 |
-
|
398 |
-
// insert and update
|
399 |
-
// http://stackoverflow.com/questions/3797239/insert-new-item-in-array-on-any-position-in-php
|
400 |
-
array_splice( $aSubjectArray, $nDesiredPosition, 0, $mValue );
|
401 |
-
}
|
402 |
-
|
403 |
-
return $aSubjectArray;
|
404 |
-
}
|
405 |
-
|
406 |
-
/**
|
407 |
-
* note: employs strict search comparison
|
408 |
-
* @param array $aArray
|
409 |
-
* @param mixed $mValue
|
410 |
-
* @param bool $bFirstOnly - set true to only remove the first element found of this value
|
411 |
-
* @return array
|
412 |
-
*/
|
413 |
-
public function removeFromArrayByValue( $aArray, $mValue, $bFirstOnly = false ) {
|
414 |
-
$aKeys = [];
|
415 |
-
|
416 |
-
if ( $bFirstOnly ) {
|
417 |
-
$mKey = array_search( $mValue, $aArray, true );
|
418 |
-
if ( $mKey !== false ) {
|
419 |
-
$aKeys[] = $mKey;
|
420 |
-
}
|
421 |
-
}
|
422 |
-
else {
|
423 |
-
$aKeys = array_keys( $aArray, $mValue, true );
|
424 |
-
}
|
425 |
-
|
426 |
-
foreach ( $aKeys as $mKey ) {
|
427 |
-
unset( $aArray[ $mKey ] );
|
428 |
-
}
|
429 |
-
|
430 |
-
return $aArray;
|
431 |
-
}
|
432 |
-
|
433 |
-
/**
|
434 |
-
* Taken from: http://stackoverflow.com/questions/1755144/how-to-validate-domain-name-in-php
|
435 |
-
* @param string $sDomainName
|
436 |
-
* @return bool
|
437 |
-
*/
|
438 |
-
public function isValidDomainName( $sDomainName ) {
|
439 |
-
$sDomainName = trim( $sDomainName );
|
440 |
-
return ( preg_match( "/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $sDomainName ) //valid chars check
|
441 |
-
&& preg_match( "/^.{1,253}$/", $sDomainName ) //overall length check
|
442 |
-
&& preg_match( "/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $sDomainName ) );//length of each label
|
443 |
-
}
|
444 |
-
|
445 |
-
/**
|
446 |
-
* @return int
|
447 |
-
* @deprecated
|
448 |
-
*/
|
449 |
-
public function time() {
|
450 |
-
return $this->loadRequest()->ts();
|
451 |
-
}
|
452 |
-
|
453 |
-
/**
|
454 |
-
* @param string $sKey
|
455 |
-
* @param string $mDefault
|
456 |
-
* @param bool $bTrim -automatically trim whitespace
|
457 |
-
* @return mixed|null
|
458 |
-
* @deprecated
|
459 |
-
*/
|
460 |
-
public function cookie( $sKey, $mDefault = null, $bTrim = true ) {
|
461 |
-
return \FernleafSystems\Wordpress\Services\Services::Request()->cookie( $sKey, $mDefault );
|
462 |
-
}
|
463 |
-
|
464 |
-
/**
|
465 |
-
* @param string $sKey
|
466 |
-
* @param mixed $mDefault
|
467 |
-
* @return mixed|null
|
468 |
-
* @deprecated
|
469 |
-
*/
|
470 |
-
public function env( $sKey, $mDefault = null ) {
|
471 |
-
return \FernleafSystems\Wordpress\Services\Services::Request()->env( $sKey, $mDefault );
|
472 |
-
}
|
473 |
-
|
474 |
-
/**
|
475 |
-
* @param string $sKey
|
476 |
-
* @param null $mDefault
|
477 |
-
* @param bool $bTrim -automatically trim whitespace
|
478 |
-
* @return mixed|null
|
479 |
-
* @deprecated
|
480 |
-
*/
|
481 |
-
public function post( $sKey, $mDefault = null, $bTrim = true ) {
|
482 |
-
return \FernleafSystems\Wordpress\Services\Services::Request()->post( $sKey, $mDefault );
|
483 |
-
}
|
484 |
-
|
485 |
-
/**
|
486 |
-
* @param string $sKey
|
487 |
-
* @param null $mDefault
|
488 |
-
* @param bool $bTrim -automatically trim whitespace
|
489 |
-
* @return mixed|null
|
490 |
-
* @deprecated
|
491 |
-
*/
|
492 |
-
public function query( $sKey, $mDefault = null, $bTrim = true ) {
|
493 |
-
return \FernleafSystems\Wordpress\Services\Services::Request()->query( $sKey, $mDefault );
|
494 |
-
}
|
495 |
-
|
496 |
-
/**
|
497 |
-
* @param string $sKey
|
498 |
-
* @param null $mDefault
|
499 |
-
* @param bool $bTrim -automatically trim whitespace
|
500 |
-
* @return mixed|null
|
501 |
-
* @deprecated
|
502 |
-
*/
|
503 |
-
public function server( $sKey, $mDefault = null, $bTrim = true ) {
|
504 |
-
return $this->loadRequest()->server( $sKey, $mDefault, $bTrim );
|
505 |
-
}
|
506 |
-
|
507 |
-
/**
|
508 |
-
* @param string $sKey
|
509 |
-
* @param null $mDefault
|
510 |
-
* @param bool $bIncludeCookie
|
511 |
-
* @param bool $bTrim -automatically trim whitespace
|
512 |
-
* @return mixed|null
|
513 |
-
* @deprecated
|
514 |
-
*/
|
515 |
-
public function request( $sKey, $bIncludeCookie = false, $mDefault = null, $bTrim = true ) {
|
516 |
-
return $this->loadRequest()->request( $sKey, $bIncludeCookie, $mDefault, $bTrim );
|
517 |
-
}
|
518 |
-
|
519 |
-
/**
|
520 |
-
* @return string URI Path in lowercase
|
521 |
-
* @deprecated
|
522 |
-
*/
|
523 |
-
public function getRequestPath() {
|
524 |
-
return $this->loadRequest()->getPath();
|
525 |
-
}
|
526 |
-
|
527 |
-
/**
|
528 |
-
* @return string
|
529 |
-
* @deprecated
|
530 |
-
*/
|
531 |
-
public function getRequestUri() {
|
532 |
-
return $this->loadRequest()->getUri();
|
533 |
-
}
|
534 |
-
|
535 |
-
/**
|
536 |
-
* @return string
|
537 |
-
* @deprecated
|
538 |
-
*/
|
539 |
-
public function getUserAgent() {
|
540 |
-
return $this->loadRequest()->getUserAgent();
|
541 |
-
}
|
542 |
-
|
543 |
-
/**
|
544 |
-
* @param bool $bIncludeCookie
|
545 |
-
* @return array
|
546 |
-
* @deprecated
|
547 |
-
*/
|
548 |
-
public function getRequestParams( $bIncludeCookie = true ) {
|
549 |
-
return $this->loadRequest()->getParams( $bIncludeCookie );
|
550 |
-
}
|
551 |
-
|
552 |
-
/**
|
553 |
-
* @return array
|
554 |
-
* @deprecated
|
555 |
-
*/
|
556 |
-
public function getRequestUriParts() {
|
557 |
-
return $this->loadRequest()->getUriParts();
|
558 |
-
}
|
559 |
-
|
560 |
-
/**
|
561 |
-
* @return string
|
562 |
-
* @deprecated
|
563 |
-
*/
|
564 |
-
public function getRequestMethod() {
|
565 |
-
return $this->loadRequest()->getMethod();
|
566 |
-
}
|
567 |
-
|
568 |
-
/**
|
569 |
-
* @return bool
|
570 |
-
* @deprecated
|
571 |
-
*/
|
572 |
-
public function isMethodPost() {
|
573 |
-
return $this->loadRequest()->isMethodPost();
|
574 |
-
}
|
575 |
-
|
576 |
-
/**
|
577 |
-
* @return string|null
|
578 |
-
* @deprecated
|
579 |
-
*/
|
580 |
-
public function getScriptName() {
|
581 |
-
return $this->loadRequest()->getScriptName();
|
582 |
-
}
|
583 |
-
|
584 |
-
/**
|
585 |
-
* @param $sKey
|
586 |
-
* @param $mValue
|
587 |
-
* @param int $nExpireLength
|
588 |
-
* @param null $sPath
|
589 |
-
* @param null $sDomain
|
590 |
-
* @param bool $bSsl
|
591 |
-
* @return bool
|
592 |
-
* @deprecated
|
593 |
-
*/
|
594 |
-
public function setCookie( $sKey, $mValue, $nExpireLength = 3600, $sPath = null, $sDomain = null, $bSsl = true ) {
|
595 |
-
return $this->loadRequest()->setCookie( $sKey, $mValue, $nExpireLength, $sPath, $sDomain, $bSsl );
|
596 |
-
}
|
597 |
-
|
598 |
-
/**
|
599 |
-
* @param string $sKey
|
600 |
-
* @return bool
|
601 |
-
* @deprecated
|
602 |
-
*/
|
603 |
-
public function setDeleteCookie( $sKey ) {
|
604 |
-
return $this->loadRequest()->setDeleteCookie( $sKey );
|
605 |
-
}
|
606 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/common/wp-admin-notices.php
DELETED
@@ -1,92 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
use FernleafSystems\Wordpress\Services\Services;
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Class ICWP_WPSF_WpAdminNotices
|
7 |
-
* @deprecated 8.4
|
8 |
-
*/
|
9 |
-
class ICWP_WPSF_WpAdminNotices extends ICWP_WPSF_Foundation {
|
10 |
-
|
11 |
-
/**
|
12 |
-
* @var ICWP_WPSF_WpAdminNotices
|
13 |
-
*/
|
14 |
-
protected static $oInstance = null;
|
15 |
-
|
16 |
-
/**
|
17 |
-
* @var string
|
18 |
-
*/
|
19 |
-
protected $sFlashMessage;
|
20 |
-
|
21 |
-
/**
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
protected $sPrefix = '';
|
25 |
-
|
26 |
-
/**
|
27 |
-
* @return ICWP_WPSF_WpAdminNotices
|
28 |
-
*/
|
29 |
-
public static function GetInstance() {
|
30 |
-
if ( is_null( self::$oInstance ) ) {
|
31 |
-
self::$oInstance = new self();
|
32 |
-
}
|
33 |
-
return self::$oInstance;
|
34 |
-
}
|
35 |
-
|
36 |
-
protected function __construct() {
|
37 |
-
}
|
38 |
-
|
39 |
-
public function onWpAdminNotices() {
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* @return \FernleafSystems\Wordpress\Services\Utilities\PluginUserMeta
|
44 |
-
* @throws \Exception
|
45 |
-
*/
|
46 |
-
protected function getCurrentUserMeta() {
|
47 |
-
return Services::WpUsers()->metaVoForUser( rtrim( $this->getPrefix(), '-' ) );
|
48 |
-
}
|
49 |
-
|
50 |
-
/**
|
51 |
-
* @return string
|
52 |
-
*/
|
53 |
-
public function getPrefix() {
|
54 |
-
return $this->sPrefix;
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* @return string
|
59 |
-
*/
|
60 |
-
protected function getFlash() {
|
61 |
-
return $this->sFlashMessage;
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* @return array
|
66 |
-
*/
|
67 |
-
protected function getFlashParts() {
|
68 |
-
return explode( '::', $this->getFlash(), 3 );
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* @return string
|
73 |
-
*/
|
74 |
-
public function getFlashText() {
|
75 |
-
$aParts = $this->getFlashParts();
|
76 |
-
return isset( $aParts[ 1 ] ) ? $aParts[ 1 ] : '';
|
77 |
-
}
|
78 |
-
|
79 |
-
/**
|
80 |
-
* @return $this
|
81 |
-
*/
|
82 |
-
public function flushFlash() {
|
83 |
-
if ( Services::WpUsers()->isUserLoggedIn() ) {
|
84 |
-
$oMeta = $this->getCurrentUserMeta();
|
85 |
-
if ( isset( $oMeta->flash_msg ) ) {
|
86 |
-
$this->sFlashMessage = (string)$oMeta->flash_msg;
|
87 |
-
unset( $oMeta->flash_msg );
|
88 |
-
}
|
89 |
-
}
|
90 |
-
return $this;
|
91 |
-
}
|
92 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/common/wp-widget.php
DELETED
@@ -1,22 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Class ICWP_WPSF_WpWidget
|
5 |
-
* @deprecated 8.4
|
6 |
-
*/
|
7 |
-
abstract class ICWP_WPSF_WpWidget extends \WP_Widget {
|
8 |
-
|
9 |
-
/**
|
10 |
-
* @param array $aWidgetArguments
|
11 |
-
* @param string $sTitle
|
12 |
-
* @param string $sContent
|
13 |
-
* @return string
|
14 |
-
*/
|
15 |
-
protected function standardRender( $aWidgetArguments, $sTitle = '', $sContent = '' ) {
|
16 |
-
echo $aWidgetArguments[ 'before_widget' ];
|
17 |
-
if ( !empty( $sTitle ) ) {
|
18 |
-
echo $aWidgetArguments[ 'before_title' ].$sTitle.$aWidgetArguments[ 'after_title' ];
|
19 |
-
}
|
20 |
-
return $sContent.$aWidgetArguments[ 'after_widget' ];
|
21 |
-
}
|
22 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/config/feature-admin_access_restriction.php
CHANGED
@@ -125,6 +125,17 @@
|
|
125 |
"summary": "Specify An Automatic Timeout Interval For Security Admin Access",
|
126 |
"description": "This will automatically expire your Security Admin Session. Does not apply until you enter the access key again. Default: 60 minutes."
|
127 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
{
|
129 |
"key": "admin_access_restrict_options",
|
130 |
"section": "section_admin_access_restriction_areas",
|
125 |
"summary": "Specify An Automatic Timeout Interval For Security Admin Access",
|
126 |
"description": "This will automatically expire your Security Admin Session. Does not apply until you enter the access key again. Default: 60 minutes."
|
127 |
},
|
128 |
+
{
|
129 |
+
"key": "allow_email_override",
|
130 |
+
"section": "section_admin_access_restriction_settings",
|
131 |
+
"default": "Y",
|
132 |
+
"type": "checkbox",
|
133 |
+
"link_info": "https://shsec.io/gf",
|
134 |
+
"link_blog": "",
|
135 |
+
"name": "Allow Email Override",
|
136 |
+
"summary": "Allow Email Override Of Admin Access Restrictions",
|
137 |
+
"description": "Allow the use of verification emails to override and switch off the Security Admin restrictions."
|
138 |
+
},
|
139 |
{
|
140 |
"key": "admin_access_restrict_options",
|
141 |
"section": "section_admin_access_restriction_areas",
|
src/config/feature-audit_trail.php
CHANGED
@@ -245,8 +245,10 @@
|
|
245 |
"event",
|
246 |
"category",
|
247 |
"message",
|
|
|
248 |
"immutable",
|
249 |
"meta",
|
|
|
250 |
"created_at",
|
251 |
"deleted_at"
|
252 |
],
|
245 |
"event",
|
246 |
"category",
|
247 |
"message",
|
248 |
+
"count",
|
249 |
"immutable",
|
250 |
"meta",
|
251 |
+
"updated_at",
|
252 |
"created_at",
|
253 |
"deleted_at"
|
254 |
],
|
src/config/feature-hack_protect.php
CHANGED
@@ -534,19 +534,6 @@
|
|
534 |
"summary": "Enable The Guard For Plugin And Theme Files",
|
535 |
"description": "When enabled the Guard will automatically scan for changes to your Plugin and Theme files."
|
536 |
},
|
537 |
-
{
|
538 |
-
"key": "ptg_depth",
|
539 |
-
"section": "section_scan_ptg",
|
540 |
-
"premium": true,
|
541 |
-
"type": "integer",
|
542 |
-
"default": 1,
|
543 |
-
"min": 0,
|
544 |
-
"link_info": "https://shsec.io/bn",
|
545 |
-
"link_blog": "https://shsec.io/bm",
|
546 |
-
"name": "Guard/Scan Depth",
|
547 |
-
"summary": "How Deep Into The Plugin Directories To Scan And Guard",
|
548 |
-
"description": "The Guard normally operates scan only the top level of a plugin folder. Increasing depth increases scan times."
|
549 |
-
},
|
550 |
{
|
551 |
"key": "ptg_extensions",
|
552 |
"section": "section_scan_ptg",
|
@@ -577,13 +564,6 @@
|
|
577 |
"summary": "Show Re-Install Links For Plugins",
|
578 |
"description": "Show links to re-install plugins and offer re-install when activating plugins."
|
579 |
},
|
580 |
-
{
|
581 |
-
"key": "ptg_last_build_at",
|
582 |
-
"section": "section_non_ui",
|
583 |
-
"transferable": false,
|
584 |
-
"type": "integer",
|
585 |
-
"default": 0
|
586 |
-
},
|
587 |
{
|
588 |
"key": "ptg_candiskwrite",
|
589 |
"section": "section_non_ui",
|
@@ -606,20 +586,6 @@
|
|
606 |
"type": "array",
|
607 |
"default": []
|
608 |
},
|
609 |
-
{
|
610 |
-
"key": "rebuild_self",
|
611 |
-
"section": "section_non_ui",
|
612 |
-
"transferable": false,
|
613 |
-
"type": "boolean",
|
614 |
-
"default": false
|
615 |
-
},
|
616 |
-
{
|
617 |
-
"key": "ptg_update_store_format",
|
618 |
-
"section": "section_non_ui",
|
619 |
-
"transferable": false,
|
620 |
-
"type": "boolean",
|
621 |
-
"default": false
|
622 |
-
},
|
623 |
{
|
624 |
"key": "rt_file_hashes",
|
625 |
"section": "section_non_ui",
|
534 |
"summary": "Enable The Guard For Plugin And Theme Files",
|
535 |
"description": "When enabled the Guard will automatically scan for changes to your Plugin and Theme files."
|
536 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
537 |
{
|
538 |
"key": "ptg_extensions",
|
539 |
"section": "section_scan_ptg",
|
564 |
"summary": "Show Re-Install Links For Plugins",
|
565 |
"description": "Show links to re-install plugins and offer re-install when activating plugins."
|
566 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
567 |
{
|
568 |
"key": "ptg_candiskwrite",
|
569 |
"section": "section_non_ui",
|
586 |
"type": "array",
|
587 |
"default": []
|
588 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
589 |
{
|
590 |
"key": "rt_file_hashes",
|
591 |
"section": "section_non_ui",
|
src/config/feature-headers.php
CHANGED
@@ -236,11 +236,23 @@
|
|
236 |
"*"
|
237 |
],
|
238 |
"type": "array",
|
239 |
-
"link_info": "",
|
240 |
"link_blog": "",
|
241 |
"name": "Permitted Hosts",
|
242 |
"summary": "Permitted Hosts and Domains",
|
243 |
"description": "You can explicitly state which hosts/domain from which content may be loaded. Take great care and test your site as you may block legitimate resources. If in-doubt, leave blank or use '*' only. Note: You can force only HTTPS for a given domain by prefixing it with 'https://'."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
}
|
245 |
]
|
246 |
}
|
236 |
"*"
|
237 |
],
|
238 |
"type": "array",
|
239 |
+
"link_info": "https://shsec.io/ga",
|
240 |
"link_blog": "",
|
241 |
"name": "Permitted Hosts",
|
242 |
"summary": "Permitted Hosts and Domains",
|
243 |
"description": "You can explicitly state which hosts/domain from which content may be loaded. Take great care and test your site as you may block legitimate resources. If in-doubt, leave blank or use '*' only. Note: You can force only HTTPS for a given domain by prefixing it with 'https://'."
|
244 |
+
},
|
245 |
+
{
|
246 |
+
"key": "xcsp_custom",
|
247 |
+
"section": "section_content_security_policy",
|
248 |
+
"premium": true,
|
249 |
+
"default": [],
|
250 |
+
"type": "array",
|
251 |
+
"link_info": "https://shsec.io/g9",
|
252 |
+
"link_blog": "",
|
253 |
+
"name": "Manual Rules",
|
254 |
+
"summary": "Manual CSP Rules",
|
255 |
+
"description": "Manual CSP rules which are not covered by the rules above."
|
256 |
}
|
257 |
]
|
258 |
}
|
src/config/feature-ips.php
CHANGED
@@ -184,6 +184,18 @@
|
|
184 |
"summary": "Allow Visitors To Unblock Their IP",
|
185 |
"description": "Allow visitors blocked by the plugin to automatically unblock themselves."
|
186 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
187 |
{
|
188 |
"key": "text_loginfailed",
|
189 |
"section": "section_user_messages",
|
@@ -470,6 +482,7 @@
|
|
470 |
"is_range",
|
471 |
"transgressions",
|
472 |
"last_access_at",
|
|
|
473 |
"created_at",
|
474 |
"deleted_at"
|
475 |
],
|
184 |
"summary": "Allow Visitors To Unblock Their IP",
|
185 |
"description": "Allow visitors blocked by the plugin to automatically unblock themselves."
|
186 |
},
|
187 |
+
{
|
188 |
+
"key": "request_whitelist",
|
189 |
+
"section": "section_auto_black_list",
|
190 |
+
"premium": true,
|
191 |
+
"default": [],
|
192 |
+
"type": "array",
|
193 |
+
"link_info": "https://shsec.io/gd",
|
194 |
+
"link_blog": "",
|
195 |
+
"name": "Request Path Whitelist",
|
196 |
+
"summary": "Request Path Whitelist",
|
197 |
+
"description": "Request Path Whitelist."
|
198 |
+
},
|
199 |
{
|
200 |
"key": "text_loginfailed",
|
201 |
"section": "section_user_messages",
|
482 |
"is_range",
|
483 |
"transgressions",
|
484 |
"last_access_at",
|
485 |
+
"blocked_at",
|
486 |
"created_at",
|
487 |
"deleted_at"
|
488 |
],
|
src/config/feature-plugin.php
CHANGED
@@ -25,6 +25,14 @@
|
|
25 |
"can_dismiss": false,
|
26 |
"type": "error"
|
27 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
"compat-sgoptimize": {
|
29 |
"id": "compat-sgoptimize",
|
30 |
"schedule": "conditions",
|
@@ -349,7 +357,8 @@
|
|
349 |
"section": "section_non_ui",
|
350 |
"transferable": false,
|
351 |
"type": "integer",
|
352 |
-
"default": 0
|
|
|
353 |
},
|
354 |
{
|
355 |
"key": "unique_installation_id",
|
@@ -399,14 +408,6 @@
|
|
399 |
"type": "text",
|
400 |
"default": ""
|
401 |
},
|
402 |
-
{
|
403 |
-
"key": "this_server_ip_details",
|
404 |
-
"section": "section_non_ui",
|
405 |
-
"transferable": false,
|
406 |
-
"sensitive": true,
|
407 |
-
"type": "array",
|
408 |
-
"default": []
|
409 |
-
},
|
410 |
{
|
411 |
"key": "last_ip_detect_source",
|
412 |
"transferable": false,
|
@@ -420,6 +421,13 @@
|
|
420 |
"section": "section_non_ui",
|
421 |
"type": "text",
|
422 |
"default": ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
423 |
}
|
424 |
],
|
425 |
"definitions": {
|
25 |
"can_dismiss": false,
|
26 |
"type": "error"
|
27 |
},
|
28 |
+
"plugin-disabled": {
|
29 |
+
"id": "plugin-disabled",
|
30 |
+
"schedule": "conditions",
|
31 |
+
"valid_admin": true,
|
32 |
+
"plugin_page_only": true,
|
33 |
+
"can_dismiss": false,
|
34 |
+
"type": "error"
|
35 |
+
},
|
36 |
"compat-sgoptimize": {
|
37 |
"id": "compat-sgoptimize",
|
38 |
"schedule": "conditions",
|
357 |
"section": "section_non_ui",
|
358 |
"transferable": false,
|
359 |
"type": "integer",
|
360 |
+
"default": 0,
|
361 |
+
"min": 0
|
362 |
},
|
363 |
{
|
364 |
"key": "unique_installation_id",
|
408 |
"type": "text",
|
409 |
"default": ""
|
410 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
411 |
{
|
412 |
"key": "last_ip_detect_source",
|
413 |
"transferable": false,
|
421 |
"section": "section_non_ui",
|
422 |
"type": "text",
|
423 |
"default": ""
|
424 |
+
},
|
425 |
+
{
|
426 |
+
"key": "wphashes_api_token",
|
427 |
+
"transferable": false,
|
428 |
+
"section": "section_non_ui",
|
429 |
+
"type": "array",
|
430 |
+
"default": []
|
431 |
}
|
432 |
],
|
433 |
"definitions": {
|
src/features/admin_access_restriction.php
CHANGED
@@ -136,13 +136,28 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
|
|
136 |
if ( $this->isRegisteredSecAdminUser() ) {
|
137 |
$nLeft = 0;
|
138 |
}
|
139 |
-
|
140 |
$nLeft = $this->getSecAdminTimeout() - ( Services::Request()->ts() - $nSecAdminAt );
|
141 |
}
|
142 |
}
|
143 |
return max( 0, $nLeft );
|
144 |
}
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
/**
|
147 |
* @return bool
|
148 |
*/
|
@@ -321,20 +336,37 @@ class ICWP_WPSF_FeatureHandler_AdminAccessRestriction extends ICWP_WPSF_FeatureH
|
|
321 |
public function insertCustomJsVars_Admin() {
|
322 |
parent::insertCustomJsVars_Admin();
|
323 |
|
|
|
324 |
if ( $this->getSecAdminTimeLeft() > 0 ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
325 |
wp_localize_script(
|
326 |
$this->prefix( 'plugin' ),
|
327 |
'icwp_wpsf_vars_secadmin',
|
328 |
-
|
329 |
-
'reqajax' => $this->getSecAdminCheckAjaxData(),
|
330 |
-
'is_sec_admin' => true, // if $nSecTimeLeft > 0
|
331 |
-
'timeleft' => $this->getSecAdminTimeLeft(), // JS uses milliseconds
|
332 |
-
'strings' => [
|
333 |
-
'confirm' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' ).' '.__( 'Reload now?', 'wp-simple-firewall' ),
|
334 |
-
'nearly' => __( 'Security Admin session has nearly timed-out.', 'wp-simple-firewall' ),
|
335 |
-
'expired' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' )
|
336 |
-
]
|
337 |
-
]
|
338 |
);
|
339 |
}
|
340 |
}
|
136 |
if ( $this->isRegisteredSecAdminUser() ) {
|
137 |
$nLeft = 0;
|
138 |
}
|
139 |
+
elseif ( $nSecAdminAt > 0 ) {
|
140 |
$nLeft = $this->getSecAdminTimeout() - ( Services::Request()->ts() - $nSecAdminAt );
|
141 |
}
|
142 |
}
|
143 |
return max( 0, $nLeft );
|
144 |
}
|
145 |
|
146 |
+
/**
|
147 |
+
*/
|
148 |
+
public function handleModRequest() {
|
149 |
+
$oReq = Services::Request();
|
150 |
+
switch ( $oReq->query( 'exec' ) ) {
|
151 |
+
case 'remove_secadmin_confirm':
|
152 |
+
( new SecurityAdmin\Lib\Actions\RemoveSecAdmin() )
|
153 |
+
->setMod( $this )
|
154 |
+
->remove();
|
155 |
+
break;
|
156 |
+
default:
|
157 |
+
break;
|
158 |
+
}
|
159 |
+
}
|
160 |
+
|
161 |
/**
|
162 |
* @return bool
|
163 |
*/
|
336 |
public function insertCustomJsVars_Admin() {
|
337 |
parent::insertCustomJsVars_Admin();
|
338 |
|
339 |
+
$aInsertData = [];
|
340 |
if ( $this->getSecAdminTimeLeft() > 0 ) {
|
341 |
+
$aInsertData = [
|
342 |
+
'ajax' => [
|
343 |
+
'check' => $this->getSecAdminCheckAjaxData(),
|
344 |
+
],
|
345 |
+
'is_sec_admin' => true, // if $nSecTimeLeft > 0
|
346 |
+
'timeleft' => $this->getSecAdminTimeLeft(), // JS uses milliseconds
|
347 |
+
'strings' => [
|
348 |
+
'confirm' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' ).' '.__( 'Reload now?', 'wp-simple-firewall' ),
|
349 |
+
'nearly' => __( 'Security Admin session has nearly timed-out.', 'wp-simple-firewall' ),
|
350 |
+
'expired' => __( 'Security Admin session has timed-out.', 'wp-simple-firewall' )
|
351 |
+
]
|
352 |
+
];
|
353 |
+
}
|
354 |
+
else {
|
355 |
+
$aInsertData = [
|
356 |
+
'ajax' => [
|
357 |
+
'req_email_remove' => $this->getAjaxActionData( 'req_email_remove' ),
|
358 |
+
],
|
359 |
+
'strings' => [
|
360 |
+
'are_you_sure' => __( 'Are you sure?', 'wp-simple-firewall' )
|
361 |
+
]
|
362 |
+
];
|
363 |
+
}
|
364 |
+
|
365 |
+
if ( !empty( $aInsertData ) ) {
|
366 |
wp_localize_script(
|
367 |
$this->prefix( 'plugin' ),
|
368 |
'icwp_wpsf_vars_secadmin',
|
369 |
+
$aInsertData
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
370 |
);
|
371 |
}
|
372 |
}
|
src/features/audit_trail.php
CHANGED
@@ -147,7 +147,7 @@ class ICWP_WPSF_FeatureHandler_AuditTrail extends ICWP_WPSF_FeatureHandler_BaseW
|
|
147 |
'href' => $this->getUrl_DirectLinkToSection( 'section_enable_audit_contexts' ),
|
148 |
];
|
149 |
}
|
150 |
-
|
151 |
$aThis[ 'key_opts' ][ 'audit' ] = [
|
152 |
'name' => __( 'Audit Areas', 'wp-simple-firewall' ),
|
153 |
'enabled' => false,
|
147 |
'href' => $this->getUrl_DirectLinkToSection( 'section_enable_audit_contexts' ),
|
148 |
];
|
149 |
}
|
150 |
+
elseif ( empty( $aAudit ) ) {
|
151 |
$aThis[ 'key_opts' ][ 'audit' ] = [
|
152 |
'name' => __( 'Audit Areas', 'wp-simple-firewall' ),
|
153 |
'enabled' => false,
|
src/features/autoupdates.php
CHANGED
@@ -132,151 +132,4 @@ class ICWP_WPSF_FeatureHandler_Autoupdates extends ICWP_WPSF_FeatureHandler_Base
|
|
132 |
protected function getNamespaceBase() {
|
133 |
return 'Autoupdates';
|
134 |
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* @return bool
|
138 |
-
* @deprecated 8.4
|
139 |
-
*/
|
140 |
-
public function isSendAutoupdatesNotificationEmail() {
|
141 |
-
return $this->isOpt( 'enable_upgrade_notification_email', 'Y' );
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* @return bool
|
146 |
-
* @deprecated 8.4
|
147 |
-
*/
|
148 |
-
public function isDisableAllAutoUpdates() {
|
149 |
-
return $this->isOpt( 'enable_autoupdate_disable_all', 'Y' );
|
150 |
-
}
|
151 |
-
|
152 |
-
/**
|
153 |
-
* @return bool
|
154 |
-
* @deprecated 8.4
|
155 |
-
*/
|
156 |
-
public function isAutoUpdateCoreMajor() {
|
157 |
-
return $this->isOpt( 'autoupdate_core', 'core_major' );
|
158 |
-
}
|
159 |
-
|
160 |
-
/**
|
161 |
-
* @return bool
|
162 |
-
* @deprecated 8.4
|
163 |
-
*/
|
164 |
-
public function isAutoUpdateCoreMinor() {
|
165 |
-
return !$this->isOpt( 'autoupdate_core', 'core_never' );
|
166 |
-
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* @return string
|
170 |
-
* @deprecated 8.4
|
171 |
-
*/
|
172 |
-
public function getSelfAutoUpdateOpt() {
|
173 |
-
return $this->getOpt( 'autoupdate_plugin_self' );
|
174 |
-
}
|
175 |
-
|
176 |
-
/**
|
177 |
-
* @return array
|
178 |
-
* @deprecated 8.4
|
179 |
-
*/
|
180 |
-
public function getDelayTracking() {
|
181 |
-
$aTracking = $this->getOpt( 'delay_tracking', [] );
|
182 |
-
if ( !is_array( $aTracking ) ) {
|
183 |
-
$aTracking = [];
|
184 |
-
}
|
185 |
-
$aTracking = Services::DataManipulation()->mergeArraysRecursive(
|
186 |
-
[
|
187 |
-
'core' => [],
|
188 |
-
'plugins' => [],
|
189 |
-
'themes' => [],
|
190 |
-
],
|
191 |
-
$aTracking
|
192 |
-
);
|
193 |
-
$this->setOpt( 'delay_tracking', $aTracking );
|
194 |
-
|
195 |
-
return $aTracking;
|
196 |
-
}
|
197 |
-
|
198 |
-
/**
|
199 |
-
* @return string[]
|
200 |
-
* @deprecated 8.4
|
201 |
-
*/
|
202 |
-
public function getAutoupdatePlugins() {
|
203 |
-
$aSelected = [];
|
204 |
-
if ( $this->isAutoupdateIndividualPlugins() ) {
|
205 |
-
$aSelected = $this->getOpt( 'selected_plugins', [] );
|
206 |
-
if ( !is_array( $aSelected ) ) {
|
207 |
-
$aSelected = [];
|
208 |
-
}
|
209 |
-
}
|
210 |
-
return $aSelected;
|
211 |
-
}
|
212 |
-
|
213 |
-
/**
|
214 |
-
* @return int
|
215 |
-
* @deprecated 8.4
|
216 |
-
*/
|
217 |
-
public function getDelayUpdatesPeriod() {
|
218 |
-
return $this->isPremium() ? $this->getOpt( 'update_delay', 0 )*DAY_IN_SECONDS : 0;
|
219 |
-
}
|
220 |
-
|
221 |
-
/**
|
222 |
-
* @param array $aTrackingInfo
|
223 |
-
* @return $this
|
224 |
-
* @deprecated 8.4
|
225 |
-
*/
|
226 |
-
public function setDelayTracking( $aTrackingInfo ) {
|
227 |
-
return $this->setOpt( 'delay_tracking', $aTrackingInfo );
|
228 |
-
}
|
229 |
-
|
230 |
-
/**
|
231 |
-
* @return bool
|
232 |
-
* @deprecated 8.4
|
233 |
-
*/
|
234 |
-
public function isAutoupdateAllPlugins() {
|
235 |
-
return $this->isOpt( 'enable_autoupdate_plugins', 'Y' );
|
236 |
-
}
|
237 |
-
|
238 |
-
/**
|
239 |
-
* @premium
|
240 |
-
* @return bool
|
241 |
-
* @deprecated 8.4
|
242 |
-
*/
|
243 |
-
public function isAutoupdateIndividualPlugins() {
|
244 |
-
return $this->isOpt( 'enable_individual_autoupdate_plugins', 'Y' );
|
245 |
-
}
|
246 |
-
|
247 |
-
/**
|
248 |
-
* @return bool
|
249 |
-
* @deprecated 8.4
|
250 |
-
*/
|
251 |
-
public function isDelayUpdates() {
|
252 |
-
return $this->getDelayUpdatesPeriod() > 0;
|
253 |
-
}
|
254 |
-
|
255 |
-
/**
|
256 |
-
* @param string $sPluginFile
|
257 |
-
* @return bool
|
258 |
-
* @deprecated 8.4
|
259 |
-
*/
|
260 |
-
public function isPluginSetToAutoupdate( $sPluginFile ) {
|
261 |
-
return in_array( $sPluginFile, $this->getAutoupdatePlugins() );
|
262 |
-
}
|
263 |
-
|
264 |
-
/**
|
265 |
-
* @param string $sPluginFile
|
266 |
-
* @return $this
|
267 |
-
* @deprecated 8.4
|
268 |
-
*/
|
269 |
-
public function setPluginToAutoUpdate( $sPluginFile ) {
|
270 |
-
$aPlugins = $this->getAutoupdatePlugins();
|
271 |
-
$nKey = array_search( $sPluginFile, $aPlugins );
|
272 |
-
|
273 |
-
if ( $nKey === false ) {
|
274 |
-
$aPlugins[] = $sPluginFile;
|
275 |
-
}
|
276 |
-
else {
|
277 |
-
unset( $aPlugins[ $nKey ] );
|
278 |
-
}
|
279 |
-
|
280 |
-
return $this->setOpt( 'selected_plugins', $aPlugins );
|
281 |
-
}
|
282 |
}
|
132 |
protected function getNamespaceBase() {
|
133 |
return 'Autoupdates';
|
134 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
}
|
src/features/base.php
CHANGED
@@ -18,7 +18,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
18 |
protected $sModSlug;
|
19 |
|
20 |
/**
|
21 |
-
* @var
|
22 |
*/
|
23 |
protected $bImportExportWhitelistNotify = false;
|
24 |
|
@@ -58,12 +58,10 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
58 |
* @throws \Exception
|
59 |
*/
|
60 |
public function __construct( $oPluginController, $aMod = [] ) {
|
61 |
-
if (
|
62 |
-
|
63 |
-
throw new \Exception( 'Plugin controller not supplied to Module' );
|
64 |
-
}
|
65 |
-
$this->setCon( $oPluginController );
|
66 |
}
|
|
|
67 |
|
68 |
if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
|
69 |
throw new \Exception( 'Module storage key AND slug are undefined' );
|
@@ -121,12 +119,18 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
121 |
add_action( $this->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
|
122 |
add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
|
123 |
|
124 |
-
// supply
|
125 |
-
add_filter( $this->prefix( 'is_event_supported' ), function ( $bSupported, $sEventTag ) {
|
126 |
-
return $bSupported || $this->isSupportedEvent( $sEventTag );
|
127 |
-
}, 10, 2 );
|
128 |
add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
|
129 |
-
return array_merge(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
} );
|
131 |
|
132 |
add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
|
@@ -219,72 +223,6 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
219 |
return is_array( $aCls ) ? $aCls : [];
|
220 |
}
|
221 |
|
222 |
-
/**
|
223 |
-
* @param string $sKey
|
224 |
-
* @return array|null
|
225 |
-
*/
|
226 |
-
public function getEventDef( $sKey ) {
|
227 |
-
return $this->isSupportedEvent( $sKey ) ? $this->getEvents()[ $sKey ] : null;
|
228 |
-
}
|
229 |
-
|
230 |
-
/**
|
231 |
-
* @return array[]
|
232 |
-
*/
|
233 |
-
public function getEvents() {
|
234 |
-
$aEvts = $this->getSupportedEvents();
|
235 |
-
|
236 |
-
$aDefaults = [
|
237 |
-
'context' => $this->getSlug(),
|
238 |
-
'cat' => 1,
|
239 |
-
'stat' => true,
|
240 |
-
'audit' => true,
|
241 |
-
'recent' => false, // whether to show in the recent events logs
|
242 |
-
'offense' => false, // whether to mark offense against IP
|
243 |
-
'audit_multiple' => false, // allow multiple audit entries in the same request
|
244 |
-
];
|
245 |
-
foreach ( $aEvts as $sKey => $aEvt ) {
|
246 |
-
$aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
|
247 |
-
$aEvts[ $sKey ][ 'key' ] = $sKey;
|
248 |
-
}
|
249 |
-
return $aEvts;
|
250 |
-
}
|
251 |
-
|
252 |
-
/**
|
253 |
-
* @return array[]
|
254 |
-
*/
|
255 |
-
public function getStatEvents_Recent() {
|
256 |
-
return array_filter(
|
257 |
-
$this->getEvents(),
|
258 |
-
function ( $aEvt ) {
|
259 |
-
return $aEvt[ 'recent' ];
|
260 |
-
}
|
261 |
-
);
|
262 |
-
}
|
263 |
-
|
264 |
-
/**
|
265 |
-
* @return array[]
|
266 |
-
*/
|
267 |
-
protected function getSupportedEvents() {
|
268 |
-
$aEvts = $this->getDef( 'events' );
|
269 |
-
return is_array( $aEvts ) ? $aEvts : [];
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* @param string $sKey
|
274 |
-
* @return bool
|
275 |
-
*/
|
276 |
-
public function isSupportedEvent( $sKey ) {
|
277 |
-
return array_key_exists( $sKey, $this->getSupportedEvents() );
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* @param string $sKey
|
282 |
-
* @return bool
|
283 |
-
*/
|
284 |
-
public function isOffenseEvent( $sKey ) {
|
285 |
-
return $this->isSupportedEvent( $sKey ) && $this->getEvents()[ $sKey ][ 'offense' ];
|
286 |
-
}
|
287 |
-
|
288 |
/**
|
289 |
* Should be over-ridden by each new class to handle upgrades.
|
290 |
* Called upon construction and after plugin options are initialized.
|
@@ -526,11 +464,21 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
526 |
);
|
527 |
}
|
528 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
529 |
/**
|
530 |
* @param string $sOptKey
|
531 |
* @return string
|
532 |
*/
|
533 |
-
|
534 |
$sUrl = $this->getUrl_AdminPage();
|
535 |
$aDef = $this->getOptions()->getOptDefinition( $sOptKey );
|
536 |
if ( !empty( $aDef[ 'section' ] ) ) {
|
@@ -583,18 +531,20 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
583 |
*/
|
584 |
public function isModuleEnabled() {
|
585 |
$oOpts = $this->getOptions();
|
|
|
|
|
586 |
|
587 |
if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
|
588 |
// Auto enabled modules always run regardless
|
589 |
$bEnabled = true;
|
590 |
}
|
591 |
-
|
592 |
$bEnabled = false;
|
593 |
}
|
594 |
-
|
595 |
$bEnabled = false;
|
596 |
}
|
597 |
-
|
598 |
$bEnabled = false;
|
599 |
}
|
600 |
else {
|
@@ -800,21 +750,21 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
800 |
}
|
801 |
|
802 |
/**
|
803 |
-
* @return
|
804 |
*/
|
805 |
public function getIfShowModuleMenuItem() {
|
806 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
|
807 |
}
|
808 |
|
809 |
/**
|
810 |
-
* @return
|
811 |
*/
|
812 |
public function getIfShowModuleLink() {
|
813 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
|
814 |
}
|
815 |
|
816 |
/**
|
817 |
-
* @return
|
818 |
*/
|
819 |
public function getIfUseSessions() {
|
820 |
return $this->getOptions()->getFeatureProperty( 'use_sessions' );
|
@@ -866,9 +816,9 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
866 |
}
|
867 |
|
868 |
/**
|
869 |
-
* @param string
|
870 |
-
* @param mixed
|
871 |
-
* @param
|
872 |
* @return bool
|
873 |
*/
|
874 |
public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
|
@@ -1311,13 +1261,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1311 |
if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
|
1312 |
continue;
|
1313 |
}
|
1314 |
-
|
1315 |
$sOptionValue = 'N';
|
1316 |
}
|
1317 |
-
|
1318 |
$sOptionValue = 0;
|
1319 |
}
|
1320 |
-
|
1321 |
$sOptionValue = [];
|
1322 |
}
|
1323 |
}
|
@@ -1329,7 +1279,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1329 |
if ( $sOptType == 'integer' ) {
|
1330 |
$sOptionValue = intval( $sOptionValue );
|
1331 |
}
|
1332 |
-
|
1333 |
$sTempValue = trim( $sOptionValue );
|
1334 |
if ( empty( $sTempValue ) ) {
|
1335 |
continue;
|
@@ -1342,13 +1292,13 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1342 |
|
1343 |
$sOptionValue = md5( $sTempValue );
|
1344 |
}
|
1345 |
-
|
1346 |
$sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
|
1347 |
}
|
1348 |
-
|
1349 |
$sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
|
1350 |
}
|
1351 |
-
|
1352 |
}
|
1353 |
}
|
1354 |
|
@@ -1438,12 +1388,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1438 |
* @uses echo()
|
1439 |
*/
|
1440 |
public function displayModuleAdminPage() {
|
1441 |
-
|
1442 |
-
echo $this->renderModulePage();
|
1443 |
-
}
|
1444 |
-
else {
|
1445 |
-
echo $this->renderRestrictedPage();
|
1446 |
-
}
|
1447 |
}
|
1448 |
|
1449 |
/**
|
@@ -1460,26 +1405,10 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1460 |
return $this->renderTemplate( 'index.php', $aData );
|
1461 |
}
|
1462 |
|
1463 |
-
/**
|
1464 |
-
* @return string
|
1465 |
-
*/
|
1466 |
-
protected function renderRestrictedPage() {
|
1467 |
-
$aData = Services::DataManipulation()
|
1468 |
-
->mergeArraysRecursive(
|
1469 |
-
$this->getBaseDisplayData(),
|
1470 |
-
[
|
1471 |
-
'ajax' => [
|
1472 |
-
'restricted_access' => $this->getAjaxActionData( 'restricted_access' )
|
1473 |
-
]
|
1474 |
-
]
|
1475 |
-
);
|
1476 |
-
return $this->renderTemplate( 'access_restricted.php', $aData );
|
1477 |
-
}
|
1478 |
-
|
1479 |
/**
|
1480 |
* @return array
|
1481 |
*/
|
1482 |
-
|
1483 |
$oCon = $this->getCon();
|
1484 |
|
1485 |
return [
|
@@ -1520,12 +1449,32 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1520 |
'show_content_help' => true,
|
1521 |
'show_alt_content' => false,
|
1522 |
'has_wizard' => $this->hasWizard(),
|
|
|
|
|
1523 |
],
|
1524 |
'hrefs' => [
|
1525 |
'go_pro' => 'https://shsec.io/shieldgoprofeature',
|
1526 |
'goprofooter' => 'https://shsec.io/goprofooter',
|
1527 |
'wizard_link' => $this->getUrl_WizardLanding(),
|
1528 |
-
'wizard_landing' => $this->getUrl_WizardLanding()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1529 |
],
|
1530 |
'content' => [
|
1531 |
'options_form' => '',
|
@@ -1652,7 +1601,7 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
1652 |
}
|
1653 |
|
1654 |
/**
|
1655 |
-
* @return
|
1656 |
*/
|
1657 |
protected function getIsShowMarketing() {
|
1658 |
return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
|
@@ -2017,10 +1966,44 @@ abstract class ICWP_WPSF_FeatureHandler_Base extends Shield\Deprecated\Foundatio
|
|
2017 |
}
|
2018 |
|
2019 |
/**
|
2020 |
-
* @return
|
2021 |
-
* @deprecated 8.
|
2022 |
*/
|
2023 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024 |
return false;
|
2025 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026 |
}
|
18 |
protected $sModSlug;
|
19 |
|
20 |
/**
|
21 |
+
* @var bool
|
22 |
*/
|
23 |
protected $bImportExportWhitelistNotify = false;
|
24 |
|
58 |
* @throws \Exception
|
59 |
*/
|
60 |
public function __construct( $oPluginController, $aMod = [] ) {
|
61 |
+
if ( !$oPluginController instanceof Shield\Controller\Controller ) {
|
62 |
+
throw new \Exception( 'Plugin controller not supplied to Module' );
|
|
|
|
|
|
|
63 |
}
|
64 |
+
$this->setCon( $oPluginController );
|
65 |
|
66 |
if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
|
67 |
throw new \Exception( 'Module storage key AND slug are undefined' );
|
119 |
add_action( $this->prefix( 'daily_cron' ), [ $this, 'runDailyCron' ] );
|
120 |
add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
|
121 |
|
122 |
+
// supply supported events for this module
|
|
|
|
|
|
|
123 |
add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
|
124 |
+
return array_merge(
|
125 |
+
is_array( $aEvents ) ? $aEvents : [],
|
126 |
+
array_map(
|
127 |
+
function ( $aEvt ) {
|
128 |
+
$aEvt[ 'context' ] = $this->getSlug();
|
129 |
+
return $aEvt;
|
130 |
+
},
|
131 |
+
is_array( $this->getDef( 'events' ) ) ? $this->getDef( 'events' ) : []
|
132 |
+
)
|
133 |
+
);
|
134 |
} );
|
135 |
|
136 |
add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
|
223 |
return is_array( $aCls ) ? $aCls : [];
|
224 |
}
|
225 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
226 |
/**
|
227 |
* Should be over-ridden by each new class to handle upgrades.
|
228 |
* Called upon construction and after plugin options are initialized.
|
464 |
);
|
465 |
}
|
466 |
|
467 |
+
/**
|
468 |
+
* @param string $sAction
|
469 |
+
* @return string
|
470 |
+
*/
|
471 |
+
public function buildAdminActionNonceUrl( $sAction ) {
|
472 |
+
$aActionNonce = $this->getNonceActionData( $sAction );
|
473 |
+
$aActionNonce[ 'ts' ] = Services::Request()->ts();
|
474 |
+
return add_query_arg( $aActionNonce, $this->getUrl_AdminPage() );
|
475 |
+
}
|
476 |
+
|
477 |
/**
|
478 |
* @param string $sOptKey
|
479 |
* @return string
|
480 |
*/
|
481 |
+
public function getUrl_DirectLinkToOption( $sOptKey ) {
|
482 |
$sUrl = $this->getUrl_AdminPage();
|
483 |
$aDef = $this->getOptions()->getOptDefinition( $sOptKey );
|
484 |
if ( !empty( $aDef[ 'section' ] ) ) {
|
531 |
*/
|
532 |
public function isModuleEnabled() {
|
533 |
$oOpts = $this->getOptions();
|
534 |
+
/** @var Shield\Modules\Plugin\Options $oPluginOpts */
|
535 |
+
$oPluginOpts = $this->getCon()->getModule_Plugin()->getOptions();
|
536 |
|
537 |
if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
|
538 |
// Auto enabled modules always run regardless
|
539 |
$bEnabled = true;
|
540 |
}
|
541 |
+
elseif ( $oPluginOpts->isPluginGloballyDisabled() ) {
|
542 |
$bEnabled = false;
|
543 |
}
|
544 |
+
elseif ( $this->getCon()->getIfForceOffActive() ) {
|
545 |
$bEnabled = false;
|
546 |
}
|
547 |
+
elseif ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
|
548 |
$bEnabled = false;
|
549 |
}
|
550 |
else {
|
750 |
}
|
751 |
|
752 |
/**
|
753 |
+
* @return bool
|
754 |
*/
|
755 |
public function getIfShowModuleMenuItem() {
|
756 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
|
757 |
}
|
758 |
|
759 |
/**
|
760 |
+
* @return bool
|
761 |
*/
|
762 |
public function getIfShowModuleLink() {
|
763 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
|
764 |
}
|
765 |
|
766 |
/**
|
767 |
+
* @return bool
|
768 |
*/
|
769 |
public function getIfUseSessions() {
|
770 |
return $this->getOptions()->getFeatureProperty( 'use_sessions' );
|
816 |
}
|
817 |
|
818 |
/**
|
819 |
+
* @param string $sOptionKey
|
820 |
+
* @param mixed $mValueToTest
|
821 |
+
* @param bool $bStrict
|
822 |
* @return bool
|
823 |
*/
|
824 |
public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
|
1261 |
if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
|
1262 |
continue;
|
1263 |
}
|
1264 |
+
elseif ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
|
1265 |
$sOptionValue = 'N';
|
1266 |
}
|
1267 |
+
elseif ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
|
1268 |
$sOptionValue = 0;
|
1269 |
}
|
1270 |
+
elseif ( $sOptType == 'multiple_select' ) {
|
1271 |
$sOptionValue = [];
|
1272 |
}
|
1273 |
}
|
1279 |
if ( $sOptType == 'integer' ) {
|
1280 |
$sOptionValue = intval( $sOptionValue );
|
1281 |
}
|
1282 |
+
elseif ( $sOptType == 'password' ) {
|
1283 |
$sTempValue = trim( $sOptionValue );
|
1284 |
if ( empty( $sTempValue ) ) {
|
1285 |
continue;
|
1292 |
|
1293 |
$sOptionValue = md5( $sTempValue );
|
1294 |
}
|
1295 |
+
elseif ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
|
1296 |
$sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
|
1297 |
}
|
1298 |
+
elseif ( $sOptType == 'comma_separated_lists' ) {
|
1299 |
$sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
|
1300 |
}
|
1301 |
+
elseif ( $sOptType == 'multiple_select' ) {
|
1302 |
}
|
1303 |
}
|
1304 |
|
1388 |
* @uses echo()
|
1389 |
*/
|
1390 |
public function displayModuleAdminPage() {
|
1391 |
+
echo $this->renderModulePage();
|
|
|
|
|
|
|
|
|
|
|
1392 |
}
|
1393 |
|
1394 |
/**
|
1405 |
return $this->renderTemplate( 'index.php', $aData );
|
1406 |
}
|
1407 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1408 |
/**
|
1409 |
* @return array
|
1410 |
*/
|
1411 |
+
public function getBaseDisplayData() {
|
1412 |
$oCon = $this->getCon();
|
1413 |
|
1414 |
return [
|
1449 |
'show_content_help' => true,
|
1450 |
'show_alt_content' => false,
|
1451 |
'has_wizard' => $this->hasWizard(),
|
1452 |
+
|
1453 |
+
'is_premium' => $this->isPremium(),
|
1454 |
],
|
1455 |
'hrefs' => [
|
1456 |
'go_pro' => 'https://shsec.io/shieldgoprofeature',
|
1457 |
'goprofooter' => 'https://shsec.io/goprofooter',
|
1458 |
'wizard_link' => $this->getUrl_WizardLanding(),
|
1459 |
+
'wizard_landing' => $this->getUrl_WizardLanding(),
|
1460 |
+
|
1461 |
+
'form_action' => Services::Request()->getUri(),
|
1462 |
+
'css_bootstrap' => $oCon->getPluginUrl_Css( 'bootstrap4.min' ),
|
1463 |
+
'css_pages' => $oCon->getPluginUrl_Css( 'pages' ),
|
1464 |
+
'css_steps' => $oCon->getPluginUrl_Css( 'jquery.steps' ),
|
1465 |
+
'css_fancybox' => $oCon->getPluginUrl_Css( 'jquery.fancybox.min' ),
|
1466 |
+
'css_globalplugin' => $oCon->getPluginUrl_Css( 'global-plugin' ),
|
1467 |
+
'css_wizard' => $oCon->getPluginUrl_Css( 'wizard' ),
|
1468 |
+
'js_jquery' => Services::Includes()->getUrl_Jquery(),
|
1469 |
+
'js_bootstrap' => $oCon->getPluginUrl_Js( 'bootstrap4.bundle.min' ),
|
1470 |
+
'js_fancybox' => $oCon->getPluginUrl_Js( 'jquery.fancybox.min' ),
|
1471 |
+
'js_globalplugin' => $oCon->getPluginUrl_Js( 'global-plugin' ),
|
1472 |
+
'js_steps' => $oCon->getPluginUrl_Js( 'jquery.steps.min' ),
|
1473 |
+
'js_wizard' => $oCon->getPluginUrl_Js( 'wizard' ),
|
1474 |
+
],
|
1475 |
+
'imgs' => [
|
1476 |
+
'favicon' => $oCon->getPluginUrl_Image( 'pluginlogo_24x24.png' ),
|
1477 |
+
'plugin_banner' => $oCon->getPluginUrl_Image( 'banner-1500x500-transparent.png' ),
|
1478 |
],
|
1479 |
'content' => [
|
1480 |
'options_form' => '',
|
1601 |
}
|
1602 |
|
1603 |
/**
|
1604 |
+
* @return bool
|
1605 |
*/
|
1606 |
protected function getIsShowMarketing() {
|
1607 |
return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
|
1966 |
}
|
1967 |
|
1968 |
/**
|
1969 |
+
* @return array[]
|
1970 |
+
* @deprecated 8.5
|
1971 |
*/
|
1972 |
+
public function getStatEvents_Recent() {
|
1973 |
+
return [];
|
1974 |
+
}
|
1975 |
+
|
1976 |
+
/**
|
1977 |
+
* @param string $sKey
|
1978 |
+
* @return array|null
|
1979 |
+
* @deprecated 8.5
|
1980 |
+
*/
|
1981 |
+
public function getEventDef( $sKey ) {
|
1982 |
+
return null;
|
1983 |
+
}
|
1984 |
+
|
1985 |
+
/**
|
1986 |
+
* @param string $sKey
|
1987 |
+
* @return bool
|
1988 |
+
* @deprecated 8.5
|
1989 |
+
*/
|
1990 |
+
public function isSupportedEvent( $sKey ) {
|
1991 |
return false;
|
1992 |
}
|
1993 |
+
|
1994 |
+
/**
|
1995 |
+
* @return array[]
|
1996 |
+
* @deprecated 8.5
|
1997 |
+
*/
|
1998 |
+
protected function getSupportedEvents() {
|
1999 |
+
return [];
|
2000 |
+
}
|
2001 |
+
|
2002 |
+
/**
|
2003 |
+
* @return array[]
|
2004 |
+
* @deprecated 8.5
|
2005 |
+
*/
|
2006 |
+
public function getEvents() {
|
2007 |
+
return $this->getDef( 'events' );
|
2008 |
+
}
|
2009 |
}
|
src/features/base_wpsf.php
CHANGED
@@ -2,33 +2,24 @@
|
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
|
|
5 |
|
6 |
class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
7 |
|
8 |
-
/**
|
9 |
-
* @var string[]
|
10 |
-
*/
|
11 |
-
private static $aStatEvents;
|
12 |
-
|
13 |
-
/**
|
14 |
-
* @var Shield\Databases\AuditTrail\EntryVO[]
|
15 |
-
*/
|
16 |
-
private static $aAuditLogs;
|
17 |
-
|
18 |
/**
|
19 |
* @var bool
|
20 |
*/
|
21 |
-
static
|
22 |
|
23 |
/**
|
24 |
* @var int
|
25 |
*/
|
26 |
-
static
|
27 |
|
28 |
/**
|
29 |
* @var bool
|
30 |
*/
|
31 |
-
private $bVisitorIsWhitelisted;
|
32 |
|
33 |
/**
|
34 |
* @return \ICWP_WPSF_Processor_Sessions
|
@@ -72,107 +63,11 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
72 |
return ( $this->getSession() instanceof \FernleafSystems\Wordpress\Plugin\Shield\Databases\Session\EntryVO );
|
73 |
}
|
74 |
|
75 |
-
protected function setupCustomHooks() {
|
76 |
-
$oCon = $this->getCon();
|
77 |
-
add_action( $oCon->prefix( 'event' ), [ $this, 'eventOffense' ], 10, 2 );
|
78 |
-
add_action( $oCon->prefix( 'event' ), [ $this, 'eventAudit' ], 10, 2 );
|
79 |
-
add_action( $oCon->prefix( 'event' ), [ $this, 'eventStat' ], 10, 2 );
|
80 |
-
}
|
81 |
-
|
82 |
-
/**
|
83 |
-
* @param string $sEvent
|
84 |
-
* @param array $aMeta
|
85 |
-
* @return $this
|
86 |
-
*/
|
87 |
-
public function eventAudit( $sEvent = '', $aMeta = [] ) {
|
88 |
-
if ( $this->isSupportedEvent( $sEvent ) ) {
|
89 |
-
$aDef = $this->getEventDef( $sEvent );
|
90 |
-
if ( $aDef[ 'audit' ] && empty( $aMeta[ 'suppress_audit' ] ) ) { // only audit if it's an auditable event
|
91 |
-
$oEntry = new Shield\Databases\AuditTrail\EntryVO();
|
92 |
-
$oEntry->event = $sEvent;
|
93 |
-
$oEntry->category = $aDef[ 'cat' ];
|
94 |
-
$oEntry->context = $aDef[ 'context' ];
|
95 |
-
$oEntry->meta = isset( $aMeta[ 'audit' ] ) ? $aMeta[ 'audit' ] : [];
|
96 |
-
if ( !is_array( self::$aAuditLogs ) ) {
|
97 |
-
self::$aAuditLogs = [];
|
98 |
-
}
|
99 |
-
|
100 |
-
// cater for where certain events may happen more than once in the same request
|
101 |
-
if ( !empty( $aDef[ 'audit_multiple' ] ) ) {
|
102 |
-
self::$aAuditLogs[] = $oEntry;
|
103 |
-
}
|
104 |
-
else {
|
105 |
-
self::$aAuditLogs[ $sEvent ] = $oEntry;
|
106 |
-
}
|
107 |
-
}
|
108 |
-
}
|
109 |
-
return $this;
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* @param string $sEvent
|
114 |
-
* @param array $aMeta
|
115 |
-
*/
|
116 |
-
public function eventOffense( $sEvent, $aMeta = [] ) {
|
117 |
-
if ( $this->isSupportedEvent( $sEvent ) ) {
|
118 |
-
$aDef = $this->getEventDef( $sEvent );
|
119 |
-
if ( $aDef[ 'offense' ] && empty( $aMeta[ 'suppress_offense' ] ) ) {
|
120 |
-
self::$nIpOffenceCount = max(
|
121 |
-
(int)self::$nIpOffenceCount,
|
122 |
-
isset( $aMeta[ 'offense_count' ] ) ? $aMeta[ 'offense_count' ] : 1
|
123 |
-
);
|
124 |
-
}
|
125 |
-
}
|
126 |
-
}
|
127 |
-
|
128 |
/**
|
129 |
-
* @
|
130 |
-
* @param array $aMeta
|
131 |
-
*/
|
132 |
-
public function eventStat( $sEvent, $aMeta = [] ) {
|
133 |
-
if ( $this->isSupportedEvent( $sEvent ) ) {
|
134 |
-
$aDef = $this->getEventDef( $sEvent );
|
135 |
-
if ( $aDef[ 'stat' ] && empty( $aMeta[ 'suppress_stat' ] ) ) { // only stat if it's a statable event
|
136 |
-
$this->addStatEvent( $sEvent, $aMeta );
|
137 |
-
}
|
138 |
-
}
|
139 |
-
}
|
140 |
-
|
141 |
-
/**
|
142 |
-
* @param string $sEvent
|
143 |
-
* @param array $aMeta
|
144 |
-
* @return $this
|
145 |
-
*/
|
146 |
-
protected function addStatEvent( $sEvent, $aMeta = [] ) {
|
147 |
-
if ( !is_array( self::$aStatEvents ) ) {
|
148 |
-
self::$aStatEvents = [];
|
149 |
-
}
|
150 |
-
self::$aStatEvents[ $sEvent ] = isset( $aMeta[ 'ts' ] ) ? $aMeta[ 'ts' ] : Services::Request()->ts();
|
151 |
-
return $this;
|
152 |
-
}
|
153 |
-
|
154 |
-
/**
|
155 |
-
* @param bool $bFlush
|
156 |
-
* @return Shield\Databases\AuditTrail\EntryVO[]
|
157 |
*/
|
158 |
-
public function
|
159 |
-
|
160 |
-
if ( $bFlush ) {
|
161 |
-
self::$aAuditLogs = [];
|
162 |
-
}
|
163 |
-
return is_array( $aEntries ) ? $aEntries : [];
|
164 |
-
}
|
165 |
-
|
166 |
-
/**
|
167 |
-
* @param bool $bFlush
|
168 |
-
* @return string[]
|
169 |
-
*/
|
170 |
-
public function getRegisteredEvents( $bFlush = false ) {
|
171 |
-
$aEntries = self::$aStatEvents;
|
172 |
-
if ( $bFlush ) {
|
173 |
-
self::$aStatEvents = [];
|
174 |
-
}
|
175 |
-
return is_array( $aEntries ) ? $aEntries : [];
|
176 |
}
|
177 |
|
178 |
/**
|
@@ -280,22 +175,48 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
280 |
}
|
281 |
|
282 |
/**
|
283 |
-
* @
|
284 |
*/
|
285 |
-
|
286 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
287 |
|
|
|
|
|
|
|
|
|
288 |
return Services::DataManipulation()->mergeArraysRecursive(
|
289 |
parent::getBaseDisplayData(),
|
290 |
[
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
291 |
'ajax' => [
|
292 |
'sec_admin_login' => $this->getSecAdminLoginAjaxData(),
|
293 |
],
|
294 |
'flags' => [
|
|
|
295 |
'has_session' => $this->hasSession()
|
296 |
],
|
297 |
'hrefs' => [
|
298 |
-
'aar_forget_key' => $
|
|
|
299 |
],
|
300 |
'classes' => [
|
301 |
'top_container' => implode( ' ', array_filter( [
|
@@ -309,6 +230,36 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
309 |
);
|
310 |
}
|
311 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
312 |
/**
|
313 |
* @return bool
|
314 |
*/
|
@@ -332,16 +283,15 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
332 |
* @return bool
|
333 |
*/
|
334 |
public function isVisitorWhitelisted() {
|
335 |
-
if ( !isset(
|
336 |
-
$
|
337 |
-
|
338 |
-
->
|
339 |
-
->
|
340 |
-
->setList( $oIpMod::LIST_MANUAL_WHITE )
|
341 |
->lookup();
|
342 |
-
|
343 |
}
|
344 |
-
return
|
345 |
}
|
346 |
|
347 |
/**
|
@@ -349,21 +299,27 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
349 |
*/
|
350 |
public function isVerifiedBot() {
|
351 |
if ( !isset( self::$bIsVerifiedBot ) ) {
|
352 |
-
$
|
353 |
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
358 |
}
|
359 |
-
self::$bIsVerifiedBot = $oSp->isIp_GoogleBot( $sIp, $sAgent )
|
360 |
-
|| $oSp->isIp_BingBot( $sIp, $sAgent )
|
361 |
-
|| $oSp->isIp_AppleBot( $sIp, $sAgent )
|
362 |
-
|| $oSp->isIp_YahooBot( $sIp, $sAgent )
|
363 |
-
|| $oSp->isIp_DuckDuckGoBot( $sIp, $sAgent )
|
364 |
-
|| $oSp->isIp_YandexBot( $sIp, $sAgent )
|
365 |
-
|| ( class_exists( 'ICWP_Plugin' ) && $oSp->isIp_iControlWP( $sIp ) )
|
366 |
-
|| $oSp->isIp_BaiduBot( $sIp, $sAgent );
|
367 |
}
|
368 |
return self::$bIsVerifiedBot;
|
369 |
}
|
@@ -423,4 +379,58 @@ class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
|
423 |
public function getIpOffenceCount() {
|
424 |
return isset( self::$nIpOffenceCount ) ? self::$nIpOffenceCount : 0;
|
425 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
426 |
}
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
5 |
+
use FernleafSystems\Wordpress\Services\Utilities;
|
6 |
|
7 |
class ICWP_WPSF_FeatureHandler_BaseWpsf extends ICWP_WPSF_FeatureHandler_Base {
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
/**
|
10 |
* @var bool
|
11 |
*/
|
12 |
+
protected static $bIsVerifiedBot;
|
13 |
|
14 |
/**
|
15 |
* @var int
|
16 |
*/
|
17 |
+
private static $nIpOffenceCount = 0;
|
18 |
|
19 |
/**
|
20 |
* @var bool
|
21 |
*/
|
22 |
+
private static $bVisitorIsWhitelisted;
|
23 |
|
24 |
/**
|
25 |
* @return \ICWP_WPSF_Processor_Sessions
|
63 |
return ( $this->getSession() instanceof \FernleafSystems\Wordpress\Plugin\Shield\Databases\Session\EntryVO );
|
64 |
}
|
65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
/**
|
67 |
+
* @return bool
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
*/
|
69 |
+
public function hasValidRequestIP() {
|
70 |
+
return Services::IP()->isValidIp( Services::IP()->getRequestIp() );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
}
|
72 |
|
73 |
/**
|
175 |
}
|
176 |
|
177 |
/**
|
178 |
+
* @uses echo()
|
179 |
*/
|
180 |
+
public function displayModuleAdminPage() {
|
181 |
+
if ( $this->canDisplayOptionsForm() ) {
|
182 |
+
parent::displayModuleAdminPage();
|
183 |
+
}
|
184 |
+
else {
|
185 |
+
echo $this->renderRestrictedPage();
|
186 |
+
}
|
187 |
+
}
|
188 |
|
189 |
+
/**
|
190 |
+
* @return array
|
191 |
+
*/
|
192 |
+
public function getBaseDisplayData() {
|
193 |
return Services::DataManipulation()->mergeArraysRecursive(
|
194 |
parent::getBaseDisplayData(),
|
195 |
[
|
196 |
+
'head' => [
|
197 |
+
'meta' => [
|
198 |
+
[
|
199 |
+
'type' => 'http-equiv',
|
200 |
+
'type_type' => 'Cache-Control',
|
201 |
+
'content' => 'no-store, no-cache',
|
202 |
+
],
|
203 |
+
[
|
204 |
+
'type' => 'http-equiv',
|
205 |
+
'type_type' => 'Expires',
|
206 |
+
'content' => '0',
|
207 |
+
],
|
208 |
+
]
|
209 |
+
],
|
210 |
'ajax' => [
|
211 |
'sec_admin_login' => $this->getSecAdminLoginAjaxData(),
|
212 |
],
|
213 |
'flags' => [
|
214 |
+
'show_promo' => !$this->isPremium(),
|
215 |
'has_session' => $this->hasSession()
|
216 |
],
|
217 |
'hrefs' => [
|
218 |
+
'aar_forget_key' => $this->isWlEnabled() ?
|
219 |
+
$this->getCon()->getLabels()[ 'AuthorURI' ] : 'https://shsec.io/gc'
|
220 |
],
|
221 |
'classes' => [
|
222 |
'top_container' => implode( ' ', array_filter( [
|
230 |
);
|
231 |
}
|
232 |
|
233 |
+
/**
|
234 |
+
* @return string
|
235 |
+
*/
|
236 |
+
protected function renderRestrictedPage() {
|
237 |
+
/** @var Shield\Modules\SecurityAdmin\Options $oSecOpts */
|
238 |
+
$oSecOpts = $this->getCon()
|
239 |
+
->getModule_SecAdmin()
|
240 |
+
->getOptions();
|
241 |
+
$aData = Services::DataManipulation()
|
242 |
+
->mergeArraysRecursive(
|
243 |
+
$this->getBaseDisplayData(),
|
244 |
+
[
|
245 |
+
'ajax' => [
|
246 |
+
'restricted_access' => $this->getAjaxActionData( 'restricted_access' ),
|
247 |
+
],
|
248 |
+
'strings' => [
|
249 |
+
'force_remove_email' => __( "If you've forgotten your key, a link can be sent to the plugin administrator email address to remove this restriction.", 'wp-simple-firewall' ),
|
250 |
+
'click_email' => __( "Click here to send the verification email.", 'wp-simple-firewall' ),
|
251 |
+
'send_to_email' => sprintf( __( "Email will be sent to %s", 'wp-simple-firewall' ),
|
252 |
+
Utilities\Obfuscate::Email( $this->getPluginDefaultRecipientAddress() ) ),
|
253 |
+
'no_email_override' => __( "The Security Administrator has restricted the use of the email override feature.", 'wp-simple-firewall' ),
|
254 |
+
],
|
255 |
+
'flags' => [
|
256 |
+
'allow_email_override' => $oSecOpts->isEmailOverridePermitted()
|
257 |
+
]
|
258 |
+
]
|
259 |
+
);
|
260 |
+
return $this->renderTemplate( '/wpadmin_pages/security_admin/index.twig', $aData, true );
|
261 |
+
}
|
262 |
+
|
263 |
/**
|
264 |
* @return bool
|
265 |
*/
|
283 |
* @return bool
|
284 |
*/
|
285 |
public function isVisitorWhitelisted() {
|
286 |
+
if ( !isset( self::$bVisitorIsWhitelisted ) ) {
|
287 |
+
$oIp = ( new Shield\Modules\IPs\Lib\Ops\LookupIpOnList() )
|
288 |
+
->setDbHandler( $this->getCon()->getModule_IPs()->getDbHandler_IPs() )
|
289 |
+
->setIP( Services::IP()->getRequestIp() )
|
290 |
+
->setListTypeWhite()
|
|
|
291 |
->lookup();
|
292 |
+
self::$bVisitorIsWhitelisted = $oIp instanceof Shield\Databases\IPs\EntryVO;
|
293 |
}
|
294 |
+
return self::$bVisitorIsWhitelisted;
|
295 |
}
|
296 |
|
297 |
/**
|
299 |
*/
|
300 |
public function isVerifiedBot() {
|
301 |
if ( !isset( self::$bIsVerifiedBot ) ) {
|
302 |
+
$oIP = Services::IP();
|
303 |
|
304 |
+
if ( $oIP->isLoopback() ) {
|
305 |
+
self::$bIsVerifiedBot = false;
|
306 |
+
}
|
307 |
+
else {
|
308 |
+
$oSP = Services::ServiceProviders();
|
309 |
+
$sIp = $oIP->getRequestIp();
|
310 |
+
$sAgent = Services::Request()->getUserAgent();
|
311 |
+
if ( empty( $sAgent ) ) {
|
312 |
+
$sAgent = 'Unknown';
|
313 |
+
}
|
314 |
+
self::$bIsVerifiedBot = $oSP->isIp_GoogleBot( $sIp, $sAgent )
|
315 |
+
|| $oSP->isIp_BingBot( $sIp, $sAgent )
|
316 |
+
|| $oSP->isIp_AppleBot( $sIp, $sAgent )
|
317 |
+
|| $oSP->isIp_YahooBot( $sIp, $sAgent )
|
318 |
+
|| $oSP->isIp_DuckDuckGoBot( $sIp, $sAgent )
|
319 |
+
|| $oSP->isIp_YandexBot( $sIp, $sAgent )
|
320 |
+
|| ( class_exists( 'ICWP_Plugin' ) && $oSP->isIp_iControlWP( $sIp ) )
|
321 |
+
|| $oSP->isIp_BaiduBot( $sIp, $sAgent );
|
322 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
}
|
324 |
return self::$bIsVerifiedBot;
|
325 |
}
|
379 |
public function getIpOffenceCount() {
|
380 |
return isset( self::$nIpOffenceCount ) ? self::$nIpOffenceCount : 0;
|
381 |
}
|
382 |
+
|
383 |
+
/**
|
384 |
+
* @param string $sEvent
|
385 |
+
* @param array $aMeta
|
386 |
+
* @return $this
|
387 |
+
* @deprecated 8.5
|
388 |
+
*/
|
389 |
+
public function eventAudit( $sEvent = '', $aMeta = [] ) {
|
390 |
+
return $this;
|
391 |
+
}
|
392 |
+
|
393 |
+
/**
|
394 |
+
* @param string $sEvent
|
395 |
+
* @param array $aMeta
|
396 |
+
* @deprecated 8.5
|
397 |
+
*/
|
398 |
+
public function eventOffense( $sEvent, $aMeta = [] ) {
|
399 |
+
}
|
400 |
+
|
401 |
+
/**
|
402 |
+
* @param string $sEvent
|
403 |
+
* @param array $aMeta
|
404 |
+
* @deprecated 8.5
|
405 |
+
*/
|
406 |
+
public function eventStat( $sEvent, $aMeta = [] ) {
|
407 |
+
}
|
408 |
+
|
409 |
+
/**
|
410 |
+
* @param string $sEvent
|
411 |
+
* @param array $aMeta
|
412 |
+
* @return $this
|
413 |
+
* @deprecated 8.5
|
414 |
+
*/
|
415 |
+
protected function addStatEvent( $sEvent, $aMeta = [] ) {
|
416 |
+
return $this;
|
417 |
+
}
|
418 |
+
|
419 |
+
/**
|
420 |
+
* @param bool $bFlush
|
421 |
+
* @return Shield\Databases\AuditTrail\EntryVO[]
|
422 |
+
* @deprecated 8.5
|
423 |
+
*/
|
424 |
+
public function getRegisteredAuditLogs( $bFlush = false ) {
|
425 |
+
return [];
|
426 |
+
}
|
427 |
+
|
428 |
+
/**
|
429 |
+
* @param bool $bFlush
|
430 |
+
* @return string[]
|
431 |
+
* @deprecated 8.5
|
432 |
+
*/
|
433 |
+
public function getRegisteredEvents( $bFlush = false ) {
|
434 |
+
return [];
|
435 |
+
}
|
436 |
}
|
src/features/events.php
CHANGED
@@ -27,12 +27,4 @@ class ICWP_WPSF_FeatureHandler_Events extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
27 |
protected function getNamespaceBase() {
|
28 |
return 'Events';
|
29 |
}
|
30 |
-
|
31 |
-
/**
|
32 |
-
* @return Shield\Databases\Events\Handler
|
33 |
-
* @deprecated 8.4
|
34 |
-
*/
|
35 |
-
protected function loadDbHandler() {
|
36 |
-
return new Shield\Databases\Events\Handler();
|
37 |
-
}
|
38 |
}
|
27 |
protected function getNamespaceBase() {
|
28 |
return 'Events';
|
29 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
}
|
src/features/hack_protect.php
CHANGED
@@ -11,6 +11,11 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
11 |
*/
|
12 |
private $oScanQueueController;
|
13 |
|
|
|
|
|
|
|
|
|
|
|
14 |
protected function doPostConstruction() {
|
15 |
parent::doPostConstruction();
|
16 |
$this->setCustomCronSchedules();
|
@@ -24,14 +29,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
24 |
$this->getScanController();
|
25 |
}
|
26 |
|
27 |
-
/**
|
28 |
-
*/
|
29 |
-
protected function updateHandler() {
|
30 |
-
parent::updateHandler();
|
31 |
-
$this->setPtgUpdateStoreFormat( true );
|
32 |
-
// ->setPtgRebuildSelfRequired( true ) // this is permanently required until a better solution is found
|
33 |
-
}
|
34 |
-
|
35 |
/**
|
36 |
* @return HackGuard\Scan\Queue\Controller
|
37 |
*/
|
@@ -43,18 +40,42 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
43 |
return $this->oScanQueueController;
|
44 |
}
|
45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
/**
|
47 |
*/
|
48 |
public function handleModRequest() {
|
49 |
$oReq = Services::Request();
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
|
|
|
|
58 |
}
|
59 |
}
|
60 |
|
@@ -75,18 +96,12 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
75 |
$this->cleanFileExclusions();
|
76 |
$this->cleanPtgFileExtensions();
|
77 |
|
78 |
-
$oOpts = $this->getOptions();
|
79 |
-
if ( $oOpts->isOptChanged( 'ptg_enable' ) || $oOpts->isOptChanged( 'ptg_depth' ) || $oOpts->isOptChanged( 'ptg_extensions' ) ) {
|
80 |
-
$this->setPtgLastBuildAt( 0 );
|
81 |
-
/** @var \ICWP_WPSF_Processor_HackProtect $oPro */
|
82 |
-
$oPro = $this->getProcessor();
|
83 |
-
$oPro->getSubProScanner()
|
84 |
-
->getSubProcessorPtg()
|
85 |
-
->resetScan();
|
86 |
-
}
|
87 |
-
|
88 |
$this->setOpt( 'ptg_candiskwrite_at', 0 );
|
89 |
$this->resetRtBackupFiles();
|
|
|
|
|
|
|
|
|
90 |
}
|
91 |
|
92 |
/**
|
@@ -127,13 +142,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
127 |
/**
|
128 |
* @param string $sScan ptg, wcf, ufc, wpv
|
129 |
* @return bool
|
|
|
130 |
*/
|
131 |
public function getScanHasProblem( $sScan ) {
|
132 |
-
|
133 |
-
$oSel = $this->getDbHandler_ScanResults()->getQuerySelector();
|
134 |
-
return $oSel->filterByNotIgnored()
|
135 |
-
->filterByScan( $sScan )
|
136 |
-
->count() > 0;
|
137 |
}
|
138 |
|
139 |
/**
|
@@ -154,17 +166,17 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
154 |
* @return $this
|
155 |
*/
|
156 |
protected function setCustomCronSchedules() {
|
157 |
-
/** @var HackGuard\Options $
|
158 |
$oOpts = $this->getOptions();
|
159 |
$nFreq = $oOpts->getScanFrequency();
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
return $this;
|
169 |
}
|
170 |
|
@@ -197,13 +209,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
197 |
return $this->setOpt( 'snapshot_users', $aUsers );
|
198 |
}
|
199 |
|
200 |
-
/**
|
201 |
-
* @return string
|
202 |
-
*/
|
203 |
-
public function getUnrecognisedFileScannerOption() {
|
204 |
-
return $this->getOpt( 'enable_unrecognised_file_cleaner_scan', 'disabled' );
|
205 |
-
}
|
206 |
-
|
207 |
/**
|
208 |
* @return array
|
209 |
*/
|
@@ -227,7 +232,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
227 |
if ( preg_match( '/^#(.+)#$/', $sExclusion, $aMatches ) ) { // it's regex
|
228 |
// ignore it
|
229 |
}
|
230 |
-
|
231 |
$sExclusion = trim( preg_replace( '#[^.0-9a-z_-]#i', '', $sExclusion ) );
|
232 |
}
|
233 |
|
@@ -242,70 +247,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
242 |
/**
|
243 |
* @return string
|
244 |
*/
|
245 |
-
public function isUfcDeleteFiles() {
|
246 |
-
return in_array( $this->getUnrecognisedFileScannerOption(), [
|
247 |
-
'enabled_delete_only',
|
248 |
-
'enabled_delete_report'
|
249 |
-
] );
|
250 |
-
}
|
251 |
-
|
252 |
-
/**
|
253 |
-
* @return bool
|
254 |
-
*/
|
255 |
-
public function isUfcEnabled() {
|
256 |
-
return ( $this->getUnrecognisedFileScannerOption() != 'disabled' );
|
257 |
-
}
|
258 |
-
|
259 |
-
/**
|
260 |
-
* @return string
|
261 |
-
*/
|
262 |
-
public function isUfcSendReport() {
|
263 |
-
return in_array( $this->getUnrecognisedFileScannerOption(), [
|
264 |
-
'enabled_report_only',
|
265 |
-
'enabled_delete_report'
|
266 |
-
] );
|
267 |
-
}
|
268 |
-
|
269 |
-
/**
|
270 |
-
* @return bool
|
271 |
-
*/
|
272 |
-
public function isWcfScanAutoRepair() {
|
273 |
-
return $this->isOpt( 'attempt_auto_file_repair', 'Y' );
|
274 |
-
}
|
275 |
-
|
276 |
-
/**
|
277 |
-
* @return bool
|
278 |
-
*/
|
279 |
-
public function isWcfScanEnabled() {
|
280 |
-
return $this->isOpt( 'enable_core_file_integrity_scan', 'Y' );
|
281 |
-
}
|
282 |
-
|
283 |
-
/**
|
284 |
-
* @return bool
|
285 |
-
*/
|
286 |
-
public function isWpvulnEnabled() {
|
287 |
-
return $this->isPremium() && !$this->isOpt( 'enable_wpvuln_scan', 'disabled' );
|
288 |
-
}
|
289 |
-
|
290 |
-
/**
|
291 |
-
* @return bool
|
292 |
-
*/
|
293 |
-
public function isWpvulnSendEmail() {
|
294 |
-
return $this->isWpvulnEnabled() && $this->isOpt( 'enable_wpvuln_scan', 'enabled_email' );
|
295 |
-
}
|
296 |
-
|
297 |
-
/**
|
298 |
-
* @return bool
|
299 |
-
*/
|
300 |
-
public function isWpvulnAutoupdatesEnabled() {
|
301 |
-
return $this->isWpvulnEnabled() && $this->isOpt( 'wpvuln_scan_autoupdate', 'Y' );
|
302 |
-
}
|
303 |
-
|
304 |
-
/**
|
305 |
-
* @return mixed
|
306 |
-
*/
|
307 |
public function getWpvulnPluginsHighlightOption() {
|
308 |
-
|
|
|
|
|
309 |
}
|
310 |
|
311 |
/**
|
@@ -349,113 +294,32 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
349 |
* @return $this
|
350 |
*/
|
351 |
protected function cleanPtgFileExtensions() {
|
352 |
-
|
|
|
|
|
353 |
'ptg_extensions',
|
354 |
-
$this->cleanStringArray( $
|
355 |
);
|
356 |
-
|
357 |
-
|
358 |
-
/**
|
359 |
-
* @return string[]
|
360 |
-
*/
|
361 |
-
public function getPtgFileExtensions() {
|
362 |
-
return $this->getOpt( 'ptg_extensions' );
|
363 |
-
}
|
364 |
-
|
365 |
-
/**
|
366 |
-
* @return bool
|
367 |
-
*/
|
368 |
-
public function getPtgDepth() {
|
369 |
-
return $this->getOpt( 'ptg_depth' );
|
370 |
-
}
|
371 |
-
|
372 |
-
/**
|
373 |
-
* @return int
|
374 |
-
*/
|
375 |
-
public function getPtgLastBuildAt() {
|
376 |
-
return $this->getOpt( 'ptg_last_build_at' );
|
377 |
-
}
|
378 |
-
|
379 |
-
/**
|
380 |
-
* @return string|false
|
381 |
-
*/
|
382 |
-
public function getPtgSnapsBaseDir() {
|
383 |
-
return $this->getCon()->getPluginCachePath( 'ptguard/' );
|
384 |
-
}
|
385 |
-
|
386 |
-
/**
|
387 |
-
* @return bool
|
388 |
-
*/
|
389 |
-
public function isPtgBuildRequired() {
|
390 |
-
return $this->isPtgEnabled() && ( $this->getPtgLastBuildAt() == 0 );
|
391 |
-
}
|
392 |
-
|
393 |
-
/**
|
394 |
-
* @param bool $bIsRequired
|
395 |
-
* @return $this
|
396 |
-
*/
|
397 |
-
public function setPtgRebuildSelfRequired( $bIsRequired ) {
|
398 |
-
return $this->setOpt( 'rebuild_self', (bool)$bIsRequired );
|
399 |
-
}
|
400 |
-
|
401 |
-
/**
|
402 |
-
* @param bool $bIsRequired
|
403 |
-
* @return $this
|
404 |
-
*/
|
405 |
-
public function setPtgUpdateStoreFormat( $bIsRequired ) {
|
406 |
-
return $this->setOpt( 'ptg_update_store_format', (bool)$bIsRequired );
|
407 |
-
}
|
408 |
-
|
409 |
-
/**
|
410 |
-
* @return bool
|
411 |
-
*/
|
412 |
-
public function isPtgRebuildSelfRequired() {
|
413 |
-
return $this->isOpt( 'rebuild_self', true );
|
414 |
-
}
|
415 |
-
|
416 |
-
/**
|
417 |
-
* @return bool
|
418 |
-
*/
|
419 |
-
public function isPtgUpdateStoreFormat() {
|
420 |
-
return $this->isOpt( 'ptg_update_store_format', true );
|
421 |
}
|
422 |
|
423 |
/**
|
424 |
* @return bool
|
425 |
*/
|
426 |
public function isPtgEnabled() {
|
427 |
-
return $this->
|
|
|
428 |
&& $this->getOptions()->isOptReqsMet( 'ptg_enable' )
|
429 |
&& $this->canPtgWriteToDisk();
|
430 |
}
|
431 |
|
432 |
/**
|
|
|
433 |
* @return bool
|
434 |
*/
|
435 |
-
|
436 |
-
return $this->
|
437 |
-
|
438 |
-
|
439 |
-
/**
|
440 |
-
* @return bool
|
441 |
-
*/
|
442 |
-
public function isPtgReinstallLinks() {
|
443 |
-
return $this->isPtgEnabled() && $this->isOpt( 'ptg_reinstall_links', 'Y' );
|
444 |
-
}
|
445 |
-
|
446 |
-
/**
|
447 |
-
* @param int $nTime
|
448 |
-
* @return $this
|
449 |
-
*/
|
450 |
-
public function setPtgLastBuildAt( $nTime = null ) {
|
451 |
-
return $this->setOpt( 'ptg_last_build_at', is_null( $nTime ) ? Services::Request()->ts() : $nTime );
|
452 |
-
}
|
453 |
-
|
454 |
-
/**
|
455 |
-
* @return bool
|
456 |
-
*/
|
457 |
-
public function isApcEnabled() {
|
458 |
-
return !$this->isOpt( 'enabled_scan_apc', 'disabled' );
|
459 |
}
|
460 |
|
461 |
/**
|
@@ -468,7 +332,10 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
468 |
public function insertCustomJsVars_Admin() {
|
469 |
parent::insertCustomJsVars_Admin();
|
470 |
|
471 |
-
|
|
|
|
|
|
|
472 |
wp_localize_script(
|
473 |
$this->prefix( 'global-plugin' ),
|
474 |
'icwp_wpsf_vars_hp',
|
@@ -565,6 +432,13 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
565 |
return $aWarnings;
|
566 |
}
|
567 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
568 |
/**
|
569 |
* temporary
|
570 |
* @return bool
|
@@ -734,8 +608,6 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
734 |
* @return array
|
735 |
*/
|
736 |
public function addInsightsNoticeData( $aAllNotices ) {
|
737 |
-
/** @var Shield\Modules\HackGuard\Options $oOpts */
|
738 |
-
$oOpts = $this->getOptions();
|
739 |
/** @var HackGuard\Strings $oStrings */
|
740 |
$oStrings = $this->getStrings();
|
741 |
$aScanNames = $oStrings->getScanNames();
|
@@ -746,7 +618,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
746 |
];
|
747 |
|
748 |
{// Core files
|
749 |
-
if ( !$this->
|
750 |
$aNotices[ 'messages' ][ 'wcf' ] = [
|
751 |
'title' => $aScanNames[ 'wcf' ],
|
752 |
'message' => __( 'Core File scanner is not enabled.', 'wp-simple-firewall' ),
|
@@ -755,7 +627,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
755 |
'rec' => __( 'Automatic WordPress Core File scanner should be turned-on.', 'wp-simple-firewall' )
|
756 |
];
|
757 |
}
|
758 |
-
|
759 |
$aNotices[ 'messages' ][ 'wcf' ] = [
|
760 |
'title' => $aScanNames[ 'wcf' ],
|
761 |
'message' => __( 'Modified WordPress core files found.', 'wp-simple-firewall' ),
|
@@ -767,7 +639,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
767 |
}
|
768 |
|
769 |
{// Unrecognised
|
770 |
-
if ( !$this->
|
771 |
$aNotices[ 'messages' ][ 'ufc' ] = [
|
772 |
'title' => $aScanNames[ 'ufc' ],
|
773 |
'message' => __( 'Unrecognised File scanner is not enabled.', 'wp-simple-firewall' ),
|
@@ -776,7 +648,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
776 |
'rec' => __( 'Automatic scanning for non-WordPress core files is recommended.', 'wp-simple-firewall' )
|
777 |
];
|
778 |
}
|
779 |
-
|
780 |
$aNotices[ 'messages' ][ 'ufc' ] = [
|
781 |
'title' => $aScanNames[ 'ufc' ],
|
782 |
'message' => __( 'Unrecognised files found in WordPress Core directory.', 'wp-simple-firewall' ),
|
@@ -788,7 +660,8 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
788 |
}
|
789 |
|
790 |
{// Plugin/Theme Guard
|
791 |
-
|
|
|
792 |
$aNotices[ 'messages' ][ 'ptg' ] = [
|
793 |
'title' => $aScanNames[ 'ptg' ],
|
794 |
'message' => __( 'Automatic Plugin/Themes Guard is not enabled.', 'wp-simple-firewall' ),
|
@@ -797,7 +670,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
797 |
'rec' => __( 'Automatic detection of plugin/theme modifications is recommended.', 'wp-simple-firewall' )
|
798 |
];
|
799 |
}
|
800 |
-
|
801 |
$aNotices[ 'messages' ][ 'ptg' ] = [
|
802 |
'title' => $aScanNames[ 'ptg' ],
|
803 |
'message' => __( 'A plugin/theme was found to have been modified.', 'wp-simple-firewall' ),
|
@@ -809,7 +682,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
809 |
}
|
810 |
|
811 |
{// Vulnerability Scanner
|
812 |
-
if ( !$this->
|
813 |
$aNotices[ 'messages' ][ 'wpv' ] = [
|
814 |
'title' => $aScanNames[ 'wpv' ],
|
815 |
'message' => __( 'Vulnerability Scanner is not enabled.', 'wp-simple-firewall' ),
|
@@ -818,7 +691,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
818 |
'rec' => __( 'Automatic detection of vulnerabilities is recommended.', 'wp-simple-firewall' )
|
819 |
];
|
820 |
}
|
821 |
-
|
822 |
$aNotices[ 'messages' ][ 'wpv' ] = [
|
823 |
'title' => $aScanNames[ 'wpv' ],
|
824 |
'message' => __( 'At least 1 item has known vulnerabilities.', 'wp-simple-firewall' ),
|
@@ -830,7 +703,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
830 |
}
|
831 |
|
832 |
{// Abandoned Plugins
|
833 |
-
if ( !$this->
|
834 |
$aNotices[ 'messages' ][ 'apc' ] = [
|
835 |
'title' => $aScanNames[ 'apc' ],
|
836 |
'message' => __( 'Abandoned Plugins Scanner is not enabled.', 'wp-simple-firewall' ),
|
@@ -839,7 +712,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
839 |
'rec' => __( 'Automatic detection of abandoned plugins is recommended.', 'wp-simple-firewall' )
|
840 |
];
|
841 |
}
|
842 |
-
|
843 |
$aNotices[ 'messages' ][ 'apc' ] = [
|
844 |
'title' => $aScanNames[ 'apc' ],
|
845 |
'message' => __( 'At least 1 plugin on your site is abandoned.', 'wp-simple-firewall' ),
|
@@ -851,7 +724,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
851 |
}
|
852 |
|
853 |
{// Malware
|
854 |
-
if ( !$
|
855 |
$aNotices[ 'messages' ][ 'mal' ] = [
|
856 |
'title' => $aScanNames[ 'mal' ],
|
857 |
'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
|
@@ -860,7 +733,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
860 |
'rec' => __( 'Automatic detection of Malware is recommended.', 'wp-simple-firewall' )
|
861 |
];
|
862 |
}
|
863 |
-
|
864 |
$aNotices[ 'messages' ][ 'mal' ] = [
|
865 |
'title' => $aScanNames[ 'mal' ],
|
866 |
'message' => __( 'At least 1 file with potential Malware has been discovered.', 'wp-simple-firewall' ),
|
@@ -884,7 +757,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
884 |
public function addInsightsConfigData( $aAllData ) {
|
885 |
/** @var HackGuard\Strings $oStrings */
|
886 |
$oStrings = $this->getStrings();
|
887 |
-
/** @var HackGuard\Options $
|
888 |
$oOpts = $this->getOptions();
|
889 |
$aScanNames = $oStrings->getScanNames();
|
890 |
|
@@ -912,7 +785,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
912 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_options' ),
|
913 |
];
|
914 |
|
915 |
-
$bCore = $this->
|
916 |
$aThis[ 'key_opts' ][ 'wcf' ] = [
|
917 |
'name' => __( 'WP Core File Scan', 'wp-simple-firewall' ),
|
918 |
'enabled' => $bCore,
|
@@ -956,7 +829,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
956 |
];
|
957 |
}
|
958 |
|
959 |
-
$bWpv = $
|
960 |
$aThis[ 'key_opts' ][ 'wpv' ] = [
|
961 |
'name' => __( 'Vulnerability Scan', 'wp-simple-firewall' ),
|
962 |
'enabled' => $bWpv,
|
@@ -966,11 +839,12 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
966 |
'weight' => 2,
|
967 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_wpv' ),
|
968 |
];
|
969 |
-
|
|
|
970 |
$aThis[ 'key_opts' ][ 'wpv_repair' ] = [
|
971 |
'name' => __( 'Auto Update', 'wp-simple-firewall' ),
|
972 |
-
'enabled' => $
|
973 |
-
'summary' => $
|
974 |
__( 'Vulnerable items are automatically updated', 'wp-simple-firewall' )
|
975 |
: __( "Vulnerable items aren't automatically updated!", 'wp-simple-firewall' ),
|
976 |
'weight' => 1,
|
@@ -978,7 +852,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
978 |
];
|
979 |
}
|
980 |
|
981 |
-
$bPtg = $this->
|
982 |
$aThis[ 'key_opts' ][ 'ptg' ] = [
|
983 |
'title' => $aScanNames[ 'ptg' ],
|
984 |
'name' => __( 'Plugin/Theme Guard', 'wp-simple-firewall' ),
|
@@ -990,7 +864,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
990 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
|
991 |
];
|
992 |
|
993 |
-
$bMal = $
|
994 |
$aThis[ 'key_opts' ][ 'mal' ] = [
|
995 |
'title' => $aScanNames[ 'mal' ],
|
996 |
'name' => $aScanNames[ 'mal' ],
|
@@ -1002,7 +876,7 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
1002 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_mal' ),
|
1003 |
];
|
1004 |
|
1005 |
-
$bApc = $this->
|
1006 |
$aThis[ 'key_opts' ][ 'apc' ] = [
|
1007 |
'title' => $aScanNames[ 'apc' ],
|
1008 |
'name' => $aScanNames[ 'apc' ],
|
@@ -1055,52 +929,197 @@ class ICWP_WPSF_FeatureHandler_HackProtect extends ICWP_WPSF_FeatureHandler_Base
|
|
1055 |
&& parent::isReadyToExecute();
|
1056 |
}
|
1057 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1058 |
/**
|
1059 |
* @return bool
|
1060 |
-
* @deprecated 8.
|
1061 |
*/
|
1062 |
-
public function
|
1063 |
-
|
|
|
|
|
1064 |
}
|
1065 |
|
1066 |
/**
|
1067 |
* @return bool
|
1068 |
-
* @deprecated 8.
|
1069 |
*/
|
1070 |
-
public function
|
1071 |
-
|
|
|
|
|
1072 |
}
|
1073 |
|
1074 |
/**
|
1075 |
* @return bool
|
1076 |
-
* @deprecated 8.
|
1077 |
*/
|
1078 |
-
public function
|
1079 |
/** @var HackGuard\Options $oOpts */
|
1080 |
$oOpts = $this->getOptions();
|
1081 |
-
return $oOpts->
|
1082 |
}
|
1083 |
|
1084 |
/**
|
1085 |
* @return bool
|
1086 |
-
* @deprecated 8.
|
1087 |
*/
|
1088 |
-
public function
|
1089 |
-
return $this->isOpt( '
|
1090 |
}
|
1091 |
|
1092 |
/**
|
1093 |
* @return bool
|
1094 |
-
* @deprecated 8.
|
1095 |
*/
|
1096 |
-
public function
|
1097 |
-
|
|
|
|
|
1098 |
}
|
1099 |
|
1100 |
/**
|
1101 |
* @return string
|
|
|
1102 |
*/
|
1103 |
-
|
1104 |
-
return '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1105 |
}
|
1106 |
}
|
11 |
*/
|
12 |
private $oScanQueueController;
|
13 |
|
14 |
+
/**
|
15 |
+
* @var HackGuard\Scan\Controller\Base[]
|
16 |
+
*/
|
17 |
+
private $aScanCons;
|
18 |
+
|
19 |
protected function doPostConstruction() {
|
20 |
parent::doPostConstruction();
|
21 |
$this->setCustomCronSchedules();
|
29 |
$this->getScanController();
|
30 |
}
|
31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
/**
|
33 |
* @return HackGuard\Scan\Queue\Controller
|
34 |
*/
|
40 |
return $this->oScanQueueController;
|
41 |
}
|
42 |
|
43 |
+
/**
|
44 |
+
* @param string $sSlug
|
45 |
+
* @return HackGuard\Scan\Controller\Base|mixed
|
46 |
+
*/
|
47 |
+
public function getScanCon( $sSlug ) {
|
48 |
+
if ( !is_array( $this->aScanCons ) ) {
|
49 |
+
$this->aScanCons = [];
|
50 |
+
}
|
51 |
+
if ( !isset( $this->aScanCons[ $sSlug ] ) ) {
|
52 |
+
$sClass = '\FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Scan\Controller\\'.ucwords( $sSlug );
|
53 |
+
if ( @class_exists( $sClass ) ) {
|
54 |
+
/** @var HackGuard\Scan\Controller\Base $oObj */
|
55 |
+
$oObj = new $sClass();
|
56 |
+
$this->aScanCons[ $sSlug ] = $oObj->setMod( $this );
|
57 |
+
}
|
58 |
+
else {
|
59 |
+
$this->aScanCons[ $sSlug ] = false;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
return $this->aScanCons[ $sSlug ];
|
63 |
+
}
|
64 |
+
|
65 |
/**
|
66 |
*/
|
67 |
public function handleModRequest() {
|
68 |
$oReq = Services::Request();
|
69 |
+
if ( $this->getCon()->isPluginAdmin() ) {
|
70 |
+
switch ( $oReq->query( 'exec' ) ) {
|
71 |
+
case 'scan_file_download':
|
72 |
+
( new Shield\Modules\HackGuard\Lib\Utility\FileDownloadHandler() )
|
73 |
+
->setDbHandler( $this->getDbHandler_ScanResults() )
|
74 |
+
->downloadByItemId( (int)$oReq->query( 'rid', 0 ) );
|
75 |
+
break;
|
76 |
+
default:
|
77 |
+
break;
|
78 |
+
}
|
79 |
}
|
80 |
}
|
81 |
|
96 |
$this->cleanFileExclusions();
|
97 |
$this->cleanPtgFileExtensions();
|
98 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
$this->setOpt( 'ptg_candiskwrite_at', 0 );
|
100 |
$this->resetRtBackupFiles();
|
101 |
+
|
102 |
+
/** @var ICWP_WPSF_Processor_HackProtect $oPro */
|
103 |
+
$oPro = $this->getProcessor();
|
104 |
+
$oPro->getSubProScanner()->deleteCron(); // very important if the scan cron schedule is changed.
|
105 |
}
|
106 |
|
107 |
/**
|
142 |
/**
|
143 |
* @param string $sScan ptg, wcf, ufc, wpv
|
144 |
* @return bool
|
145 |
+
* @deprecated 8.5.5
|
146 |
*/
|
147 |
public function getScanHasProblem( $sScan ) {
|
148 |
+
return $this->getScanCon( $sScan )->getScanHasProblem();
|
|
|
|
|
|
|
|
|
149 |
}
|
150 |
|
151 |
/**
|
166 |
* @return $this
|
167 |
*/
|
168 |
protected function setCustomCronSchedules() {
|
169 |
+
/** @var HackGuard\Options $oOpts */
|
170 |
$oOpts = $this->getOptions();
|
171 |
$nFreq = $oOpts->getScanFrequency();
|
172 |
+
Services::WpCron()
|
173 |
+
->addNewSchedule(
|
174 |
+
$this->prefix( sprintf( 'per-day-%s', $nFreq ) ),
|
175 |
+
[
|
176 |
+
'interval' => DAY_IN_SECONDS/$nFreq,
|
177 |
+
'display' => sprintf( __( '%s per day', 'wp-simple-firewall' ), $nFreq )
|
178 |
+
]
|
179 |
+
);
|
180 |
return $this;
|
181 |
}
|
182 |
|
209 |
return $this->setOpt( 'snapshot_users', $aUsers );
|
210 |
}
|
211 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
212 |
/**
|
213 |
* @return array
|
214 |
*/
|
232 |
if ( preg_match( '/^#(.+)#$/', $sExclusion, $aMatches ) ) { // it's regex
|
233 |
// ignore it
|
234 |
}
|
235 |
+
elseif ( strpos( $sExclusion, '/' ) === false ) { // filename only
|
236 |
$sExclusion = trim( preg_replace( '#[^.0-9a-z_-]#i', '', $sExclusion ) );
|
237 |
}
|
238 |
|
247 |
/**
|
248 |
* @return string
|
249 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
250 |
public function getWpvulnPluginsHighlightOption() {
|
251 |
+
/** @var HackGuard\Options $oOpts */
|
252 |
+
$oOpts = $this->getOptions();
|
253 |
+
return $oOpts->isWpvulnEnabled() ? $oOpts->getOpt( 'wpvuln_scan_display' ) : 'disabled';
|
254 |
}
|
255 |
|
256 |
/**
|
294 |
* @return $this
|
295 |
*/
|
296 |
protected function cleanPtgFileExtensions() {
|
297 |
+
/** @var HackGuard\Options $oOpts */
|
298 |
+
$oOpts = $this->getOptions();
|
299 |
+
$oOpts->setOpt(
|
300 |
'ptg_extensions',
|
301 |
+
$this->cleanStringArray( $oOpts->getPtgFileExtensions(), '#[^a-z0-9_-]#i' )
|
302 |
);
|
303 |
+
return $this;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
304 |
}
|
305 |
|
306 |
/**
|
307 |
* @return bool
|
308 |
*/
|
309 |
public function isPtgEnabled() {
|
310 |
+
return $this->isModuleEnabled() && $this->isPremium()
|
311 |
+
&& $this->isOpt( 'ptg_enable', 'enabled' )
|
312 |
&& $this->getOptions()->isOptReqsMet( 'ptg_enable' )
|
313 |
&& $this->canPtgWriteToDisk();
|
314 |
}
|
315 |
|
316 |
/**
|
317 |
+
* @param string $sSlug
|
318 |
* @return bool
|
319 |
*/
|
320 |
+
protected function isScanEnabled( $sSlug ) {
|
321 |
+
return $this->getScanCon( $sSlug )
|
322 |
+
->isEnabled();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
}
|
324 |
|
325 |
/**
|
332 |
public function insertCustomJsVars_Admin() {
|
333 |
parent::insertCustomJsVars_Admin();
|
334 |
|
335 |
+
/** @var HackGuard\Options $oOpts */
|
336 |
+
$oOpts = $this->getOptions();
|
337 |
+
if ( Services::WpPost()->isCurrentPage( 'plugins.php' )
|
338 |
+
&& $oOpts->isPtgReinstallLinks() && $this->getScanCon( 'ptg' )->isReady() ) {
|
339 |
wp_localize_script(
|
340 |
$this->prefix( 'global-plugin' ),
|
341 |
'icwp_wpsf_vars_hp',
|
432 |
return $aWarnings;
|
433 |
}
|
434 |
|
435 |
+
/**
|
436 |
+
* @return string|false
|
437 |
+
*/
|
438 |
+
public function getPtgSnapsBaseDir() {
|
439 |
+
return $this->getCon()->getPluginCachePath( 'ptguard/' );
|
440 |
+
}
|
441 |
+
|
442 |
/**
|
443 |
* temporary
|
444 |
* @return bool
|
608 |
* @return array
|
609 |
*/
|
610 |
public function addInsightsNoticeData( $aAllNotices ) {
|
|
|
|
|
611 |
/** @var HackGuard\Strings $oStrings */
|
612 |
$oStrings = $this->getStrings();
|
613 |
$aScanNames = $oStrings->getScanNames();
|
618 |
];
|
619 |
|
620 |
{// Core files
|
621 |
+
if ( !$this->isScanEnabled( 'wcf' ) ) {
|
622 |
$aNotices[ 'messages' ][ 'wcf' ] = [
|
623 |
'title' => $aScanNames[ 'wcf' ],
|
624 |
'message' => __( 'Core File scanner is not enabled.', 'wp-simple-firewall' ),
|
627 |
'rec' => __( 'Automatic WordPress Core File scanner should be turned-on.', 'wp-simple-firewall' )
|
628 |
];
|
629 |
}
|
630 |
+
elseif ( $this->getScanHasProblem( 'wcf' ) ) {
|
631 |
$aNotices[ 'messages' ][ 'wcf' ] = [
|
632 |
'title' => $aScanNames[ 'wcf' ],
|
633 |
'message' => __( 'Modified WordPress core files found.', 'wp-simple-firewall' ),
|
639 |
}
|
640 |
|
641 |
{// Unrecognised
|
642 |
+
if ( !$this->isScanEnabled( 'ufc' ) ) {
|
643 |
$aNotices[ 'messages' ][ 'ufc' ] = [
|
644 |
'title' => $aScanNames[ 'ufc' ],
|
645 |
'message' => __( 'Unrecognised File scanner is not enabled.', 'wp-simple-firewall' ),
|
648 |
'rec' => __( 'Automatic scanning for non-WordPress core files is recommended.', 'wp-simple-firewall' )
|
649 |
];
|
650 |
}
|
651 |
+
elseif ( $this->getScanHasProblem( 'ufc' ) ) {
|
652 |
$aNotices[ 'messages' ][ 'ufc' ] = [
|
653 |
'title' => $aScanNames[ 'ufc' ],
|
654 |
'message' => __( 'Unrecognised files found in WordPress Core directory.', 'wp-simple-firewall' ),
|
660 |
}
|
661 |
|
662 |
{// Plugin/Theme Guard
|
663 |
+
$oPTG = $this->getScanCon( 'ptg' );
|
664 |
+
if ( !$oPTG->isEnabled() ) {
|
665 |
$aNotices[ 'messages' ][ 'ptg' ] = [
|
666 |
'title' => $aScanNames[ 'ptg' ],
|
667 |
'message' => __( 'Automatic Plugin/Themes Guard is not enabled.', 'wp-simple-firewall' ),
|
670 |
'rec' => __( 'Automatic detection of plugin/theme modifications is recommended.', 'wp-simple-firewall' )
|
671 |
];
|
672 |
}
|
673 |
+
elseif ( $oPTG->getScanHasProblem() ) {
|
674 |
$aNotices[ 'messages' ][ 'ptg' ] = [
|
675 |
'title' => $aScanNames[ 'ptg' ],
|
676 |
'message' => __( 'A plugin/theme was found to have been modified.', 'wp-simple-firewall' ),
|
682 |
}
|
683 |
|
684 |
{// Vulnerability Scanner
|
685 |
+
if ( !$this->isScanEnabled( 'wpv' ) ) {
|
686 |
$aNotices[ 'messages' ][ 'wpv' ] = [
|
687 |
'title' => $aScanNames[ 'wpv' ],
|
688 |
'message' => __( 'Vulnerability Scanner is not enabled.', 'wp-simple-firewall' ),
|
691 |
'rec' => __( 'Automatic detection of vulnerabilities is recommended.', 'wp-simple-firewall' )
|
692 |
];
|
693 |
}
|
694 |
+
elseif ( $this->getScanHasProblem( 'wpv' ) ) {
|
695 |
$aNotices[ 'messages' ][ 'wpv' ] = [
|
696 |
'title' => $aScanNames[ 'wpv' ],
|
697 |
'message' => __( 'At least 1 item has known vulnerabilities.', 'wp-simple-firewall' ),
|
703 |
}
|
704 |
|
705 |
{// Abandoned Plugins
|
706 |
+
if ( !$this->isScanEnabled( 'apc' ) ) {
|
707 |
$aNotices[ 'messages' ][ 'apc' ] = [
|
708 |
'title' => $aScanNames[ 'apc' ],
|
709 |
'message' => __( 'Abandoned Plugins Scanner is not enabled.', 'wp-simple-firewall' ),
|
712 |
'rec' => __( 'Automatic detection of abandoned plugins is recommended.', 'wp-simple-firewall' )
|
713 |
];
|
714 |
}
|
715 |
+
elseif ( $this->getScanHasProblem( 'apc' ) ) {
|
716 |
$aNotices[ 'messages' ][ 'apc' ] = [
|
717 |
'title' => $aScanNames[ 'apc' ],
|
718 |
'message' => __( 'At least 1 plugin on your site is abandoned.', 'wp-simple-firewall' ),
|
724 |
}
|
725 |
|
726 |
{// Malware
|
727 |
+
if ( !$this->isScanEnabled( 'mal' ) ) {
|
728 |
$aNotices[ 'messages' ][ 'mal' ] = [
|
729 |
'title' => $aScanNames[ 'mal' ],
|
730 |
'message' => sprintf( __( '%s Scanner is not enabled.' ), $aScanNames[ 'mal' ] ),
|
733 |
'rec' => __( 'Automatic detection of Malware is recommended.', 'wp-simple-firewall' )
|
734 |
];
|
735 |
}
|
736 |
+
elseif ( $this->getScanHasProblem( 'mal' ) ) {
|
737 |
$aNotices[ 'messages' ][ 'mal' ] = [
|
738 |
'title' => $aScanNames[ 'mal' ],
|
739 |
'message' => __( 'At least 1 file with potential Malware has been discovered.', 'wp-simple-firewall' ),
|
757 |
public function addInsightsConfigData( $aAllData ) {
|
758 |
/** @var HackGuard\Strings $oStrings */
|
759 |
$oStrings = $this->getStrings();
|
760 |
+
/** @var HackGuard\Options $oOpts */
|
761 |
$oOpts = $this->getOptions();
|
762 |
$aScanNames = $oStrings->getScanNames();
|
763 |
|
785 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_options' ),
|
786 |
];
|
787 |
|
788 |
+
$bCore = $this->isScanEnabled( 'wcf' );
|
789 |
$aThis[ 'key_opts' ][ 'wcf' ] = [
|
790 |
'name' => __( 'WP Core File Scan', 'wp-simple-firewall' ),
|
791 |
'enabled' => $bCore,
|
829 |
];
|
830 |
}
|
831 |
|
832 |
+
$bWpv = $oOpts->isWpvulnEnabled();
|
833 |
$aThis[ 'key_opts' ][ 'wpv' ] = [
|
834 |
'name' => __( 'Vulnerability Scan', 'wp-simple-firewall' ),
|
835 |
'enabled' => $bWpv,
|
839 |
'weight' => 2,
|
840 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_wpv' ),
|
841 |
];
|
842 |
+
$bWpvAutoUpdates = $oOpts->isWpvulnAutoupdatesEnabled();
|
843 |
+
if ( $bWpv && !$bWpvAutoUpdates ) {
|
844 |
$aThis[ 'key_opts' ][ 'wpv_repair' ] = [
|
845 |
'name' => __( 'Auto Update', 'wp-simple-firewall' ),
|
846 |
+
'enabled' => $bWpvAutoUpdates,
|
847 |
+
'summary' => $bWpvAutoUpdates ?
|
848 |
__( 'Vulnerable items are automatically updated', 'wp-simple-firewall' )
|
849 |
: __( "Vulnerable items aren't automatically updated!", 'wp-simple-firewall' ),
|
850 |
'weight' => 1,
|
852 |
];
|
853 |
}
|
854 |
|
855 |
+
$bPtg = $this->isScanEnabled( 'ptg' );
|
856 |
$aThis[ 'key_opts' ][ 'ptg' ] = [
|
857 |
'title' => $aScanNames[ 'ptg' ],
|
858 |
'name' => __( 'Plugin/Theme Guard', 'wp-simple-firewall' ),
|
864 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_ptg' ),
|
865 |
];
|
866 |
|
867 |
+
$bMal = $this->isScanEnabled( 'mal' );
|
868 |
$aThis[ 'key_opts' ][ 'mal' ] = [
|
869 |
'title' => $aScanNames[ 'mal' ],
|
870 |
'name' => $aScanNames[ 'mal' ],
|
876 |
'href' => $this->getUrl_DirectLinkToSection( 'section_scan_mal' ),
|
877 |
];
|
878 |
|
879 |
+
$bApc = $this->isScanEnabled( 'apc' );
|
880 |
$aThis[ 'key_opts' ][ 'apc' ] = [
|
881 |
'title' => $aScanNames[ 'apc' ],
|
882 |
'name' => $aScanNames[ 'apc' ],
|
929 |
&& parent::isReadyToExecute();
|
930 |
}
|
931 |
|
932 |
+
/**
|
933 |
+
* @return string
|
934 |
+
*/
|
935 |
+
protected function getNamespaceBase() {
|
936 |
+
return 'HackGuard';
|
937 |
+
}
|
938 |
+
|
939 |
+
/**
|
940 |
+
* @return bool
|
941 |
+
* @deprecated 8.5
|
942 |
+
*/
|
943 |
+
public function isPtgReadyToScan() {
|
944 |
+
return false;
|
945 |
+
}
|
946 |
+
|
947 |
+
/**
|
948 |
+
* @param int $nTime
|
949 |
+
* @return $this
|
950 |
+
* @deprecated 8.5
|
951 |
+
*/
|
952 |
+
public function setPtgLastBuildAt( $nTime = null ) {
|
953 |
+
return $this;
|
954 |
+
}
|
955 |
+
|
956 |
+
/**
|
957 |
+
* @return int
|
958 |
+
* @deprecated 8.5
|
959 |
+
*/
|
960 |
+
public function getPtgLastBuildAt() {
|
961 |
+
return $this->getOpt( 'ptg_last_build_at' );
|
962 |
+
}
|
963 |
+
|
964 |
+
/**
|
965 |
+
* @return bool
|
966 |
+
* @deprecated 8.5
|
967 |
+
*/
|
968 |
+
public function isPtgRebuildSelfRequired() {
|
969 |
+
return $this->isOpt( 'rebuild_self', true );
|
970 |
+
}
|
971 |
+
|
972 |
+
/**
|
973 |
+
* @param bool $bIsRequired
|
974 |
+
* @return $this
|
975 |
+
* @deprecated 8.5
|
976 |
+
*/
|
977 |
+
public function setPtgRebuildSelfRequired( $bIsRequired ) {
|
978 |
+
return $this->setOpt( 'rebuild_self', (bool)$bIsRequired );
|
979 |
+
}
|
980 |
+
|
981 |
+
/**
|
982 |
+
* @return bool
|
983 |
+
* @deprecated 8.5
|
984 |
+
*/
|
985 |
+
public function isPtgBuildRequired() {
|
986 |
+
return false;
|
987 |
+
}
|
988 |
+
|
989 |
+
/**
|
990 |
+
* @param bool $bIsRequired
|
991 |
+
* @return $this
|
992 |
+
* @deprecated 8.5
|
993 |
+
*/
|
994 |
+
public function setPtgUpdateStoreFormat( $bIsRequired ) {
|
995 |
+
return $this->setOpt( 'ptg_update_store_format', (bool)$bIsRequired );
|
996 |
+
}
|
997 |
+
|
998 |
+
/**
|
999 |
+
* @return bool
|
1000 |
+
* @deprecated 8.5
|
1001 |
+
*/
|
1002 |
+
public function getPtgDepth() {
|
1003 |
+
return 0;
|
1004 |
+
}
|
1005 |
+
|
1006 |
+
/**
|
1007 |
+
* @return bool
|
1008 |
+
* @deprecated 8.5
|
1009 |
+
*/
|
1010 |
+
public function isPtgUpdateStoreFormat() {
|
1011 |
+
return $this->isOpt( 'ptg_update_store_format', true );
|
1012 |
+
}
|
1013 |
+
|
1014 |
+
/**
|
1015 |
+
* @return string[]
|
1016 |
+
* @deprecated 8.5
|
1017 |
+
*/
|
1018 |
+
public function getPtgFileExtensions() {
|
1019 |
+
return $this->getOpt( 'ptg_extensions' );
|
1020 |
+
}
|
1021 |
+
|
1022 |
+
/**
|
1023 |
+
* @return bool
|
1024 |
+
* @deprecated 8.5
|
1025 |
+
*/
|
1026 |
+
public function isPtgReinstallLinks() {
|
1027 |
+
return $this->isOpt( 'ptg_reinstall_links', 'Y' );
|
1028 |
+
}
|
1029 |
+
|
1030 |
+
/**
|
1031 |
+
* @return string
|
1032 |
+
* @deprecated 8.5
|
1033 |
+
*/
|
1034 |
+
public function isUfcDeleteFiles() {
|
1035 |
+
/** @var HackGuard\Options $oOpts */
|
1036 |
+
$oOpts = $this->getOptions();
|
1037 |
+
return $oOpts->isUfcDeleteFiles();
|
1038 |
+
}
|
1039 |
+
|
1040 |
+
/**
|
1041 |
+
* @return bool
|
1042 |
+
* @deprecated 8.5
|
1043 |
+
*/
|
1044 |
+
public function isUfcEnabled() {
|
1045 |
+
/** @var HackGuard\Options $oOpts */
|
1046 |
+
$oOpts = $this->getOptions();
|
1047 |
+
return $oOpts->isUfcEnabled();
|
1048 |
+
}
|
1049 |
+
|
1050 |
+
/**
|
1051 |
+
* @return string
|
1052 |
+
* @deprecated 8.5
|
1053 |
+
*/
|
1054 |
+
public function isUfcSendReport() {
|
1055 |
+
/** @var HackGuard\Options $oOpts */
|
1056 |
+
$oOpts = $this->getOptions();
|
1057 |
+
return $oOpts->isUfcSendReport();
|
1058 |
+
}
|
1059 |
+
|
1060 |
/**
|
1061 |
* @return bool
|
1062 |
+
* @deprecated 8.5
|
1063 |
*/
|
1064 |
+
public function isApcEnabled() {
|
1065 |
+
/** @var HackGuard\Options $oOpts */
|
1066 |
+
$oOpts = $this->getOptions();
|
1067 |
+
return $oOpts->isApcEnabled();
|
1068 |
}
|
1069 |
|
1070 |
/**
|
1071 |
* @return bool
|
1072 |
+
* @deprecated 8.5
|
1073 |
*/
|
1074 |
+
public function isWcfScanEnabled() {
|
1075 |
+
/** @var HackGuard\Options $oOpts */
|
1076 |
+
$oOpts = $this->getOptions();
|
1077 |
+
return $oOpts->isWcfScanEnabled();
|
1078 |
}
|
1079 |
|
1080 |
/**
|
1081 |
* @return bool
|
1082 |
+
* @deprecated 8.5
|
1083 |
*/
|
1084 |
+
public function isWpvulnEnabled() {
|
1085 |
/** @var HackGuard\Options $oOpts */
|
1086 |
$oOpts = $this->getOptions();
|
1087 |
+
return $oOpts->isWpvulnEnabled();
|
1088 |
}
|
1089 |
|
1090 |
/**
|
1091 |
* @return bool
|
1092 |
+
* @deprecated 8.5
|
1093 |
*/
|
1094 |
+
public function isWpvulnSendEmail() {
|
1095 |
+
return $this->isWpvulnEnabled() && $this->isOpt( 'enable_wpvuln_scan', 'enabled_email' );
|
1096 |
}
|
1097 |
|
1098 |
/**
|
1099 |
* @return bool
|
1100 |
+
* @deprecated 8.5
|
1101 |
*/
|
1102 |
+
public function isWpvulnAutoupdatesEnabled() {
|
1103 |
+
/** @var HackGuard\Options $oOpts */
|
1104 |
+
$oOpts = $this->getOptions();
|
1105 |
+
return $oOpts->isWpvulnAutoupdatesEnabled();
|
1106 |
}
|
1107 |
|
1108 |
/**
|
1109 |
* @return string
|
1110 |
+
* @deprecated 8.5
|
1111 |
*/
|
1112 |
+
public function getUnrecognisedFileScannerOption() {
|
1113 |
+
return $this->getOpt( 'enable_unrecognised_file_cleaner_scan', 'disabled' );
|
1114 |
+
}
|
1115 |
+
|
1116 |
+
/**
|
1117 |
+
* @return bool
|
1118 |
+
* @deprecated 8.5
|
1119 |
+
*/
|
1120 |
+
public function isWcfScanAutoRepair() {
|
1121 |
+
/** @var HackGuard\Options $oOpts */
|
1122 |
+
$oOpts = $this->getOptions();
|
1123 |
+
return $oOpts->isWcfScanAutoRepair();
|
1124 |
}
|
1125 |
}
|
src/features/headers.php
CHANGED
@@ -1,127 +1,89 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
5 |
|
6 |
class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
7 |
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
public function isContentSecurityPolicyEnabled() {
|
12 |
-
return $this->isOpt( 'enable_x_content_security_policy', 'Y' );
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* @return bool
|
17 |
-
*/
|
18 |
-
public function isReferrerPolicyEnabled() {
|
19 |
-
return !$this->isOpt( 'x_referrer_policy', 'disabled' );
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* @return bool
|
24 |
-
*/
|
25 |
-
public function isEnabledXFrame() {
|
26 |
-
return in_array( $this->getOpt( 'x_frame' ), [ 'on_sameorigin', 'on_deny' ] );
|
27 |
-
}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @return bool
|
31 |
-
*/
|
32 |
-
public function isEnabledXssProtection() {
|
33 |
-
return $this->isOpt( 'x_xss_protect', 'Y' );
|
34 |
}
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
* @return string
|
47 |
-
*/
|
48 |
-
public function getReferrerPolicyValue() {
|
49 |
-
$sValue = $this->getOpt( 'x_referrer_policy' );
|
50 |
-
return in_array( $sValue, [ 'empty', 'disabled' ] ) ? '' : $sValue;
|
51 |
-
}
|
52 |
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
$aHosts = $this->getOpt( 'xcsp_hosts', [] );
|
58 |
-
if ( empty( $aHosts ) || !is_array( $aHosts ) ) {
|
59 |
-
$aHosts = [];
|
60 |
-
}
|
61 |
-
return $aHosts;
|
62 |
-
}
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
foreach ( $aDomains as $sDomain ) {
|
70 |
-
$bValidDomain = false;
|
71 |
-
$sDomain = trim( $sDomain );
|
72 |
-
|
73 |
-
$bHttps = ( strpos( $sDomain, 'https://' ) === 0 );
|
74 |
-
$bHttp = ( strpos( $sDomain, 'http://' ) === 0 );
|
75 |
-
if ( $bHttp || $bHttps ) {
|
76 |
-
$sDomain = preg_replace( '#^http(s)?://#', '', $sDomain );
|
77 |
-
}
|
78 |
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
}
|
85 |
-
else {
|
86 |
-
$bValidDomain = true;
|
87 |
-
}
|
88 |
}
|
89 |
-
else
|
90 |
-
|
91 |
-
$sCustomProtocol = $aMatches[ 1 ];
|
92 |
-
$sDomain = str_replace( $sCustomProtocol, '', $sDomain );
|
93 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
95 |
-
|
96 |
-
$bWildCard = ( strpos( $sDomain, '*.' ) === 0 );
|
97 |
if ( $bWildCard ) {
|
98 |
-
$sDomain =
|
99 |
}
|
100 |
-
|
101 |
-
|
102 |
-
$bValidDomain = true;
|
103 |
}
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
if ( $bHttp ) {
|
110 |
-
// $sDomain = 'http://'.$sDomain; // it seems there's no need to "explicitly" state http://
|
111 |
-
}
|
112 |
-
else if ( $bHttps ) {
|
113 |
-
$sDomain = 'https://'.$sDomain;
|
114 |
-
}
|
115 |
-
else if ( !empty( $sCustomProtocol ) ) {
|
116 |
-
$sDomain = $sCustomProtocol.$sDomain;
|
117 |
-
}
|
118 |
-
$aValidDomains[] = $sDomain;
|
119 |
}
|
|
|
120 |
}
|
121 |
-
asort( $aValidDomains );
|
122 |
-
$aValidDomains = array_unique( $aValidDomains );
|
123 |
-
$this->setOpt( 'xcsp_hosts', $aValidDomains );
|
124 |
}
|
|
|
|
|
125 |
}
|
126 |
|
127 |
/**
|
@@ -129,6 +91,9 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
129 |
* @return array
|
130 |
*/
|
131 |
public function addInsightsConfigData( $aAllData ) {
|
|
|
|
|
|
|
132 |
$aThis = [
|
133 |
'strings' => [
|
134 |
'title' => __( 'HTTP Security Headers', 'wp-simple-firewall' ),
|
@@ -142,8 +107,8 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
142 |
$aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
|
143 |
}
|
144 |
else {
|
145 |
-
$bAllEnabled = $
|
146 |
-
&& $
|
147 |
$aThis[ 'key_opts' ][ 'all' ] = [
|
148 |
'name' => __( 'HTTP Headers', 'wp-simple-firewall' ),
|
149 |
'enabled' => $bAllEnabled,
|
@@ -153,7 +118,7 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
153 |
'weight' => 2,
|
154 |
'href' => $this->getUrl_DirectLinkToSection( 'section_security_headers' ),
|
155 |
];
|
156 |
-
$bCsp = $
|
157 |
$aThis[ 'key_opts' ][ 'csp' ] = [
|
158 |
'name' => __( 'Content Security Policies', 'wp-simple-firewall' ),
|
159 |
'enabled' => $bCsp,
|
@@ -175,4 +140,67 @@ class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
175 |
protected function getNamespaceBase() {
|
176 |
return 'Headers';
|
177 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
178 |
}
|
1 |
<?php
|
2 |
|
3 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Headers;
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
5 |
|
6 |
class ICWP_WPSF_FeatureHandler_Headers extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
7 |
|
8 |
+
protected function doExtraSubmitProcessing() {
|
9 |
+
$this->cleanCspHosts();
|
10 |
+
$this->cleanCustomRules();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
}
|
12 |
|
13 |
+
private function cleanCustomRules() {
|
14 |
+
/** @var Headers\Options $oOpts */
|
15 |
+
$oOpts = $this->getOptions();
|
16 |
+
$oOpts->setOpt( 'xcsp_custom', array_unique( array_filter( array_map(
|
17 |
+
function ( $sRule ) {
|
18 |
+
$sRule = trim( preg_replace( '#;|\s{2,}#', '', html_entity_decode( $sRule, ENT_QUOTES ) ) );
|
19 |
+
if ( !empty( $sRule ) ) {
|
20 |
+
$sRule .= ';';
|
21 |
+
}
|
22 |
+
return $sRule;
|
23 |
+
},
|
24 |
+
$this->getOpt( 'xcsp_custom', [] )
|
25 |
+
) ) ) );
|
26 |
}
|
27 |
|
28 |
+
private function cleanCspHosts() {
|
29 |
+
/** @var Headers\Options $oOpts */
|
30 |
+
$oOpts = $this->getOptions();
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
+
$aValidDomains = [];
|
33 |
+
foreach ( $oOpts->getOpt( 'xcsp_hosts', [] ) as $sDomain ) {
|
34 |
+
$bValidDomain = false;
|
35 |
+
$sDomain = trim( $sDomain );
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
|
37 |
+
$bHttps = ( strpos( $sDomain, 'https://' ) === 0 );
|
38 |
+
$bHttp = ( strpos( $sDomain, 'http://' ) === 0 );
|
39 |
+
if ( $bHttp || $bHttps ) {
|
40 |
+
$sDomain = preg_replace( '#^http(s)?://#', '', $sDomain );
|
41 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
+
$sCustomProtocol = '';
|
44 |
+
// Special wildcard case
|
45 |
+
if ( $sDomain == '*' ) {
|
46 |
+
if ( $bHttps ) {
|
47 |
+
$this->setOpt( 'xcsp_https', 'Y' );
|
|
|
|
|
|
|
|
|
48 |
}
|
49 |
+
else {
|
50 |
+
$bValidDomain = true;
|
|
|
|
|
51 |
}
|
52 |
+
}
|
53 |
+
elseif ( strpos( $sDomain, '://' ) && preg_match( '#^([a-zA-Z]+://)#', $sDomain, $aMatches ) ) {
|
54 |
+
// there's a protocol specified
|
55 |
+
$sCustomProtocol = $aMatches[ 1 ];
|
56 |
+
$sDomain = str_replace( $sCustomProtocol, '', $sDomain );
|
57 |
+
}
|
58 |
+
|
59 |
+
// First we remove the wildcard and test domain, then add it back later.
|
60 |
+
$bWildCard = ( strpos( $sDomain, '*.' ) === 0 );
|
61 |
+
if ( $bWildCard ) {
|
62 |
+
$sDomain = preg_replace( '#^\*\.#', '', $sDomain );
|
63 |
+
}
|
64 |
+
|
65 |
+
if ( !empty ( $sDomain ) && Services::Data()->isValidDomainName( $sDomain ) ) {
|
66 |
+
$bValidDomain = true;
|
67 |
+
}
|
68 |
|
69 |
+
if ( $bValidDomain ) {
|
|
|
70 |
if ( $bWildCard ) {
|
71 |
+
$sDomain = '*.'.$sDomain;
|
72 |
}
|
73 |
+
if ( $bHttp ) {
|
74 |
+
// $sDomain = 'http://'.$sDomain; // it seems there's no need to "explicitly" state http://
|
|
|
75 |
}
|
76 |
+
elseif ( $bHttps ) {
|
77 |
+
$sDomain = 'https://'.$sDomain;
|
78 |
+
}
|
79 |
+
elseif ( !empty( $sCustomProtocol ) ) {
|
80 |
+
$sDomain = $sCustomProtocol.$sDomain;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
}
|
82 |
+
$aValidDomains[] = $sDomain;
|
83 |
}
|
|
|
|
|
|
|
84 |
}
|
85 |
+
asort( $aValidDomains );
|
86 |
+
$oOpts->setOpt( 'xcsp_hosts', array_unique( $aValidDomains ) );
|
87 |
}
|
88 |
|
89 |
/**
|
91 |
* @return array
|
92 |
*/
|
93 |
public function addInsightsConfigData( $aAllData ) {
|
94 |
+
/** @var Headers\Options $oOpts */
|
95 |
+
$oOpts = $this->getOptions();
|
96 |
+
|
97 |
$aThis = [
|
98 |
'strings' => [
|
99 |
'title' => __( 'HTTP Security Headers', 'wp-simple-firewall' ),
|
107 |
$aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
|
108 |
}
|
109 |
else {
|
110 |
+
$bAllEnabled = $oOpts->isEnabledXFrame() && $oOpts->isEnabledXssProtection()
|
111 |
+
&& $oOpts->isEnabledContentTypeHeader() && $oOpts->isReferrerPolicyEnabled();
|
112 |
$aThis[ 'key_opts' ][ 'all' ] = [
|
113 |
'name' => __( 'HTTP Headers', 'wp-simple-firewall' ),
|
114 |
'enabled' => $bAllEnabled,
|
118 |
'weight' => 2,
|
119 |
'href' => $this->getUrl_DirectLinkToSection( 'section_security_headers' ),
|
120 |
];
|
121 |
+
$bCsp = $oOpts->isEnabledContentSecurityPolicy();
|
122 |
$aThis[ 'key_opts' ][ 'csp' ] = [
|
123 |
'name' => __( 'Content Security Policies', 'wp-simple-firewall' ),
|
124 |
'enabled' => $bCsp,
|
140 |
protected function getNamespaceBase() {
|
141 |
return 'Headers';
|
142 |
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* @return bool
|
146 |
+
* @deprecated 8.5
|
147 |
+
*/
|
148 |
+
public function isContentSecurityPolicyEnabled() {
|
149 |
+
return $this->isOpt( 'enable_x_content_security_policy', 'Y' );
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* @return bool
|
154 |
+
* @deprecated 8.5
|
155 |
+
*/
|
156 |
+
public function isReferrerPolicyEnabled() {
|
157 |
+
return !$this->isOpt( 'x_referrer_policy', 'disabled' );
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* @return bool
|
162 |
+
* @deprecated 8.5
|
163 |
+
*/
|
164 |
+
public function isEnabledXFrame() {
|
165 |
+
return in_array( $this->getOpt( 'x_frame' ), [ 'on_sameorigin', 'on_deny' ] );
|
166 |
+
}
|
167 |
+
|
168 |
+
/**
|
169 |
+
* @return bool
|
170 |
+
* @deprecated 8.5
|
171 |
+
*/
|
172 |
+
public function isEnabledXssProtection() {
|
173 |
+
return $this->isOpt( 'x_xss_protect', 'Y' );
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* @return bool
|
178 |
+
* @deprecated 8.5
|
179 |
+
*/
|
180 |
+
public function isEnabledContentTypeHeader() {
|
181 |
+
return $this->isOpt( 'x_content_type', 'Y' );
|
182 |
+
}
|
183 |
+
|
184 |
+
/**
|
185 |
+
* Using this function without first checking isReferrerPolicyEnabled() will result in empty
|
186 |
+
* referrer policy header in the case of "disabled"
|
187 |
+
* @return string
|
188 |
+
* @deprecated 8.5
|
189 |
+
*/
|
190 |
+
public function getReferrerPolicyValue() {
|
191 |
+
$sValue = $this->getOpt( 'x_referrer_policy' );
|
192 |
+
return in_array( $sValue, [ 'empty', 'disabled' ] ) ? '' : $sValue;
|
193 |
+
}
|
194 |
+
|
195 |
+
/**
|
196 |
+
* @return array
|
197 |
+
* @deprecated 8.5
|
198 |
+
*/
|
199 |
+
public function getCspHosts() {
|
200 |
+
$aHosts = $this->getOpt( 'xcsp_hosts', [] );
|
201 |
+
if ( empty( $aHosts ) || !is_array( $aHosts ) ) {
|
202 |
+
$aHosts = [];
|
203 |
+
}
|
204 |
+
return $aHosts;
|
205 |
+
}
|
206 |
}
|
src/features/insights.php
CHANGED
@@ -7,10 +7,13 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
7 |
|
8 |
protected function doPostConstruction() {
|
9 |
parent::doPostConstruction();
|
10 |
-
$
|
11 |
-
|
12 |
-
|
13 |
-
|
|
|
|
|
|
|
14 |
Services::Response()->redirect( $this->getUrl_AdminPage() );
|
15 |
}
|
16 |
}
|
@@ -60,7 +63,13 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
60 |
$oProHp = $oCon->getModule( 'hack_protect' )->getProcessor();
|
61 |
/** @var ICWP_WPSF_FeatureHandler_License $oModLicense */
|
62 |
$oModLicense = $oCon->getModule( 'license' );
|
|
|
63 |
$oModPlugin = $oCon->getModule_Plugin();
|
|
|
|
|
|
|
|
|
|
|
64 |
/** @var ICWP_WPSF_Processor_Plugin $oProPlugin */
|
65 |
$oProPlugin = $oModPlugin->getProcessor();
|
66 |
$oEvtsMod = $oCon->getModule_Events();
|
@@ -125,11 +134,20 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
125 |
'summary_blacklist' => sprintf( __( 'IP addresses that have tripped %s defenses.', 'wp-simple-firewall' ), $nPluginName ),
|
126 |
'enter_ip_block' => __( 'Enter IP address to block', 'wp-simple-firewall' ),
|
127 |
'enter_ip_white' => __( 'Enter IP address to whitelist', 'wp-simple-firewall' ),
|
|
|
128 |
'label_for_ip' => __( 'Label for IP', 'wp-simple-firewall' ),
|
129 |
'ip_new' => __( 'New IP', 'wp-simple-firewall' ),
|
|
|
130 |
'ip_block' => __( 'Block IP', 'wp-simple-firewall' ),
|
131 |
],
|
132 |
-
'vars' => [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
];
|
134 |
break;
|
135 |
|
@@ -137,6 +155,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
137 |
$aData = [
|
138 |
'ajax' => [
|
139 |
'render_table_adminnotes' => $oModPlugin->getAjaxActionData( 'render_table_adminnotes', true ),
|
|
|
140 |
'item_delete' => $oModPlugin->getAjaxActionData( 'note_delete', true ),
|
141 |
'item_insert' => $oModPlugin->getAjaxActionData( 'note_insert', true ),
|
142 |
'bulk_action' => $oModPlugin->getAjaxActionData( 'bulk_action', true ),
|
@@ -309,6 +328,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
309 |
$sName = [
|
310 |
'href' => add_query_arg( [ 'inav' => $sKey ], $this->getUrl_AdminPage() ),
|
311 |
'name' => $sName,
|
|
|
312 |
'active' => $sKey === $sNavSection,
|
313 |
'subnavs' => []
|
314 |
];
|
@@ -344,6 +364,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
344 |
'flags' => [
|
345 |
'show_promo' => !$bIsPro && ( $sNavSection != 'settings' ),
|
346 |
'show_guided_tour' => $oModPlugin->getIfShowIntroVideo(),
|
|
|
|
|
|
|
347 |
],
|
348 |
'hrefs' => [
|
349 |
'go_pro' => 'https://shsec.io/shieldgoprofeature',
|
@@ -370,6 +393,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
370 |
$oCon = $this->getCon();
|
371 |
$aStdDepsJs = [ $this->prefix( 'plugin' ) ];
|
372 |
$sNav = Services::Request()->query( 'inav', 'overview' );
|
|
|
|
|
|
|
373 |
switch ( $sNav ) {
|
374 |
|
375 |
case 'importexport':
|
@@ -390,7 +416,11 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
390 |
case 'reports':
|
391 |
|
392 |
$aDeps = $aStdDepsJs;
|
|
|
393 |
$aJsAssets = [ 'chartist.min', 'chartist-plugin-legend', 'charts' ];
|
|
|
|
|
|
|
394 |
foreach ( $aJsAssets as $sAsset ) {
|
395 |
$sUnique = $oCon->prefix( $sAsset );
|
396 |
wp_register_script(
|
@@ -406,6 +436,9 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
406 |
|
407 |
$aDeps = [];
|
408 |
$aCssAssets = [ 'chartist.min', 'chartist-plugin-legend' ];
|
|
|
|
|
|
|
409 |
foreach ( $aCssAssets as $sAsset ) {
|
410 |
$sUnique = $oCon->prefix( $sAsset );
|
411 |
wp_register_style(
|
@@ -781,11 +814,11 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
781 |
|
782 |
$aStatsData = [
|
783 |
'login' => [
|
784 |
-
'id'
|
785 |
-
'title'
|
786 |
-
'val'
|
787 |
$oSelEvents->clearWheres()->sumEvent( 'login_block' ) ),
|
788 |
-
'tooltip_p'
|
789 |
],
|
790 |
// 'firewall' => [
|
791 |
// 'id' => 'firewall_block',
|
@@ -794,48 +827,43 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
794 |
// 'tooltip' => __( 'Total requests blocked by firewall rules.', 'wp-simple-firewall' )
|
795 |
// ],
|
796 |
'bot_blocks' => [
|
797 |
-
'id'
|
798 |
-
'title'
|
799 |
-
'val'
|
800 |
$oSelEvents->clearWheres()->sumEventsLike( 'bottrack_' ) ),
|
801 |
-
'tooltip_p'
|
802 |
],
|
803 |
'comments' => [
|
804 |
-
'id'
|
805 |
-
'title'
|
806 |
-
'val'
|
807 |
$oSelEvents->clearWheres()->sumEvents( [
|
808 |
'spam_block_bot',
|
809 |
'spam_block_human',
|
810 |
'spam_block_recaptcha'
|
811 |
] ) ),
|
812 |
-
'tooltip_p'
|
813 |
],
|
814 |
'transgressions' => [
|
815 |
-
'id'
|
816 |
-
'title'
|
817 |
-
'val'
|
818 |
$oSelEvents->clearWheres()->sumEvent( 'ip_offense' ) ),
|
819 |
-
'tooltip_p'
|
820 |
],
|
821 |
'conn_kills' => [
|
822 |
-
'id'
|
823 |
-
'title'
|
824 |
-
'val'
|
825 |
$oSelEvents->clearWheres()->sumEvent( 'conn_kill' ) ),
|
826 |
-
'tooltip_p'
|
827 |
],
|
828 |
'ip_blocked' => [
|
829 |
'id' => 'ip_blocked',
|
830 |
'title' => __( 'IP Blocked', 'wp-simple-firewall' ),
|
831 |
'val' => sprintf( '%s: %s', __( 'Now' ),
|
832 |
-
$oSelectIp
|
833 |
-
|
834 |
-
[
|
835 |
-
ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
|
836 |
-
ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
|
837 |
-
]
|
838 |
-
)->count() ),
|
839 |
'tooltip_p' => __( 'IP address exceeds offense limit and is blocked.', 'wp-simple-firewall' ),
|
840 |
],
|
841 |
];
|
@@ -855,12 +883,12 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
855 |
protected function getRecentEvents() {
|
856 |
$oCon = $this->getCon();
|
857 |
|
858 |
-
$
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
|
865 |
/** @var Shield\Modules\Insights\Strings $oStrs */
|
866 |
$oStrs = $this->getStrings();
|
@@ -871,7 +899,7 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
871 |
->getDbHandler_Events()
|
872 |
->getQuerySelector();
|
873 |
|
874 |
-
$
|
875 |
array_map(
|
876 |
function ( $oEntryVO ) use ( $aNames ) {
|
877 |
/** @var Shield\Databases\Events\EntryVO $oEntryVO */
|
@@ -882,20 +910,20 @@ class ICWP_WPSF_FeatureHandler_Insights extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
882 |
},
|
883 |
$oSel->getLatestForAllEvents()
|
884 |
),
|
885 |
-
$
|
886 |
);
|
887 |
|
888 |
$sNotYetRecorded = __( 'Not yet recorded', 'wp-simple-firewall' );
|
889 |
-
foreach ( array_keys( $
|
890 |
-
if ( !isset( $
|
891 |
-
$
|
892 |
'name' => isset( $aNames[ $sStatKey ] ) ? $aNames[ $sStatKey ] : '*** '.$sStatKey,
|
893 |
'val' => $sNotYetRecorded
|
894 |
];
|
895 |
}
|
896 |
}
|
897 |
|
898 |
-
return $
|
899 |
}
|
900 |
|
901 |
/**
|
7 |
|
8 |
protected function doPostConstruction() {
|
9 |
parent::doPostConstruction();
|
10 |
+
$this->maybeRedirectToAdmin();
|
11 |
+
}
|
12 |
+
|
13 |
+
private function maybeRedirectToAdmin() {
|
14 |
+
$oCon = $this->getCon();
|
15 |
+
$nActiveFor = $oCon->getModule_Plugin()->getActivateLength();
|
16 |
+
if ( !Services::WpGeneral()->isAjax() && is_admin() && !$oCon->isModulePage() && $nActiveFor < 4 ) {
|
17 |
Services::Response()->redirect( $this->getUrl_AdminPage() );
|
18 |
}
|
19 |
}
|
63 |
$oProHp = $oCon->getModule( 'hack_protect' )->getProcessor();
|
64 |
/** @var ICWP_WPSF_FeatureHandler_License $oModLicense */
|
65 |
$oModLicense = $oCon->getModule( 'license' );
|
66 |
+
|
67 |
$oModPlugin = $oCon->getModule_Plugin();
|
68 |
+
$oTourManager = $oModPlugin->getTourManager();
|
69 |
+
if ( !$oTourManager->isCompleted( 'insights_overview' ) && $oModPlugin->getActivateLength() > 600 ) {
|
70 |
+
$oTourManager->setCompleted( 'insights_overview' );
|
71 |
+
}
|
72 |
+
|
73 |
/** @var ICWP_WPSF_Processor_Plugin $oProPlugin */
|
74 |
$oProPlugin = $oModPlugin->getProcessor();
|
75 |
$oEvtsMod = $oCon->getModule_Events();
|
134 |
'summary_blacklist' => sprintf( __( 'IP addresses that have tripped %s defenses.', 'wp-simple-firewall' ), $nPluginName ),
|
135 |
'enter_ip_block' => __( 'Enter IP address to block', 'wp-simple-firewall' ),
|
136 |
'enter_ip_white' => __( 'Enter IP address to whitelist', 'wp-simple-firewall' ),
|
137 |
+
'enter_ip' => __( 'Enter IP address', 'wp-simple-firewall' ),
|
138 |
'label_for_ip' => __( 'Label for IP', 'wp-simple-firewall' ),
|
139 |
'ip_new' => __( 'New IP', 'wp-simple-firewall' ),
|
140 |
+
'ip_filter' => __( 'Filter By IP', 'wp-simple-firewall' ),
|
141 |
'ip_block' => __( 'Block IP', 'wp-simple-firewall' ),
|
142 |
],
|
143 |
+
'vars' => [
|
144 |
+
'unique_ips_black' => ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
|
145 |
+
->setDbHandler( $oIpMod->getDbHandler_IPs() )
|
146 |
+
->black(),
|
147 |
+
'unique_ips_white' => ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
|
148 |
+
->setDbHandler( $oIpMod->getDbHandler_IPs() )
|
149 |
+
->white()
|
150 |
+
],
|
151 |
];
|
152 |
break;
|
153 |
|
155 |
$aData = [
|
156 |
'ajax' => [
|
157 |
'render_table_adminnotes' => $oModPlugin->getAjaxActionData( 'render_table_adminnotes', true ),
|
158 |
+
'item_action_notes' => $oModPlugin->getAjaxActionData( 'item_action_notes', true ),
|
159 |
'item_delete' => $oModPlugin->getAjaxActionData( 'note_delete', true ),
|
160 |
'item_insert' => $oModPlugin->getAjaxActionData( 'note_insert', true ),
|
161 |
'bulk_action' => $oModPlugin->getAjaxActionData( 'bulk_action', true ),
|
328 |
$sName = [
|
329 |
'href' => add_query_arg( [ 'inav' => $sKey ], $this->getUrl_AdminPage() ),
|
330 |
'name' => $sName,
|
331 |
+
'slug' => $sKey,
|
332 |
'active' => $sKey === $sNavSection,
|
333 |
'subnavs' => []
|
334 |
];
|
364 |
'flags' => [
|
365 |
'show_promo' => !$bIsPro && ( $sNavSection != 'settings' ),
|
366 |
'show_guided_tour' => $oModPlugin->getIfShowIntroVideo(),
|
367 |
+
'tours' => [
|
368 |
+
'insights_overview' => $oTourManager->canShow( 'insights_overview' )
|
369 |
+
]
|
370 |
],
|
371 |
'hrefs' => [
|
372 |
'go_pro' => 'https://shsec.io/shieldgoprofeature',
|
393 |
$oCon = $this->getCon();
|
394 |
$aStdDepsJs = [ $this->prefix( 'plugin' ) ];
|
395 |
$sNav = Services::Request()->query( 'inav', 'overview' );
|
396 |
+
|
397 |
+
$oModPlugin = $oCon->getModule_Plugin();
|
398 |
+
$oTourManager = $oModPlugin->getTourManager();
|
399 |
switch ( $sNav ) {
|
400 |
|
401 |
case 'importexport':
|
416 |
case 'reports':
|
417 |
|
418 |
$aDeps = $aStdDepsJs;
|
419 |
+
|
420 |
$aJsAssets = [ 'chartist.min', 'chartist-plugin-legend', 'charts' ];
|
421 |
+
if ( $oTourManager->canShow( 'insights_overview' ) ) {
|
422 |
+
array_unshift( $aJsAssets, 'introjs.min.js' );
|
423 |
+
}
|
424 |
foreach ( $aJsAssets as $sAsset ) {
|
425 |
$sUnique = $oCon->prefix( $sAsset );
|
426 |
wp_register_script(
|
436 |
|
437 |
$aDeps = [];
|
438 |
$aCssAssets = [ 'chartist.min', 'chartist-plugin-legend' ];
|
439 |
+
if ( $oTourManager->canShow( 'insights_overview' ) ) {
|
440 |
+
array_unshift( $aCssAssets, 'introjs.min.css' );
|
441 |
+
}
|
442 |
foreach ( $aCssAssets as $sAsset ) {
|
443 |
$sUnique = $oCon->prefix( $sAsset );
|
444 |
wp_register_style(
|
814 |
|
815 |
$aStatsData = [
|
816 |
'login' => [
|
817 |
+
'id' => 'login_block',
|
818 |
+
'title' => __( 'Login Blocks', 'wp-simple-firewall' ),
|
819 |
+
'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
|
820 |
$oSelEvents->clearWheres()->sumEvent( 'login_block' ) ),
|
821 |
+
'tooltip_p' => __( 'Total login attempts blocked.', 'wp-simple-firewall' ),
|
822 |
],
|
823 |
// 'firewall' => [
|
824 |
// 'id' => 'firewall_block',
|
827 |
// 'tooltip' => __( 'Total requests blocked by firewall rules.', 'wp-simple-firewall' )
|
828 |
// ],
|
829 |
'bot_blocks' => [
|
830 |
+
'id' => 'bot_blocks',
|
831 |
+
'title' => __( 'Bot Detection', 'wp-simple-firewall' ),
|
832 |
+
'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
|
833 |
$oSelEvents->clearWheres()->sumEventsLike( 'bottrack_' ) ),
|
834 |
+
'tooltip_p' => __( 'Total requests identified as bots.', 'wp-simple-firewall' ),
|
835 |
],
|
836 |
'comments' => [
|
837 |
+
'id' => 'comment_block',
|
838 |
+
'title' => __( 'Comment Blocks', 'wp-simple-firewall' ),
|
839 |
+
'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
|
840 |
$oSelEvents->clearWheres()->sumEvents( [
|
841 |
'spam_block_bot',
|
842 |
'spam_block_human',
|
843 |
'spam_block_recaptcha'
|
844 |
] ) ),
|
845 |
+
'tooltip_p' => __( 'Total SPAM comments blocked.', 'wp-simple-firewall' ),
|
846 |
],
|
847 |
'transgressions' => [
|
848 |
+
'id' => 'ip_offense',
|
849 |
+
'title' => __( 'Offenses', 'wp-simple-firewall' ),
|
850 |
+
'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
|
851 |
$oSelEvents->clearWheres()->sumEvent( 'ip_offense' ) ),
|
852 |
+
'tooltip_p' => __( 'Total offenses against the site.', 'wp-simple-firewall' ),
|
853 |
],
|
854 |
'conn_kills' => [
|
855 |
+
'id' => 'conn_kill',
|
856 |
+
'title' => __( 'Connection Killed', 'wp-simple-firewall' ),
|
857 |
+
'val' => sprintf( '%s: %s', __( 'Lifetime Total' ),
|
858 |
$oSelEvents->clearWheres()->sumEvent( 'conn_kill' ) ),
|
859 |
+
'tooltip_p' => __( 'Total connections blocked/killed after too many offenses.', 'wp-simple-firewall' ),
|
860 |
],
|
861 |
'ip_blocked' => [
|
862 |
'id' => 'ip_blocked',
|
863 |
'title' => __( 'IP Blocked', 'wp-simple-firewall' ),
|
864 |
'val' => sprintf( '%s: %s', __( 'Now' ),
|
865 |
+
$oSelectIp->filterByBlacklist()->count()
|
866 |
+
),
|
|
|
|
|
|
|
|
|
|
|
867 |
'tooltip_p' => __( 'IP address exceeds offense limit and is blocked.', 'wp-simple-firewall' ),
|
868 |
],
|
869 |
];
|
883 |
protected function getRecentEvents() {
|
884 |
$oCon = $this->getCon();
|
885 |
|
886 |
+
$aTheStats = array_filter(
|
887 |
+
$oCon->loadEventsService()->getEvents(),
|
888 |
+
function ( $aEvt ) {
|
889 |
+
return isset( $aEvt[ 'recent' ] ) && $aEvt[ 'recent' ];
|
890 |
+
}
|
891 |
+
);
|
892 |
|
893 |
/** @var Shield\Modules\Insights\Strings $oStrs */
|
894 |
$oStrs = $this->getStrings();
|
899 |
->getDbHandler_Events()
|
900 |
->getQuerySelector();
|
901 |
|
902 |
+
$aRecentStats = array_intersect_key(
|
903 |
array_map(
|
904 |
function ( $oEntryVO ) use ( $aNames ) {
|
905 |
/** @var Shield\Databases\Events\EntryVO $oEntryVO */
|
910 |
},
|
911 |
$oSel->getLatestForAllEvents()
|
912 |
),
|
913 |
+
$aTheStats
|
914 |
);
|
915 |
|
916 |
$sNotYetRecorded = __( 'Not yet recorded', 'wp-simple-firewall' );
|
917 |
+
foreach ( array_keys( $aTheStats ) as $sStatKey ) {
|
918 |
+
if ( !isset( $aRecentStats[ $sStatKey ] ) ) {
|
919 |
+
$aRecentStats[ $sStatKey ] = [
|
920 |
'name' => isset( $aNames[ $sStatKey ] ) ? $aNames[ $sStatKey ] : '*** '.$sStatKey,
|
921 |
'val' => $sNotYetRecorded
|
922 |
];
|
923 |
}
|
924 |
}
|
925 |
|
926 |
+
return $aRecentStats;
|
927 |
}
|
928 |
|
929 |
/**
|
src/features/ips.php
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
<?php
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
|
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
5 |
|
6 |
class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
@@ -9,6 +10,11 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
9 |
const LIST_MANUAL_BLACK = 'MB';
|
10 |
const LIST_AUTO_BLACK = 'AB';
|
11 |
|
|
|
|
|
|
|
|
|
|
|
12 |
/**
|
13 |
* @return false|Shield\Databases\IPs\Handler
|
14 |
*/
|
@@ -39,17 +45,34 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
39 |
if ( !is_int( $nLimit ) || $nLimit < 0 ) {
|
40 |
$oOpts->resetOptToDefault( 'transgression_limit' );
|
41 |
}
|
|
|
|
|
42 |
}
|
43 |
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
}
|
54 |
|
55 |
/**
|
@@ -60,6 +83,16 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
60 |
return is_array( $aIps ) ? $aIps : [];
|
61 |
}
|
62 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
/**
|
64 |
* @param string $sIp
|
65 |
* @return $this
|
@@ -149,17 +182,17 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
149 |
if ( !$this->getCon()->isPluginDeleting() ) {
|
150 |
$this->addFilterIpsToWhiteList();
|
151 |
}
|
152 |
-
parent::onPluginShutdown();
|
153 |
}
|
154 |
|
155 |
/**
|
156 |
*/
|
157 |
protected function addFilterIpsToWhiteList() {
|
158 |
$aIps = [];
|
159 |
-
$oSp =
|
160 |
|
161 |
-
if (
|
162 |
-
foreach ( array_flip( $oSp->getIps_ManageWp() ) as $sIp => $n ) {
|
163 |
$aIps[ $sIp ] = 'ManageWP';
|
164 |
}
|
165 |
}
|
@@ -173,13 +206,15 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
173 |
$aIps = apply_filters( 'icwp_simple_firewall_whitelist_ips', $aIps );
|
174 |
|
175 |
if ( !empty( $aIps ) && is_array( $aIps ) ) {
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
$aWhiteIps = $oPro->getWhitelistIps();
|
180 |
foreach ( $aIps as $sIP => $sLabel ) {
|
181 |
if ( !in_array( $sIP, $aWhiteIps ) ) {
|
182 |
-
|
|
|
|
|
|
|
183 |
}
|
184 |
}
|
185 |
}
|
@@ -191,4 +226,13 @@ class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
|
191 |
protected function getNamespaceBase() {
|
192 |
return 'IPs';
|
193 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
}
|
1 |
<?php
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\IPs;
|
5 |
use FernleafSystems\Wordpress\Services\Services;
|
6 |
|
7 |
class ICWP_WPSF_FeatureHandler_Ips extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
10 |
const LIST_MANUAL_BLACK = 'MB';
|
11 |
const LIST_AUTO_BLACK = 'AB';
|
12 |
|
13 |
+
/**
|
14 |
+
* @var IPs\Lib\OffenseTracker
|
15 |
+
*/
|
16 |
+
private $oOffenseTracker;
|
17 |
+
|
18 |
/**
|
19 |
* @return false|Shield\Databases\IPs\Handler
|
20 |
*/
|
45 |
if ( !is_int( $nLimit ) || $nLimit < 0 ) {
|
46 |
$oOpts->resetOptToDefault( 'transgression_limit' );
|
47 |
}
|
48 |
+
|
49 |
+
$this->cleanPathWhitelist();
|
50 |
}
|
51 |
|
52 |
+
private function cleanPathWhitelist() {
|
53 |
+
/** @var IPs\Options $oOpts */
|
54 |
+
$oOpts = $this->getOptions();
|
55 |
+
$oOpts->setOpt( 'request_whitelist', array_unique( array_filter( array_map(
|
56 |
+
function ( $sRule ) {
|
57 |
+
$sRule = strtolower( trim( $sRule ) );
|
58 |
+
if ( !empty( $sRule ) ) {
|
59 |
+
$aToCheck = [
|
60 |
+
parse_url( Services::WpGeneral()->getHomeUrl(), PHP_URL_PATH ),
|
61 |
+
parse_url( Services::WpGeneral()->getWpUrl(), PHP_URL_PATH ),
|
62 |
+
];
|
63 |
+
$sRegEx = sprintf( '#^%s$#i', str_replace( 'STAR', '.*', preg_quote( str_replace( '*', 'STAR', $sRule ), '#' ) ) );
|
64 |
+
foreach ( $aToCheck as $sPath ) {
|
65 |
+
$sSlashPath = rtrim( $sPath, '/' ).'/';
|
66 |
+
if ( preg_match( $sRegEx, $sPath ) || preg_match( $sRegEx, $sSlashPath ) ) {
|
67 |
+
$sRule = false;
|
68 |
+
break;
|
69 |
+
}
|
70 |
+
}
|
71 |
+
}
|
72 |
+
return $sRule;
|
73 |
+
},
|
74 |
+
$this->getOpt( 'request_whitelist', [] ) // do not use Options getter as it formats into regex
|
75 |
+
) ) ) );
|
76 |
}
|
77 |
|
78 |
/**
|
83 |
return is_array( $aIps ) ? $aIps : [];
|
84 |
}
|
85 |
|
86 |
+
/**
|
87 |
+
* @return IPs\Lib\OffenseTracker
|
88 |
+
*/
|
89 |
+
public function loadOffenseTracker() {
|
90 |
+
if ( !isset( $this->oOffenseTracker ) ) {
|
91 |
+
$this->oOffenseTracker = new IPs\Lib\OffenseTracker( $this->getCon() );
|
92 |
+
}
|
93 |
+
return $this->oOffenseTracker;
|
94 |
+
}
|
95 |
+
|
96 |
/**
|
97 |
* @param string $sIp
|
98 |
* @return $this
|
182 |
if ( !$this->getCon()->isPluginDeleting() ) {
|
183 |
$this->addFilterIpsToWhiteList();
|
184 |
}
|
185 |
+
parent::onPluginShutdown();
|
186 |
}
|
187 |
|
188 |
/**
|
189 |
*/
|
190 |
protected function addFilterIpsToWhiteList() {
|
191 |
$aIps = [];
|
192 |
+
$oSp = Services::ServiceProviders();
|
193 |
|
194 |
+
if ( @class_exists( '\MwpWorkerResponder' ) ) {
|
195 |
+
foreach ( array_flip( $oSp->getIps_ManageWp( true ) ) as $sIp => $n ) {
|
196 |
$aIps[ $sIp ] = 'ManageWP';
|
197 |
}
|
198 |
}
|
206 |
$aIps = apply_filters( 'icwp_simple_firewall_whitelist_ips', $aIps );
|
207 |
|
208 |
if ( !empty( $aIps ) && is_array( $aIps ) ) {
|
209 |
+
$aWhiteIps = ( new Shield\Modules\IPs\Lib\Ops\RetrieveIpsForLists() )
|
210 |
+
->setDbHandler( $this->getDbHandler_IPs() )
|
211 |
+
->white();
|
|
|
212 |
foreach ( $aIps as $sIP => $sLabel ) {
|
213 |
if ( !in_array( $sIP, $aWhiteIps ) ) {
|
214 |
+
( new Shield\Modules\IPs\Lib\Ops\AddIp() )
|
215 |
+
->setMod( $this )
|
216 |
+
->setIP( $sIP )
|
217 |
+
->toManualWhitelist( $sLabel );
|
218 |
}
|
219 |
}
|
220 |
}
|
226 |
protected function getNamespaceBase() {
|
227 |
return 'IPs';
|
228 |
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* IP addresses that should never be put on the black list.
|
232 |
+
* @return string[]
|
233 |
+
* @deprecated 8.5.1
|
234 |
+
*/
|
235 |
+
public function getReservedIps() {
|
236 |
+
return Services::IP()->getServerPublicIPs();
|
237 |
+
}
|
238 |
}
|
src/features/license.php
CHANGED
@@ -19,7 +19,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
19 |
}
|
20 |
|
21 |
/**
|
22 |
-
* @return
|
23 |
*/
|
24 |
public function getIfShowModuleMenuItem() {
|
25 |
return parent::getIfShowModuleMenuItem() && !$this->isPremium();
|
@@ -111,7 +111,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
111 |
$this->sendLicenseWarningEmail();
|
112 |
$oCon->fireEvent( 'lic_fail_email' );
|
113 |
}
|
114 |
-
|
115 |
$oCurrent = $oLookupLicense;
|
116 |
$this->deactivate( __( 'Automatic license verification failed.', 'wp-simple-firewall' ) );
|
117 |
$this->sendLicenseDeactivatedEmail();
|
@@ -176,12 +176,11 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
176 |
* @return bool
|
177 |
*/
|
178 |
protected function isLicenseMaybeExpiring() {
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
return $bNearly;
|
185 |
}
|
186 |
|
187 |
/**
|
@@ -263,6 +262,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
263 |
->setRequestParams(
|
264 |
[
|
265 |
'installation_id' => $this->getCon()->getSiteInstallationId(),
|
|
|
266 |
'nonce' => $sPass,
|
267 |
]
|
268 |
)
|
@@ -311,14 +311,6 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
311 |
return $this->getDef( 'license_item_id' );
|
312 |
}
|
313 |
|
314 |
-
/**
|
315 |
-
* Unused
|
316 |
-
* @return string
|
317 |
-
*/
|
318 |
-
public function getLicenseItemIdShieldCentral() {
|
319 |
-
return $this->getDef( 'license_item_id_sc' );
|
320 |
-
}
|
321 |
-
|
322 |
/**
|
323 |
* @return string
|
324 |
*/
|
@@ -562,7 +554,7 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
562 |
if ( !$this->isKeyless() ) {
|
563 |
$aLicenseTableVars[ 'license_key' ] = $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a';
|
564 |
}
|
565 |
-
|
566 |
'vars' => [
|
567 |
'license_table' => $aLicenseTableVars,
|
568 |
'activation_url' => $oWp->getHomeUrl()
|
@@ -595,7 +587,6 @@ class ICWP_WPSF_FeatureHandler_License extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
595 |
],
|
596 |
'strings' => $this->getStrings()->getDisplayStrings(),
|
597 |
];
|
598 |
-
return $aData;
|
599 |
}
|
600 |
|
601 |
/**
|
19 |
}
|
20 |
|
21 |
/**
|
22 |
+
* @return bool
|
23 |
*/
|
24 |
public function getIfShowModuleMenuItem() {
|
25 |
return parent::getIfShowModuleMenuItem() && !$this->isPremium();
|
111 |
$this->sendLicenseWarningEmail();
|
112 |
$oCon->fireEvent( 'lic_fail_email' );
|
113 |
}
|
114 |
+
elseif ( $bForceCheck || $oCurrent->isExpired() || $this->isLastVerifiedGraceExpired() ) {
|
115 |
$oCurrent = $oLookupLicense;
|
116 |
$this->deactivate( __( 'Automatic license verification failed.', 'wp-simple-firewall' ) );
|
117 |
$this->sendLicenseDeactivatedEmail();
|
176 |
* @return bool
|
177 |
*/
|
178 |
protected function isLicenseMaybeExpiring() {
|
179 |
+
return $this->isLicenseActive() &&
|
180 |
+
(
|
181 |
+
abs( Services::Request()->ts() - $this->loadLicense()->getExpiresAt() )
|
182 |
+
< ( DAY_IN_SECONDS/2 )
|
183 |
+
);
|
|
|
184 |
}
|
185 |
|
186 |
/**
|
262 |
->setRequestParams(
|
263 |
[
|
264 |
'installation_id' => $this->getCon()->getSiteInstallationId(),
|
265 |
+
'version_shield' => $this->getCon()->getVersion(),
|
266 |
'nonce' => $sPass,
|
267 |
]
|
268 |
)
|
311 |
return $this->getDef( 'license_item_id' );
|
312 |
}
|
313 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
314 |
/**
|
315 |
* @return string
|
316 |
*/
|
554 |
if ( !$this->isKeyless() ) {
|
555 |
$aLicenseTableVars[ 'license_key' ] = $this->hasLicenseKey() ? $this->getLicenseKey() : 'n/a';
|
556 |
}
|
557 |
+
return [
|
558 |
'vars' => [
|
559 |
'license_table' => $aLicenseTableVars,
|
560 |
'activation_url' => $oWp->getHomeUrl()
|
587 |
],
|
588 |
'strings' => $this->getStrings()->getDisplayStrings(),
|
589 |
];
|
|
|
590 |
}
|
591 |
|
592 |
/**
|
src/features/login_protect.php
CHANGED
@@ -52,13 +52,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
52 |
}
|
53 |
}
|
54 |
|
55 |
-
/**
|
56 |
-
* @return string
|
57 |
-
*/
|
58 |
-
private function generateCanSendEmailVerifyLink() {
|
59 |
-
return add_query_arg( $this->getNonceActionData( 'email_send_verify' ), $this->getUrl_AdminPage() );
|
60 |
-
}
|
61 |
-
|
62 |
/**
|
63 |
* @uses wp_redirect()
|
64 |
*/
|
@@ -81,7 +74,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
81 |
/**
|
82 |
* @param string $sEmail
|
83 |
* @param bool $bSendAsLink
|
84 |
-
* @return
|
85 |
*/
|
86 |
public function sendEmailVerifyCanSend( $sEmail = null, $bSendAsLink = true ) {
|
87 |
|
@@ -96,7 +89,10 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
96 |
];
|
97 |
|
98 |
if ( $bSendAsLink ) {
|
99 |
-
$aMessage[] = sprintf(
|
|
|
|
|
|
|
100 |
}
|
101 |
else {
|
102 |
$aMessage[] = sprintf( __( "Here's your code for the guided wizard: %s", 'wp-simple-firewall' ), $this->getCanEmailVerifyCode() );
|
@@ -162,7 +158,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
162 |
}
|
163 |
|
164 |
/**
|
165 |
-
* @param
|
166 |
* @return array
|
167 |
*/
|
168 |
protected function getOptEmailTwoFactorRolesDefaults( $bAsOptDefaults = true ) {
|
@@ -182,14 +178,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
182 |
return $aTwoAuthRoles;
|
183 |
}
|
184 |
|
185 |
-
/**
|
186 |
-
* @return int
|
187 |
-
* @deprecated 8.4
|
188 |
-
*/
|
189 |
-
public function getCooldownInterval() {
|
190 |
-
return (int)$this->getOpt( 'login_limit_interval' );
|
191 |
-
}
|
192 |
-
|
193 |
/**
|
194 |
* @return string
|
195 |
*/
|
@@ -252,7 +240,7 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
252 |
$bCanSkip = isset( $aHashes[ $sHash ] )
|
253 |
&& ( (int)$aHashes[ $sHash ] + $nSkipTime ) > $oReq->ts();
|
254 |
}
|
255 |
-
|
256 |
// custom support for WooCommerce Social login
|
257 |
$oMeta = $this->getCon()->getUserMeta( $oUser );
|
258 |
$bCanSkip = isset( $oMeta->wc_social_login_valid ) ? $oMeta->wc_social_login_valid : false;
|
@@ -644,14 +632,6 @@ class ICWP_WPSF_FeatureHandler_LoginProtect extends ICWP_WPSF_FeatureHandler_Bas
|
|
644 |
return $aAllData;
|
645 |
}
|
646 |
|
647 |
-
/**
|
648 |
-
* @return bool
|
649 |
-
* @deprecated 8.4
|
650 |
-
*/
|
651 |
-
public function isCooldownEnabled() {
|
652 |
-
return $this->getCooldownInterval() > 0;
|
653 |
-
}
|
654 |
-
|
655 |
/**
|
656 |
* @return string
|
657 |
*/
|
52 |
}
|
53 |
}
|
54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
/**
|
56 |
* @uses wp_redirect()
|
57 |
*/
|
74 |
/**
|
75 |
* @param string $sEmail
|
76 |
* @param bool $bSendAsLink
|
77 |
+
* @return bool
|
78 |
*/
|
79 |
public function sendEmailVerifyCanSend( $sEmail = null, $bSendAsLink = true ) {
|
80 |
|
89 |
];
|
90 |
|
91 |
if ( $bSendAsLink ) {
|
92 |
+
$aMessage[] = sprintf(
|
93 |
+
__( 'Click the verify link: %s', 'wp-simple-firewall' ),
|
94 |
+
$this->buildAdminActionNonceUrl( 'email_send_verify' )
|
95 |
+
);
|
96 |
}
|
97 |
else {
|
98 |
$aMessage[] = sprintf( __( "Here's your code for the guided wizard: %s", 'wp-simple-firewall' ), $this->getCanEmailVerifyCode() );
|
158 |
}
|
159 |
|
160 |
/**
|
161 |
+
* @param bool $bAsOptDefaults
|
162 |
* @return array
|
163 |
*/
|
164 |
protected function getOptEmailTwoFactorRolesDefaults( $bAsOptDefaults = true ) {
|
178 |
return $aTwoAuthRoles;
|
179 |
}
|
180 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
181 |
/**
|
182 |
* @return string
|
183 |
*/
|
240 |
$bCanSkip = isset( $aHashes[ $sHash ] )
|
241 |
&& ( (int)$aHashes[ $sHash ] + $nSkipTime ) > $oReq->ts();
|
242 |
}
|
243 |
+
elseif ( $this->getIfSupport3rdParty() && class_exists( 'WC_Social_Login' ) ) {
|
244 |
// custom support for WooCommerce Social login
|
245 |
$oMeta = $this->getCon()->getUserMeta( $oUser );
|
246 |
$bCanSkip = isset( $oMeta->wc_social_login_valid ) ? $oMeta->wc_social_login_valid : false;
|
632 |
return $aAllData;
|
633 |
}
|
634 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
635 |
/**
|
636 |
* @return string
|
637 |
*/
|
src/features/plugin.php
CHANGED
@@ -9,14 +9,21 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
9 |
|
10 |
protected function doPostConstruction() {
|
11 |
parent::doPostConstruction();
|
12 |
-
$this->
|
13 |
}
|
14 |
|
15 |
protected function setupCustomHooks() {
|
16 |
parent::setupCustomHooks();
|
17 |
-
|
18 |
-
add_filter( $
|
19 |
-
add_filter( $
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
}
|
21 |
|
22 |
protected function updateHandler() {
|
@@ -39,75 +46,41 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
39 |
}
|
40 |
|
41 |
/**
|
42 |
-
*
|
43 |
-
*/
|
44 |
-
public function onWpInit() {
|
45 |
-
parent::onWpInit();
|
46 |
-
$this->getImportExportSecretKey();
|
47 |
-
}
|
48 |
-
|
49 |
-
/**
|
50 |
-
* @return bool
|
51 |
-
*/
|
52 |
-
public function getLastCheckServerIpAtHasExpired() {
|
53 |
-
/** @var Plugin\Options $oOpts */
|
54 |
-
$oOpts = $this->getOptions();
|
55 |
-
$aDetails = $oOpts->getServerIpDetails();
|
56 |
-
$nAge = Services::Request()->ts() - $aDetails[ 'check_ts' ];
|
57 |
-
return ( $nAge > HOUR_IN_SECONDS )
|
58 |
-
&& ( $this->getServerHash() != $aDetails[ 'hash' ] || $nAge > WEEK_IN_SECONDS );
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* @return string
|
63 |
*/
|
64 |
-
public function
|
65 |
-
|
66 |
-
$
|
67 |
-
|
68 |
-
$
|
69 |
-
|
70 |
-
|
71 |
-
$sThisServerIp = Services::IP()->whatIsMyIp();
|
72 |
-
if ( !empty( $sThisServerIp ) ) {
|
73 |
-
$oOpts->updateServerIpDetails( [
|
74 |
-
'ip' => $sThisServerIp,
|
75 |
-
'hash' => $this->getServerHash(),
|
76 |
-
'check_ts' => Services::Request()->ts(),
|
77 |
-
] );
|
78 |
-
}
|
79 |
-
}
|
80 |
-
return $sThisServerIp;
|
81 |
}
|
82 |
|
83 |
/**
|
84 |
-
*
|
85 |
*/
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
$_SERVER,
|
90 |
-
array_flip( [
|
91 |
-
'SERVER_SOFTWARE',
|
92 |
-
'SERVER_SIGNATURE',
|
93 |
-
'PATH',
|
94 |
-
'DOCUMENT_ROOT',
|
95 |
-
'SERVER_ADDR',
|
96 |
-
] )
|
97 |
-
) )
|
98 |
-
) );
|
99 |
}
|
100 |
|
101 |
/**
|
102 |
* @return bool
|
103 |
*/
|
104 |
public function isDisplayPluginBadge() {
|
105 |
-
/** @var
|
106 |
$oOpts = $this->getOptions();
|
107 |
return $oOpts->isOnFloatingPluginBadge()
|
108 |
&& ( Services::Request()->cookie( $this->getCookieIdBadgeState() ) != 'closed' );
|
109 |
}
|
110 |
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
/**
|
112 |
* @param bool $bDisplay
|
113 |
* @return $this
|
@@ -117,44 +90,24 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
117 |
}
|
118 |
|
119 |
/**
|
120 |
-
* Forcefully sets
|
121 |
*/
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
|
|
|
|
126 |
);
|
127 |
-
if ( !$this->isVisitorAddressSourceAutoDetect() ) {
|
128 |
-
$oDetector->setPreferredSource( $this->getVisitorAddressSource() );
|
129 |
-
}
|
130 |
-
|
131 |
-
$sIp = $oDetector->detect();
|
132 |
-
if ( !empty( $sIp ) ) {
|
133 |
-
Services::IP()->setRequestIpAddress( $sIp );
|
134 |
-
$this->setOpt( 'last_ip_detect_source', $oDetector->getLastSuccessfulSource() );
|
135 |
}
|
136 |
}
|
137 |
|
138 |
-
/**
|
139 |
-
* @return string
|
140 |
-
*/
|
141 |
-
public function getVisitorAddressSource() {
|
142 |
-
return $this->getOpt( 'visitor_address_source' );
|
143 |
-
}
|
144 |
-
|
145 |
/**
|
146 |
* @param string $sSource
|
147 |
* @return $this
|
148 |
*/
|
149 |
public function setVisitorAddressSource( $sSource ) {
|
150 |
-
return $this->setOpt( 'visitor_address_source', $sSource );
|
151 |
-
}
|
152 |
-
|
153 |
-
/**
|
154 |
-
* @return string
|
155 |
-
*/
|
156 |
-
public function isVisitorAddressSourceAutoDetect() {
|
157 |
-
return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
|
158 |
}
|
159 |
|
160 |
/**
|
@@ -226,8 +179,9 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
226 |
}
|
227 |
|
228 |
/**
|
229 |
-
* @param
|
230 |
-
* @return
|
|
|
231 |
*/
|
232 |
public function filter_IsPluginGloballyDisabled( $bGloballyDisabled ) {
|
233 |
return $bGloballyDisabled || !$this->isOpt( 'global_enable_plugin_features', 'Y' );
|
@@ -260,14 +214,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
260 |
return $aPluginFeatures;
|
261 |
}
|
262 |
|
263 |
-
/**
|
264 |
-
* @return int
|
265 |
-
*/
|
266 |
-
public function getTrackingLastSentAt() {
|
267 |
-
$nTime = (int)$this->getOpt( 'tracking_last_sent_at', 0 );
|
268 |
-
return ( $nTime < 0 ) ? 0 : $nTime;
|
269 |
-
}
|
270 |
-
|
271 |
/**
|
272 |
* @return string
|
273 |
*/
|
@@ -278,34 +224,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
278 |
);
|
279 |
}
|
280 |
|
281 |
-
/**
|
282 |
-
* @return bool
|
283 |
-
*/
|
284 |
-
public function isTrackingEnabled() {
|
285 |
-
return $this->isOpt( 'enable_tracking', 'Y' );
|
286 |
-
}
|
287 |
-
|
288 |
-
/**
|
289 |
-
* @return bool
|
290 |
-
*/
|
291 |
-
public function isTrackingPermissionSet() {
|
292 |
-
return !$this->isOpt( 'tracking_permission_set_at', 0 );
|
293 |
-
}
|
294 |
-
|
295 |
-
/**
|
296 |
-
* @return $this
|
297 |
-
*/
|
298 |
-
public function setTrackingLastSentAt() {
|
299 |
-
return $this->setOpt( 'tracking_last_sent_at', Services::Request()->ts() );
|
300 |
-
}
|
301 |
-
|
302 |
-
/**
|
303 |
-
* @return bool
|
304 |
-
*/
|
305 |
-
public function readyToSendTrackingData() {
|
306 |
-
return ( Services::Request()->ts() - $this->getTrackingLastSentAt() > WEEK_IN_SECONDS );
|
307 |
-
}
|
308 |
-
|
309 |
/**
|
310 |
* @param string $sEmail
|
311 |
* @return string
|
@@ -319,11 +237,13 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
319 |
* This is the point where you would want to do any options verification
|
320 |
*/
|
321 |
protected function doPrePluginOptionsSave() {
|
|
|
|
|
322 |
|
323 |
$this->storeRealInstallDate();
|
324 |
|
325 |
-
if ( $
|
326 |
-
$
|
327 |
}
|
328 |
|
329 |
$this->cleanRecaptchaKey( 'google_recaptcha_site_key' );
|
@@ -458,17 +378,24 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
458 |
/**
|
459 |
* @return int
|
460 |
*/
|
461 |
-
public function
|
462 |
-
return (int)$this->getOpt( 'activated_at', 0 );
|
463 |
}
|
464 |
|
465 |
/**
|
|
|
466 |
* @return bool
|
467 |
*/
|
468 |
public function getIfShowIntroVideo() {
|
469 |
-
|
470 |
-
|
471 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
472 |
}
|
473 |
|
474 |
/**
|
@@ -502,21 +429,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
502 |
);
|
503 |
}
|
504 |
|
505 |
-
/**
|
506 |
-
* @return string
|
507 |
-
*/
|
508 |
-
public function getImportExportMasterImportUrl() {
|
509 |
-
return $this->getOpt( 'importexport_masterurl', '' );
|
510 |
-
}
|
511 |
-
|
512 |
-
/**
|
513 |
-
* @return bool
|
514 |
-
*/
|
515 |
-
public function hasImportExportMasterImportUrl() {
|
516 |
-
$sMaster = $this->getImportExportMasterImportUrl();
|
517 |
-
return !empty( $sMaster );
|
518 |
-
}
|
519 |
-
|
520 |
/**
|
521 |
* @return bool
|
522 |
*/
|
@@ -524,13 +436,6 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
524 |
return ( count( $this->getImportExportWhitelist() ) > 0 );
|
525 |
}
|
526 |
|
527 |
-
/**
|
528 |
-
* @return int
|
529 |
-
*/
|
530 |
-
public function getImportExportHandshakeExpiresAt() {
|
531 |
-
return $this->getOpt( 'importexport_handshake_expires_at', Services::Request()->ts() );
|
532 |
-
}
|
533 |
-
|
534 |
/**
|
535 |
* @return string[]
|
536 |
*/
|
@@ -552,20 +457,13 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
552 |
protected function getImportExportSecretKey() {
|
553 |
$sId = $this->getOpt( 'importexport_secretkey', '' );
|
554 |
if ( empty( $sId ) || $this->isImportExportSecretKeyExpired() ) {
|
555 |
-
$sId = sha1( $this->
|
556 |
$this->setOpt( 'importexport_secretkey', $sId )
|
557 |
->setOpt( 'importexport_secretkey_expires_at', Services::Request()->ts() + HOUR_IN_SECONDS );
|
558 |
}
|
559 |
return $sId;
|
560 |
}
|
561 |
|
562 |
-
/**
|
563 |
-
* @return bool
|
564 |
-
*/
|
565 |
-
public function isImportExportPermitted() {
|
566 |
-
return $this->isPremium() && $this->isOpt( 'importexport_enable', 'Y' );
|
567 |
-
}
|
568 |
-
|
569 |
/**
|
570 |
* @return bool
|
571 |
*/
|
@@ -643,7 +541,9 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
643 |
* @return $this
|
644 |
*/
|
645 |
protected function cleanImportExportMasterImportUrl() {
|
646 |
-
|
|
|
|
|
647 |
if ( $sUrl === false ) {
|
648 |
$sUrl = '';
|
649 |
}
|
@@ -654,7 +554,7 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
654 |
* @return $this
|
655 |
*/
|
656 |
public function startImportExportHandshake() {
|
657 |
-
$this->setOpt( 'importexport_handshake_expires_at', Services::Request()->ts() + 30 );
|
658 |
return $this->saveModOptions();
|
659 |
}
|
660 |
|
@@ -718,6 +618,12 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
718 |
wp_enqueue_script( 'jquery-ui-dialog' ); // jquery and jquery-ui should be dependencies, didn't check though...
|
719 |
wp_enqueue_style( 'wp-jquery-ui-dialog' );
|
720 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
721 |
}
|
722 |
|
723 |
/**
|
@@ -792,18 +698,26 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
792 |
}
|
793 |
|
794 |
/**
|
795 |
-
* @return
|
796 |
-
* @deprecated 8.4
|
797 |
*/
|
798 |
-
|
799 |
-
return
|
800 |
}
|
801 |
|
802 |
/**
|
803 |
* @return string
|
|
|
804 |
*/
|
805 |
-
|
806 |
-
return '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
807 |
}
|
808 |
|
809 |
/**
|
@@ -812,4 +726,105 @@ class ICWP_WPSF_FeatureHandler_Plugin extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
812 |
public function getSurveyEmail() {
|
813 |
return base64_decode( $this->getDef( 'survey_email' ) );
|
814 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
815 |
}
|
9 |
|
10 |
protected function doPostConstruction() {
|
11 |
parent::doPostConstruction();
|
12 |
+
$this->setVisitorIpSource();
|
13 |
}
|
14 |
|
15 |
protected function setupCustomHooks() {
|
16 |
parent::setupCustomHooks();
|
17 |
+
$oCon = $this->getCon();
|
18 |
+
add_filter( $oCon->prefix( 'report_email_address' ), [ $this, 'supplyPluginReportEmail' ] );
|
19 |
+
add_filter( $oCon->prefix( 'google_recaptcha_config' ), [ $this, 'getGoogleRecaptchaConfig' ], 10, 0 );
|
20 |
+
/* Enfold theme deletes all cookies except particular ones.
|
21 |
+
add_filter( 'avf_admin_keep_cookies', function ( $aCookiesToKeep ) use ( $oCon ) {
|
22 |
+
$aCookiesToKeep[] = $oCon->getPluginPrefix().'*';
|
23 |
+
$aCookiesToKeep[] = $oCon->getOptionStoragePrefix().'*';
|
24 |
+
return $aCookiesToKeep;
|
25 |
+
}, 10, 0 );
|
26 |
+
*/
|
27 |
}
|
28 |
|
29 |
protected function updateHandler() {
|
46 |
}
|
47 |
|
48 |
/**
|
49 |
+
* Hooked to the plugin's main plugin_shutdown action
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
*/
|
51 |
+
public function onPluginShutdown() {
|
52 |
+
/* TODO: uncomment on any version 8.6+
|
53 |
+
$sPreferredSource = Services::IP()->getIpDetector()->getLastSuccessfulSource();
|
54 |
+
if ( !empty( $sPreferredSource ) ) {
|
55 |
+
$this->setOpt( 'last_ip_detect_source', $sPreferredSource );
|
56 |
+
} */
|
57 |
+
parent::onPluginShutdown();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
}
|
59 |
|
60 |
/**
|
61 |
+
* A action added to WordPress 'init' hook
|
62 |
*/
|
63 |
+
public function onWpInit() {
|
64 |
+
parent::onWpInit();
|
65 |
+
$this->getImportExportSecretKey();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
}
|
67 |
|
68 |
/**
|
69 |
* @return bool
|
70 |
*/
|
71 |
public function isDisplayPluginBadge() {
|
72 |
+
/** @var Plugin\Options $oOpts */
|
73 |
$oOpts = $this->getOptions();
|
74 |
return $oOpts->isOnFloatingPluginBadge()
|
75 |
&& ( Services::Request()->cookie( $this->getCookieIdBadgeState() ) != 'closed' );
|
76 |
}
|
77 |
|
78 |
+
public function runHourlyCron() {
|
79 |
+
( new Plugin\Lib\WpHashesTokenManager() )
|
80 |
+
->setMod( $this )
|
81 |
+
->getToken();
|
82 |
+
}
|
83 |
+
|
84 |
/**
|
85 |
* @param bool $bDisplay
|
86 |
* @return $this
|
90 |
}
|
91 |
|
92 |
/**
|
93 |
+
* Forcefully sets preferred Visitor IP source in the Data component for use throughout the plugin
|
94 |
*/
|
95 |
+
private function setVisitorIpSource() {
|
96 |
+
/** @var Plugin\Options $oOpts */
|
97 |
+
$oOpts = $this->getOptions();
|
98 |
+
if ( !$oOpts->isIpSourceAutoDetect() ) {
|
99 |
+
Services::IP()->setIpDetector(
|
100 |
+
( new Utilities\Net\VisitorIpDetection() )->setPreferredSource( $oOpts->getIpSource() )
|
101 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
}
|
103 |
}
|
104 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
/**
|
106 |
* @param string $sSource
|
107 |
* @return $this
|
108 |
*/
|
109 |
public function setVisitorAddressSource( $sSource ) {
|
110 |
+
return $this->getOptions()->setOpt( 'visitor_address_source', $sSource );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
}
|
112 |
|
113 |
/**
|
179 |
}
|
180 |
|
181 |
/**
|
182 |
+
* @param bool $bGloballyDisabled
|
183 |
+
* @return bool
|
184 |
+
* @deprecated 8.5.7
|
185 |
*/
|
186 |
public function filter_IsPluginGloballyDisabled( $bGloballyDisabled ) {
|
187 |
return $bGloballyDisabled || !$this->isOpt( 'global_enable_plugin_features', 'Y' );
|
214 |
return $aPluginFeatures;
|
215 |
}
|
216 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
/**
|
218 |
* @return string
|
219 |
*/
|
224 |
);
|
225 |
}
|
226 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
227 |
/**
|
228 |
* @param string $sEmail
|
229 |
* @return string
|
237 |
* This is the point where you would want to do any options verification
|
238 |
*/
|
239 |
protected function doPrePluginOptionsSave() {
|
240 |
+
/** @var Plugin\Options $oOpts */
|
241 |
+
$oOpts = $this->getOptions();
|
242 |
|
243 |
$this->storeRealInstallDate();
|
244 |
|
245 |
+
if ( $oOpts->isTrackingEnabled() && !$oOpts->isTrackingPermissionSet() ) {
|
246 |
+
$oOpts->setOpt( 'tracking_permission_set_at', Services::Request()->ts() );
|
247 |
}
|
248 |
|
249 |
$this->cleanRecaptchaKey( 'google_recaptcha_site_key' );
|
378 |
/**
|
379 |
* @return int
|
380 |
*/
|
381 |
+
public function getActivateLength() {
|
382 |
+
return Services::Request()->ts() - (int)$this->getOptions()->getOpt( 'activated_at', 0 );
|
383 |
}
|
384 |
|
385 |
/**
|
386 |
+
* hidden 20200121
|
387 |
* @return bool
|
388 |
*/
|
389 |
public function getIfShowIntroVideo() {
|
390 |
+
return false && ( $this->getActivateLength() < 8 )
|
391 |
+
&& ( Services::Request()->ts() - $this->getInstallDate() < 15 );
|
392 |
+
}
|
393 |
+
|
394 |
+
/**
|
395 |
+
* @return Plugin\Lib\TourManager
|
396 |
+
*/
|
397 |
+
public function getTourManager() {
|
398 |
+
return ( new Plugin\Lib\TourManager() )->setMod( $this );
|
399 |
}
|
400 |
|
401 |
/**
|
429 |
);
|
430 |
}
|
431 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
432 |
/**
|
433 |
* @return bool
|
434 |
*/
|
436 |
return ( count( $this->getImportExportWhitelist() ) > 0 );
|
437 |
}
|
438 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
439 |
/**
|
440 |
* @return string[]
|
441 |
*/
|
457 |
protected function getImportExportSecretKey() {
|
458 |
$sId = $this->getOpt( 'importexport_secretkey', '' );
|
459 |
if ( empty( $sId ) || $this->isImportExportSecretKeyExpired() ) {
|
460 |
+
$sId = sha1( $this->getCon()->getSiteInstallationId().wp_rand( 0, PHP_INT_MAX ) );
|
461 |
$this->setOpt( 'importexport_secretkey', $sId )
|
462 |
->setOpt( 'importexport_secretkey_expires_at', Services::Request()->ts() + HOUR_IN_SECONDS );
|
463 |
}
|
464 |
return $sId;
|
465 |
}
|
466 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
467 |
/**
|
468 |
* @return bool
|
469 |
*/
|
541 |
* @return $this
|
542 |
*/
|
543 |
protected function cleanImportExportMasterImportUrl() {
|
544 |
+
/** @var Plugin\Options $oOpts */
|
545 |
+
$oOpts = $this->getOptions();
|
546 |
+
$sUrl = Services::Data()->validateSimpleHttpUrl( $oOpts->getImportExportMasterImportUrl() );
|
547 |
if ( $sUrl === false ) {
|
548 |
$sUrl = '';
|
549 |
}
|
554 |
* @return $this
|
555 |
*/
|
556 |
public function startImportExportHandshake() {
|
557 |
+
$this->getOptions()->setOpt( 'importexport_handshake_expires_at', Services::Request()->ts() + 30 );
|
558 |
return $this->saveModOptions();
|
559 |
}
|
560 |
|
618 |
wp_enqueue_script( 'jquery-ui-dialog' ); // jquery and jquery-ui should be dependencies, didn't check though...
|
619 |
wp_enqueue_style( 'wp-jquery-ui-dialog' );
|
620 |
}
|
621 |
+
|
622 |
+
wp_localize_script(
|
623 |
+
$this->prefix( 'plugin' ),
|
624 |
+
'icwp_wpsf_vars_tourmanager',
|
625 |
+
[ 'ajax' => $this->getAjaxActionData( 'mark_tour_finished' ) ]
|
626 |
+
);
|
627 |
}
|
628 |
|
629 |
/**
|
698 |
}
|
699 |
|
700 |
/**
|
701 |
+
* @return string
|
|
|
702 |
*/
|
703 |
+
protected function getNamespaceBase() {
|
704 |
+
return 'Plugin';
|
705 |
}
|
706 |
|
707 |
/**
|
708 |
* @return string
|
709 |
+
* @deprecated 8.5.2
|
710 |
*/
|
711 |
+
public function getVisitorAddressSource() {
|
712 |
+
return $this->getOptions()->getOpt( 'visitor_address_source' );
|
713 |
+
}
|
714 |
+
|
715 |
+
/**
|
716 |
+
* @return string
|
717 |
+
* @deprecated 8.5.2
|
718 |
+
*/
|
719 |
+
public function isVisitorAddressSourceAutoDetect() {
|
720 |
+
return $this->getVisitorAddressSource() == 'AUTO_DETECT_IP';
|
721 |
}
|
722 |
|
723 |
/**
|
726 |
public function getSurveyEmail() {
|
727 |
return base64_decode( $this->getDef( 'survey_email' ) );
|
728 |
}
|
729 |
+
|
730 |
+
/**
|
731 |
+
* @return bool
|
732 |
+
* @deprecated 8.5.2
|
733 |
+
*/
|
734 |
+
public function hasImportExportMasterImportUrl() {
|
735 |
+
/** @var Plugin\Options $oOpts */
|
736 |
+
$oOpts = $this->getOptions();
|
737 |
+
return $oOpts->hasImportExportMasterImportUrl();
|
738 |
+
}
|
739 |
+
|
740 |
+
/**
|
741 |
+
* @return int
|
742 |
+
* @deprecated 8.5.2
|
743 |
+
*/
|
744 |
+
public function getImportExportHandshakeExpiresAt() {
|
745 |
+
return $this->getOpt( 'importexport_handshake_expires_at', Services::Request()->ts() );
|
746 |
+
}
|
747 |
+
|
748 |
+
/**
|
749 |
+
* @return string
|
750 |
+
* @deprecated 8.5.2
|
751 |
+
*/
|
752 |
+
public function getImportExportMasterImportUrl() {
|
753 |
+
return $this->getOpt( 'importexport_masterurl', '' );
|
754 |
+
}
|
755 |
+
|
756 |
+
/**
|
757 |
+
* @return bool
|
758 |
+
* @deprecated 8.5.2
|
759 |
+
*/
|
760 |
+
public function isImportExportPermitted() {
|
761 |
+
return $this->isPremium() && $this->isOpt( 'importexport_enable', 'Y' );
|
762 |
+
}
|
763 |
+
|
764 |
+
/**
|
765 |
+
* @return bool
|
766 |
+
* @deprecated 8.5.2
|
767 |
+
*/
|
768 |
+
public function readyToSendTrackingData() {
|
769 |
+
return Services::Request()
|
770 |
+
->carbon()
|
771 |
+
->subWeek()->timestamp > (int)$this->getOptions()->getOpt( 'tracking_last_sent_at', 0 );
|
772 |
+
}
|
773 |
+
|
774 |
+
/**
|
775 |
+
* @return bool
|
776 |
+
* @deprecated 8.5.2
|
777 |
+
*/
|
778 |
+
public function isTrackingEnabled() {
|
779 |
+
return $this->isOpt( 'enable_tracking', 'Y' );
|
780 |
+
}
|
781 |
+
|
782 |
+
/**
|
783 |
+
* @return bool
|
784 |
+
* @deprecated 8.5.2
|
785 |
+
*/
|
786 |
+
public function isTrackingPermissionSet() {
|
787 |
+
return !$this->isOpt( 'tracking_permission_set_at', 0 );
|
788 |
+
}
|
789 |
+
|
790 |
+
/**
|
791 |
+
* @return $this
|
792 |
+
* @deprecated 8.5.2
|
793 |
+
*/
|
794 |
+
public function setTrackingLastSentAt() {
|
795 |
+
return $this->setOpt( 'tracking_last_sent_at', Services::Request()->ts() );
|
796 |
+
}
|
797 |
+
|
798 |
+
/**
|
799 |
+
* @return int
|
800 |
+
* @deprecated 8.5.2
|
801 |
+
*/
|
802 |
+
public function getTrackingLastSentAt() {
|
803 |
+
return (int)max( 0, $this->getOptions()->getOpt( 'tracking_last_sent_at', 0 ) );
|
804 |
+
}
|
805 |
+
|
806 |
+
/**
|
807 |
+
* @return int
|
808 |
+
* @deprecated 8.5.2
|
809 |
+
*/
|
810 |
+
public function getActivatedAt() {
|
811 |
+
return (int)$this->getOpt( 'activated_at', 0 );
|
812 |
+
}
|
813 |
+
|
814 |
+
/**
|
815 |
+
* @return string[]
|
816 |
+
* @deprecated 8.5.1
|
817 |
+
*/
|
818 |
+
public function getMyServerIPs() {
|
819 |
+
return Services::IP()->getServerPublicIPs();
|
820 |
+
}
|
821 |
+
|
822 |
+
/**
|
823 |
+
* @return string
|
824 |
+
* @deprecated 8.5
|
825 |
+
*/
|
826 |
+
public function getMyServerIp() {
|
827 |
+
$aIPs = $this->getMyServerIPs();
|
828 |
+
return array_shift( $aIPs );
|
829 |
+
}
|
830 |
}
|
src/features/sessions.php
CHANGED
@@ -41,12 +41,4 @@ class ICWP_WPSF_FeatureHandler_Sessions extends ICWP_WPSF_FeatureHandler_BaseWps
|
|
41 |
protected function getNamespaceBase() {
|
42 |
return 'Sessions';
|
43 |
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @return Shield\Databases\Session\Handler
|
47 |
-
* @deprecated 8.4
|
48 |
-
*/
|
49 |
-
protected function loadDbHandler() {
|
50 |
-
return new Shield\Databases\Session\Handler();
|
51 |
-
}
|
52 |
}
|
41 |
protected function getNamespaceBase() {
|
42 |
return 'Sessions';
|
43 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
}
|
src/features/statistics.php
DELETED
@@ -1,25 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
-
use FernleafSystems\Wordpress\Services\Services;
|
5 |
-
|
6 |
-
/**
|
7 |
-
* Class ICWP_WPSF_FeatureHandler_Statistics
|
8 |
-
* @deprecated 8.4
|
9 |
-
*/
|
10 |
-
class ICWP_WPSF_FeatureHandler_Statistics extends ICWP_WPSF_FeatureHandler_BaseWpsf {
|
11 |
-
|
12 |
-
/**
|
13 |
-
* @return bool
|
14 |
-
*/
|
15 |
-
public function isModuleEnabled() {
|
16 |
-
return false;
|
17 |
-
}
|
18 |
-
|
19 |
-
/**
|
20 |
-
* @return string
|
21 |
-
*/
|
22 |
-
protected function getNamespaceBase() {
|
23 |
-
return 'Statistics';
|
24 |
-
}
|
25 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/features/traffic.php
CHANGED
@@ -82,6 +82,7 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
82 |
|
83 |
/**
|
84 |
* @return array
|
|
|
85 |
*/
|
86 |
public function getCustomExclusions() {
|
87 |
$aEx = $this->getOpt( 'custom_exclusions' );
|
@@ -164,12 +165,4 @@ class ICWP_WPSF_FeatureHandler_Traffic extends ICWP_WPSF_FeatureHandler_BaseWpsf
|
|
164 |
protected function getNamespaceBase() {
|
165 |
return 'Traffic';
|
166 |
}
|
167 |
-
|
168 |
-
/**
|
169 |
-
* @return Shield\Databases\Traffic\Handler
|
170 |
-
* @deprecated 8.4
|
171 |
-
*/
|
172 |
-
protected function loadDbHandler() {
|
173 |
-
return new Shield\Databases\Traffic\Handler();
|
174 |
-
}
|
175 |
}
|
82 |
|
83 |
/**
|
84 |
* @return array
|
85 |
+
* @deprecated 8.5.2
|
86 |
*/
|
87 |
public function getCustomExclusions() {
|
88 |
$aEx = $this->getOpt( 'custom_exclusions' );
|
165 |
protected function getNamespaceBase() {
|
166 |
return 'Traffic';
|
167 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
}
|
src/features/user_management.php
CHANGED
@@ -1,6 +1,7 @@
|
|
1 |
<?php
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
|
|
4 |
use FernleafSystems\Wordpress\Services\Services;
|
5 |
|
6 |
class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_BaseWpsf {
|
@@ -33,47 +34,22 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
33 |
return $aEmails;
|
34 |
}
|
35 |
|
36 |
-
/**
|
37 |
-
* @return int
|
38 |
-
*/
|
39 |
-
public function getIdleTimeoutInterval() {
|
40 |
-
return $this->getOpt( 'session_idle_timeout_interval' )*HOUR_IN_SECONDS;
|
41 |
-
}
|
42 |
-
|
43 |
-
/**
|
44 |
-
* @return int
|
45 |
-
*/
|
46 |
-
public function getMaxSessionTime() {
|
47 |
-
return $this->getOpt( 'session_timeout_interval' )*DAY_IN_SECONDS;
|
48 |
-
}
|
49 |
-
|
50 |
-
/**
|
51 |
-
* @return bool
|
52 |
-
*/
|
53 |
-
public function hasSessionIdleTimeout() {
|
54 |
-
return $this->isModuleEnabled() && ( $this->getIdleTimeoutInterval() > 0 );
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* @return bool
|
59 |
-
*/
|
60 |
-
public function hasMaxSessionTimeout() {
|
61 |
-
return $this->isModuleEnabled() && ( $this->getMaxSessionTime() > 0 );
|
62 |
-
}
|
63 |
-
|
64 |
protected function doExtraSubmitProcessing() {
|
65 |
-
|
|
|
|
|
|
|
66 |
|
67 |
-
if ( $
|
68 |
-
$
|
69 |
}
|
70 |
|
71 |
-
$
|
72 |
array_unique( array_filter( array_map(
|
73 |
function ( $sRole ) {
|
74 |
return preg_replace( '#[^\sa-z0-9_-]#i', '', trim( strtolower( $sRole ) ) );
|
75 |
},
|
76 |
-
$
|
77 |
) ) )
|
78 |
);
|
79 |
}
|
@@ -92,13 +68,6 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
92 |
}
|
93 |
}
|
94 |
|
95 |
-
/**
|
96 |
-
* @return bool
|
97 |
-
*/
|
98 |
-
public function isLockToIp() {
|
99 |
-
return $this->isOpt( 'session_lock_location', 'Y' );
|
100 |
-
}
|
101 |
-
|
102 |
/**
|
103 |
* @return bool
|
104 |
*/
|
@@ -115,6 +84,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
115 |
|
116 |
/**
|
117 |
* @return int seconds
|
|
|
118 |
*/
|
119 |
public function getPassExpireTimeout() {
|
120 |
return $this->getPassExpireDays()*DAY_IN_SECONDS;
|
@@ -122,6 +92,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
122 |
|
123 |
/**
|
124 |
* @return int
|
|
|
125 |
*/
|
126 |
public function getPassMinLength() {
|
127 |
return $this->isPremium() ? (int)$this->getOpt( 'pass_min_length' ) : 0;
|
@@ -129,6 +100,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
129 |
|
130 |
/**
|
131 |
* @return int
|
|
|
132 |
*/
|
133 |
public function getPassMinStrength() {
|
134 |
return $this->isPremium() ? (int)$this->getOpt( 'pass_min_strength' ) : 0;
|
@@ -151,6 +123,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
151 |
|
152 |
/**
|
153 |
* @return bool
|
|
|
154 |
*/
|
155 |
public function isPasswordPoliciesEnabled() {
|
156 |
return $this->isOpt( 'enable_password_policies', 'Y' )
|
@@ -159,6 +132,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
159 |
|
160 |
/**
|
161 |
* @return bool
|
|
|
162 |
*/
|
163 |
public function isPassForceUpdateExisting() {
|
164 |
return $this->isOpt( 'pass_force_existing', 'Y' );
|
@@ -166,6 +140,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
166 |
|
167 |
/**
|
168 |
* @return bool
|
|
|
169 |
*/
|
170 |
public function isPassExpirationEnabled() {
|
171 |
return $this->isPasswordPoliciesEnabled() && ( $this->getPassExpireTimeout() > 0 );
|
@@ -173,6 +148,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
173 |
|
174 |
/**
|
175 |
* @return bool
|
|
|
176 |
*/
|
177 |
public function isPassPreventPwned() {
|
178 |
return $this->isOpt( 'pass_prevent_pwned', 'Y' );
|
@@ -180,6 +156,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
180 |
|
181 |
/**
|
182 |
* @return bool
|
|
|
183 |
*/
|
184 |
public function isSuspendEnabled() {
|
185 |
return $this->isPremium() &&
|
@@ -191,6 +168,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
191 |
|
192 |
/**
|
193 |
* @return bool
|
|
|
194 |
*/
|
195 |
public function isSuspendManualEnabled() {
|
196 |
return $this->isOpt( 'manual_suspend', 'Y' );
|
@@ -198,6 +176,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
198 |
|
199 |
/**
|
200 |
* @return int
|
|
|
201 |
*/
|
202 |
public function getSuspendAutoIdleTime() {
|
203 |
return $this->getOpt( 'auto_idle_days', 0 )*DAY_IN_SECONDS;
|
@@ -205,6 +184,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
205 |
|
206 |
/**
|
207 |
* @return array
|
|
|
208 |
*/
|
209 |
public function getSuspendAutoIdleUserRoles() {
|
210 |
$aRoles = $this->getOpt( 'auto_idle_roles', [] );
|
@@ -213,6 +193,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
213 |
|
214 |
/**
|
215 |
* @return bool
|
|
|
216 |
*/
|
217 |
public function isSuspendAutoIdleEnabled() {
|
218 |
return ( $this->getSuspendAutoIdleTime() > 0 )
|
@@ -221,6 +202,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
221 |
|
222 |
/**
|
223 |
* @return bool
|
|
|
224 |
*/
|
225 |
public function isSuspendAutoPasswordEnabled() {
|
226 |
return $this->isOpt( 'auto_password', 'Y' )
|
@@ -256,7 +238,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
256 |
]
|
257 |
);
|
258 |
}
|
259 |
-
|
260 |
$oMeta->hard_suspended_at = 0;
|
261 |
unset( $aIds[ $nUserId ] );
|
262 |
$this->getCon()->fireEvent(
|
@@ -327,6 +309,9 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
327 |
* @return array
|
328 |
*/
|
329 |
public function addInsightsConfigData( $aAllData ) {
|
|
|
|
|
|
|
330 |
$aThis = [
|
331 |
'strings' => [
|
332 |
'title' => __( 'User Management', 'wp-simple-firewall' ),
|
@@ -340,7 +325,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
340 |
$aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
|
341 |
}
|
342 |
else {
|
343 |
-
$bHasIdle = $
|
344 |
$aThis[ 'key_opts' ][ 'idle' ] = [
|
345 |
'name' => __( 'Idle Users', 'wp-simple-firewall' ),
|
346 |
'enabled' => $bHasIdle,
|
@@ -351,7 +336,7 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
351 |
'href' => $this->getUrl_DirectLinkToOption( 'session_idle_timeout_interval' ),
|
352 |
];
|
353 |
|
354 |
-
$bLocked = $
|
355 |
$aThis[ 'key_opts' ][ 'lock' ] = [
|
356 |
'name' => __( 'Lock To IP', 'wp-simple-firewall' ),
|
357 |
'enabled' => $bLocked,
|
@@ -397,4 +382,52 @@ class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_
|
|
397 |
protected function getNamespaceBase() {
|
398 |
return 'UserManagement';
|
399 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
400 |
}
|
1 |
<?php
|
2 |
|
3 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
4 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\UserManagement;
|
5 |
use FernleafSystems\Wordpress\Services\Services;
|
6 |
|
7 |
class ICWP_WPSF_FeatureHandler_UserManagement extends \ICWP_WPSF_FeatureHandler_BaseWpsf {
|
34 |
return $aEmails;
|
35 |
}
|
36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
protected function doExtraSubmitProcessing() {
|
38 |
+
/** @var UserManagement\Options $oOpts */
|
39 |
+
$oOpts = $this->getOptions();
|
40 |
+
|
41 |
+
$oOpts->setOpt( 'enable_admin_login_email_notification', implode( ', ', $this->getAdminLoginNotificationEmails() ) );
|
42 |
|
43 |
+
if ( $oOpts->getIdleTimeoutInterval() > $oOpts->getMaxSessionTime() ) {
|
44 |
+
$oOpts->setOpt( 'session_idle_timeout_interval', $oOpts->getOpt( 'session_timeout_interval' )*24 );
|
45 |
}
|
46 |
|
47 |
+
$oOpts->setOpt( 'auto_idle_roles',
|
48 |
array_unique( array_filter( array_map(
|
49 |
function ( $sRole ) {
|
50 |
return preg_replace( '#[^\sa-z0-9_-]#i', '', trim( strtolower( $sRole ) ) );
|
51 |
},
|
52 |
+
$oOpts->getSuspendAutoIdleUserRoles()
|
53 |
) ) )
|
54 |
);
|
55 |
}
|
68 |
}
|
69 |
}
|
70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
/**
|
72 |
* @return bool
|
73 |
*/
|
84 |
|
85 |
/**
|
86 |
* @return int seconds
|
87 |
+
* @deprecated 8.5.2
|
88 |
*/
|
89 |
public function getPassExpireTimeout() {
|
90 |
return $this->getPassExpireDays()*DAY_IN_SECONDS;
|
92 |
|
93 |
/**
|
94 |
* @return int
|
95 |
+
* @deprecated 8.5.2
|
96 |
*/
|
97 |
public function getPassMinLength() {
|
98 |
return $this->isPremium() ? (int)$this->getOpt( 'pass_min_length' ) : 0;
|
100 |
|
101 |
/**
|
102 |
* @return int
|
103 |
+
* @deprecated 8.5.2
|
104 |
*/
|
105 |
public function getPassMinStrength() {
|
106 |
return $this->isPremium() ? (int)$this->getOpt( 'pass_min_strength' ) : 0;
|
123 |
|
124 |
/**
|
125 |
* @return bool
|
126 |
+
* @deprecated 8.5.2
|
127 |
*/
|
128 |
public function isPasswordPoliciesEnabled() {
|
129 |
return $this->isOpt( 'enable_password_policies', 'Y' )
|
132 |
|
133 |
/**
|
134 |
* @return bool
|
135 |
+
* @deprecated 8.5.2
|
136 |
*/
|
137 |
public function isPassForceUpdateExisting() {
|
138 |
return $this->isOpt( 'pass_force_existing', 'Y' );
|
140 |
|
141 |
/**
|
142 |
* @return bool
|
143 |
+
* @deprecated 8.5.2
|
144 |
*/
|
145 |
public function isPassExpirationEnabled() {
|
146 |
return $this->isPasswordPoliciesEnabled() && ( $this->getPassExpireTimeout() > 0 );
|
148 |
|
149 |
/**
|
150 |
* @return bool
|
151 |
+
* @deprecated 8.5.2
|
152 |
*/
|
153 |
public function isPassPreventPwned() {
|
154 |
return $this->isOpt( 'pass_prevent_pwned', 'Y' );
|
156 |
|
157 |
/**
|
158 |
* @return bool
|
159 |
+
* @deprecated 8.5.2
|
160 |
*/
|
161 |
public function isSuspendEnabled() {
|
162 |
return $this->isPremium() &&
|
168 |
|
169 |
/**
|
170 |
* @return bool
|
171 |
+
* @deprecated 8.5.2
|
172 |
*/
|
173 |
public function isSuspendManualEnabled() {
|
174 |
return $this->isOpt( 'manual_suspend', 'Y' );
|
176 |
|
177 |
/**
|
178 |
* @return int
|
179 |
+
* @deprecated 8.5.2
|
180 |
*/
|
181 |
public function getSuspendAutoIdleTime() {
|
182 |
return $this->getOpt( 'auto_idle_days', 0 )*DAY_IN_SECONDS;
|
184 |
|
185 |
/**
|
186 |
* @return array
|
187 |
+
* @deprecated 8.5.2
|
188 |
*/
|
189 |
public function getSuspendAutoIdleUserRoles() {
|
190 |
$aRoles = $this->getOpt( 'auto_idle_roles', [] );
|
193 |
|
194 |
/**
|
195 |
* @return bool
|
196 |
+
* @deprecated 8.5.2
|
197 |
*/
|
198 |
public function isSuspendAutoIdleEnabled() {
|
199 |
return ( $this->getSuspendAutoIdleTime() > 0 )
|
202 |
|
203 |
/**
|
204 |
* @return bool
|
205 |
+
* @deprecated 8.5.2
|
206 |
*/
|
207 |
public function isSuspendAutoPasswordEnabled() {
|
208 |
return $this->isOpt( 'auto_password', 'Y' )
|
238 |
]
|
239 |
);
|
240 |
}
|
241 |
+
elseif ( !$bAdd && $bIdSuspended ) {
|
242 |
$oMeta->hard_suspended_at = 0;
|
243 |
unset( $aIds[ $nUserId ] );
|
244 |
$this->getCon()->fireEvent(
|
309 |
* @return array
|
310 |
*/
|
311 |
public function addInsightsConfigData( $aAllData ) {
|
312 |
+
/** @var UserManagement\Options $oOpts */
|
313 |
+
$oOpts = $this->getOptions();
|
314 |
+
|
315 |
$aThis = [
|
316 |
'strings' => [
|
317 |
'title' => __( 'User Management', 'wp-simple-firewall' ),
|
325 |
$aThis[ 'key_opts' ][ 'mod' ] = $this->getModDisabledInsight();
|
326 |
}
|
327 |
else {
|
328 |
+
$bHasIdle = $oOpts->hasSessionIdleTimeout();
|
329 |
$aThis[ 'key_opts' ][ 'idle' ] = [
|
330 |
'name' => __( 'Idle Users', 'wp-simple-firewall' ),
|
331 |
'enabled' => $bHasIdle,
|
336 |
'href' => $this->getUrl_DirectLinkToOption( 'session_idle_timeout_interval' ),
|
337 |
];
|
338 |
|
339 |
+
$bLocked = $oOpts->isLockToIp();
|
340 |
$aThis[ 'key_opts' ][ 'lock' ] = [
|
341 |
'name' => __( 'Lock To IP', 'wp-simple-firewall' ),
|
342 |
'enabled' => $bLocked,
|
382 |
protected function getNamespaceBase() {
|
383 |
return 'UserManagement';
|
384 |
}
|
385 |
+
|
386 |
+
/**
|
387 |
+
* @return int
|
388 |
+
* @deprecated 8.5
|
389 |
+
*/
|
390 |
+
public function getMaxSessionTime() {
|
391 |
+
/** @var UserManagement\Options $oOpts */
|
392 |
+
$oOpts = $this->getOptions();
|
393 |
+
return $oOpts->getMaxSessionTime();
|
394 |
+
}
|
395 |
+
|
396 |
+
/**
|
397 |
+
* @return int
|
398 |
+
* @deprecated 8.5
|
399 |
+
*/
|
400 |
+
public function getIdleTimeoutInterval() {
|
401 |
+
return $this->getOpt( 'session_idle_timeout_interval' )*HOUR_IN_SECONDS;
|
402 |
+
}
|
403 |
+
|
404 |
+
/**
|
405 |
+
* @return bool
|
406 |
+
* @deprecated 8.5
|
407 |
+
*/
|
408 |
+
public function hasMaxSessionTimeout() {
|
409 |
+
/** @var UserManagement\Options $oOpts */
|
410 |
+
$oOpts = $this->getOptions();
|
411 |
+
return $oOpts->hasMaxSessionTimeout();
|
412 |
+
}
|
413 |
+
|
414 |
+
/**
|
415 |
+
* @return bool
|
416 |
+
* @deprecated 8.5
|
417 |
+
*/
|
418 |
+
public function hasSessionIdleTimeout() {
|
419 |
+
/** @var UserManagement\Options $oOpts */
|
420 |
+
$oOpts = $this->getOptions();
|
421 |
+
return $oOpts->hasSessionIdleTimeout();
|
422 |
+
}
|
423 |
+
|
424 |
+
/**
|
425 |
+
* @return bool
|
426 |
+
* @deprecated 8.5
|
427 |
+
*/
|
428 |
+
public function isLockToIp() {
|
429 |
+
/** @var UserManagement\Options $oOpts */
|
430 |
+
$oOpts = $this->getOptions();
|
431 |
+
return $oOpts->isLockToIp();
|
432 |
+
}
|
433 |
}
|
src/lib/src/Controller/Controller.php
CHANGED
@@ -2,11 +2,29 @@
|
|
2 |
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Controller;
|
4 |
|
5 |
-
use FernleafSystems\
|
6 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
|
|
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
class Controller extends Shield\Deprecated\Foundation {
|
9 |
|
|
|
|
|
10 |
/**
|
11 |
* @var \stdClass
|
12 |
*/
|
@@ -23,7 +41,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
23 |
private $sRootFile;
|
24 |
|
25 |
/**
|
26 |
-
* @var
|
27 |
*/
|
28 |
protected $bRebuildOptions;
|
29 |
|
@@ -87,24 +105,60 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
87 |
*/
|
88 |
protected $oNotices;
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
/**
|
91 |
* @param string $sRootFile
|
92 |
* @return Controller
|
93 |
* @throws \Exception
|
94 |
*/
|
95 |
public static function GetInstance( $sRootFile = null ) {
|
96 |
-
if ( !isset(
|
97 |
-
|
98 |
}
|
99 |
-
return
|
100 |
}
|
101 |
|
102 |
/**
|
103 |
* @param string $sRootFile
|
104 |
* @throws \Exception
|
105 |
*/
|
106 |
-
|
107 |
$this->sRootFile = $sRootFile;
|
|
|
|
|
108 |
$this->loadServices();
|
109 |
$this->checkMinimumRequirements();
|
110 |
$this->doRegisterHooks();
|
@@ -237,6 +291,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
237 |
do_action( $this->prefix( 'deactivate_plugin' ) );
|
238 |
if ( apply_filters( $this->prefix( 'delete_on_deactivate' ), false ) ) {
|
239 |
$this->bPluginDeleting = true;
|
|
|
240 |
do_action( $this->prefix( 'delete_plugin' ) );
|
241 |
$this->deletePluginControllerOptions();
|
242 |
}
|
@@ -245,7 +300,11 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
245 |
}
|
246 |
|
247 |
public function onWpActivatePlugin() {
|
248 |
-
$this->
|
|
|
|
|
|
|
|
|
249 |
}
|
250 |
|
251 |
/**
|
@@ -359,9 +418,10 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
359 |
|
360 |
if ( Services::Request()->query( $this->prefix( 'runtests' ) ) && $this->isPluginAdmin() ) {
|
361 |
$this->runTests();
|
362 |
-
}
|
363 |
|
364 |
-
if ( !Services::WpGeneral()->isAjax()
|
|
|
365 |
wp_add_privacy_policy_content( $this->getHumanName(), $this->buildPrivacyPolicyContent() );
|
366 |
}
|
367 |
}
|
@@ -427,14 +487,17 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
427 |
wp_add_dashboard_widget(
|
428 |
$this->prefix( 'dashboard_widget' ),
|
429 |
apply_filters( $this->prefix( 'dashboard_widget_title' ), $this->getHumanName() ),
|
430 |
-
|
|
|
|
|
431 |
);
|
432 |
}
|
433 |
}
|
434 |
|
|
|
|
|
|
|
435 |
public function displayDashboardWidget() {
|
436 |
-
$aContent = apply_filters( $this->prefix( 'dashboard_widget_content' ), [] );
|
437 |
-
echo implode( '', $aContent );
|
438 |
}
|
439 |
|
440 |
/**
|
@@ -552,25 +615,6 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
552 |
}
|
553 |
}
|
554 |
|
555 |
-
/**
|
556 |
-
* @param string $sEventTag
|
557 |
-
* @param array $aMetaData
|
558 |
-
* @return $this
|
559 |
-
*/
|
560 |
-
public function fireEvent( $sEventTag, $aMetaData = [] ) {
|
561 |
-
if ( apply_filters( $this->prefix( 'is_event_supported' ), false, $sEventTag ) ) {
|
562 |
-
do_action( $this->prefix( 'event' ), $sEventTag, $aMetaData );
|
563 |
-
}
|
564 |
-
return $this;
|
565 |
-
}
|
566 |
-
|
567 |
-
/**
|
568 |
-
* @return array
|
569 |
-
*/
|
570 |
-
public function getAllEvents() {
|
571 |
-
return apply_filters( $this->prefix( 'get_all_events' ), [] );
|
572 |
-
}
|
573 |
-
|
574 |
/**
|
575 |
* Displaying all views now goes through this central function and we work out
|
576 |
* what to display based on the name of current hook/filter being processed.
|
@@ -819,9 +863,9 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
819 |
/**
|
820 |
* This is a filter method designed to say whether WordPress plugin upgrades should be permitted,
|
821 |
* based on the plugin settings.
|
822 |
-
* @param
|
823 |
* @param string|object $mItem
|
824 |
-
* @return
|
825 |
*/
|
826 |
public function onWpAutoUpdate( $bDoAutoUpdate, $mItem ) {
|
827 |
$oWp = Services::WpGeneral();
|
@@ -869,8 +913,6 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
869 |
break;
|
870 |
|
871 |
case 'pass' :
|
872 |
-
break;
|
873 |
-
|
874 |
default:
|
875 |
break;
|
876 |
}
|
@@ -1118,7 +1160,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1118 |
if ( !$oWp->isMultisite() && is_admin() ) {
|
1119 |
return true;
|
1120 |
}
|
1121 |
-
|
1122 |
return true;
|
1123 |
}
|
1124 |
return false;
|
@@ -1152,11 +1194,12 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1152 |
/**
|
1153 |
* DO NOT CHANGE THIS IMPLEMENTATION. We call this as early as possible so that the
|
1154 |
* current_user_can() never gets caught up in an infinite loop of permissions checking
|
1155 |
-
* @return
|
1156 |
*/
|
1157 |
public function getMeetsBasePermissions() {
|
1158 |
if ( did_action( 'init' ) && !isset( $this->bMeetsBasePermissions ) ) {
|
1159 |
$this->bMeetsBasePermissions = current_user_can( $this->getBasePermissions() );
|
|
|
1160 |
}
|
1161 |
return isset( $this->bMeetsBasePermissions ) ? $this->bMeetsBasePermissions : false;
|
1162 |
}
|
@@ -1228,12 +1271,13 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1228 |
&& hash_equals( $oConOptions->hash, $sCurrentHash ) ) {
|
1229 |
$this->bRebuildOptions = false;
|
1230 |
}
|
1231 |
-
|
1232 |
$this->bRebuildOptions = false;
|
1233 |
}
|
1234 |
|
1235 |
$oConOptions->hash = $sCurrentHash;
|
1236 |
$oConOptions->mod_time = $sModifiedTime;
|
|
|
1237 |
return $this->bRebuildOptions;
|
1238 |
}
|
1239 |
|
@@ -1245,18 +1289,19 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1245 |
}
|
1246 |
|
1247 |
/**
|
1248 |
-
* @return
|
1249 |
*/
|
1250 |
public function getIsResetPlugin() {
|
1251 |
if ( !isset( $this->bResetPlugin ) ) {
|
1252 |
$bExists = Services::WpFs()->isFile( $this->getPath_Flags( 'reset' ) );
|
1253 |
$this->bResetPlugin = (bool)$bExists;
|
|
|
1254 |
}
|
1255 |
return $this->bResetPlugin;
|
1256 |
}
|
1257 |
|
1258 |
/**
|
1259 |
-
* @return
|
1260 |
*/
|
1261 |
public function getIsWpmsNetworkAdminOnly() {
|
1262 |
return $this->getPluginSpec_Property( 'wpms_network_admin_only' );
|
@@ -1478,8 +1523,15 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1478 |
* @return string
|
1479 |
*/
|
1480 |
public function getRootFile() {
|
1481 |
-
if (
|
1482 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1483 |
}
|
1484 |
return $this->sRootFile;
|
1485 |
}
|
@@ -1554,7 +1606,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1554 |
/**
|
1555 |
*/
|
1556 |
protected function deleteCronJobs() {
|
1557 |
-
$oWpCron =
|
1558 |
$aCrons = $oWpCron->getCrons();
|
1559 |
|
1560 |
$sPattern = sprintf( '#^(%s|%s)#', $this->getParentSlug(), $this->getPluginSlug() );
|
@@ -1655,6 +1707,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1655 |
if ( $this->getIfForceOffActive() ) {
|
1656 |
Services::WpFs()->deleteFile( $this->getForceOffFilePath() );
|
1657 |
$this->sForceOffFile = null;
|
|
|
1658 |
clearstatcache();
|
1659 |
}
|
1660 |
return $this;
|
@@ -1675,6 +1728,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1675 |
$oFs = Services::WpFs();
|
1676 |
$sFile = $oFs->findFileInDir( 'forceOff', $this->getRootDir(), false, false );
|
1677 |
$this->sForceOffFile = ( !empty( $sFile ) && $oFs->isFile( $sFile ) ) ? $sFile : false;
|
|
|
1678 |
}
|
1679 |
return $this->sForceOffFile;
|
1680 |
}
|
@@ -1778,6 +1832,8 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1778 |
}
|
1779 |
}
|
1780 |
|
|
|
|
|
1781 |
do_action( $this->prefix( 'run_processors' ) );
|
1782 |
|
1783 |
return $bSuccess;
|
@@ -1790,6 +1846,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1790 |
public function getModule( $sSlug ) {
|
1791 |
if ( !is_array( $this->aModules ) ) {
|
1792 |
$this->aModules = [];
|
|
|
1793 |
}
|
1794 |
$oModule = isset( $this->aModules[ $sSlug ] ) ? $this->aModules[ $sSlug ] : null;
|
1795 |
if ( !is_null( $oModule ) && !( $oModule instanceof \ICWP_WPSF_FeatureHandler_Base ) ) {
|
@@ -1819,6 +1876,13 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1819 |
return $this->getModule( 'events' );
|
1820 |
}
|
1821 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1822 |
/**
|
1823 |
* @return \ICWP_WPSF_FeatureHandler_Insights
|
1824 |
*/
|
@@ -1833,6 +1897,13 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1833 |
return $this->getModule( 'ips' );
|
1834 |
}
|
1835 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1836 |
/**
|
1837 |
* @return \ICWP_WPSF_FeatureHandler_LoginProtect
|
1838 |
*/
|
@@ -1917,6 +1988,7 @@ class Controller extends Shield\Deprecated\Foundation {
|
|
1917 |
}
|
1918 |
|
1919 |
$this->aModules[ $sModSlug ] = $this->{$sOptionsVarName};
|
|
|
1920 |
return $this->{$sOptionsVarName};
|
1921 |
}
|
1922 |
|
2 |
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Controller;
|
4 |
|
5 |
+
use FernleafSystems\Utilities\Data\Adapter\StdClassAdapter;
|
6 |
use FernleafSystems\Wordpress\Plugin\Shield;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
|
9 |
+
/**
|
10 |
+
* Class Controller
|
11 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Controller
|
12 |
+
* @property bool $is_activating
|
13 |
+
* @property bool $modules_loaded
|
14 |
+
* @property bool $rebuild_options
|
15 |
+
* @property bool $plugin_deleting
|
16 |
+
* @property bool $plugin_reset
|
17 |
+
* @property string $file_forceoff
|
18 |
+
* @property string $base_file
|
19 |
+
* @property string $root_file
|
20 |
+
* @property bool $user_can_base_permissions
|
21 |
+
* @property Shield\Modules\Events\Lib\EventsService $service_events
|
22 |
+
* @property \ICWP_WPSF_FeatureHandler_Base[] $modules
|
23 |
+
*/
|
24 |
class Controller extends Shield\Deprecated\Foundation {
|
25 |
|
26 |
+
use StdClassAdapter;
|
27 |
+
|
28 |
/**
|
29 |
* @var \stdClass
|
30 |
*/
|
41 |
private $sRootFile;
|
42 |
|
43 |
/**
|
44 |
+
* @var bool
|
45 |
*/
|
46 |
protected $bRebuildOptions;
|
47 |
|
105 |
*/
|
106 |
protected $oNotices;
|
107 |
|
108 |
+
/**
|
109 |
+
* @var Shield\Modules\Events\Lib\EventsService
|
110 |
+
*/
|
111 |
+
private $oEventsService;
|
112 |
+
|
113 |
+
/**
|
114 |
+
* @param string $sEventTag
|
115 |
+
* @param array $aMetaData
|
116 |
+
* @return $this
|
117 |
+
*/
|
118 |
+
public function fireEvent( $sEventTag, $aMetaData = [] ) {
|
119 |
+
$this->loadEventsService()->fireEvent( $sEventTag, $aMetaData );
|
120 |
+
return $this;
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* @return array
|
125 |
+
*/
|
126 |
+
public function getAllEvents() {
|
127 |
+
return $this->loadEventsService()->getEvents();
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* @return Shield\Modules\Events\Lib\EventsService
|
132 |
+
*/
|
133 |
+
public function loadEventsService() {
|
134 |
+
if ( !isset( $this->oEventsService ) ) {
|
135 |
+
$this->oEventsService = ( new Shield\Modules\Events\Lib\EventsService() )
|
136 |
+
->setCon( $this );
|
137 |
+
$this->service_events = $this->oEventsService;
|
138 |
+
}
|
139 |
+
return $this->oEventsService;
|
140 |
+
}
|
141 |
+
|
142 |
/**
|
143 |
* @param string $sRootFile
|
144 |
* @return Controller
|
145 |
* @throws \Exception
|
146 |
*/
|
147 |
public static function GetInstance( $sRootFile = null ) {
|
148 |
+
if ( !isset( static::$oInstance ) ) {
|
149 |
+
static::$oInstance = new static( $sRootFile );
|
150 |
}
|
151 |
+
return static::$oInstance;
|
152 |
}
|
153 |
|
154 |
/**
|
155 |
* @param string $sRootFile
|
156 |
* @throws \Exception
|
157 |
*/
|
158 |
+
protected function __construct( $sRootFile ) {
|
159 |
$this->sRootFile = $sRootFile;
|
160 |
+
$this->root_file = $sRootFile;
|
161 |
+
$this->base_file = $this->getRootFile();
|
162 |
$this->loadServices();
|
163 |
$this->checkMinimumRequirements();
|
164 |
$this->doRegisterHooks();
|
291 |
do_action( $this->prefix( 'deactivate_plugin' ) );
|
292 |
if ( apply_filters( $this->prefix( 'delete_on_deactivate' ), false ) ) {
|
293 |
$this->bPluginDeleting = true;
|
294 |
+
$this->plugin_deleting = $this->bPluginDeleting;
|
295 |
do_action( $this->prefix( 'delete_plugin' ) );
|
296 |
$this->deletePluginControllerOptions();
|
297 |
}
|
300 |
}
|
301 |
|
302 |
public function onWpActivatePlugin() {
|
303 |
+
$this->is_activating = true;
|
304 |
+
$oModPlugin = $this->getModule_Plugin();
|
305 |
+
if ( $oModPlugin instanceof \ICWP_WPSF_FeatureHandler_Base ) {
|
306 |
+
$oModPlugin->setActivatedAt();
|
307 |
+
}
|
308 |
}
|
309 |
|
310 |
/**
|
418 |
|
419 |
if ( Services::Request()->query( $this->prefix( 'runtests' ) ) && $this->isPluginAdmin() ) {
|
420 |
$this->runTests();
|
421 |
+
}
|
422 |
|
423 |
+
if ( !empty( $this->modules_loaded ) && !Services::WpGeneral()->isAjax()
|
424 |
+
&& function_exists( 'wp_add_privacy_policy_content' ) ) {
|
425 |
wp_add_privacy_policy_content( $this->getHumanName(), $this->buildPrivacyPolicyContent() );
|
426 |
}
|
427 |
}
|
487 |
wp_add_dashboard_widget(
|
488 |
$this->prefix( 'dashboard_widget' ),
|
489 |
apply_filters( $this->prefix( 'dashboard_widget_title' ), $this->getHumanName() ),
|
490 |
+
function () {
|
491 |
+
do_action( $this->prefix( 'dashboard_widget_content' ) );
|
492 |
+
}
|
493 |
);
|
494 |
}
|
495 |
}
|
496 |
|
497 |
+
/**
|
498 |
+
* @deprecated 8.5.7
|
499 |
+
*/
|
500 |
public function displayDashboardWidget() {
|
|
|
|
|
501 |
}
|
502 |
|
503 |
/**
|
615 |
}
|
616 |
}
|
617 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
618 |
/**
|
619 |
* Displaying all views now goes through this central function and we work out
|
620 |
* what to display based on the name of current hook/filter being processed.
|
863 |
/**
|
864 |
* This is a filter method designed to say whether WordPress plugin upgrades should be permitted,
|
865 |
* based on the plugin settings.
|
866 |
+
* @param bool $bDoAutoUpdate
|
867 |
* @param string|object $mItem
|
868 |
+
* @return bool
|
869 |
*/
|
870 |
public function onWpAutoUpdate( $bDoAutoUpdate, $mItem ) {
|
871 |
$oWp = Services::WpGeneral();
|
913 |
break;
|
914 |
|
915 |
case 'pass' :
|
|
|
|
|
916 |
default:
|
917 |
break;
|
918 |
}
|
1160 |
if ( !$oWp->isMultisite() && is_admin() ) {
|
1161 |
return true;
|
1162 |
}
|
1163 |
+
elseif ( $oWp->isMultisite() && $this->getIsWpmsNetworkAdminOnly() && ( is_network_admin() || $oWp->isAjax() ) ) {
|
1164 |
return true;
|
1165 |
}
|
1166 |
return false;
|
1194 |
/**
|
1195 |
* DO NOT CHANGE THIS IMPLEMENTATION. We call this as early as possible so that the
|
1196 |
* current_user_can() never gets caught up in an infinite loop of permissions checking
|
1197 |
+
* @return bool
|
1198 |
*/
|
1199 |
public function getMeetsBasePermissions() {
|
1200 |
if ( did_action( 'init' ) && !isset( $this->bMeetsBasePermissions ) ) {
|
1201 |
$this->bMeetsBasePermissions = current_user_can( $this->getBasePermissions() );
|
1202 |
+
$this->user_can_base_permissions = $this->bMeetsBasePermissions;
|
1203 |
}
|
1204 |
return isset( $this->bMeetsBasePermissions ) ? $this->bMeetsBasePermissions : false;
|
1205 |
}
|
1271 |
&& hash_equals( $oConOptions->hash, $sCurrentHash ) ) {
|
1272 |
$this->bRebuildOptions = false;
|
1273 |
}
|
1274 |
+
elseif ( isset( $oConOptions->mod_time ) && ( $sModifiedTime < $oConOptions->mod_time ) ) {
|
1275 |
$this->bRebuildOptions = false;
|
1276 |
}
|
1277 |
|
1278 |
$oConOptions->hash = $sCurrentHash;
|
1279 |
$oConOptions->mod_time = $sModifiedTime;
|
1280 |
+
$this->rebuild_options = $this->bRebuildOptions;
|
1281 |
return $this->bRebuildOptions;
|
1282 |
}
|
1283 |
|
1289 |
}
|
1290 |
|
1291 |
/**
|
1292 |
+
* @return bool
|
1293 |
*/
|
1294 |
public function getIsResetPlugin() {
|
1295 |
if ( !isset( $this->bResetPlugin ) ) {
|
1296 |
$bExists = Services::WpFs()->isFile( $this->getPath_Flags( 'reset' ) );
|
1297 |
$this->bResetPlugin = (bool)$bExists;
|
1298 |
+
$this->plugin_reset = $this->bResetPlugin;
|
1299 |
}
|
1300 |
return $this->bResetPlugin;
|
1301 |
}
|
1302 |
|
1303 |
/**
|
1304 |
+
* @return bool
|
1305 |
*/
|
1306 |
public function getIsWpmsNetworkAdminOnly() {
|
1307 |
return $this->getPluginSpec_Property( 'wpms_network_admin_only' );
|
1523 |
* @return string
|
1524 |
*/
|
1525 |
public function getRootFile() {
|
1526 |
+
if ( empty( $this->sRootFile ) ) {
|
1527 |
+
$oVO = ( new \FernleafSystems\Wordpress\Services\Utilities\WpOrg\Plugin\Files() )
|
1528 |
+
->findPluginFromFile( __FILE__ );
|
1529 |
+
if ( $oVO instanceof \FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo ) {
|
1530 |
+
$this->sRootFile = path_join( WP_PLUGIN_DIR, $oVO->file );
|
1531 |
+
}
|
1532 |
+
else {
|
1533 |
+
$this->sRootFile = __FILE__;
|
1534 |
+
}
|
1535 |
}
|
1536 |
return $this->sRootFile;
|
1537 |
}
|
1606 |
/**
|
1607 |
*/
|
1608 |
protected function deleteCronJobs() {
|
1609 |
+
$oWpCron = Services::WpCron();
|
1610 |
$aCrons = $oWpCron->getCrons();
|
1611 |
|
1612 |
$sPattern = sprintf( '#^(%s|%s)#', $this->getParentSlug(), $this->getPluginSlug() );
|
1707 |
if ( $this->getIfForceOffActive() ) {
|
1708 |
Services::WpFs()->deleteFile( $this->getForceOffFilePath() );
|
1709 |
$this->sForceOffFile = null;
|
1710 |
+
unset( $this->file_forceoff );
|
1711 |
clearstatcache();
|
1712 |
}
|
1713 |
return $this;
|
1728 |
$oFs = Services::WpFs();
|
1729 |
$sFile = $oFs->findFileInDir( 'forceOff', $this->getRootDir(), false, false );
|
1730 |
$this->sForceOffFile = ( !empty( $sFile ) && $oFs->isFile( $sFile ) ) ? $sFile : false;
|
1731 |
+
$this->file_forceoff = $this->sForceOffFile;
|
1732 |
}
|
1733 |
return $this->sForceOffFile;
|
1734 |
}
|
1832 |
}
|
1833 |
}
|
1834 |
|
1835 |
+
$this->modules_loaded = true;
|
1836 |
+
|
1837 |
do_action( $this->prefix( 'run_processors' ) );
|
1838 |
|
1839 |
return $bSuccess;
|
1846 |
public function getModule( $sSlug ) {
|
1847 |
if ( !is_array( $this->aModules ) ) {
|
1848 |
$this->aModules = [];
|
1849 |
+
$this->modules = $this->aModules;
|
1850 |
}
|
1851 |
$oModule = isset( $this->aModules[ $sSlug ] ) ? $this->aModules[ $sSlug ] : null;
|
1852 |
if ( !is_null( $oModule ) && !( $oModule instanceof \ICWP_WPSF_FeatureHandler_Base ) ) {
|
1876 |
return $this->getModule( 'events' );
|
1877 |
}
|
1878 |
|
1879 |
+
/**
|
1880 |
+
* @return \ICWP_WPSF_FeatureHandler_HackProtect
|
1881 |
+
*/
|
1882 |
+
public function getModule_HackGuard() {
|
1883 |
+
return $this->getModule( 'hack_protect' );
|
1884 |
+
}
|
1885 |
+
|
1886 |
/**
|
1887 |
* @return \ICWP_WPSF_FeatureHandler_Insights
|
1888 |
*/
|
1897 |
return $this->getModule( 'ips' );
|
1898 |
}
|
1899 |
|
1900 |
+
/**
|
1901 |
+
* @return \ICWP_WPSF_FeatureHandler_License
|
1902 |
+
*/
|
1903 |
+
public function getModule_License() {
|
1904 |
+
return $this->getModule( 'license' );
|
1905 |
+
}
|
1906 |
+
|
1907 |
/**
|
1908 |
* @return \ICWP_WPSF_FeatureHandler_LoginProtect
|
1909 |
*/
|
1988 |
}
|
1989 |
|
1990 |
$this->aModules[ $sModSlug ] = $this->{$sOptionsVarName};
|
1991 |
+
$this->modules = $this->aModules;
|
1992 |
return $this->{$sOptionsVarName};
|
1993 |
}
|
1994 |
|
src/lib/src/Databases/AuditTrail/EntryVO.php
CHANGED
@@ -7,14 +7,16 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
*
|
10 |
-
* @property string ip
|
11 |
-
* @property string message
|
12 |
-
* @property string wp_username
|
13 |
-
* @property string rid
|
14 |
-
* @property string
|
15 |
-
* @property string
|
16 |
-
* @property string
|
17 |
-
* @property string
|
|
|
|
|
18 |
*/
|
19 |
class EntryVO extends Base\EntryVO {
|
20 |
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
*
|
10 |
+
* @property string $$ip
|
11 |
+
* @property string $message
|
12 |
+
* @property string $wp_username
|
13 |
+
* @property string $rid
|
14 |
+
* @property string $ip
|
15 |
+
* @property string $event
|
16 |
+
* @property string $context
|
17 |
+
* @property string $category
|
18 |
+
* @property int $count
|
19 |
+
* @property string $data - do not access directly! Instead getAuditData()
|
20 |
*/
|
21 |
class EntryVO extends Base\EntryVO {
|
22 |
|
src/lib/src/Databases/AuditTrail/Handler.php
CHANGED
@@ -4,7 +4,6 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
|
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Options;
|
7 |
-
use FernleafSystems\Wordpress\Services\Services;
|
8 |
|
9 |
class Handler extends Base\Handler {
|
10 |
|
@@ -15,46 +14,6 @@ class Handler extends Base\Handler {
|
|
15 |
$this->trimDb( $oOpts->getMaxEntries() );
|
16 |
}
|
17 |
|
18 |
-
/**
|
19 |
-
* @param $aEvents - array of events: key event slug, value created_at timestamp
|
20 |
-
*/
|
21 |
-
public function commitAudits( $aEvents ) {
|
22 |
-
foreach ( $aEvents as $oEntry ) {
|
23 |
-
$this->commitAudit( $oEntry );
|
24 |
-
}
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* @param EntryVO $oEntry
|
29 |
-
*/
|
30 |
-
public function commitAudit( $oEntry ) {
|
31 |
-
$oWp = Services::WpGeneral();
|
32 |
-
$oWpUsers = Services::WpUsers();
|
33 |
-
|
34 |
-
$oEntry->rid = $this->getCon()->getShortRequestId();
|
35 |
-
if ( empty( $oEntry->message ) ) {
|
36 |
-
$oEntry->message = '';
|
37 |
-
}
|
38 |
-
if ( empty( $oEntry->wp_username ) ) {
|
39 |
-
if ( $oWpUsers->isUserLoggedIn() ) {
|
40 |
-
$sUser = $oWpUsers->getCurrentWpUsername();
|
41 |
-
}
|
42 |
-
else if ( $oWp->isCron() ) {
|
43 |
-
$sUser = 'WP Cron';
|
44 |
-
}
|
45 |
-
else if ( $oWp->isWpCli() ) {
|
46 |
-
$sUser = 'WP CLI';
|
47 |
-
}
|
48 |
-
else {
|
49 |
-
$sUser = '-';
|
50 |
-
}
|
51 |
-
$oEntry->wp_username = $sUser;
|
52 |
-
}
|
53 |
-
/** @var Insert $oQI */
|
54 |
-
$oQI = $this->getQueryInserter();
|
55 |
-
$oQI->insert( $oEntry );
|
56 |
-
}
|
57 |
-
|
58 |
/**
|
59 |
* @return array
|
60 |
*/
|
@@ -88,9 +47,25 @@ class Handler extends Base\Handler {
|
|
88 |
message text COMMENT 'Audit Event Description',
|
89 |
meta text COMMENT 'Audit Event Data',
|
90 |
immutable tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'May Be Deleted',
|
|
|
|
|
91 |
created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
92 |
deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
93 |
PRIMARY KEY (id)
|
94 |
) %s;";
|
95 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
}
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Options;
|
|
|
7 |
|
8 |
class Handler extends Base\Handler {
|
9 |
|
14 |
$this->trimDb( $oOpts->getMaxEntries() );
|
15 |
}
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
/**
|
18 |
* @return array
|
19 |
*/
|
47 |
message text COMMENT 'Audit Event Description',
|
48 |
meta text COMMENT 'Audit Event Data',
|
49 |
immutable tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'May Be Deleted',
|
50 |
+
count SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1 COMMENT 'Repeat Count',
|
51 |
+
updated_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
52 |
created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
53 |
deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
54 |
PRIMARY KEY (id)
|
55 |
) %s;";
|
56 |
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @param EntryVO[] $aEvents - array of events: key event slug, value created_at timestamp
|
60 |
+
* @deprecated 8.5
|
61 |
+
*/
|
62 |
+
public function commitAudits( $aEvents ) {
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @param EntryVO $oEntry
|
67 |
+
* @deprecated 8.5
|
68 |
+
*/
|
69 |
+
public function commitAudit( $oEntry ) {
|
70 |
+
}
|
71 |
}
|
src/lib/src/Databases/AuditTrail/Insert.php
CHANGED
@@ -16,18 +16,14 @@ class Insert extends Base\Insert {
|
|
16 |
|
17 |
$aData = $this->getInsertData();
|
18 |
|
19 |
-
if ( !isset( $aData[ 'ip' ] ) ) {
|
20 |
-
$aData[ 'ip' ] = Services::IP()->getRequestIp();
|
21 |
-
}
|
22 |
if ( is_array( $aData[ 'message' ] ) ) {
|
23 |
$aData[ 'message' ] = implode( ' ', $aData[ 'message' ] );
|
24 |
}
|
25 |
if ( isset( $aData[ 'data' ] ) && !is_string( $aData[ 'data' ] ) ) {
|
26 |
$aData[ 'data' ] = '';
|
27 |
}
|
28 |
-
if ( empty( $aData[ '
|
29 |
-
$
|
30 |
-
$aData[ 'wp_username' ] = $oWpUsers->isUserLoggedIn() ? $oWpUsers->getCurrentWpUsername() : 'unknown';
|
31 |
}
|
32 |
|
33 |
return $this->setInsertData( $aData );
|
16 |
|
17 |
$aData = $this->getInsertData();
|
18 |
|
|
|
|
|
|
|
19 |
if ( is_array( $aData[ 'message' ] ) ) {
|
20 |
$aData[ 'message' ] = implode( ' ', $aData[ 'message' ] );
|
21 |
}
|
22 |
if ( isset( $aData[ 'data' ] ) && !is_string( $aData[ 'data' ] ) ) {
|
23 |
$aData[ 'data' ] = '';
|
24 |
}
|
25 |
+
if ( empty( $aData[ 'ip' ] ) || !Services::IP()->isValidIp( $aData[ 'ip' ] ) ) {
|
26 |
+
$aData[ 'ip' ] = '';
|
|
|
27 |
}
|
28 |
|
29 |
return $this->setInsertData( $aData );
|
src/lib/src/Databases/AuditTrail/Select.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
|
6 |
use FernleafSystems\Wordpress\Services\Services;
|
7 |
|
8 |
class Select extends Base\Select {
|
@@ -18,7 +19,7 @@ class Select extends Base\Select {
|
|
18 |
* @return string[]
|
19 |
*/
|
20 |
public function getDistinctIps() {
|
21 |
-
return $this->
|
22 |
}
|
23 |
|
24 |
/**
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
|
7 |
use FernleafSystems\Wordpress\Services\Services;
|
8 |
|
9 |
class Select extends Base\Select {
|
19 |
* @return string[]
|
20 |
*/
|
21 |
public function getDistinctIps() {
|
22 |
+
return IpListSort::Sort( $this->getDistinctForColumn( 'ip' ) );
|
23 |
}
|
24 |
|
25 |
/**
|
src/lib/src/Databases/AuditTrail/Update.php
CHANGED
@@ -6,4 +6,12 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
6 |
|
7 |
class Update extends Base\Update {
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
}
|
6 |
|
7 |
class Update extends Base\Update {
|
8 |
|
9 |
+
/**
|
10 |
+
* @param EntryVO $oEntry
|
11 |
+
* @param int $nIncrease
|
12 |
+
* @return bool
|
13 |
+
*/
|
14 |
+
public function updateCount( $oEntry, $nIncrease = 1 ) {
|
15 |
+
return $this->updateEntry( $oEntry, [ 'count' => $oEntry->count + $nIncrease ] );
|
16 |
+
}
|
17 |
}
|
src/lib/src/Databases/Base/BaseQuery.php
CHANGED
@@ -34,9 +34,15 @@ abstract class BaseQuery {
|
|
34 |
|
35 |
/**
|
36 |
* @var string
|
|
|
37 |
*/
|
38 |
protected $sOrderBy;
|
39 |
|
|
|
|
|
|
|
|
|
|
|
40 |
/**
|
41 |
* @var string
|
42 |
*/
|
@@ -149,7 +155,7 @@ abstract class BaseQuery {
|
|
149 |
$aExtras = array_filter(
|
150 |
[
|
151 |
$this->getGroupBy(),
|
152 |
-
$this->
|
153 |
$this->buildLimitPhrase(),
|
154 |
$this->buildOffsetPhrase(),
|
155 |
]
|
@@ -329,8 +335,20 @@ abstract class BaseQuery {
|
|
329 |
/**
|
330 |
* @return string
|
331 |
*/
|
332 |
-
|
333 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
334 |
}
|
335 |
|
336 |
/**
|
@@ -368,7 +386,7 @@ abstract class BaseQuery {
|
|
368 |
return $this->setLimit( 0 )
|
369 |
->setWheres( [] )
|
370 |
->setPage( 1 )
|
371 |
-
->setOrderBy(
|
372 |
}
|
373 |
|
374 |
/**
|
@@ -397,7 +415,7 @@ abstract class BaseQuery {
|
|
397 |
if ( empty( $sGroupByColumn ) ) {
|
398 |
$this->sGroupBy = '';
|
399 |
}
|
400 |
-
|
401 |
$this->sGroupBy = $sGroupByColumn;
|
402 |
}
|
403 |
return $this;
|
@@ -406,14 +424,18 @@ abstract class BaseQuery {
|
|
406 |
/**
|
407 |
* @param string $sOrderByColumn
|
408 |
* @param string $sOrder
|
|
|
409 |
* @return $this
|
410 |
*/
|
411 |
-
public function setOrderBy( $sOrderByColumn, $sOrder = 'DESC' ) {
|
412 |
if ( empty( $sOrderByColumn ) ) {
|
413 |
-
$this->
|
414 |
}
|
415 |
else {
|
416 |
-
|
|
|
|
|
|
|
417 |
}
|
418 |
return $this;
|
419 |
}
|
@@ -458,4 +480,12 @@ abstract class BaseQuery {
|
|
458 |
[ '=', '<', '>', '!=', '<>', '<=', '>=', '<=>', 'IN', 'LIKE', 'NOT LIKE' ]
|
459 |
);
|
460 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
461 |
}
|
34 |
|
35 |
/**
|
36 |
* @var string
|
37 |
+
* @deprecated 8.5
|
38 |
*/
|
39 |
protected $sOrderBy;
|
40 |
|
41 |
+
/**
|
42 |
+
* @var array
|
43 |
+
*/
|
44 |
+
protected $aOrderBys;
|
45 |
+
|
46 |
/**
|
47 |
* @var string
|
48 |
*/
|
155 |
$aExtras = array_filter(
|
156 |
[
|
157 |
$this->getGroupBy(),
|
158 |
+
$this->buildOrderBy(),
|
159 |
$this->buildLimitPhrase(),
|
160 |
$this->buildOffsetPhrase(),
|
161 |
]
|
335 |
/**
|
336 |
* @return string
|
337 |
*/
|
338 |
+
protected function buildOrderBy() {
|
339 |
+
$sOrder = '';
|
340 |
+
if ( !is_array( $this->aOrderBys ) ) {
|
341 |
+
// Defaults to created_at if aOrderBys is untouched. Set to empty array for no order
|
342 |
+
$this->aOrderBys = [ 'created_at' => 'DESC' ];
|
343 |
+
}
|
344 |
+
if ( !empty( $this->aOrderBys ) ) {
|
345 |
+
$aOrders = [];
|
346 |
+
foreach ( $this->aOrderBys as $sCol => $sOrder ) {
|
347 |
+
$aOrders[] = sprintf( '`%s` %s', esc_sql( $sCol ), esc_sql( $sOrder ) );
|
348 |
+
}
|
349 |
+
$sOrder = sprintf( 'ORDER BY %s', implode( ', ', $aOrders ) );
|
350 |
+
}
|
351 |
+
return $sOrder;
|
352 |
}
|
353 |
|
354 |
/**
|
386 |
return $this->setLimit( 0 )
|
387 |
->setWheres( [] )
|
388 |
->setPage( 1 )
|
389 |
+
->setOrderBy( null );
|
390 |
}
|
391 |
|
392 |
/**
|
415 |
if ( empty( $sGroupByColumn ) ) {
|
416 |
$this->sGroupBy = '';
|
417 |
}
|
418 |
+
elseif ( $this->getDbH()->hasColumn( $sGroupByColumn ) ) {
|
419 |
$this->sGroupBy = $sGroupByColumn;
|
420 |
}
|
421 |
return $this;
|
424 |
/**
|
425 |
* @param string $sOrderByColumn
|
426 |
* @param string $sOrder
|
427 |
+
* @param bool $bReplace
|
428 |
* @return $this
|
429 |
*/
|
430 |
+
public function setOrderBy( $sOrderByColumn, $sOrder = 'DESC', $bReplace = false ) {
|
431 |
if ( empty( $sOrderByColumn ) ) {
|
432 |
+
$this->aOrderBys = $sOrderByColumn;
|
433 |
}
|
434 |
else {
|
435 |
+
if ( !is_array( $this->aOrderBys ) || $bReplace ) {
|
436 |
+
$this->aOrderBys = [];
|
437 |
+
}
|
438 |
+
$this->aOrderBys[ $sOrderByColumn ] = $sOrder;
|
439 |
}
|
440 |
return $this;
|
441 |
}
|
480 |
[ '=', '<', '>', '!=', '<>', '<=', '>=', '<=>', 'IN', 'LIKE', 'NOT LIKE' ]
|
481 |
);
|
482 |
}
|
483 |
+
|
484 |
+
/**
|
485 |
+
* @return string
|
486 |
+
* @deprecated 8.5
|
487 |
+
*/
|
488 |
+
public function getOrderBy() {
|
489 |
+
return '';
|
490 |
+
}
|
491 |
}
|
src/lib/src/Databases/Base/EntryVO.php
CHANGED
@@ -93,14 +93,6 @@ class EntryVO {
|
|
93 |
return (int)$this->created_at;
|
94 |
}
|
95 |
|
96 |
-
/**
|
97 |
-
* @return int
|
98 |
-
* @deprecated
|
99 |
-
*/
|
100 |
-
public function getId() {
|
101 |
-
return (int)$this->id;
|
102 |
-
}
|
103 |
-
|
104 |
/**
|
105 |
* @return bool
|
106 |
*/
|
93 |
return (int)$this->created_at;
|
94 |
}
|
95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
/**
|
97 |
* @return bool
|
98 |
*/
|
src/lib/src/Databases/Base/EntryVoConsumer.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Trait EntryVoConsumer
|
7 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Databases\Base
|
8 |
+
*/
|
9 |
+
trait EntryVoConsumer {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* @var EntryVO
|
13 |
+
*/
|
14 |
+
private $oEntryVO;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @return EntryVO|mixed
|
18 |
+
*/
|
19 |
+
public function getEntryVO() {
|
20 |
+
return $this->oEntryVO;
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @param EntryVO $oE
|
25 |
+
* @return $this
|
26 |
+
*/
|
27 |
+
public function setEntryVO( $oE ) {
|
28 |
+
$this->oEntryVO = $oE;
|
29 |
+
return $this;
|
30 |
+
}
|
31 |
+
}
|
src/lib/src/Databases/Base/Handler.php
CHANGED
@@ -129,7 +129,7 @@ class Handler {
|
|
129 |
}
|
130 |
|
131 |
/**
|
132 |
-
* @return Insert
|
133 |
*/
|
134 |
public function getQueryInserter() {
|
135 |
$sClass = $this->getNamespace().'Insert';
|
@@ -139,7 +139,7 @@ class Handler {
|
|
139 |
}
|
140 |
|
141 |
/**
|
142 |
-
* @return Delete
|
143 |
*/
|
144 |
public function getQueryDeleter() {
|
145 |
$sClass = $this->getNamespace().'Delete';
|
@@ -149,7 +149,7 @@ class Handler {
|
|
149 |
}
|
150 |
|
151 |
/**
|
152 |
-
* @return Select
|
153 |
*/
|
154 |
public function getQuerySelector() {
|
155 |
$sClass = $this->getNamespace().'Select';
|
@@ -160,7 +160,7 @@ class Handler {
|
|
160 |
}
|
161 |
|
162 |
/**
|
163 |
-
* @return Update
|
164 |
*/
|
165 |
public function getQueryUpdater() {
|
166 |
$sClass = $this->getNamespace().'Update';
|
@@ -170,7 +170,7 @@ class Handler {
|
|
170 |
}
|
171 |
|
172 |
/**
|
173 |
-
* @return EntryVO
|
174 |
*/
|
175 |
public function getVo() {
|
176 |
$sClass = $this->getNamespace().'EntryVO';
|
129 |
}
|
130 |
|
131 |
/**
|
132 |
+
* @return Insert|mixed
|
133 |
*/
|
134 |
public function getQueryInserter() {
|
135 |
$sClass = $this->getNamespace().'Insert';
|
139 |
}
|
140 |
|
141 |
/**
|
142 |
+
* @return Delete|mixed
|
143 |
*/
|
144 |
public function getQueryDeleter() {
|
145 |
$sClass = $this->getNamespace().'Delete';
|
149 |
}
|
150 |
|
151 |
/**
|
152 |
+
* @return Select|mixed
|
153 |
*/
|
154 |
public function getQuerySelector() {
|
155 |
$sClass = $this->getNamespace().'Select';
|
160 |
}
|
161 |
|
162 |
/**
|
163 |
+
* @return Update|mixed
|
164 |
*/
|
165 |
public function getQueryUpdater() {
|
166 |
$sClass = $this->getNamespace().'Update';
|
170 |
}
|
171 |
|
172 |
/**
|
173 |
+
* @return EntryVO|mixed
|
174 |
*/
|
175 |
public function getVo() {
|
176 |
$sClass = $this->getNamespace().'EntryVO';
|
src/lib/src/Databases/Base/Select.php
CHANGED
@@ -90,16 +90,16 @@ class Select extends BaseQuery {
|
|
90 |
if ( $this->isCount() ) {
|
91 |
$sSubstitute = 'COUNT(*)';
|
92 |
}
|
93 |
-
|
94 |
$sSubstitute = sprintf( 'SUM(%s)', array_shift( $aCols ) );
|
95 |
}
|
96 |
-
|
97 |
$sSubstitute = sprintf( 'DISTINCT %s', implode( ',', $aCols ) );
|
98 |
}
|
99 |
-
|
100 |
$sSubstitute = implode( ',', $aCols );
|
101 |
}
|
102 |
-
|
103 |
$sSubstitute = $this->sCustomSelect;
|
104 |
}
|
105 |
else {
|
@@ -228,7 +228,7 @@ class Select extends BaseQuery {
|
|
228 |
if ( $this->isCount() || $this->isSum() ) {
|
229 |
$mData = $this->queryVar();
|
230 |
}
|
231 |
-
|
232 |
$mData = $this->queryDistinct();
|
233 |
if ( is_array( $mData ) ) {
|
234 |
$mData = array_map( function ( $aRecord ) {
|
@@ -287,6 +287,24 @@ class Select extends BaseQuery {
|
|
287 |
->clearWheres();
|
288 |
}
|
289 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
290 |
/**
|
291 |
* Verifies the given columns are valid and unique
|
292 |
* @param string[] $aColumns
|
90 |
if ( $this->isCount() ) {
|
91 |
$sSubstitute = 'COUNT(*)';
|
92 |
}
|
93 |
+
elseif ( $this->isSum() ) {
|
94 |
$sSubstitute = sprintf( 'SUM(%s)', array_shift( $aCols ) );
|
95 |
}
|
96 |
+
elseif ( $this->isDistinct() && $this->hasColumnsToSelect() ) {
|
97 |
$sSubstitute = sprintf( 'DISTINCT %s', implode( ',', $aCols ) );
|
98 |
}
|
99 |
+
elseif ( $this->hasColumnsToSelect() ) {
|
100 |
$sSubstitute = implode( ',', $aCols );
|
101 |
}
|
102 |
+
elseif ( $this->isCustomSelect() ) {
|
103 |
$sSubstitute = $this->sCustomSelect;
|
104 |
}
|
105 |
else {
|
228 |
if ( $this->isCount() || $this->isSum() ) {
|
229 |
$mData = $this->queryVar();
|
230 |
}
|
231 |
+
elseif ( $this->isDistinct() ) {
|
232 |
$mData = $this->queryDistinct();
|
233 |
if ( is_array( $mData ) ) {
|
234 |
$mData = array_map( function ( $aRecord ) {
|
287 |
->clearWheres();
|
288 |
}
|
289 |
|
290 |
+
/**
|
291 |
+
* @return EntryVO|mixed|\stdClass|null
|
292 |
+
*/
|
293 |
+
public function selectLatestById() {
|
294 |
+
return $this->setOrderBy( 'id' )
|
295 |
+
->setLimit( 1 )
|
296 |
+
->first();
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* @return EntryVO|mixed|\stdClass|null
|
301 |
+
*/
|
302 |
+
public function selectFirstById() {
|
303 |
+
return $this->setOrderBy( 'id', 'ASC' )
|
304 |
+
->setLimit( 1 )
|
305 |
+
->first();
|
306 |
+
}
|
307 |
+
|
308 |
/**
|
309 |
* Verifies the given columns are valid and unique
|
310 |
* @param string[] $aColumns
|
src/lib/src/Databases/Events/Insert.php
CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
|
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
|
7 |
class Insert extends Base\Insert {
|
|
|
8 |
}
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
|
7 |
class Insert extends Base\Insert {
|
8 |
+
|
9 |
}
|
src/lib/src/Databases/Events/Update.php
CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Events;
|
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
|
7 |
class Update extends Base\Update {
|
|
|
8 |
}
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
|
7 |
class Update extends Base\Update {
|
8 |
+
|
9 |
}
|
src/lib/src/Databases/GeoIp/Select.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\GeoIp;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
|
6 |
|
7 |
class Select extends Base\Select {
|
8 |
|
@@ -22,13 +23,11 @@ class Select extends Base\Select {
|
|
22 |
* @return string[]
|
23 |
*/
|
24 |
public function getDistinctIps() {
|
25 |
-
|
26 |
function ( $sIp ) {
|
27 |
return inet_ntop( $sIp );
|
28 |
},
|
29 |
$this->getDistinctForColumn( 'ip' )
|
30 |
) );
|
31 |
-
asort( $aIps );
|
32 |
-
return $aIps;
|
33 |
}
|
34 |
}
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\GeoIp;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
|
7 |
|
8 |
class Select extends Base\Select {
|
9 |
|
23 |
* @return string[]
|
24 |
*/
|
25 |
public function getDistinctIps() {
|
26 |
+
return IpListSort::Sort( array_map(
|
27 |
function ( $sIp ) {
|
28 |
return inet_ntop( $sIp );
|
29 |
},
|
30 |
$this->getDistinctForColumn( 'ip' )
|
31 |
) );
|
|
|
|
|
32 |
}
|
33 |
}
|
src/lib/src/Databases/IPs/CommonFilters.php
CHANGED
@@ -12,6 +12,31 @@ trait CommonFilters {
|
|
12 |
return $this->addWhereEquals( 'ip', $sIp );
|
13 |
}
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
/**
|
16 |
* @param bool $bIsRange
|
17 |
* @return $this
|
12 |
return $this->addWhereEquals( 'ip', $sIp );
|
13 |
}
|
14 |
|
15 |
+
/**
|
16 |
+
* @param bool $bIsBlocked
|
17 |
+
* @return $this
|
18 |
+
*/
|
19 |
+
public function filterByBlocked( $bIsBlocked ) {
|
20 |
+
return $this->addWhere( 'blocked_at', 0, $bIsBlocked ? '>' : '=' );
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @return $this
|
25 |
+
*/
|
26 |
+
public function filterByBlacklist() {
|
27 |
+
return $this->filterByLists( [
|
28 |
+
\ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
|
29 |
+
\ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
|
30 |
+
] );
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @return $this
|
35 |
+
*/
|
36 |
+
public function filterByWhitelist() {
|
37 |
+
return $this->filterByList( \ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_WHITE );
|
38 |
+
}
|
39 |
+
|
40 |
/**
|
41 |
* @param bool $bIsRange
|
42 |
* @return $this
|
src/lib/src/Databases/IPs/Delete.php
CHANGED
@@ -30,11 +30,8 @@ class Delete extends Base\Delete {
|
|
30 |
public function deleteIpFromBlacklists( $sIp ) {
|
31 |
$this->reset();
|
32 |
if ( Services::IP()->isValidIpOrRange( $sIp ) ) {
|
33 |
-
$this->
|
34 |
-
->
|
35 |
-
\ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK,
|
36 |
-
\ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK
|
37 |
-
] );
|
38 |
}
|
39 |
return $this->hasWheres() ? $this->query() : false;
|
40 |
}
|
30 |
public function deleteIpFromBlacklists( $sIp ) {
|
31 |
$this->reset();
|
32 |
if ( Services::IP()->isValidIpOrRange( $sIp ) ) {
|
33 |
+
$this->filterByIp( $sIp )
|
34 |
+
->filterByBlacklist();
|
|
|
|
|
|
|
35 |
}
|
36 |
return $this->hasWheres() ? $this->query() : false;
|
37 |
}
|
src/lib/src/Databases/IPs/EntryVO.php
CHANGED
@@ -6,17 +6,19 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
6 |
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
-
* @property string ip
|
10 |
-
* @property
|
11 |
-
* @property
|
12 |
-
* @property string
|
13 |
-
* @property
|
14 |
-
* @property int
|
|
|
15 |
*/
|
16 |
class EntryVO extends Base\EntryVO {
|
17 |
|
18 |
/**
|
19 |
* @return string
|
|
|
20 |
*/
|
21 |
public function getLabel() {
|
22 |
return (string)$this->label;
|
@@ -24,6 +26,7 @@ class EntryVO extends Base\EntryVO {
|
|
24 |
|
25 |
/**
|
26 |
* @return int
|
|
|
27 |
*/
|
28 |
public function getLastAccessAt() {
|
29 |
return (int)$this->last_access_at;
|
@@ -31,6 +34,7 @@ class EntryVO extends Base\EntryVO {
|
|
31 |
|
32 |
/**
|
33 |
* @return string
|
|
|
34 |
*/
|
35 |
public function getList() {
|
36 |
return (string)$this->list;
|
@@ -38,6 +42,7 @@ class EntryVO extends Base\EntryVO {
|
|
38 |
|
39 |
/**
|
40 |
* @return int
|
|
|
41 |
*/
|
42 |
public function getTransgressions() {
|
43 |
return (int)$this->transgressions;
|
@@ -45,15 +50,9 @@ class EntryVO extends Base\EntryVO {
|
|
45 |
|
46 |
/**
|
47 |
* @return bool
|
|
|
48 |
*/
|
49 |
public function hasTransgressions() {
|
50 |
-
return $this->
|
51 |
-
}
|
52 |
-
|
53 |
-
/**
|
54 |
-
* @return bool
|
55 |
-
*/
|
56 |
-
public function isIpRange() {
|
57 |
-
return (bool)$this->is_range;
|
58 |
}
|
59 |
}
|
6 |
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
+
* @property string $ip
|
10 |
+
* @property int $transgressions
|
11 |
+
* @property bool $is_range
|
12 |
+
* @property string $label
|
13 |
+
* @property string $list
|
14 |
+
* @property int $last_access_at
|
15 |
+
* @property int $blocked_at
|
16 |
*/
|
17 |
class EntryVO extends Base\EntryVO {
|
18 |
|
19 |
/**
|
20 |
* @return string
|
21 |
+
* @deprecated 8.5
|
22 |
*/
|
23 |
public function getLabel() {
|
24 |
return (string)$this->label;
|
26 |
|
27 |
/**
|
28 |
* @return int
|
29 |
+
* @deprecated 8.5
|
30 |
*/
|
31 |
public function getLastAccessAt() {
|
32 |
return (int)$this->last_access_at;
|
34 |
|
35 |
/**
|
36 |
* @return string
|
37 |
+
* @deprecated 8.5
|
38 |
*/
|
39 |
public function getList() {
|
40 |
return (string)$this->list;
|
42 |
|
43 |
/**
|
44 |
* @return int
|
45 |
+
* @deprecated 8.5
|
46 |
*/
|
47 |
public function getTransgressions() {
|
48 |
return (int)$this->transgressions;
|
50 |
|
51 |
/**
|
52 |
* @return bool
|
53 |
+
* @deprecated 8.5
|
54 |
*/
|
55 |
public function hasTransgressions() {
|
56 |
+
return (int)$this->transgressions > 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
}
|
58 |
}
|
src/lib/src/Databases/IPs/Handler.php
CHANGED
@@ -15,7 +15,7 @@ class Handler extends Base\Handler {
|
|
15 |
$oOpts = $oMod->getOptions();
|
16 |
/** @var Delete $oDel */
|
17 |
$oDel = $this->getQueryDeleter();
|
18 |
-
$oDel->
|
19 |
->filterByLastAccessBefore( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
|
20 |
->query();
|
21 |
}
|
@@ -57,11 +57,12 @@ class Handler extends Base\Handler {
|
|
57 |
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
58 |
ip varchar(40) NOT NULL DEFAULT '',
|
59 |
label varchar(255) NOT NULL DEFAULT '',
|
|
|
60 |
list varchar(4) NOT NULL DEFAULT '',
|
61 |
ip6 tinyint(1) NOT NULL DEFAULT 0,
|
62 |
is_range tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
|
63 |
-
transgressions tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
|
64 |
last_access_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
|
|
65 |
created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
66 |
deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
67 |
PRIMARY KEY (id)
|
15 |
$oOpts = $oMod->getOptions();
|
16 |
/** @var Delete $oDel */
|
17 |
$oDel = $this->getQueryDeleter();
|
18 |
+
$oDel->filterByBlacklist()
|
19 |
->filterByLastAccessBefore( Services::Request()->ts() - $oOpts->getAutoExpireTime() )
|
20 |
->query();
|
21 |
}
|
57 |
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
58 |
ip varchar(40) NOT NULL DEFAULT '',
|
59 |
label varchar(255) NOT NULL DEFAULT '',
|
60 |
+
transgressions smallint(1) UNSIGNED NOT NULL DEFAULT 0,
|
61 |
list varchar(4) NOT NULL DEFAULT '',
|
62 |
ip6 tinyint(1) NOT NULL DEFAULT 0,
|
63 |
is_range tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
|
|
|
64 |
last_access_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
65 |
+
blocked_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
66 |
created_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
67 |
deleted_at int(15) UNSIGNED NOT NULL DEFAULT 0,
|
68 |
PRIMARY KEY (id)
|
src/lib/src/Databases/IPs/Select.php
CHANGED
@@ -11,26 +11,43 @@ class Select extends Base\Select {
|
|
11 |
/**
|
12 |
* @param string $sIp
|
13 |
* @return bool
|
|
|
14 |
*/
|
15 |
public function getIpOnBlackLists( $sIp ) {
|
16 |
return $this->reset()
|
17 |
->filterByIp( $sIp )
|
18 |
-
->
|
19 |
-
\ICWP_WPSF_FeatureHandler_Ips::LIST_AUTO_BLACK,
|
20 |
-
\ICWP_WPSF_FeatureHandler_Ips::LIST_MANUAL_BLACK
|
21 |
-
] )
|
22 |
->first();
|
23 |
}
|
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
/**
|
26 |
* @param string $sList
|
27 |
* @return EntryVO[]
|
|
|
28 |
*/
|
29 |
public function allFromList( $sList ) {
|
30 |
/** @var EntryVO[] $aRes */
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
}
|
36 |
}
|
11 |
/**
|
12 |
* @param string $sIp
|
13 |
* @return bool
|
14 |
+
* @deprecated 8.5
|
15 |
*/
|
16 |
public function getIpOnBlackLists( $sIp ) {
|
17 |
return $this->reset()
|
18 |
->filterByIp( $sIp )
|
19 |
+
->filterByBlacklist()
|
|
|
|
|
|
|
20 |
->first();
|
21 |
}
|
22 |
|
23 |
+
/**
|
24 |
+
* @return EntryVO[]
|
25 |
+
*/
|
26 |
+
public function getAllBlocked() {
|
27 |
+
/** @var EntryVO[] $aRes */
|
28 |
+
return $this->reset()
|
29 |
+
->filterByBlocked( true )
|
30 |
+
->filterByBlacklist()
|
31 |
+
->query();
|
32 |
+
}
|
33 |
+
|
34 |
/**
|
35 |
* @param string $sList
|
36 |
* @return EntryVO[]
|
37 |
+
* @deprecated 8.5
|
38 |
*/
|
39 |
public function allFromList( $sList ) {
|
40 |
/** @var EntryVO[] $aRes */
|
41 |
+
return $this->reset()
|
42 |
+
->filterByList( $sList )
|
43 |
+
->query();
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @return string[]
|
48 |
+
* @deprecated 8.5
|
49 |
+
*/
|
50 |
+
public function getDistinctIps() {
|
51 |
+
return $this->getDistinct_FilterAndSort( 'ip' );
|
52 |
}
|
53 |
}
|
src/lib/src/Databases/IPs/Update.php
CHANGED
@@ -14,7 +14,7 @@ class Update extends Base\Update {
|
|
14 |
* @return bool
|
15 |
*/
|
16 |
public function incrementTransgressions( $oIp, $nIncrement = 1 ) {
|
17 |
-
return $this->updateTransgressions( $oIp, $oIp->
|
18 |
}
|
19 |
|
20 |
/**
|
@@ -49,4 +49,12 @@ class Update extends Base\Update {
|
|
49 |
public function updateLastAccessAt( $oIp ) {
|
50 |
return $this->updateEntry( $oIp, [ 'last_access_at' => Services::Request()->ts() ] );
|
51 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
}
|
14 |
* @return bool
|
15 |
*/
|
16 |
public function incrementTransgressions( $oIp, $nIncrement = 1 ) {
|
17 |
+
return $this->updateTransgressions( $oIp, $oIp->transgressions + $nIncrement );
|
18 |
}
|
19 |
|
20 |
/**
|
49 |
public function updateLastAccessAt( $oIp ) {
|
50 |
return $this->updateEntry( $oIp, [ 'last_access_at' => Services::Request()->ts() ] );
|
51 |
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @param EntryVO $oIp
|
55 |
+
* @return bool
|
56 |
+
*/
|
57 |
+
public function setBlocked( $oIp ) {
|
58 |
+
return $this->updateEntry( $oIp, [ 'blocked_at' => Services::Request()->ts() ] );
|
59 |
+
}
|
60 |
}
|
src/lib/src/Databases/ScanQueue/Update.php
CHANGED
@@ -7,6 +7,15 @@ use FernleafSystems\Wordpress\Services\Services;
|
|
7 |
|
8 |
class Update extends Base\Update {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
/**
|
11 |
* @param EntryVO $oEntry
|
12 |
* @return bool
|
7 |
|
8 |
class Update extends Base\Update {
|
9 |
|
10 |
+
/**
|
11 |
+
* @param EntryVO $oEntry
|
12 |
+
* @return bool
|
13 |
+
*/
|
14 |
+
public function storeResults( $oEntry ) {
|
15 |
+
return isset( $oEntry->results ) &&
|
16 |
+
$this->updateEntry( $oEntry, [ 'results' => gzcompress( $oEntry->getRawDataAsArray()[ 'results' ] ) ] );
|
17 |
+
}
|
18 |
+
|
19 |
/**
|
20 |
* @param EntryVO $oEntry
|
21 |
* @return bool
|
src/lib/src/Databases/Scanner/Common.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Services\Services;
|
6 |
+
|
7 |
+
trait Common {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* @param string $sHash
|
11 |
+
* @return $this
|
12 |
+
*/
|
13 |
+
public function filterByHash( $sHash ) {
|
14 |
+
if ( !empty( $sHash ) ) {
|
15 |
+
$this->filterByHashes( [ $sHash ] );
|
16 |
+
}
|
17 |
+
return $this;
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @param string[] $aHashes
|
22 |
+
* @return $this
|
23 |
+
*/
|
24 |
+
public function filterByHashes( $aHashes ) {
|
25 |
+
return $this->addWhereIn( 'hash', $aHashes );
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @return $this
|
30 |
+
*/
|
31 |
+
public function filterByIgnored() {
|
32 |
+
return $this->addWhereNewerThan( 0, 'ignored_at' );
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* @return $this
|
37 |
+
*/
|
38 |
+
public function filterByNotIgnored() {
|
39 |
+
return $this->addWhereEquals( 'ignored_at', 0 );
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @param int $nInterval
|
44 |
+
* @return $this
|
45 |
+
*/
|
46 |
+
public function filterByNotRecentlyNotified( $nInterval = null ) {
|
47 |
+
if ( is_null( $nInterval ) ) {
|
48 |
+
$nInterval = WEEK_IN_SECONDS;
|
49 |
+
}
|
50 |
+
return $this->addWhereOlderThan( Services::Request()->ts() - $nInterval, 'notified_at' );
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @param int $nInterval
|
55 |
+
* @return $this
|
56 |
+
*/
|
57 |
+
public function filterByIsRecentlyNotified( $nInterval = null ) {
|
58 |
+
if ( is_null( $nInterval ) ) {
|
59 |
+
$nInterval = WEEK_IN_SECONDS;
|
60 |
+
}
|
61 |
+
return $this->addWhereNewerThan( Services::Request()->ts() - $nInterval, 'notified_at' );
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @param string $sScan
|
66 |
+
* @return $this
|
67 |
+
*/
|
68 |
+
public function filterByScan( $sScan ) {
|
69 |
+
if ( !empty( $sScan ) ) {
|
70 |
+
$this->filterByScans( [ $sScan ] );
|
71 |
+
}
|
72 |
+
return $this;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* @param string[] $aScans
|
77 |
+
* @return $this
|
78 |
+
*/
|
79 |
+
public function filterByScans( $aScans ) {
|
80 |
+
return $this->addWhereIn( 'scan', array_map( 'strtolower', $aScans ) );
|
81 |
+
}
|
82 |
+
}
|
src/lib/src/Databases/Scanner/Delete.php
CHANGED
@@ -6,27 +6,7 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
6 |
|
7 |
class Delete extends Base\Delete {
|
8 |
|
9 |
-
|
10 |
-
* @param string $sHash
|
11 |
-
* @return $this
|
12 |
-
*/
|
13 |
-
public function filterByHash( $sHash ) {
|
14 |
-
if ( !empty( $sHash ) ) {
|
15 |
-
$this->addWhereEquals( 'hash', $sHash );
|
16 |
-
}
|
17 |
-
return $this;
|
18 |
-
}
|
19 |
-
|
20 |
-
/**
|
21 |
-
* @param string $sScan
|
22 |
-
* @return $this
|
23 |
-
*/
|
24 |
-
public function filterByScan( $sScan ) {
|
25 |
-
if ( !empty( $sScan ) ) {
|
26 |
-
$this->addWhereEquals( 'scan', $sScan );
|
27 |
-
}
|
28 |
-
return $this;
|
29 |
-
}
|
30 |
|
31 |
/**
|
32 |
* @param string $sScan
|
6 |
|
7 |
class Delete extends Base\Delete {
|
8 |
|
9 |
+
use Common;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
/**
|
12 |
* @param string $sScan
|
src/lib/src/Databases/Scanner/EntryVO.php
CHANGED
@@ -6,13 +6,13 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
6 |
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
-
* @property string hash
|
10 |
-
* @property array meta
|
11 |
-
* @property string scan
|
12 |
-
* @property int severity
|
13 |
-
* @property int discovered_at
|
14 |
-
* @property int ignored_at
|
15 |
-
* @property int notified_at
|
16 |
*/
|
17 |
class EntryVO extends Base\EntryVO {
|
18 |
|
6 |
|
7 |
/**
|
8 |
* Class EntryVO
|
9 |
+
* @property string $hash
|
10 |
+
* @property array $meta
|
11 |
+
* @property string $scan
|
12 |
+
* @property int $severity
|
13 |
+
* @property int $discovered_at
|
14 |
+
* @property int $ignored_at
|
15 |
+
* @property int $notified_at
|
16 |
*/
|
17 |
class EntryVO extends Base\EntryVO {
|
18 |
|
src/lib/src/Databases/Scanner/Select.php
CHANGED
@@ -3,67 +3,10 @@
|
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
-
use FernleafSystems\Wordpress\Services\Services;
|
7 |
|
8 |
class Select extends Base\Select {
|
9 |
|
10 |
-
|
11 |
-
* @param string $sHash
|
12 |
-
* @return $this
|
13 |
-
*/
|
14 |
-
public function filterByHash( $sHash ) {
|
15 |
-
if ( !empty( $sHash ) ) {
|
16 |
-
$this->addWhereEquals( 'hash', $sHash );
|
17 |
-
}
|
18 |
-
return $this;
|
19 |
-
}
|
20 |
-
|
21 |
-
/**
|
22 |
-
* @return $this
|
23 |
-
*/
|
24 |
-
public function filterByIgnored() {
|
25 |
-
return $this->addWhereNewerThan( 0, 'ignored_at' );
|
26 |
-
}
|
27 |
-
|
28 |
-
/**
|
29 |
-
* @return $this
|
30 |
-
*/
|
31 |
-
public function filterByNotIgnored() {
|
32 |
-
return $this->addWhereEquals( 'ignored_at', 0 );
|
33 |
-
}
|
34 |
-
|
35 |
-
/**
|
36 |
-
* @param int $nInterval
|
37 |
-
* @return $this
|
38 |
-
*/
|
39 |
-
public function filterByNotRecentlyNotified( $nInterval = null ) {
|
40 |
-
if ( is_null( $nInterval ) ) {
|
41 |
-
$nInterval = WEEK_IN_SECONDS;
|
42 |
-
}
|
43 |
-
return $this->addWhereOlderThan( Services::Request()->ts() - $nInterval, 'notified_at' );
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* @param int $nInterval
|
48 |
-
* @return $this
|
49 |
-
*/
|
50 |
-
public function filterByIsRecentlyNotified( $nInterval = null ) {
|
51 |
-
if ( is_null( $nInterval ) ) {
|
52 |
-
$nInterval = WEEK_IN_SECONDS;
|
53 |
-
}
|
54 |
-
return $this->addWhereNewerThan( Services::Request()->ts() - $nInterval, 'notified_at' );
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* @param string $sScan
|
59 |
-
* @return $this
|
60 |
-
*/
|
61 |
-
public function filterByScan( $sScan ) {
|
62 |
-
if ( !empty( $sScan ) ) {
|
63 |
-
$this->addWhereEquals( 'scan', strtolower( $sScan ) );
|
64 |
-
}
|
65 |
-
return $this;
|
66 |
-
}
|
67 |
|
68 |
/**
|
69 |
* @param int $nNotifiedInterval
|
@@ -74,13 +17,6 @@ class Select extends Base\Select {
|
|
74 |
->filterByNotIgnored();
|
75 |
}
|
76 |
|
77 |
-
/**
|
78 |
-
* @return string[]
|
79 |
-
*/
|
80 |
-
public function getDistinctSeverity() {
|
81 |
-
return $this->getDistinct_FilterAndSort( 'severity' );
|
82 |
-
}
|
83 |
-
|
84 |
/**
|
85 |
* @param string $sScan
|
86 |
* @return int
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Scanner;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
|
6 |
|
7 |
class Select extends Base\Select {
|
8 |
|
9 |
+
use Common;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
/**
|
12 |
* @param int $nNotifiedInterval
|
17 |
->filterByNotIgnored();
|
18 |
}
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
/**
|
21 |
* @param string $sScan
|
22 |
* @return int
|
src/lib/src/Databases/Scanner/Update.php
CHANGED
@@ -7,6 +7,44 @@ use FernleafSystems\Wordpress\Services\Services;
|
|
7 |
|
8 |
class Update extends Base\Update {
|
9 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
/**
|
11 |
* @param EntryVO $oEntry
|
12 |
* @return bool
|
7 |
|
8 |
class Update extends Base\Update {
|
9 |
|
10 |
+
/**
|
11 |
+
* @param string $sScan
|
12 |
+
* @return bool
|
13 |
+
*/
|
14 |
+
public function clearIgnoredAtForScan( $sScan ) {
|
15 |
+
return $this->setUpdateWheres( [ 'scan' => $sScan ] )
|
16 |
+
->setUpdateData( [ 'ignored_at' => 0 ] )
|
17 |
+
->query() !== false;
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* @param string $sScan
|
22 |
+
* @return bool
|
23 |
+
*/
|
24 |
+
public function clearNotifiedAtForScan( $sScan ) {
|
25 |
+
return $this->setUpdateWheres( [ 'scan' => $sScan ] )
|
26 |
+
->setUpdateData( [ 'notified_at' => 0 ] )
|
27 |
+
->query() !== false;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* @param string $sScan
|
32 |
+
* @return bool
|
33 |
+
*/
|
34 |
+
public function setAllNotifiedForScan( $sScan ) {
|
35 |
+
return $this
|
36 |
+
->setUpdateWheres(
|
37 |
+
[
|
38 |
+
'scan' => $sScan,
|
39 |
+
'ignored_at' => 0,
|
40 |
+
]
|
41 |
+
)
|
42 |
+
->setUpdateData(
|
43 |
+
[ 'notified_at' => Services::Request()->ts() ]
|
44 |
+
)
|
45 |
+
->query() !== false;
|
46 |
+
}
|
47 |
+
|
48 |
/**
|
49 |
* @param EntryVO $oEntry
|
50 |
* @return bool
|
src/lib/src/Databases/Session/Insert.php
CHANGED
@@ -16,6 +16,7 @@ class Insert extends Base\Insert {
|
|
16 |
$aData = [
|
17 |
'session_id' => $sSessionId,
|
18 |
'wp_username' => $sUsername,
|
|
|
19 |
];
|
20 |
return $this->setInsertData( $aData )->query() === 1;
|
21 |
}
|
@@ -35,16 +36,19 @@ class Insert extends Base\Insert {
|
|
35 |
throw new \Exception( 'WP Username not provided' );
|
36 |
}
|
37 |
|
38 |
-
$
|
39 |
-
$
|
|
|
|
|
|
|
40 |
|
|
|
41 |
$aData = array_merge(
|
42 |
[
|
43 |
'browser' => md5( $oReq->getUserAgent() ),
|
44 |
-
'
|
45 |
-
'
|
46 |
-
'
|
47 |
-
'last_activity_uri' => $oReq->server( 'REQUEST_URI' ),
|
48 |
'login_intent_expires_at' => 0,
|
49 |
'secadmin_at' => 0,
|
50 |
],
|
16 |
$aData = [
|
17 |
'session_id' => $sSessionId,
|
18 |
'wp_username' => $sUsername,
|
19 |
+
'ip' => Services::IP()->getRequestIp()
|
20 |
];
|
21 |
return $this->setInsertData( $aData )->query() === 1;
|
22 |
}
|
36 |
throw new \Exception( 'WP Username not provided' );
|
37 |
}
|
38 |
|
39 |
+
$oIP = Services::IP();
|
40 |
+
if ( empty( $aData[ 'ip' ] ) || !$oIP->isValidIp( $aData[ 'ip' ] ) ) {
|
41 |
+
$sReqIP = $oIP->getRequestIp();
|
42 |
+
$aData[ 'ip' ] = $oIP->isValidIp( $sReqIP ) ? $sReqIP : '';
|
43 |
+
}
|
44 |
|
45 |
+
$oReq = Services::Request();
|
46 |
$aData = array_merge(
|
47 |
[
|
48 |
'browser' => md5( $oReq->getUserAgent() ),
|
49 |
+
'logged_in_at' => $oReq->ts(),
|
50 |
+
'last_activity_at' => $oReq->ts(),
|
51 |
+
'last_activity_uri' => $oReq->getRequestUri(),
|
|
|
52 |
'login_intent_expires_at' => 0,
|
53 |
'secadmin_at' => 0,
|
54 |
],
|
src/lib/src/Databases/Session/Select.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Session;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
|
6 |
use FernleafSystems\Wordpress\Services\Services;
|
7 |
|
8 |
class Select extends Base\Select {
|
@@ -11,7 +12,7 @@ class Select extends Base\Select {
|
|
11 |
* @return string[]
|
12 |
*/
|
13 |
public function getDistinctIps() {
|
14 |
-
return $this->
|
15 |
}
|
16 |
|
17 |
/**
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Session;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
|
7 |
use FernleafSystems\Wordpress\Services\Services;
|
8 |
|
9 |
class Select extends Base\Select {
|
12 |
* @return string[]
|
13 |
*/
|
14 |
public function getDistinctIps() {
|
15 |
+
return IpListSort::Sort( $this->getDistinctForColumn( 'ip' ) );
|
16 |
}
|
17 |
|
18 |
/**
|
src/lib/src/Databases/Tally/Insert.php
CHANGED
@@ -13,7 +13,7 @@ class Insert extends Base\Insert {
|
|
13 |
*/
|
14 |
public function insert( $oTally ) {
|
15 |
$bSuccess = false;
|
16 |
-
if ( preg_match( '#[a-z]
|
17 |
&& is_numeric( $oTally->tally ) && $oTally->tally > 0 ) {
|
18 |
$bSuccess = parent::insert( $oTally );
|
19 |
}
|
13 |
*/
|
14 |
public function insert( $oTally ) {
|
15 |
$bSuccess = false;
|
16 |
+
if ( preg_match( '#[a-z]+\.[a-z]+#i', $oTally->stat_key )
|
17 |
&& is_numeric( $oTally->tally ) && $oTally->tally > 0 ) {
|
18 |
$bSuccess = parent::insert( $oTally );
|
19 |
}
|
src/lib/src/Databases/Traffic/Insert.php
CHANGED
@@ -6,4 +6,18 @@ use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
6 |
|
7 |
class Insert extends Base\Insert {
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
}
|
6 |
|
7 |
class Insert extends Base\Insert {
|
8 |
|
9 |
+
/**
|
10 |
+
* @return $this
|
11 |
+
* @throws \Exception
|
12 |
+
*/
|
13 |
+
protected function verifyInsertData() {
|
14 |
+
parent::verifyInsertData();
|
15 |
+
$aData = $this->getInsertData();
|
16 |
+
|
17 |
+
if ( empty( $aData[ 'ip' ] ) ) {
|
18 |
+
throw new \Exception( 'IP address provided is not valid' );
|
19 |
+
}
|
20 |
+
|
21 |
+
return $this->setInsertData( $aData );
|
22 |
+
}
|
23 |
}
|
src/lib/src/Databases/Traffic/Select.php
CHANGED
@@ -3,6 +3,7 @@
|
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Traffic;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
|
|
6 |
use FernleafSystems\Wordpress\Services\Services;
|
7 |
|
8 |
class Select extends Base\Select {
|
@@ -13,14 +14,12 @@ class Select extends Base\Select {
|
|
13 |
* @return string[]
|
14 |
*/
|
15 |
public function getDistinctIps() {
|
16 |
-
|
17 |
-
function ( $
|
18 |
-
return inet_ntop( $
|
19 |
},
|
20 |
$this->getDistinctForColumn( 'ip' )
|
21 |
) );
|
22 |
-
asort( $aIps );
|
23 |
-
return $aIps;
|
24 |
}
|
25 |
|
26 |
/**
|
3 |
namespace FernleafSystems\Wordpress\Plugin\Shield\Databases\Traffic;
|
4 |
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Utilities\Tool\IpListSort;
|
7 |
use FernleafSystems\Wordpress\Services\Services;
|
8 |
|
9 |
class Select extends Base\Select {
|
14 |
* @return string[]
|
15 |
*/
|
16 |
public function getDistinctIps() {
|
17 |
+
return IpListSort::Sort( array_map(
|
18 |
+
function ( $sIpBinary ) {
|
19 |
+
return inet_ntop( $sIpBinary );
|
20 |
},
|
21 |
$this->getDistinctForColumn( 'ip' )
|
22 |
) );
|
|
|
|
|
23 |
}
|
24 |
|
25 |
/**
|
src/lib/src/Deprecated/Foundation.php
CHANGED
@@ -19,23 +19,11 @@ class Foundation {
|
|
19 |
return self::DEFAULT_SERVICE_PREFIX.$sSuffix;
|
20 |
}
|
21 |
|
22 |
-
/**
|
23 |
-
* @return \ICWP_WPSF_DataProcessor
|
24 |
-
* @deprecated 8.4.0
|
25 |
-
*/
|
26 |
-
static public function loadDP() {
|
27 |
-
$sKey = 'icwp-data';
|
28 |
-
if ( !self::isServiceReady( $sKey ) ) {
|
29 |
-
self::setService( $sKey, \ICWP_WPSF_DataProcessor::GetInstance() );
|
30 |
-
}
|
31 |
-
return self::getService( $sKey );
|
32 |
-
}
|
33 |
-
|
34 |
/**
|
35 |
* @return \ICWP_WPSF_WpCron
|
36 |
-
* @deprecated
|
37 |
*/
|
38 |
-
static
|
39 |
$sKey = 'icwp-wpcron';
|
40 |
if ( !self::isServiceReady( $sKey ) ) {
|
41 |
self::setService( $sKey, \ICWP_WPSF_WpCron::GetInstance() );
|
@@ -45,6 +33,7 @@ class Foundation {
|
|
45 |
|
46 |
/**
|
47 |
* @return \ICWP_WPSF_ServiceProviders
|
|
|
48 |
*/
|
49 |
public function loadServiceProviders() {
|
50 |
$sKey = 'icwp-serviceproviders';
|
@@ -57,7 +46,7 @@ class Foundation {
|
|
57 |
/**
|
58 |
* @return array
|
59 |
*/
|
60 |
-
static
|
61 |
if ( !is_array( self::$aDic ) ) {
|
62 |
self::$aDic = [];
|
63 |
}
|
@@ -68,7 +57,7 @@ class Foundation {
|
|
68 |
* @param string $sService
|
69 |
* @return mixed
|
70 |
*/
|
71 |
-
static
|
72 |
$aDic = self::getDic();
|
73 |
return $aDic[ $sService ];
|
74 |
}
|
@@ -77,7 +66,7 @@ class Foundation {
|
|
77 |
* @param string $sService
|
78 |
* @return bool
|
79 |
*/
|
80 |
-
static
|
81 |
$aDic = self::getDic();
|
82 |
return !empty( $aDic[ $sService ] );
|
83 |
}
|
@@ -86,7 +75,7 @@ class Foundation {
|
|
86 |
* @param string $sServiceKey
|
87 |
* @param mixed $oService
|
88 |
*/
|
89 |
-
static
|
90 |
$aDic = self::getDic();
|
91 |
$aDic[ $sServiceKey ] = $oService;
|
92 |
self::$aDic = $aDic;
|
19 |
return self::DEFAULT_SERVICE_PREFIX.$sSuffix;
|
20 |
}
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
/**
|
23 |
* @return \ICWP_WPSF_WpCron
|
24 |
+
* @deprecated 8.5
|
25 |
*/
|
26 |
+
public static function loadWpCronProcessor() {
|
27 |
$sKey = 'icwp-wpcron';
|
28 |
if ( !self::isServiceReady( $sKey ) ) {
|
29 |
self::setService( $sKey, \ICWP_WPSF_WpCron::GetInstance() );
|
33 |
|
34 |
/**
|
35 |
* @return \ICWP_WPSF_ServiceProviders
|
36 |
+
* @deprecated 8.5.2
|
37 |
*/
|
38 |
public function loadServiceProviders() {
|
39 |
$sKey = 'icwp-serviceproviders';
|
46 |
/**
|
47 |
* @return array
|
48 |
*/
|
49 |
+
private static function getDic() {
|
50 |
if ( !is_array( self::$aDic ) ) {
|
51 |
self::$aDic = [];
|
52 |
}
|
57 |
* @param string $sService
|
58 |
* @return mixed
|
59 |
*/
|
60 |
+
private static function getService( $sService ) {
|
61 |
$aDic = self::getDic();
|
62 |
return $aDic[ $sService ];
|
63 |
}
|
66 |
* @param string $sService
|
67 |
* @return bool
|
68 |
*/
|
69 |
+
private static function isServiceReady( $sService ) {
|
70 |
$aDic = self::getDic();
|
71 |
return !empty( $aDic[ $sService ] );
|
72 |
}
|
75 |
* @param string $sServiceKey
|
76 |
* @param mixed $oService
|
77 |
*/
|
78 |
+
private static function setService( $sServiceKey, $oService ) {
|
79 |
$aDic = self::getDic();
|
80 |
$aDic[ $sServiceKey ] = $oService;
|
81 |
self::$aDic = $aDic;
|
src/lib/src/Modules/AuditTrail/Auditors/Base.php
CHANGED
@@ -7,5 +7,4 @@ use FernleafSystems\Wordpress\Plugin\Shield\Modules;
|
|
7 |
class Base {
|
8 |
|
9 |
use Modules\ModConsumer;
|
10 |
-
|
11 |
}
|
7 |
class Base {
|
8 |
|
9 |
use Modules\ModConsumer;
|
|
|
10 |
}
|
src/lib/src/Modules/AuditTrail/Auditors/Posts.php
CHANGED
@@ -39,10 +39,10 @@ class Posts extends Base {
|
|
39 |
if ( $sNewStatus == 'trash' ) {
|
40 |
$sEvent = 'post_trashed';
|
41 |
}
|
42 |
-
|
43 |
$sEvent = 'post_recovered';
|
44 |
}
|
45 |
-
|
46 |
|
47 |
if ( in_array( $sOldStatus, [ 'publish', 'private' ] ) ) {
|
48 |
$sEvent = 'post_updated';
|
@@ -51,7 +51,7 @@ class Posts extends Base {
|
|
51 |
$sEvent = 'post_published';
|
52 |
}
|
53 |
}
|
54 |
-
|
55 |
$sEvent = 'post_unpublished';
|
56 |
}
|
57 |
else {
|
39 |
if ( $sNewStatus == 'trash' ) {
|
40 |
$sEvent = 'post_trashed';
|
41 |
}
|
42 |
+
elseif ( $sOldStatus == 'trash' && $sNewStatus != 'trash' ) {
|
43 |
$sEvent = 'post_recovered';
|
44 |
}
|
45 |
+
elseif ( in_array( $sNewStatus, [ 'publish', 'private' ] ) ) {
|
46 |
|
47 |
if ( in_array( $sOldStatus, [ 'publish', 'private' ] ) ) {
|
48 |
$sEvent = 'post_updated';
|
51 |
$sEvent = 'post_published';
|
52 |
}
|
53 |
}
|
54 |
+
elseif ( in_array( $sOldStatus, [ 'publish', 'private' ] ) && $sNewStatus == 'draft' ) {
|
55 |
$sEvent = 'post_unpublished';
|
56 |
}
|
57 |
else {
|
src/lib/src/Modules/AuditTrail/Auditors/Users.php
CHANGED
@@ -21,7 +21,7 @@ class Users extends Base {
|
|
21 |
'user_login',
|
22 |
[
|
23 |
'audit' => [
|
24 |
-
'user'
|
25 |
]
|
26 |
]
|
27 |
);
|
@@ -72,7 +72,7 @@ class Users extends Base {
|
|
72 |
'user_deleted_reassigned',
|
73 |
[
|
74 |
'audit' => [
|
75 |
-
'user'
|
76 |
]
|
77 |
]
|
78 |
);
|
21 |
'user_login',
|
22 |
[
|
23 |
'audit' => [
|
24 |
+
'user' => sanitize_user( $sUsername ),
|
25 |
]
|
26 |
]
|
27 |
);
|
72 |
'user_deleted_reassigned',
|
73 |
[
|
74 |
'audit' => [
|
75 |
+
'user' => sanitize_user( $oReassignedUser->user_login ),
|
76 |
]
|
77 |
]
|
78 |
);
|
src/lib/src/Modules/AuditTrail/Lib/AuditWriter.php
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
|
7 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib\Ops\Commit;
|
8 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib\EventsListener;
|
9 |
+
|
10 |
+
class AuditWriter extends EventsListener {
|
11 |
+
|
12 |
+
use HandlerConsumer;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @var AuditTrail\EntryVO[]
|
16 |
+
*/
|
17 |
+
private $aAuditLogs;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* @param string $sEvent
|
21 |
+
* @param array $aMeta
|
22 |
+
*/
|
23 |
+
protected function captureEvent( $sEvent, $aMeta = [] ) {
|
24 |
+
$oCon = $this->getCon();
|
25 |
+
$aDef = $oCon->loadEventsService()->getEventDef( $sEvent );
|
26 |
+
if ( $aDef[ 'audit' ] && empty( $aMeta[ 'suppress_audit' ] ) ) { // only audit if it's an auditable event
|
27 |
+
$oEntry = new AuditTrail\EntryVO();
|
28 |
+
$oEntry->rid = $this->getCon()->getShortRequestId();
|
29 |
+
$oEntry->event = $sEvent;
|
30 |
+
$oEntry->category = $aDef[ 'cat' ];
|
31 |
+
$oEntry->context = $aDef[ 'context' ];
|
32 |
+
$oEntry->meta = isset( $aMeta[ 'audit' ] ) ? $aMeta[ 'audit' ] : [];
|
33 |
+
|
34 |
+
$aLogs = $this->getLogs();
|
35 |
+
|
36 |
+
// cater for where certain events may happen more than once in the same request
|
37 |
+
if ( !empty( $aDef[ 'audit_multiple' ] ) ) {
|
38 |
+
$aLogs[] = $oEntry;
|
39 |
+
}
|
40 |
+
else {
|
41 |
+
$aLogs[ $sEvent ] = $oEntry;
|
42 |
+
}
|
43 |
+
|
44 |
+
$this->setLogs( $aLogs );
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
protected function onShutdown() {
|
49 |
+
if ( !$this->getCon()->isPluginDeleting() ) {
|
50 |
+
( new Commit() )
|
51 |
+
->setDbHandler( $this->getDbHandler() )
|
52 |
+
->commitAudits( $this->getLogs() );
|
53 |
+
$this->setLogs();
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @return AuditTrail\EntryVO[]
|
59 |
+
*/
|
60 |
+
public function getLogs() {
|
61 |
+
return is_array( $this->aAuditLogs ) ? $this->aAuditLogs : [];
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @param AuditTrail\EntryVO[] $aLogs
|
66 |
+
* @return $this
|
67 |
+
*/
|
68 |
+
public function setLogs( $aLogs = [] ) {
|
69 |
+
$this->aAuditLogs = $aLogs;
|
70 |
+
return $this;
|
71 |
+
}
|
72 |
+
}
|
src/lib/src/Modules/AuditTrail/Lib/Ops/Commit.php
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\AuditTrail\Lib\Ops;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\AuditTrail;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
+
|
9 |
+
class Commit {
|
10 |
+
|
11 |
+
use HandlerConsumer;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var AuditTrail\EntryVO|null
|
15 |
+
*/
|
16 |
+
private $oLatest;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @param AuditTrail\EntryVO[] $aEvents
|
20 |
+
*/
|
21 |
+
public function commitAudits( $aEvents ) {
|
22 |
+
if ( is_array( $aEvents ) ) {
|
23 |
+
foreach ( $aEvents as $oEntry ) {
|
24 |
+
if ( $oEntry instanceof AuditTrail\EntryVO ) {
|
25 |
+
$this->commitAudit( $oEntry );
|
26 |
+
}
|
27 |
+
}
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @param AuditTrail\EntryVO $oEntry
|
33 |
+
*/
|
34 |
+
public function commitAudit( $oEntry ) {
|
35 |
+
$oWp = Services::WpGeneral();
|
36 |
+
$oWpUsers = Services::WpUsers();
|
37 |
+
|
38 |
+
if ( empty( $oEntry->ip ) ) {
|
39 |
+
$oEntry->ip = Services::IP()->getRequestIp();
|
40 |
+
}
|
41 |
+
if ( empty( $oEntry->message ) ) {
|
42 |
+
$oEntry->message = '';
|
43 |
+
}
|
44 |
+
if ( empty( $oEntry->wp_username ) ) {
|
45 |
+
if ( $oWpUsers->isUserLoggedIn() ) {
|
46 |
+
$sUser = $oWpUsers->getCurrentWpUsername();
|
47 |
+
}
|
48 |
+
elseif ( $oWp->isCron() ) {
|
49 |
+
$sUser = 'WP Cron';
|
50 |
+
}
|
51 |
+
elseif ( $oWp->isWpCli() ) {
|
52 |
+
$sUser = 'WP CLI';
|
53 |
+
}
|
54 |
+
else {
|
55 |
+
$sUser = '-';
|
56 |
+
}
|
57 |
+
$oEntry->wp_username = $sUser;
|
58 |
+
}
|
59 |
+
|
60 |
+
$oLatest = null;
|
61 |
+
$bCanCount = in_array( $oEntry->event, $this->getCanCountEvents() );
|
62 |
+
if ( $bCanCount ) {
|
63 |
+
$oLatest = $this->latest();
|
64 |
+
if ( $oLatest instanceof AuditTrail\EntryVO ) {
|
65 |
+
foreach ( [ 'event', 'ip' ] as $sCol ) {
|
66 |
+
$bCanCount = $bCanCount && ( $oLatest->{$sCol} === $oEntry->{$sCol} );
|
67 |
+
}
|
68 |
+
}
|
69 |
+
else {
|
70 |
+
$bCanCount = false;
|
71 |
+
}
|
72 |
+
}
|
73 |
+
|
74 |
+
if ( $bCanCount && $oLatest instanceof AuditTrail\EntryVO ) {
|
75 |
+
/** @var AuditTrail\Update $oQU */
|
76 |
+
$oQU = $this->getDbHandler()->getQueryUpdater();
|
77 |
+
$oQU->updateCount( $oLatest );
|
78 |
+
}
|
79 |
+
else {
|
80 |
+
/** @var AuditTrail\Insert $oQI */
|
81 |
+
$oQI = $this->getDbHandler()->getQueryInserter();
|
82 |
+
$oQI->insert( $oEntry );
|
83 |
+
}
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* TODO: This should be a config
|
88 |
+
* @return string[]
|
89 |
+
*/
|
90 |
+
private function getCanCountEvents() {
|
91 |
+
return [ 'conn_kill' ];
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* @return AuditTrail\EntryVO|false
|
96 |
+
*/
|
97 |
+
private function latest() {
|
98 |
+
if ( is_null( $this->oLatest ) ) {
|
99 |
+
$this->oLatest = $this->getDbHandler()
|
100 |
+
->getQuerySelector()
|
101 |
+
->selectLatestById();
|
102 |
+
if ( empty( $this->oLatest ) ) {
|
103 |
+
$this->oLatest = false;
|
104 |
+
}
|
105 |
+
}
|
106 |
+
return $this->oLatest;
|
107 |
+
}
|
108 |
+
}
|
src/lib/src/Modules/Autoupdates/Options.php
CHANGED
@@ -56,6 +56,13 @@ class Options extends Base\ShieldOptions {
|
|
56 |
return $this->getOpt( 'autoupdate_plugin_self' );
|
57 |
}
|
58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
/**
|
60 |
* @return bool
|
61 |
*/
|
@@ -67,7 +74,7 @@ class Options extends Base\ShieldOptions {
|
|
67 |
* @return bool
|
68 |
*/
|
69 |
public function isAutoUpdateCoreMinor() {
|
70 |
-
return !$this->
|
71 |
}
|
72 |
|
73 |
/**
|
56 |
return $this->getOpt( 'autoupdate_plugin_self' );
|
57 |
}
|
58 |
|
59 |
+
/**
|
60 |
+
* @return bool
|
61 |
+
*/
|
62 |
+
public function isAutoUpdateCoreNever() {
|
63 |
+
return $this->isOpt( 'autoupdate_core', 'core_never' );
|
64 |
+
}
|
65 |
+
|
66 |
/**
|
67 |
* @return bool
|
68 |
*/
|
74 |
* @return bool
|
75 |
*/
|
76 |
public function isAutoUpdateCoreMinor() {
|
77 |
+
return !$this->isAutoUpdateCoreNever();
|
78 |
}
|
79 |
|
80 |
/**
|
src/lib/src/Modules/Base/BaseModCon.php
CHANGED
@@ -22,7 +22,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
22 |
protected $sModSlug;
|
23 |
|
24 |
/**
|
25 |
-
* @var
|
26 |
*/
|
27 |
protected $bImportExportWhitelistNotify = false;
|
28 |
|
@@ -32,7 +32,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
32 |
private static $oEmailHandler;
|
33 |
|
34 |
/**
|
35 |
-
* @var
|
36 |
*/
|
37 |
private $oProcessor;
|
38 |
|
@@ -62,17 +62,15 @@ class BaseModCon extends Deprecated\Foundation {
|
|
62 |
private $aDbHandlers;
|
63 |
|
64 |
/**
|
65 |
-
* @param Shield\Controller\Controller $
|
66 |
* @param array $aMod
|
67 |
* @throws \Exception
|
68 |
*/
|
69 |
-
public function __construct( $
|
70 |
-
if (
|
71 |
-
|
72 |
-
throw new \Exception( 'Plugin controller not supplied to Module' );
|
73 |
-
}
|
74 |
-
$this->setCon( $oPluginController );
|
75 |
}
|
|
|
76 |
|
77 |
if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
|
78 |
throw new \Exception( 'Module storage key AND slug are undefined' );
|
@@ -130,11 +128,17 @@ class BaseModCon extends Deprecated\Foundation {
|
|
130 |
add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
|
131 |
|
132 |
// supply our supported plugin events for this module
|
133 |
-
add_filter( $this->prefix( 'is_event_supported' ), function ( $bSupported, $sEventTag ) {
|
134 |
-
return $bSupported || $this->isSupportedEvent( $sEventTag );
|
135 |
-
}, 10, 2 );
|
136 |
add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
|
137 |
-
return array_merge(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
} );
|
139 |
|
140 |
add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
|
@@ -227,72 +231,6 @@ class BaseModCon extends Deprecated\Foundation {
|
|
227 |
return is_array( $aCls ) ? $aCls : [];
|
228 |
}
|
229 |
|
230 |
-
/**
|
231 |
-
* @param string $sKey
|
232 |
-
* @return array|null
|
233 |
-
*/
|
234 |
-
public function getEventDef( $sKey ) {
|
235 |
-
return $this->isSupportedEvent( $sKey ) ? $this->getEvents()[ $sKey ] : null;
|
236 |
-
}
|
237 |
-
|
238 |
-
/**
|
239 |
-
* @return array[]
|
240 |
-
*/
|
241 |
-
public function getEvents() {
|
242 |
-
$aEvts = $this->getSupportedEvents();
|
243 |
-
|
244 |
-
$aDefaults = [
|
245 |
-
'context' => $this->getSlug(),
|
246 |
-
'cat' => 1,
|
247 |
-
'stat' => true,
|
248 |
-
'audit' => true,
|
249 |
-
'recent' => false, // whether to show in the recent events logs
|
250 |
-
'offense' => false, // whether to mark offense against IP
|
251 |
-
'audit_multiple' => false, // allow multiple audit entries in the same request
|
252 |
-
];
|
253 |
-
foreach ( $aEvts as $sKey => $aEvt ) {
|
254 |
-
$aEvts[ $sKey ] = array_merge( $aDefaults, $aEvt );
|
255 |
-
$aEvts[ $sKey ][ 'key' ] = $sKey;
|
256 |
-
}
|
257 |
-
return $aEvts;
|
258 |
-
}
|
259 |
-
|
260 |
-
/**
|
261 |
-
* @return array[]
|
262 |
-
*/
|
263 |
-
public function getStatEvents_Recent() {
|
264 |
-
return array_filter(
|
265 |
-
$this->getEvents(),
|
266 |
-
function ( $aEvt ) {
|
267 |
-
return $aEvt[ 'recent' ];
|
268 |
-
}
|
269 |
-
);
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* @return array[]
|
274 |
-
*/
|
275 |
-
protected function getSupportedEvents() {
|
276 |
-
$aEvts = $this->getDef( 'events' );
|
277 |
-
return is_array( $aEvts ) ? $aEvts : [];
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* @param string $sKey
|
282 |
-
* @return bool
|
283 |
-
*/
|
284 |
-
public function isSupportedEvent( $sKey ) {
|
285 |
-
return array_key_exists( $sKey, $this->getSupportedEvents() );
|
286 |
-
}
|
287 |
-
|
288 |
-
/**
|
289 |
-
* @param string $sKey
|
290 |
-
* @return bool
|
291 |
-
*/
|
292 |
-
public function isOffenseEvent( $sKey ) {
|
293 |
-
return $this->isSupportedEvent( $sKey ) && $this->getEvents()[ $sKey ][ 'offense' ];
|
294 |
-
}
|
295 |
-
|
296 |
/**
|
297 |
* Should be over-ridden by each new class to handle upgrades.
|
298 |
* Called upon construction and after plugin options are initialized.
|
@@ -394,7 +332,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
394 |
if ( !empty( $aOptions ) && is_array( $aOptions ) && array_key_exists( $this->getOptionsStorageKey(), $aOptions ) ) {
|
395 |
$this->getOptions()
|
396 |
->setMultipleOptions( $aOptions[ $this->getOptionsStorageKey() ] );
|
397 |
-
$this->
|
398 |
}
|
399 |
}
|
400 |
|
@@ -500,7 +438,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
500 |
// cleanup databases randomly just in-case cron doesn't run.
|
501 |
$this->cleanupDatabases();
|
502 |
}
|
503 |
-
$this->
|
504 |
}
|
505 |
}
|
506 |
|
@@ -533,7 +471,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
533 |
* @param string $sOptKey
|
534 |
* @return string
|
535 |
*/
|
536 |
-
|
537 |
$sUrl = $this->getUrl_AdminPage();
|
538 |
$aDef = $this->getOptions()->getOptDefinition( $sOptKey );
|
539 |
if ( !empty( $aDef[ 'section' ] ) ) {
|
@@ -586,18 +524,20 @@ class BaseModCon extends Deprecated\Foundation {
|
|
586 |
*/
|
587 |
public function isModuleEnabled() {
|
588 |
$oOpts = $this->getOptions();
|
|
|
|
|
589 |
|
590 |
if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
|
591 |
// Auto enabled modules always run regardless
|
592 |
$bEnabled = true;
|
593 |
}
|
594 |
-
|
595 |
$bEnabled = false;
|
596 |
}
|
597 |
-
|
598 |
$bEnabled = false;
|
599 |
}
|
600 |
-
|
601 |
$bEnabled = false;
|
602 |
}
|
603 |
else {
|
@@ -786,21 +726,21 @@ class BaseModCon extends Deprecated\Foundation {
|
|
786 |
}
|
787 |
|
788 |
/**
|
789 |
-
* @return
|
790 |
*/
|
791 |
public function getIfShowModuleMenuItem() {
|
792 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
|
793 |
}
|
794 |
|
795 |
/**
|
796 |
-
* @return
|
797 |
*/
|
798 |
public function getIfShowModuleLink() {
|
799 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
|
800 |
}
|
801 |
|
802 |
/**
|
803 |
-
* @return
|
804 |
*/
|
805 |
public function getIfUseSessions() {
|
806 |
return $this->getOptions()->getFeatureProperty( 'use_sessions' );
|
@@ -852,9 +792,9 @@ class BaseModCon extends Deprecated\Foundation {
|
|
852 |
}
|
853 |
|
854 |
/**
|
855 |
-
* @param string
|
856 |
-
* @param mixed
|
857 |
-
* @param
|
858 |
* @return bool
|
859 |
*/
|
860 |
public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
|
@@ -997,11 +937,9 @@ class BaseModCon extends Deprecated\Foundation {
|
|
997 |
}
|
998 |
|
999 |
/**
|
1000 |
-
*
|
1001 |
-
* It will also update the stored plugin options version.
|
1002 |
-
* @return void
|
1003 |
*/
|
1004 |
-
public function
|
1005 |
$this->doPrePluginOptionsSave();
|
1006 |
if ( apply_filters( $this->prefix( 'force_options_resave' ), false ) ) {
|
1007 |
$this->getOptions()
|
@@ -1011,6 +949,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1011 |
// we set the flag that options have been updated. (only use this flag if it's a MANUAL options update)
|
1012 |
$this->bImportExportWhitelistNotify = $this->getOptions()->getNeedSave();
|
1013 |
$this->store();
|
|
|
1014 |
}
|
1015 |
|
1016 |
private function store() {
|
@@ -1297,13 +1236,13 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1297 |
if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
|
1298 |
continue;
|
1299 |
}
|
1300 |
-
|
1301 |
$sOptionValue = 'N';
|
1302 |
}
|
1303 |
-
|
1304 |
$sOptionValue = 0;
|
1305 |
}
|
1306 |
-
|
1307 |
$sOptionValue = [];
|
1308 |
}
|
1309 |
}
|
@@ -1315,7 +1254,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1315 |
if ( $sOptType == 'integer' ) {
|
1316 |
$sOptionValue = intval( $sOptionValue );
|
1317 |
}
|
1318 |
-
|
1319 |
$sTempValue = trim( $sOptionValue );
|
1320 |
if ( empty( $sTempValue ) ) {
|
1321 |
continue;
|
@@ -1328,13 +1267,13 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1328 |
|
1329 |
$sOptionValue = md5( $sTempValue );
|
1330 |
}
|
1331 |
-
|
1332 |
$sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
|
1333 |
}
|
1334 |
-
|
1335 |
$sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
|
1336 |
}
|
1337 |
-
|
1338 |
}
|
1339 |
}
|
1340 |
|
@@ -1344,7 +1283,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1344 |
}
|
1345 |
}
|
1346 |
|
1347 |
-
$this->
|
1348 |
|
1349 |
// only use this flag when the options are being updated with a MANUAL save.
|
1350 |
if ( isset( $this->bImportExportWhitelistNotify ) && $this->bImportExportWhitelistNotify ) {
|
@@ -1459,7 +1398,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1459 |
]
|
1460 |
]
|
1461 |
);
|
1462 |
-
return $this->renderTemplate( '
|
1463 |
}
|
1464 |
|
1465 |
/**
|
@@ -1638,7 +1577,7 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1638 |
}
|
1639 |
|
1640 |
/**
|
1641 |
-
* @return
|
1642 |
*/
|
1643 |
protected function getIsShowMarketing() {
|
1644 |
return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
|
@@ -1937,13 +1876,6 @@ class BaseModCon extends Deprecated\Foundation {
|
|
1937 |
return $this->oStrings;
|
1938 |
}
|
1939 |
|
1940 |
-
/**
|
1941 |
-
* @return Shield\Databases\Base\Handler|mixed|false
|
1942 |
-
*/
|
1943 |
-
protected function loadDbHandler() {
|
1944 |
-
return false;
|
1945 |
-
}
|
1946 |
-
|
1947 |
/**
|
1948 |
* @return $this;
|
1949 |
*/
|
22 |
protected $sModSlug;
|
23 |
|
24 |
/**
|
25 |
+
* @var bool
|
26 |
*/
|
27 |
protected $bImportExportWhitelistNotify = false;
|
28 |
|
32 |
private static $oEmailHandler;
|
33 |
|
34 |
/**
|
35 |
+
* @var BaseProcessor
|
36 |
*/
|
37 |
private $oProcessor;
|
38 |
|
62 |
private $aDbHandlers;
|
63 |
|
64 |
/**
|
65 |
+
* @param Shield\Controller\Controller $oPlugCon
|
66 |
* @param array $aMod
|
67 |
* @throws \Exception
|
68 |
*/
|
69 |
+
public function __construct( $oPlugCon, $aMod = [] ) {
|
70 |
+
if ( !$oPlugCon instanceof Shield\Controller\Controller ) {
|
71 |
+
throw new \Exception( 'Plugin controller not supplied to Module' );
|
|
|
|
|
|
|
72 |
}
|
73 |
+
$this->setCon( $oPlugCon );
|
74 |
|
75 |
if ( empty( $aMod[ 'storage_key' ] ) && empty( $aMod[ 'slug' ] ) ) {
|
76 |
throw new \Exception( 'Module storage key AND slug are undefined' );
|
128 |
add_action( $this->prefix( 'hourly_cron' ), [ $this, 'runHourlyCron' ] );
|
129 |
|
130 |
// supply our supported plugin events for this module
|
|
|
|
|
|
|
131 |
add_filter( $this->prefix( 'get_all_events' ), function ( $aEvents ) {
|
132 |
+
return array_merge(
|
133 |
+
is_array( $aEvents ) ? $aEvents : [],
|
134 |
+
array_map(
|
135 |
+
function ( $aEvt ) {
|
136 |
+
$aEvt[ 'context' ] = $this->getSlug();
|
137 |
+
return $aEvt;
|
138 |
+
},
|
139 |
+
is_array( $this->getDef( 'events' ) ) ? $this->getDef( 'events' ) : []
|
140 |
+
)
|
141 |
+
);
|
142 |
} );
|
143 |
|
144 |
add_action( 'admin_enqueue_scripts', [ $this, 'onWpEnqueueAdminJs' ], 100 );
|
231 |
return is_array( $aCls ) ? $aCls : [];
|
232 |
}
|
233 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
234 |
/**
|
235 |
* Should be over-ridden by each new class to handle upgrades.
|
236 |
* Called upon construction and after plugin options are initialized.
|
332 |
if ( !empty( $aOptions ) && is_array( $aOptions ) && array_key_exists( $this->getOptionsStorageKey(), $aOptions ) ) {
|
333 |
$this->getOptions()
|
334 |
->setMultipleOptions( $aOptions[ $this->getOptionsStorageKey() ] );
|
335 |
+
$this->saveModOptions();
|
336 |
}
|
337 |
}
|
338 |
|
438 |
// cleanup databases randomly just in-case cron doesn't run.
|
439 |
$this->cleanupDatabases();
|
440 |
}
|
441 |
+
$this->saveModOptions();
|
442 |
}
|
443 |
}
|
444 |
|
471 |
* @param string $sOptKey
|
472 |
* @return string
|
473 |
*/
|
474 |
+
public function getUrl_DirectLinkToOption( $sOptKey ) {
|
475 |
$sUrl = $this->getUrl_AdminPage();
|
476 |
$aDef = $this->getOptions()->getOptDefinition( $sOptKey );
|
477 |
if ( !empty( $aDef[ 'section' ] ) ) {
|
524 |
*/
|
525 |
public function isModuleEnabled() {
|
526 |
$oOpts = $this->getOptions();
|
527 |
+
/** @var Shield\Modules\Plugin\Options $oPluginOpts */
|
528 |
+
$oPluginOpts = $this->getCon()->getModule_Plugin()->getOptions();
|
529 |
|
530 |
if ( $this->getOptions()->getFeatureProperty( 'auto_enabled' ) === true ) {
|
531 |
// Auto enabled modules always run regardless
|
532 |
$bEnabled = true;
|
533 |
}
|
534 |
+
elseif ( $oPluginOpts->isPluginGloballyDisabled() ) {
|
535 |
$bEnabled = false;
|
536 |
}
|
537 |
+
elseif ( $this->getCon()->getIfForceOffActive() ) {
|
538 |
$bEnabled = false;
|
539 |
}
|
540 |
+
elseif ( $oOpts->getFeatureProperty( 'premium' ) === true && !$this->isPremium() ) {
|
541 |
$bEnabled = false;
|
542 |
}
|
543 |
else {
|
726 |
}
|
727 |
|
728 |
/**
|
729 |
+
* @return bool
|
730 |
*/
|
731 |
public function getIfShowModuleMenuItem() {
|
732 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_menu_item' );
|
733 |
}
|
734 |
|
735 |
/**
|
736 |
+
* @return bool
|
737 |
*/
|
738 |
public function getIfShowModuleLink() {
|
739 |
return (bool)$this->getOptions()->getFeatureProperty( 'show_module_options' );
|
740 |
}
|
741 |
|
742 |
/**
|
743 |
+
* @return bool
|
744 |
*/
|
745 |
public function getIfUseSessions() {
|
746 |
return $this->getOptions()->getFeatureProperty( 'use_sessions' );
|
792 |
}
|
793 |
|
794 |
/**
|
795 |
+
* @param string $sOptionKey
|
796 |
+
* @param mixed $mValueToTest
|
797 |
+
* @param bool $bStrict
|
798 |
* @return bool
|
799 |
*/
|
800 |
public function isOpt( $sOptionKey, $mValueToTest, $bStrict = false ) {
|
937 |
}
|
938 |
|
939 |
/**
|
940 |
+
* @return $this
|
|
|
|
|
941 |
*/
|
942 |
+
public function saveModOptions() {
|
943 |
$this->doPrePluginOptionsSave();
|
944 |
if ( apply_filters( $this->prefix( 'force_options_resave' ), false ) ) {
|
945 |
$this->getOptions()
|
949 |
// we set the flag that options have been updated. (only use this flag if it's a MANUAL options update)
|
950 |
$this->bImportExportWhitelistNotify = $this->getOptions()->getNeedSave();
|
951 |
$this->store();
|
952 |
+
return $this;
|
953 |
}
|
954 |
|
955 |
private function store() {
|
1236 |
if ( in_array( $sOptType, [ 'text', 'email' ] ) ) { //text box, and it's null, don't update
|
1237 |
continue;
|
1238 |
}
|
1239 |
+
elseif ( $sOptType == 'checkbox' ) { //if it was a checkbox, and it's null, it means 'N'
|
1240 |
$sOptionValue = 'N';
|
1241 |
}
|
1242 |
+
elseif ( $sOptType == 'integer' ) { //if it was a integer, and it's null, it means '0'
|
1243 |
$sOptionValue = 0;
|
1244 |
}
|
1245 |
+
elseif ( $sOptType == 'multiple_select' ) {
|
1246 |
$sOptionValue = [];
|
1247 |
}
|
1248 |
}
|
1254 |
if ( $sOptType == 'integer' ) {
|
1255 |
$sOptionValue = intval( $sOptionValue );
|
1256 |
}
|
1257 |
+
elseif ( $sOptType == 'password' ) {
|
1258 |
$sTempValue = trim( $sOptionValue );
|
1259 |
if ( empty( $sTempValue ) ) {
|
1260 |
continue;
|
1267 |
|
1268 |
$sOptionValue = md5( $sTempValue );
|
1269 |
}
|
1270 |
+
elseif ( $sOptType == 'array' ) { //arrays are textareas, where each is separated by newline
|
1271 |
$sOptionValue = array_filter( explode( "\n", esc_textarea( $sOptionValue ) ), 'trim' );
|
1272 |
}
|
1273 |
+
elseif ( $sOptType == 'comma_separated_lists' ) {
|
1274 |
$sOptionValue = Services::Data()->extractCommaSeparatedList( $sOptionValue );
|
1275 |
}
|
1276 |
+
elseif ( $sOptType == 'multiple_select' ) {
|
1277 |
}
|
1278 |
}
|
1279 |
|
1283 |
}
|
1284 |
}
|
1285 |
|
1286 |
+
$this->saveModOptions();
|
1287 |
|
1288 |
// only use this flag when the options are being updated with a MANUAL save.
|
1289 |
if ( isset( $this->bImportExportWhitelistNotify ) && $this->bImportExportWhitelistNotify ) {
|
1398 |
]
|
1399 |
]
|
1400 |
);
|
1401 |
+
return $this->renderTemplate( '/wpadmin_pages/security_admin/index.twig', $aData, true );
|
1402 |
}
|
1403 |
|
1404 |
/**
|
1577 |
}
|
1578 |
|
1579 |
/**
|
1580 |
+
* @return bool
|
1581 |
*/
|
1582 |
protected function getIsShowMarketing() {
|
1583 |
return apply_filters( $this->prefix( 'show_marketing' ), !$this->isPremium() );
|
1876 |
return $this->oStrings;
|
1877 |
}
|
1878 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1879 |
/**
|
1880 |
* @return $this;
|
1881 |
*/
|
src/lib/src/Modules/Base/Lib/BaseService.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Services\Services;
|
6 |
+
|
7 |
+
class BaseService {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* @var static
|
11 |
+
*/
|
12 |
+
private static $oInst;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @return static
|
16 |
+
*/
|
17 |
+
public static function Instance() {
|
18 |
+
if ( !isset( self::$oInst ) ) {
|
19 |
+
self::$oInst = new static();
|
20 |
+
}
|
21 |
+
return self::$oInst;
|
22 |
+
}
|
23 |
+
|
24 |
+
/**
|
25 |
+
* BaseService constructor.
|
26 |
+
*/
|
27 |
+
protected function __construct() {
|
28 |
+
$this->start();
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
*
|
33 |
+
*/
|
34 |
+
protected function start() {
|
35 |
+
}
|
36 |
+
}
|
src/lib/src/Modules/Base/Options.php
CHANGED
@@ -25,12 +25,12 @@ class Options {
|
|
25 |
protected $aRawOptionsConfigData;
|
26 |
|
27 |
/**
|
28 |
-
* @var
|
29 |
*/
|
30 |
protected $bNeedSave;
|
31 |
|
32 |
/**
|
33 |
-
* @var
|
34 |
*/
|
35 |
protected $bRebuildFromFile = false;
|
36 |
|
@@ -181,7 +181,7 @@ class Options {
|
|
181 |
}
|
182 |
|
183 |
/**
|
184 |
-
* @return
|
185 |
*/
|
186 |
public function getIfLoadOptionsFromStorage() {
|
187 |
return $this->bLoadFromSaved;
|
@@ -190,7 +190,7 @@ class Options {
|
|
190 |
/**
|
191 |
* Determines whether the given option key is a valid option
|
192 |
* @param string
|
193 |
-
* @return
|
194 |
*/
|
195 |
public function isValidOptionKey( $sOptionKey ) {
|
196 |
return in_array( $sOptionKey, $this->getOptionsKeys() );
|
@@ -465,9 +465,9 @@ class Options {
|
|
465 |
}
|
466 |
|
467 |
/**
|
468 |
-
* @param string
|
469 |
-
* @param mixed
|
470 |
-
* @param
|
471 |
* @return bool
|
472 |
*/
|
473 |
public function isOpt( $sKey, $mValueToTest, $bStrict = false ) {
|
@@ -605,7 +605,7 @@ class Options {
|
|
605 |
}
|
606 |
|
607 |
/**
|
608 |
-
* @return
|
609 |
*/
|
610 |
public function getRebuildFromFile() {
|
611 |
return $this->bRebuildFromFile;
|
@@ -709,7 +709,7 @@ class Options {
|
|
709 |
}
|
710 |
|
711 |
/**
|
712 |
-
* @param
|
713 |
* @return $this
|
714 |
*/
|
715 |
public function setIfLoadOptionsFromStorage( $bLoadFromSaved ) {
|
@@ -718,14 +718,14 @@ class Options {
|
|
718 |
}
|
719 |
|
720 |
/**
|
721 |
-
* @param
|
722 |
*/
|
723 |
public function setNeedSave( $bNeed ) {
|
724 |
$this->bNeedSave = $bNeed;
|
725 |
}
|
726 |
|
727 |
/**
|
728 |
-
* @param
|
729 |
* @return $this
|
730 |
*/
|
731 |
public function setRebuildFromFile( $bRebuild ) {
|
@@ -815,15 +815,28 @@ class Options {
|
|
815 |
* @return mixed
|
816 |
*/
|
817 |
private function ensureOptValueState( $sOptKey, $mValue ) {
|
818 |
-
|
819 |
-
|
820 |
-
|
821 |
-
|
|
|
|
|
822 |
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
827 |
}
|
828 |
return $mValue;
|
829 |
}
|
@@ -1021,13 +1034,4 @@ class Options {
|
|
1021 |
$this->sPathToConfig = $sPathToConfig;
|
1022 |
return $this;
|
1023 |
}
|
1024 |
-
|
1025 |
-
/**
|
1026 |
-
* @param string
|
1027 |
-
* @return mixed|null
|
1028 |
-
* @deprecated 8.4
|
1029 |
-
*/
|
1030 |
-
public function getFeatureDefinition( $sDefinition ) {
|
1031 |
-
return $this->getDef( $sDefinition );
|
1032 |
-
}
|
1033 |
}
|
25 |
protected $aRawOptionsConfigData;
|
26 |
|
27 |
/**
|
28 |
+
* @var bool
|
29 |
*/
|
30 |
protected $bNeedSave;
|
31 |
|
32 |
/**
|
33 |
+
* @var bool
|
34 |
*/
|
35 |
protected $bRebuildFromFile = false;
|
36 |
|
181 |
}
|
182 |
|
183 |
/**
|
184 |
+
* @return bool
|
185 |
*/
|
186 |
public function getIfLoadOptionsFromStorage() {
|
187 |
return $this->bLoadFromSaved;
|
190 |
/**
|
191 |
* Determines whether the given option key is a valid option
|
192 |
* @param string
|
193 |
+
* @return bool
|
194 |
*/
|
195 |
public function isValidOptionKey( $sOptionKey ) {
|
196 |
return in_array( $sOptionKey, $this->getOptionsKeys() );
|
465 |
}
|
466 |
|
467 |
/**
|
468 |
+
* @param string $sKey
|
469 |
+
* @param mixed $mValueToTest
|
470 |
+
* @param bool $bStrict
|
471 |
* @return bool
|
472 |
*/
|
473 |
public function isOpt( $sKey, $mValueToTest, $bStrict = false ) {
|
605 |
}
|
606 |
|
607 |
/**
|
608 |
+
* @return bool
|
609 |
*/
|
610 |
public function getRebuildFromFile() {
|
611 |
return $this->bRebuildFromFile;
|
709 |
}
|
710 |
|
711 |
/**
|
712 |
+
* @param bool $bLoadFromSaved
|
713 |
* @return $this
|
714 |
*/
|
715 |
public function setIfLoadOptionsFromStorage( $bLoadFromSaved ) {
|
718 |
}
|
719 |
|
720 |
/**
|
721 |
+
* @param bool $bNeed
|
722 |
*/
|
723 |
public function setNeedSave( $bNeed ) {
|
724 |
$this->bNeedSave = $bNeed;
|
725 |
}
|
726 |
|
727 |
/**
|
728 |
+
* @param bool $bRebuild
|
729 |
* @return $this
|
730 |
*/
|
731 |
public function setRebuildFromFile( $bRebuild ) {
|
815 |
* @return mixed
|
816 |
*/
|
817 |
private function ensureOptValueState( $sOptKey, $mValue ) {
|
818 |
+
$sType = $this->getOptionType( $sOptKey );
|
819 |
+
if ( !empty( $sType ) ) {
|
820 |
+
switch ( $sType ) {
|
821 |
+
case 'integer':
|
822 |
+
$mValue = (int)$mValue;
|
823 |
+
break;
|
824 |
|
825 |
+
case 'text':
|
826 |
+
case 'email':
|
827 |
+
$mValue = (string)$mValue;
|
828 |
+
break;
|
829 |
+
|
830 |
+
case 'array':
|
831 |
+
case 'multiple_select':
|
832 |
+
if ( !is_array( $mValue ) ) {
|
833 |
+
$mValue = $this->getOptDefault( $sOptKey );
|
834 |
+
}
|
835 |
+
break;
|
836 |
+
|
837 |
+
default:
|
838 |
+
break;
|
839 |
+
}
|
840 |
}
|
841 |
return $mValue;
|
842 |
}
|
1034 |
$this->sPathToConfig = $sPathToConfig;
|
1035 |
return $this;
|
1036 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1037 |
}
|
src/lib/src/Modules/Base/Strings.php
CHANGED
@@ -94,6 +94,8 @@ class Strings {
|
|
94 |
'join_thousands_H' => __( "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better Protect Their Sites.", 'wp-simple-firewall' ),
|
95 |
'join_thousands_P' => implode( ', ', $aProFeaturesDisplay ),
|
96 |
'get_pro_protection' => __( 'Upgrade To Pro Protection', 'wp-simple-firewall' ),
|
|
|
|
|
97 |
],
|
98 |
$this->getAdditionalDisplayStrings()
|
99 |
);
|
94 |
'join_thousands_H' => __( "Join The 1,000s Who've Already Upgraded Their WordPress Security To Better Protect Their Sites.", 'wp-simple-firewall' ),
|
95 |
'join_thousands_P' => implode( ', ', $aProFeaturesDisplay ),
|
96 |
'get_pro_protection' => __( 'Upgrade To Pro Protection', 'wp-simple-firewall' ),
|
97 |
+
|
98 |
+
'page_title' => 'Twig Page',
|
99 |
],
|
100 |
$this->getAdditionalDisplayStrings()
|
101 |
);
|
src/lib/src/Modules/CommentsFilter/Scan/Bot.php
CHANGED
@@ -33,21 +33,21 @@ class Bot {
|
|
33 |
$sKey = 'checkbox';
|
34 |
}
|
35 |
// honeypot check
|
36 |
-
|
37 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'honeypot', 'wp-simple-firewall' ) );
|
38 |
$sKey = 'honeypot';
|
39 |
}
|
40 |
-
|
41 |
|
42 |
if ( $nCooldown > 0 && $oReq->ts() < ( $nCommentTs + $nCooldown ) ) {
|
43 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'cooldown', 'wp-simple-firewall' ) );
|
44 |
$sKey = 'cooldown';
|
45 |
}
|
46 |
-
|
47 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'expired', 'wp-simple-firewall' ) );
|
48 |
$sKey = 'expired';
|
49 |
}
|
50 |
-
|
51 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'token', 'wp-simple-firewall' ) );
|
52 |
$sKey = 'token';
|
53 |
}
|
33 |
$sKey = 'checkbox';
|
34 |
}
|
35 |
// honeypot check
|
36 |
+
elseif ( !empty( $sFieldHoney ) ) {
|
37 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'honeypot', 'wp-simple-firewall' ) );
|
38 |
$sKey = 'honeypot';
|
39 |
}
|
40 |
+
elseif ( $nCooldown > 0 || $nExpire > 0 ) {
|
41 |
|
42 |
if ( $nCooldown > 0 && $oReq->ts() < ( $nCommentTs + $nCooldown ) ) {
|
43 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'cooldown', 'wp-simple-firewall' ) );
|
44 |
$sKey = 'cooldown';
|
45 |
}
|
46 |
+
elseif ( $nExpire > 0 && $oReq->ts() > ( $nCommentTs + $nExpire ) ) {
|
47 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'expired', 'wp-simple-firewall' ) );
|
48 |
$sKey = 'expired';
|
49 |
}
|
50 |
+
elseif ( !$this->checkTokenHash( $sCommentToken, $nCommentTs, $nPostId ) ) {
|
51 |
$sExplanation = sprintf( __( 'Failed Bot Test (%s)', 'wp-simple-firewall' ), __( 'token', 'wp-simple-firewall' ) );
|
52 |
$sKey = 'token';
|
53 |
}
|
src/lib/src/Modules/CommentsFilter/Scan/Human.php
CHANGED
@@ -87,7 +87,8 @@ class Human {
|
|
87 |
$oFs = Services::WpFs();
|
88 |
$sBLFile = $oMod->getSpamBlacklistFile();
|
89 |
if ( !$oFs->exists( $sBLFile ) ) {
|
90 |
-
$sRawList = Services::HttpRequest()->getContent( $this->getOptions()
|
|
|
91 |
$sList = '';
|
92 |
if ( !empty( $sRawList ) ) {
|
93 |
$sList = implode( "\n", array_map( 'base64_encode', array_filter( array_map( 'trim', explode( "\n", $sRawList ) ) ) ) );
|
87 |
$oFs = Services::WpFs();
|
88 |
$sBLFile = $oMod->getSpamBlacklistFile();
|
89 |
if ( !$oFs->exists( $sBLFile ) ) {
|
90 |
+
$sRawList = Services::HttpRequest()->getContent( $this->getOptions()
|
91 |
+
->getDef( 'url_spam_blacklist_terms' ) );
|
92 |
$sList = '';
|
93 |
if ( !empty( $sRawList ) ) {
|
94 |
$sList = implode( "\n", array_map( 'base64_encode', array_filter( array_map( 'trim', explode( "\n", $sRawList ) ) ) ) );
|
src/lib/src/Modules/CommentsFilter/Token/Create.php
CHANGED
@@ -25,9 +25,6 @@ class Create {
|
|
25 |
$sToken,
|
26 |
$oMod->getTokenExpireInterval()
|
27 |
);
|
28 |
-
error_log( $nTs );
|
29 |
-
error_log( $nPostId );
|
30 |
-
error_log( $sToken );
|
31 |
|
32 |
return $sToken;
|
33 |
}
|
25 |
$sToken,
|
26 |
$oMod->getTokenExpireInterval()
|
27 |
);
|
|
|
|
|
|
|
28 |
|
29 |
return $sToken;
|
30 |
}
|
src/lib/src/Modules/Email/Options.php
CHANGED
@@ -5,4 +5,5 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Email;
|
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
|
6 |
|
7 |
class Options extends Base\ShieldOptions {
|
|
|
8 |
}
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
|
6 |
|
7 |
class Options extends Base\ShieldOptions {
|
8 |
+
|
9 |
}
|
src/lib/src/Modules/Events/Lib/EventsListener.php
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Controller;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\PluginControllerConsumer;
|
7 |
+
|
8 |
+
abstract class EventsListener {
|
9 |
+
|
10 |
+
use PluginControllerConsumer;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* @var bool
|
14 |
+
*/
|
15 |
+
private $bCommit = false;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* EventsListener constructor.
|
19 |
+
* @param Controller\Controller $oCon
|
20 |
+
*/
|
21 |
+
public function __construct( $oCon ) {
|
22 |
+
$this->setCon( $oCon );
|
23 |
+
|
24 |
+
add_action( $oCon->prefix( 'event' ),
|
25 |
+
function ( $sEvent, $aMeta = [] ) use ( $oCon ) {
|
26 |
+
if ( $oCon->loadEventsService()->isSupportedEvent( $sEvent ) ) {
|
27 |
+
$this->captureEvent( $sEvent, $aMeta );
|
28 |
+
}
|
29 |
+
}, 10, 2 );
|
30 |
+
|
31 |
+
add_action( $oCon->prefix( 'plugin_shutdown' ), function () {
|
32 |
+
$this->onShutdown();
|
33 |
+
}, 100 );
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @param string $sEvent
|
38 |
+
* @param array $aMeta
|
39 |
+
*/
|
40 |
+
abstract protected function captureEvent( $sEvent, $aMeta = [] );
|
41 |
+
|
42 |
+
protected function onShutdown() {
|
43 |
+
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @return bool
|
48 |
+
*/
|
49 |
+
public function isCommit() {
|
50 |
+
return (bool)$this->bCommit;
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @param bool $bCommit
|
55 |
+
* @return $this
|
56 |
+
*/
|
57 |
+
public function setIfCommit( $bCommit ) {
|
58 |
+
$this->bCommit = $bCommit;
|
59 |
+
return $this;
|
60 |
+
}
|
61 |
+
}
|
src/lib/src/Modules/Events/Lib/EventsService.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\PluginControllerConsumer;
|
6 |
+
|
7 |
+
class EventsService {
|
8 |
+
|
9 |
+
use PluginControllerConsumer;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* @var array[]
|
13 |
+
*/
|
14 |
+
private $aEvents;
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @param string $sEventTag
|
18 |
+
* @param array $aMetaData
|
19 |
+
* @return $this
|
20 |
+
*/
|
21 |
+
public function fireEvent( $sEventTag, $aMetaData = [] ) {
|
22 |
+
if ( $this->isSupportedEvent( $sEventTag ) ) {
|
23 |
+
do_action( $this->getCon()->prefix( 'event' ), $sEventTag, $aMetaData );
|
24 |
+
}
|
25 |
+
return $this;
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @return array[]
|
30 |
+
*/
|
31 |
+
public function getEvents() {
|
32 |
+
if ( empty( $this->aEvents ) ) {
|
33 |
+
$aEvts = apply_filters( $this->getCon()->prefix( 'get_all_events' ), [] );
|
34 |
+
$this->aEvents = is_array( $aEvts ) ? $this->buildEvents( $aEvts ) : [];
|
35 |
+
}
|
36 |
+
return $this->aEvents;
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @param string $sEventKey
|
41 |
+
* @return array|null
|
42 |
+
*/
|
43 |
+
public function getEventDef( $sEventKey ) {
|
44 |
+
return $this->isSupportedEvent( $sEventKey ) ? $this->getEvents()[ $sEventKey ] : null;
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @return string[]
|
49 |
+
*/
|
50 |
+
public function getEventKeys() {
|
51 |
+
return array_keys( $this->getEvents() );
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @param string $sEventKey
|
56 |
+
* @return bool
|
57 |
+
*/
|
58 |
+
public function isSupportedEvent( $sEventKey ) {
|
59 |
+
return in_array( $sEventKey, $this->getEventKeys() );
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @param array[] $aEvents
|
64 |
+
* @return array[]
|
65 |
+
*/
|
66 |
+
protected function buildEvents( $aEvents ) {
|
67 |
+
$aDefaults = [
|
68 |
+
'cat' => 1,
|
69 |
+
'stat' => true,
|
70 |
+
'audit' => true,
|
71 |
+
'recent' => false, // whether to show in the recent events logs
|
72 |
+
'offense' => false, // whether to mark offense against IP
|
73 |
+
'audit_multiple' => false, // allow multiple audit entries in the same request
|
74 |
+
'suppress_offense' => false, // events that normally trigger offense can be forcefully suppressed
|
75 |
+
];
|
76 |
+
foreach ( $aEvents as $sEventKey => $aEvt ) {
|
77 |
+
$aEvents[ $sEventKey ] = array_merge( $aDefaults, $aEvt );
|
78 |
+
$aEvents[ $sEventKey ][ 'key' ] = $sEventKey;
|
79 |
+
}
|
80 |
+
return $aEvents;
|
81 |
+
}
|
82 |
+
}
|
src/lib/src/Modules/Events/Lib/StatsWriter.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Events\Lib;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Base\HandlerConsumer;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Databases\Events\Handler;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
+
|
9 |
+
class StatsWriter extends EventsListener {
|
10 |
+
|
11 |
+
use HandlerConsumer;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var int[] - key: event; value: timestamp
|
15 |
+
*/
|
16 |
+
private $aEventStats;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @param string $sEvent
|
20 |
+
* @param array $aMeta
|
21 |
+
*/
|
22 |
+
protected function captureEvent( $sEvent, $aMeta = [] ) {
|
23 |
+
$aStats = $this->getEventStats();
|
24 |
+
$aStats[ $sEvent ] = isset( $aMeta[ 'ts' ] ) ? $aMeta[ 'ts' ] : Services::Request()->ts();
|
25 |
+
$this->setEventStats( $aStats );
|
26 |
+
}
|
27 |
+
|
28 |
+
protected function onShutdown() {
|
29 |
+
if ( !$this->getCon()->isPluginDeleting() ) {
|
30 |
+
/** @var Handler $oDbH */
|
31 |
+
$oDbH = $this->getDbHandler();
|
32 |
+
$oDbH->commitEvents( $this->getEventStats() );
|
33 |
+
$this->setEventStats();
|
34 |
+
}
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @return int[]
|
39 |
+
*/
|
40 |
+
public function getEventStats() {
|
41 |
+
return is_array( $this->aEventStats ) ? $this->aEventStats : [];
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @param int[] $aStats
|
46 |
+
* @return $this
|
47 |
+
*/
|
48 |
+
public function setEventStats( $aStats = [] ) {
|
49 |
+
$this->aEventStats = $aStats;
|
50 |
+
return $this;
|
51 |
+
}
|
52 |
+
}
|
src/lib/src/Modules/Events/Strings.php
CHANGED
@@ -167,8 +167,8 @@ class Strings extends Base\Strings {
|
|
167 |
'hide_login_url' => __( '', 'wp-simple-firewall' ),
|
168 |
'2fa_success' => __( '', 'wp-simple-firewall' ),
|
169 |
'check_skip' => __( '', 'wp-simple-firewall' ),
|
170 |
-
'fw_email_fail' => __( '', 'wp-simple-firewall' ),
|
171 |
-
'fw_email_success' => __( '', 'wp-simple-firewall' ),
|
172 |
'firewall_block' => __( 'Firewall Block', 'wp-simple-firewall' ),
|
173 |
'blockparam_dirtraversal' => sprintf( '%s: %s',
|
174 |
__( 'Firewall', 'wp-simple-firewall' ),
|
167 |
'hide_login_url' => __( '', 'wp-simple-firewall' ),
|
168 |
'2fa_success' => __( '', 'wp-simple-firewall' ),
|
169 |
'check_skip' => __( '', 'wp-simple-firewall' ),
|
170 |
+
'fw_email_fail' => __( 'Firewall Block Email Fail', 'wp-simple-firewall' ),
|
171 |
+
'fw_email_success' => __( 'Firewall Block Email Success', 'wp-simple-firewall' ),
|
172 |
'firewall_block' => __( 'Firewall Block', 'wp-simple-firewall' ),
|
173 |
'blockparam_dirtraversal' => sprintf( '%s: %s',
|
174 |
__( 'Firewall', 'wp-simple-firewall' ),
|
src/lib/src/Modules/Firewall/Options.php
CHANGED
@@ -5,4 +5,11 @@ namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\Firewall;
|
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
|
6 |
|
7 |
class Options extends Base\ShieldOptions {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
}
|
5 |
use FernleafSystems\Wordpress\Plugin\Shield\Modules\Base;
|
6 |
|
7 |
class Options extends Base\ShieldOptions {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* @return bool
|
11 |
+
*/
|
12 |
+
public function isSendBlockEmail() {
|
13 |
+
return $this->isOpt( 'block_send_email', 'Y' );
|
14 |
+
}
|
15 |
}
|
src/lib/src/Modules/HackGuard/AjaxHandler.php
CHANGED
@@ -14,6 +14,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
14 |
*/
|
15 |
protected function processAjaxAction( $sAction ) {
|
16 |
|
|
|
17 |
switch ( $sAction ) {
|
18 |
|
19 |
case 'scans_start':
|
@@ -24,11 +25,14 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
24 |
$aResponse = $this->ajaxExec_CheckScans();
|
25 |
break;
|
26 |
|
|
|
|
|
|
|
|
|
27 |
case 'bulk_action':
|
28 |
-
$aResponse = $this->ajaxExec_ScanItemAction(
|
29 |
break;
|
30 |
|
31 |
-
case 'item_asset_accept':
|
32 |
case 'item_asset_deactivate':
|
33 |
case 'item_asset_reinstall':
|
34 |
case 'item_delete':
|
@@ -62,6 +66,10 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
62 |
$sScanSlug = Services::Request()->post( 'fScan' );
|
63 |
switch ( $sScanSlug ) {
|
64 |
|
|
|
|
|
|
|
|
|
65 |
case 'apc':
|
66 |
$oTableBuilder = new Shield\Tables\Build\ScanApc();
|
67 |
break;
|
@@ -91,13 +99,12 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
91 |
}
|
92 |
|
93 |
if ( empty( $oTableBuilder ) ) {
|
94 |
-
$sHtml = 'SCAN SLUG NOT
|
95 |
}
|
96 |
else {
|
97 |
$sHtml = $oTableBuilder
|
98 |
->setMod( $oMod )
|
99 |
->setDbHandler( $oMod->getDbHandler_ScanResults() )
|
100 |
-
->setScanActionVO( ( new Scan\ScanActionFromSlug() )->getAction( $sScanSlug ) )
|
101 |
->buildTable();
|
102 |
}
|
103 |
|
@@ -111,6 +118,7 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
111 |
* @return array
|
112 |
*/
|
113 |
private function ajaxExec_PluginReinstall() {
|
|
|
114 |
$oMod = $this->getMod();
|
115 |
$oReq = Services::Request();
|
116 |
|
@@ -119,12 +127,9 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
119 |
$sFile = sanitize_text_field( wp_unslash( $oReq->post( 'file' ) ) );
|
120 |
|
121 |
if ( $bReinstall ) {
|
122 |
-
/** @var \
|
123 |
-
$
|
124 |
-
$bActivate = $
|
125 |
-
->getSubProcessorPtg()
|
126 |
-
->reinstall( $sFile )
|
127 |
-
&& $bActivate;
|
128 |
}
|
129 |
|
130 |
if ( $bActivate ) {
|
@@ -136,70 +141,77 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
136 |
|
137 |
/**
|
138 |
* @param string $sAction
|
|
|
139 |
* @return array
|
140 |
*/
|
141 |
-
private function ajaxExec_ScanItemAction( $sAction ) {
|
142 |
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
143 |
$oMod = $this->getMod();
|
144 |
-
$oScanCon = $oMod->getScanController();
|
145 |
-
$oReq = Services::Request();
|
146 |
|
147 |
$bSuccess = false;
|
148 |
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
/** @var \ICWP_WPSF_Processor_HackProtect $oP */
|
154 |
-
$oP = $oMod->getProcessor();
|
155 |
-
$oScanner = $oP->getSubProScanner();
|
156 |
-
$oTablePro = $oScanner->getScannerFromSlug( $sScanSlug );
|
157 |
-
|
158 |
-
if ( empty( $oTablePro ) ) {
|
159 |
-
$sMessage = __( 'Unsupported scanner', 'wp-simple-firewall' );
|
160 |
-
}
|
161 |
-
else if ( empty( $sItemId ) && ( empty( $aItemIds ) || !is_array( $aItemIds ) ) ) {
|
162 |
-
$sMessage = __( 'Unsupported item(s) selected', 'wp-simple-firewall' );
|
163 |
}
|
164 |
else {
|
165 |
-
if (
|
166 |
-
$
|
167 |
}
|
|
|
|
|
|
|
|
|
|
|
168 |
|
169 |
-
|
170 |
-
$
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
}
|
176 |
-
}
|
177 |
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
|
|
|
|
|
|
|
|
|
|
190 |
}
|
191 |
-
|
192 |
-
$sMessage
|
193 |
}
|
194 |
}
|
195 |
-
catch ( \Exception $oE ) {
|
196 |
-
$sMessage = $oE->getMessage();
|
197 |
-
}
|
198 |
}
|
199 |
|
200 |
return [
|
201 |
'success' => $bSuccess,
|
202 |
-
'page_reload' =>
|
203 |
'message' => $sMessage,
|
204 |
];
|
205 |
}
|
@@ -210,13 +222,10 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
210 |
private function ajaxExec_CheckScans() {
|
211 |
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
212 |
$oMod = $this->getMod();
|
213 |
-
/** @var \ICWP_WPSF_Processor_HackProtect $oP */
|
214 |
-
$oP = $oMod->getProcessor();
|
215 |
/** @var Strings $oStrings */
|
216 |
$oStrings = $oMod->getStrings();
|
217 |
-
$oDbH = $oMod->getDbHandler_ScanQueue();
|
218 |
/** @var Shield\Databases\ScanQueue\Select $oSel */
|
219 |
-
$oSel = $
|
220 |
|
221 |
$oQueCon = $oMod->getScanController();
|
222 |
$sCurrent = $oSel->getCurrentScan();
|
@@ -261,9 +270,6 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
261 |
$sMessage = __( 'No scans were selected', 'wp-simple-firewall' );
|
262 |
$aFormParams = $this->getAjaxFormParams();
|
263 |
|
264 |
-
/** @var \ICWP_WPSF_Processor_HackProtect $oP */
|
265 |
-
$oP = $oMod->getProcessor();
|
266 |
-
$oScanner = $oP->getSubProScanner();
|
267 |
$oScanCon = $oMod->getScanController();
|
268 |
|
269 |
if ( !empty( $aFormParams ) ) {
|
@@ -275,26 +281,21 @@ class AjaxHandler extends Shield\Modules\Base\AjaxHandlerShield {
|
|
275 |
|
276 |
$aScansToStart = [];
|
277 |
foreach ( $aSelectedScans as $sScanSlug ) {
|
|
|
|
|
278 |
|
279 |
-
$oTablePro = $oScanner->getScannerFromSlug( $sScanSlug );
|
280 |
-
|
281 |
-
if ( !empty( $oTablePro ) && $oTablePro->isAvailable() ) {
|
282 |
-
$bAsync = true;
|
283 |
$aScansToStart[] = $sScanSlug;
|
284 |
|
285 |
if ( isset( $aFormParams[ 'opt_clear_ignore' ] ) ) {
|
286 |
-
$
|
287 |
}
|
288 |
if ( isset( $aFormParams[ 'opt_clear_notification' ] ) ) {
|
289 |
-
$
|
290 |
}
|
291 |
|
292 |
$bSuccess = true;
|
293 |
$bPageReload = true;
|
294 |
-
$sMessage =
|
295 |
-
__( 'Scans started.', 'wp-simple-firewall' ).' '.__( 'Please wait, as this will take a few moments.', 'wp-simple-firewall' )
|
296 |
-
: __( 'Scans completed.', 'wp-simple-firewall' ).' '.__( 'Reloading page', 'wp-simple-firewall' );
|
297 |
-
|
298 |
}
|
299 |
}
|
300 |
$oScanCon->startScans( $aScansToStart );
|
14 |
*/
|
15 |
protected function processAjaxAction( $sAction ) {
|
16 |
|
17 |
+
$oReq = Services::Request();
|
18 |
switch ( $sAction ) {
|
19 |
|
20 |
case 'scans_start':
|
25 |
$aResponse = $this->ajaxExec_CheckScans();
|
26 |
break;
|
27 |
|
28 |
+
case 'item_action':
|
29 |
+
$aResponse = $this->ajaxExec_ScanItemAction( $oReq->post( 'item_action' ), false );
|
30 |
+
break;
|
31 |
+
|
32 |
case 'bulk_action':
|
33 |
+
$aResponse = $this->ajaxExec_ScanItemAction( $oReq->post( 'bulk_action' ), true );
|
34 |
break;
|
35 |
|
|
|
36 |
case 'item_asset_deactivate':
|
37 |
case 'item_asset_reinstall':
|
38 |
case 'item_delete':
|
66 |
$sScanSlug = Services::Request()->post( 'fScan' );
|
67 |
switch ( $sScanSlug ) {
|
68 |
|
69 |
+
case 'aggregate':
|
70 |
+
$oTableBuilder = new Shield\Tables\Build\ScanAggregate();
|
71 |
+
break;
|
72 |
+
|
73 |
case 'apc':
|
74 |
$oTableBuilder = new Shield\Tables\Build\ScanApc();
|
75 |
break;
|
99 |
}
|
100 |
|
101 |
if ( empty( $oTableBuilder ) ) {
|
102 |
+
$sHtml = '<div class="alert alert-danger m-0">SCAN SLUG NOT SUPPORTED</div>';
|
103 |
}
|
104 |
else {
|
105 |
$sHtml = $oTableBuilder
|
106 |
->setMod( $oMod )
|
107 |
->setDbHandler( $oMod->getDbHandler_ScanResults() )
|
|
|
108 |
->buildTable();
|
109 |
}
|
110 |
|
118 |
* @return array
|
119 |
*/
|
120 |
private function ajaxExec_PluginReinstall() {
|
121 |
+
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
122 |
$oMod = $this->getMod();
|
123 |
$oReq = Services::Request();
|
124 |
|
127 |
$sFile = sanitize_text_field( wp_unslash( $oReq->post( 'file' ) ) );
|
128 |
|
129 |
if ( $bReinstall ) {
|
130 |
+
/** @var Scan\Controller\Ptg $oPtgScan */
|
131 |
+
$oPtgScan = $oMod->getScanCon( 'ptg' );
|
132 |
+
$bActivate = $oPtgScan->actionPluginReinstall( $sFile );
|
|
|
|
|
|
|
133 |
}
|
134 |
|
135 |
if ( $bActivate ) {
|
141 |
|
142 |
/**
|
143 |
* @param string $sAction
|
144 |
+
* @param bool $bIsBulkAction
|
145 |
* @return array
|
146 |
*/
|
147 |
+
private function ajaxExec_ScanItemAction( $sAction, $bIsBulkAction = false ) {
|
148 |
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
149 |
$oMod = $this->getMod();
|
|
|
|
|
150 |
|
151 |
$bSuccess = false;
|
152 |
|
153 |
+
if ( $sAction == 'download' ) {
|
154 |
+
// A special case since this action is handled using Javascript
|
155 |
+
$bSuccess = true;
|
156 |
+
$sMessage = __( 'File download has started.', 'wp-simple-firewall' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
}
|
158 |
else {
|
159 |
+
if ( $bIsBulkAction ) {
|
160 |
+
$aItemIdsToProcess = (array)Services::Request()->post( 'ids', [] );
|
161 |
}
|
162 |
+
else {
|
163 |
+
$aItemIdsToProcess = [ Services::Request()->post( 'rid' ) ];
|
164 |
+
}
|
165 |
+
/** @var int[] $aItemIdsToProcess */
|
166 |
+
$aItemIdsToProcess = array_filter( array_map( 'intval', $aItemIdsToProcess ) );
|
167 |
|
168 |
+
if ( empty( $aItemIdsToProcess ) ) {
|
169 |
+
$sMessage = __( 'Unsupported item(s) selected', 'wp-simple-firewall' );
|
170 |
+
}
|
171 |
+
else {
|
172 |
+
try {
|
173 |
+
$aScanSlugs = [];
|
174 |
+
$aSuccessfulItems = [];
|
175 |
+
foreach ( $aItemIdsToProcess as $nId ) {
|
176 |
+
/** @var Shield\Databases\Scanner\EntryVO $oEntry */
|
177 |
+
$oEntry = $oMod->getDbHandler_ScanResults()
|
178 |
+
->getQuerySelector()
|
179 |
+
->byId( $nId );
|
180 |
+
if ( $oEntry instanceof Shield\Databases\Scanner\EntryVO ) {
|
181 |
+
$aScanSlugs[] = $oEntry->scan;
|
182 |
+
if ( $oMod->getScanCon( $oEntry->scan )->executeItemAction( $nId, $sAction ) ) {
|
183 |
+
$aSuccessfulItems[] = $nId;
|
184 |
+
}
|
185 |
+
}
|
186 |
}
|
|
|
187 |
|
188 |
+
if ( count( $aSuccessfulItems ) === count( $aItemIdsToProcess ) ) {
|
189 |
+
$bSuccess = true;
|
190 |
+
$sMessage = __( 'Action successful.' );
|
191 |
+
}
|
192 |
+
else {
|
193 |
+
$sMessage = __( 'An error occurred.' ).' '.__( 'Some items may not have been processed.' );
|
194 |
+
}
|
195 |
|
196 |
+
// We don't rescan for ignores.
|
197 |
+
if ( in_array( $sAction, [ 'ignore' ] ) ) {
|
198 |
+
$sMessage .= ' '.__( 'Reloading', 'wp-simple-firewall' ).' ...';
|
199 |
+
}
|
200 |
+
else {
|
201 |
+
// rescan
|
202 |
+
$oMod->getScanController()->startScans( $aScanSlugs );
|
203 |
+
$sMessage .= ' '.__( 'Rescanning', 'wp-simple-firewall' ).' ...';
|
204 |
+
}
|
205 |
}
|
206 |
+
catch ( \Exception $oE ) {
|
207 |
+
$sMessage = $oE->getMessage();
|
208 |
}
|
209 |
}
|
|
|
|
|
|
|
210 |
}
|
211 |
|
212 |
return [
|
213 |
'success' => $bSuccess,
|
214 |
+
'page_reload' => !in_array( $sAction, [ 'download' ] ),
|
215 |
'message' => $sMessage,
|
216 |
];
|
217 |
}
|
222 |
private function ajaxExec_CheckScans() {
|
223 |
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
224 |
$oMod = $this->getMod();
|
|
|
|
|
225 |
/** @var Strings $oStrings */
|
226 |
$oStrings = $oMod->getStrings();
|
|
|
227 |
/** @var Shield\Databases\ScanQueue\Select $oSel */
|
228 |
+
$oSel = $oMod->getDbHandler_ScanQueue()->getQuerySelector();
|
229 |
|
230 |
$oQueCon = $oMod->getScanController();
|
231 |
$sCurrent = $oSel->getCurrentScan();
|
270 |
$sMessage = __( 'No scans were selected', 'wp-simple-firewall' );
|
271 |
$aFormParams = $this->getAjaxFormParams();
|
272 |
|
|
|
|
|
|
|
273 |
$oScanCon = $oMod->getScanController();
|
274 |
|
275 |
if ( !empty( $aFormParams ) ) {
|
281 |
|
282 |
$aScansToStart = [];
|
283 |
foreach ( $aSelectedScans as $sScanSlug ) {
|
284 |
+
$oThisScanCon = $oMod->getScanCon( $sScanSlug );
|
285 |
+
if ( !empty( $oThisScanCon ) && $oThisScanCon->isScanningAvailable() ) {
|
286 |
|
|
|
|
|
|
|
|
|
287 |
$aScansToStart[] = $sScanSlug;
|
288 |
|
289 |
if ( isset( $aFormParams[ 'opt_clear_ignore' ] ) ) {
|
290 |
+
$oThisScanCon->resetIgnoreStatus();
|
291 |
}
|
292 |
if ( isset( $aFormParams[ 'opt_clear_notification' ] ) ) {
|
293 |
+
$oThisScanCon->resetNotifiedStatus();
|
294 |
}
|
295 |
|
296 |
$bSuccess = true;
|
297 |
$bPageReload = true;
|
298 |
+
$sMessage = __( 'Scans started.', 'wp-simple-firewall' ).' '.__( 'Please wait, as this will take a few moments.', 'wp-simple-firewall' );
|
|
|
|
|
|
|
299 |
}
|
300 |
}
|
301 |
$oScanCon->startScans( $aScansToStart );
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesForAsset.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build\BuildHashesFromDir;
|
6 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
|
7 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Class BuildHashesForAsset
|
11 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
|
12 |
+
*/
|
13 |
+
class BuildHashesForAsset {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @var string
|
17 |
+
*/
|
18 |
+
private $sHashAlgo = 'md5';
|
19 |
+
|
20 |
+
/**
|
21 |
+
* All file keys are their normalised file paths, with the ABSPATH stripped from it.
|
22 |
+
* @param WpPluginVo|WpThemeVo $oAsset
|
23 |
+
* @return string[]
|
24 |
+
*/
|
25 |
+
public function build( $oAsset ) {
|
26 |
+
return ( new BuildHashesFromDir() )
|
27 |
+
->setHashAlgo( $this->getHashAlgo() )
|
28 |
+
->setDepth( 0 )
|
29 |
+
->setFileExts( [] )
|
30 |
+
->build( $oAsset->getInstallDir() );
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @return string
|
35 |
+
*/
|
36 |
+
public function getHashAlgo() {
|
37 |
+
return empty( $this->sHashAlgo ) ? 'md5' : $this->sHashAlgo;
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @param string $sHashAlgo
|
42 |
+
* @return static
|
43 |
+
*/
|
44 |
+
public function setHashAlgo( $sHashAlgo ) {
|
45 |
+
$this->sHashAlgo = $sHashAlgo;
|
46 |
+
return $this;
|
47 |
+
}
|
48 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromApi.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Services\Core\VOs;
|
6 |
+
use FernleafSystems\Wordpress\Services\Utilities\Integrations\WpHashes\Hashes;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Class BuildHashesFromApi
|
10 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
|
11 |
+
*/
|
12 |
+
class BuildHashesFromApi {
|
13 |
+
|
14 |
+
/**
|
15 |
+
* All file keys are their normalised file paths, with the ABSPATH stripped from it.
|
16 |
+
* @param VOs\WpPluginVo|VOs\WpThemeVo $oAsset
|
17 |
+
* @return string[] - keys are file paths relative to ABSPATH
|
18 |
+
* @throws \Exception
|
19 |
+
*/
|
20 |
+
public function build( $oAsset ) {
|
21 |
+
if ( !$oAsset->isWpOrg() ) {
|
22 |
+
|
23 |
+
$bApiSupport = false;
|
24 |
+
|
25 |
+
$aApiInfo = ( new Hashes\ApiInfo() )
|
26 |
+
->setUseQueryCache( true )
|
27 |
+
->getInfo();
|
28 |
+
if ( is_array( $aApiInfo ) && !empty( $aApiInfo[ 'supported_premium' ] ) ) {
|
29 |
+
if ( $oAsset instanceof VOs\WpPluginVo ) {
|
30 |
+
$sSlug = $oAsset->slug;
|
31 |
+
$sFile = $oAsset->file;
|
32 |
+
$sName = $oAsset->Name;
|
33 |
+
$aItems = $aApiInfo[ 'supported_premium' ][ 'plugins' ];
|
34 |
+
}
|
35 |
+
else {
|
36 |
+
$sSlug = $oAsset->stylesheet;
|
37 |
+
$sFile = $oAsset->stylesheet;
|
38 |
+
$sName = $oAsset->wp_theme->get( 'Name' );
|
39 |
+
$aItems = $aApiInfo[ 'supported_premium' ][ 'themes' ];
|
40 |
+
}
|
41 |
+
|
42 |
+
foreach ( $aItems as $aMaybeItem ) {
|
43 |
+
|
44 |
+
if ( $aMaybeItem[ 'slug' ] == $sSlug
|
45 |
+
|| $aMaybeItem[ 'name' ] == $sName || $aMaybeItem[ 'file' ] == $sFile ) {
|
46 |
+
$bApiSupport = true;
|
47 |
+
if ( $oAsset instanceof VOs\WpPluginVo && empty( $oAsset->slug ) ) {
|
48 |
+
$oAsset->slug = $aMaybeItem[ 'slug' ];
|
49 |
+
}
|
50 |
+
break;
|
51 |
+
}
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
if ( !$bApiSupport ) {
|
56 |
+
throw new \Exception( 'Not a WordPress.org asset.' );
|
57 |
+
}
|
58 |
+
}
|
59 |
+
return $this->retrieveForAsset( $oAsset );
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @param VOs\WpPluginVo|VOs\WpThemeVo $oAsset
|
64 |
+
* @return string[]|null
|
65 |
+
* @throws \Exception
|
66 |
+
*/
|
67 |
+
private function retrieveForAsset( $oAsset ) {
|
68 |
+
|
69 |
+
if ( $oAsset instanceof VOs\WpPluginVo ) {
|
70 |
+
$aHashes = ( new Hashes\Plugin() )
|
71 |
+
->setUseQueryCache( true )
|
72 |
+
->getHashes( $oAsset->slug, $oAsset->Version, 'md5' );
|
73 |
+
}
|
74 |
+
elseif ( $oAsset instanceof VOs\WpThemeVo ) {
|
75 |
+
if ( $oAsset->is_child ) {
|
76 |
+
throw new \Exception( 'Live hashes are not supported for child themes.' );
|
77 |
+
}
|
78 |
+
$aHashes = ( new Hashes\Theme() )
|
79 |
+
->setUseQueryCache( true )
|
80 |
+
->getHashes( $oAsset->stylesheet, $oAsset->version, 'md5' );
|
81 |
+
}
|
82 |
+
else {
|
83 |
+
throw new \Exception( 'Not a supported asset type' );
|
84 |
+
}
|
85 |
+
|
86 |
+
return $aHashes;
|
87 |
+
}
|
88 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/Build/BuildHashesFromDir.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Scans\Helpers\StandardDirectoryIterator;
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Class BuildHashesFromDir
|
9 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\Build
|
10 |
+
*/
|
11 |
+
class BuildHashesFromDir {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var int
|
15 |
+
*/
|
16 |
+
protected $nDepth = 0;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @var string[]
|
20 |
+
*/
|
21 |
+
protected $aFileExts = [];
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @var string
|
25 |
+
*/
|
26 |
+
private $sHashAlgo = 'md5';
|
27 |
+
|
28 |
+
/**
|
29 |
+
* All file keys are their normalised file paths, with the ABSPATH stripped from it.
|
30 |
+
* @param string $sDir
|
31 |
+
* @return string[]
|
32 |
+
*/
|
33 |
+
public function build( $sDir ) {
|
34 |
+
$aSnaps = [];
|
35 |
+
try {
|
36 |
+
$sDir = wp_normalize_path( $sDir );
|
37 |
+
$sAlgo = $this->getHashAlgo();
|
38 |
+
$oDirIt = StandardDirectoryIterator::create( $sDir, $this->nDepth, $this->aFileExts );
|
39 |
+
foreach ( $oDirIt as $oFile ) {
|
40 |
+
/** @var \SplFileInfo $oFile */
|
41 |
+
$sFullPath = $oFile->getPathname();
|
42 |
+
$sKey = str_replace( $sDir, '', wp_normalize_path( $sFullPath ) );
|
43 |
+
$aSnaps[ $sKey ] = hash_file( $sAlgo, $sFullPath );
|
44 |
+
}
|
45 |
+
}
|
46 |
+
catch ( \Exception $oE ) {
|
47 |
+
}
|
48 |
+
return $aSnaps;
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
public function getHashAlgo() {
|
55 |
+
return empty( $this->sHashAlgo ) ? 'md5' : $this->sHashAlgo;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @param int $nDepth
|
60 |
+
* @return $this
|
61 |
+
*/
|
62 |
+
public function setDepth( $nDepth ) {
|
63 |
+
$this->nDepth = max( 0, (int)$nDepth );
|
64 |
+
return $this;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* @param string[] $aExts
|
69 |
+
* @return $this
|
70 |
+
*/
|
71 |
+
public function setFileExts( $aExts ) {
|
72 |
+
$this->aFileExts = $aExts;
|
73 |
+
return $this;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @param string $sHashAlgo
|
78 |
+
* @return static
|
79 |
+
*/
|
80 |
+
public function setHashAlgo( $sHashAlgo ) {
|
81 |
+
$this->sHashAlgo = $sHashAlgo;
|
82 |
+
return $this;
|
83 |
+
}
|
84 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/FindAssetsToSnap.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
|
6 |
+
use FernleafSystems\Wordpress\Services\Core\VOs;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
+
|
9 |
+
class FindAssetsToSnap {
|
10 |
+
|
11 |
+
use ModConsumer;
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @return VOs\WpPluginVo[]|VOs\WpThemeVo[]
|
15 |
+
*/
|
16 |
+
public function run() {
|
17 |
+
$aAssets = [];
|
18 |
+
|
19 |
+
foreach ( Services::WpPlugins()->getPluginsAsVo() as $oAsset ) {
|
20 |
+
if ( $oAsset->active ) {
|
21 |
+
$aAssets[] = $oAsset;
|
22 |
+
}
|
23 |
+
}
|
24 |
+
|
25 |
+
$oWPT = Services::WpThemes();
|
26 |
+
$oAsset = $oWPT->getThemeAsVo( $oWPT->getCurrent()->get_stylesheet() );
|
27 |
+
$aAssets[] = $oAsset;
|
28 |
+
|
29 |
+
if ( $oWPT->isActiveThemeAChild() ) {
|
30 |
+
$oAsset = $oWPT->getThemeAsVo( $oAsset->wp_theme->get_template() );
|
31 |
+
$aAssets[] = $oAsset;
|
32 |
+
}
|
33 |
+
|
34 |
+
return $aAssets;
|
35 |
+
}
|
36 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/Store.php
ADDED
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
|
6 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
+
|
9 |
+
class Store {
|
10 |
+
|
11 |
+
const SEPARATOR = '=::=';
|
12 |
+
|
13 |
+
/**
|
14 |
+
* @var array
|
15 |
+
*/
|
16 |
+
private $aSnapMeta;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @var array
|
20 |
+
*/
|
21 |
+
private $aSnapData;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @var WpPluginVo|WpThemeVo
|
25 |
+
*/
|
26 |
+
private $oAsset;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
protected $sWorkingDir;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Store constructor.
|
35 |
+
* @param WpPluginVo|WpThemeVo $oAsset
|
36 |
+
*/
|
37 |
+
public function __construct( $oAsset ) {
|
38 |
+
$this->oAsset = $oAsset;
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @return WpPluginVo|WpThemeVo
|
43 |
+
*/
|
44 |
+
public function getAsset() {
|
45 |
+
return $this->oAsset;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @return string
|
50 |
+
*/
|
51 |
+
public function getContext() {
|
52 |
+
return ( $this->getAsset() instanceof WpPluginVo ) ? 'plugins' : 'themes';
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @return string
|
57 |
+
*/
|
58 |
+
public function getSnapStorePath() {
|
59 |
+
return $this->getBaseSnapPath().'.txt';
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @return string
|
64 |
+
*/
|
65 |
+
public function getSnapStoreMetaPath() {
|
66 |
+
return $this->getBaseSnapPath().'_meta'.'.txt';
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @return string
|
71 |
+
*/
|
72 |
+
private function getBaseSnapPath() {
|
73 |
+
return path_join( $this->getWorkingDir(), path_join( $this->getContext(), $this->getSlug() ) );
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @return string
|
78 |
+
*/
|
79 |
+
public function getWorkingDir() {
|
80 |
+
return $this->sWorkingDir;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* @return string
|
85 |
+
*/
|
86 |
+
protected function getSlug() {
|
87 |
+
$oAs = $this->getAsset();
|
88 |
+
return ( $oAs instanceof WpPluginVo ) ? dirname( $oAs->file ) : $oAs->stylesheet;
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* @return string[]
|
93 |
+
*/
|
94 |
+
public function getSnapData() {
|
95 |
+
if ( !is_array( $this->aSnapData ) ) {
|
96 |
+
$this->loadSnapDataIfExists();
|
97 |
+
}
|
98 |
+
return is_array( $this->aSnapData ) ? $this->aSnapData : [];
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* @return array[]
|
103 |
+
*/
|
104 |
+
public function getSnapMeta() {
|
105 |
+
if ( empty( $this->aSnapMeta ) ) {
|
106 |
+
$this->loadSnapMetaIfExists();
|
107 |
+
}
|
108 |
+
return is_array( $this->aSnapMeta ) ? $this->aSnapMeta : [];
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* @return $this
|
113 |
+
*/
|
114 |
+
private function loadSnapDataIfExists() {
|
115 |
+
try {
|
116 |
+
$this->aSnapData = $this->readSnapData();
|
117 |
+
}
|
118 |
+
catch ( \Exception $oE ) {
|
119 |
+
$this->aSnapData = [];
|
120 |
+
}
|
121 |
+
return $this;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* @return $this
|
126 |
+
*/
|
127 |
+
private function loadSnapMetaIfExists() {
|
128 |
+
try {
|
129 |
+
$this->aSnapMeta = $this->readSnapMeta();
|
130 |
+
}
|
131 |
+
catch ( \Exception $oE ) {
|
132 |
+
$this->aSnapMeta = [];
|
133 |
+
}
|
134 |
+
return $this;
|
135 |
+
}
|
136 |
+
|
137 |
+
/**
|
138 |
+
* @throws \Exception
|
139 |
+
*/
|
140 |
+
private function readSnapData() {
|
141 |
+
$oFS = Services::WpFs();
|
142 |
+
|
143 |
+
if ( $this->isReady() && !$this->getSnapStoreExists() ) {
|
144 |
+
throw new \Exception( sprintf( 'Snapshot store does not exist: "%s"', $this->getSnapStorePath() ) );
|
145 |
+
}
|
146 |
+
|
147 |
+
$sEncoded = $oFS->getFileContent( $this->getSnapStorePath(), true );
|
148 |
+
if ( !empty( $sEncoded ) ) {
|
149 |
+
$aSnap = [];
|
150 |
+
foreach ( array_map( 'trim', explode( "\n", $sEncoded ) ) as $sLine ) {
|
151 |
+
list( $sFile, $sHash ) = explode( self::SEPARATOR, $sLine, 2 );
|
152 |
+
$aSnap[ $sFile ] = $sHash;
|
153 |
+
}
|
154 |
+
}
|
155 |
+
if ( empty( $aSnap ) ) {
|
156 |
+
throw new \Exception( 'Snapshot data could not be decoded' );
|
157 |
+
}
|
158 |
+
|
159 |
+
return $aSnap;
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* @throws \Exception
|
164 |
+
*/
|
165 |
+
private function readSnapMeta() {
|
166 |
+
$oFS = Services::WpFs();
|
167 |
+
|
168 |
+
if ( $this->isReady() && !$this->getSnapStoreExists() ) {
|
169 |
+
throw new \Exception( sprintf( 'Snapshot store does not exist: "%s"', $this->getSnapStorePath() ) );
|
170 |
+
}
|
171 |
+
|
172 |
+
$sEncoded = $oFS->getFileContent( $this->getSnapStoreMetaPath(), true );
|
173 |
+
if ( !empty( $sEncoded ) ) {
|
174 |
+
$aData = json_decode( $sEncoded, true );
|
175 |
+
}
|
176 |
+
if ( empty( $aData ) || !is_array( $aData ) ) {
|
177 |
+
throw new \Exception( 'Snapshot data could not be decoded' );
|
178 |
+
}
|
179 |
+
|
180 |
+
return $aData;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* @return $this
|
185 |
+
* @throws \Exception
|
186 |
+
*/
|
187 |
+
public function save() {
|
188 |
+
if ( $this->isReady() ) {
|
189 |
+
$aToWrite = [];
|
190 |
+
foreach ( $this->getSnapData() as $sFile => $sHash ) {
|
191 |
+
$aToWrite[] = sprintf( '%s%s%s', $sFile, self::SEPARATOR, $sHash );
|
192 |
+
}
|
193 |
+
Services::WpFs()->putFileContent(
|
194 |
+
$this->getSnapStorePath(),
|
195 |
+
implode( "\n", $aToWrite ),
|
196 |
+
true
|
197 |
+
);
|
198 |
+
Services::WpFs()->putFileContent(
|
199 |
+
$this->getSnapStoreMetaPath(),
|
200 |
+
json_encode( $this->getSnapMeta() ),
|
201 |
+
true
|
202 |
+
);
|
203 |
+
}
|
204 |
+
return $this;
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* @return bool
|
209 |
+
* @throws \Exception
|
210 |
+
*/
|
211 |
+
protected function isReady() {
|
212 |
+
$oFS = Services::WpFs();
|
213 |
+
$sDir = dirname( $this->getSnapStorePath() );
|
214 |
+
|
215 |
+
if ( strlen( $this->getContext() ) < 1 ) {
|
216 |
+
throw new \Exception( 'Context has not been specified' );
|
217 |
+
}
|
218 |
+
if ( !$oFS->mkdir( $sDir ) ) {
|
219 |
+
throw new \Exception( sprintf( 'Store directory could not be created: %s', $sDir ) );
|
220 |
+
}
|
221 |
+
if ( !$oFS->exists( $sDir ) ) {
|
222 |
+
throw new \Exception( sprintf( 'Store directory path does not exist: %s', $sDir ) );
|
223 |
+
}
|
224 |
+
return true;
|
225 |
+
}
|
226 |
+
|
227 |
+
/**
|
228 |
+
* @return bool
|
229 |
+
*/
|
230 |
+
public function getSnapStoreExists() {
|
231 |
+
return Services::WpFs()->exists( $this->getSnapStorePath() ) && $this->isSnapStoreRelevant();
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* We try to capture periods wherein which the plugin may have been deactivated and tracking has paused.
|
236 |
+
* @return bool
|
237 |
+
*/
|
238 |
+
private function isSnapStoreRelevant() {
|
239 |
+
$bRelevant = true;
|
240 |
+
$oFs = Services::WpFs();
|
241 |
+
$mTime = Services::Request()->ts() - $oFs->getModifiedTime( $this->getSnapStorePath() );
|
242 |
+
if ( $mTime > DAY_IN_SECONDS ) {
|
243 |
+
$bRelevant = false;
|
244 |
+
}
|
245 |
+
elseif ( $mTime > DAY_IN_SECONDS/2 ) {
|
246 |
+
$oFs->touch( $this->getSnapStorePath() );
|
247 |
+
}
|
248 |
+
return $bRelevant;
|
249 |
+
}
|
250 |
+
|
251 |
+
/**
|
252 |
+
* @param array $aData
|
253 |
+
* @return $this
|
254 |
+
*/
|
255 |
+
public function setSnapData( $aData ) {
|
256 |
+
$this->aSnapData = $aData;
|
257 |
+
return $this;
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* @param array $aMeta
|
262 |
+
* @return $this
|
263 |
+
*/
|
264 |
+
public function setSnapMeta( $aMeta ) {
|
265 |
+
$this->aSnapMeta = $aMeta;
|
266 |
+
return $this;
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
* @param string $sDir
|
271 |
+
* @return $this
|
272 |
+
*/
|
273 |
+
public function setWorkingDir( $sDir ) {
|
274 |
+
$this->sWorkingDir = $sDir;
|
275 |
+
return $this;
|
276 |
+
}
|
277 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseAction.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
|
6 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
|
7 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
|
8 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpThemeVo;
|
9 |
+
|
10 |
+
class BaseAction {
|
11 |
+
|
12 |
+
use ModConsumer;
|
13 |
+
|
14 |
+
/**
|
15 |
+
* @var WpPluginVo|WpThemeVo
|
16 |
+
*/
|
17 |
+
private $oAsset;
|
18 |
+
|
19 |
+
public function __construct() {
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* @return WpPluginVo|WpThemeVo
|
24 |
+
*/
|
25 |
+
public function getAsset() {
|
26 |
+
return $this->oAsset;
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @param WpPluginVo|WpThemeVo $oAsset
|
31 |
+
* @return static
|
32 |
+
*/
|
33 |
+
public function setAsset( $oAsset ) {
|
34 |
+
$this->oAsset = $oAsset;
|
35 |
+
return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @return Snapshots\Store
|
40 |
+
* @throws \Exception
|
41 |
+
*/
|
42 |
+
protected function getNewStore() {
|
43 |
+
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
44 |
+
$oMod = $this->getMod();
|
45 |
+
return ( new Snapshots\Store( $this->getAsset() ) )
|
46 |
+
->setWorkingDir( $oMod->getPtgSnapsBaseDir() );
|
47 |
+
}
|
48 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BaseBulk.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\ModConsumer;
|
6 |
+
|
7 |
+
class BaseBulk {
|
8 |
+
|
9 |
+
use ModConsumer;
|
10 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/Build.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots;
|
6 |
+
use FernleafSystems\Wordpress\Services\Core\VOs\WpPluginVo;
|
7 |
+
use FernleafSystems\Wordpress\Services\Services;
|
8 |
+
|
9 |
+
class Build extends BaseAction {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* @throws \Exception
|
13 |
+
*/
|
14 |
+
public function run() {
|
15 |
+
$oAsset = $this->getAsset();
|
16 |
+
try {
|
17 |
+
$aHashes = ( new Snapshots\Build\BuildHashesFromApi() )->build( $oAsset );
|
18 |
+
}
|
19 |
+
catch ( \Exception $oE ) {
|
20 |
+
}
|
21 |
+
|
22 |
+
$aMeta = $this->generateMeta();
|
23 |
+
if ( empty( $aHashes ) ) {
|
24 |
+
$aHashes = ( new Snapshots\Build\BuildHashesForAsset() )
|
25 |
+
->setHashAlgo( 'md5' )
|
26 |
+
->build( $oAsset );
|
27 |
+
$aMeta[ 'live_hashes' ] = false;
|
28 |
+
}
|
29 |
+
else {
|
30 |
+
$aMeta[ 'live_hashes' ] = true;
|
31 |
+
}
|
32 |
+
|
33 |
+
if ( !empty( $aHashes ) ) {
|
34 |
+
/** @var \ICWP_WPSF_FeatureHandler_HackProtect $oMod */
|
35 |
+
$oMod = $this->getMod();
|
36 |
+
$oStore = ( new CreateNew() )
|
37 |
+
->setMod( $oMod )
|
38 |
+
->setAsset( $oAsset )
|
39 |
+
->run();
|
40 |
+
$oStore->setSnapData( $aHashes )
|
41 |
+
->setSnapMeta( $aMeta )
|
42 |
+
->save();
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @return array
|
48 |
+
*/
|
49 |
+
private function generateMeta() {
|
50 |
+
$oAsset = $this->getAsset();
|
51 |
+
$aMeta = [
|
52 |
+
'ts' => Services::Request()->ts(),
|
53 |
+
'snap_version' => $this->getCon()->getVersion(),
|
54 |
+
];
|
55 |
+
$aMeta[ 'unique_id' ] = ( $oAsset instanceof WpPluginVo ) ?
|
56 |
+
$oAsset->file
|
57 |
+
: $oAsset->stylesheet;
|
58 |
+
$aMeta[ 'name' ] = ( $oAsset instanceof WpPluginVo ) ?
|
59 |
+
$oAsset->Name
|
60 |
+
: $oAsset->wp_theme->get( 'Name' );
|
61 |
+
$aMeta[ 'version' ] = $oAsset->version;
|
62 |
+
return $aMeta;
|
63 |
+
}
|
64 |
+
}
|
src/lib/src/Modules/HackGuard/Lib/Snapshots/StoreAction/BuildAll.php
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction;
|
4 |
+
|
5 |
+
use FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\FindAssetsToSnap;
|
6 |
+
use FernleafSystems\Wordpress\Services\Core\VOs;
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Class BuildAll
|
10 |
+
* @package FernleafSystems\Wordpress\Plugin\Shield\Modules\HackGuard\Lib\Snapshots\StoreAction
|
11 |
+
* @deprecated 8.5.2
|
12 |
+
*/
|
13 |
+
class BuildAll extends BaseBulk {
|
14 |
+
|
15 |
+
public function build() {
|
16 |
+
forea
|