Jelajahi Sumber

Add HealthChecks.io to homepage

causefx 7 tahun lalu
induk
melakukan
31369ebb14

+ 6 - 0
api/config/default.php

@@ -131,6 +131,10 @@ return array(
 	'ombiLimitUser' => false,
 	'ombiRefresh' => '600000',
 	'ombiTvDefault' => 'all',
+	'homepageHealthChecksEnabled' => false,
+	'healthChecksToken' => '',
+	'healthChecksTags' => '',
+	'homepageHealthChecksAuth' => '1',
 	'homepageOrdercustomhtml' => '1',
 	'homepageOrdercustomhtmlTwo' => '2',
 	'homepageOrdertransmission' => '3',
@@ -147,11 +151,13 @@ return array(
 	'homepageOrdercalendar' => '14',
 	'homepageOrderrTorrent' => '15',
 	'homepageOrderdownloader' => '16',
+	'homepageOrderhealthchecks' => '17',
 	'homepageShowStreamNames' => false,
 	'homepageShowStreamNamesAuth' => '1',
 	'homepageStreamRefresh' => '60000',
 	'homepageRecentRefresh' => '60000',
 	'homepageDownloadRefresh' => '60000',
+	'homepageHealthChecksRefresh' => '60000',
 	'homepagePlexStreams' => false,
 	'homepagePlexStreamsAuth' => '1',
 	'homepagePlexRecent' => false,

+ 41 - 0
api/functions/homepage-connect-functions.php

@@ -51,6 +51,9 @@ function homepageConnect($array)
 		case 'getRequests':
 			return getOmbiRequests($GLOBALS['ombiLimit']);
 			break;
+		case 'getHealthChecks':
+			return (qualifyRequest($GLOBALS['homepageHealthChecksAuth'])) ? getHealthChecks($array['data']['tags']) : false;
+			break;
 		default:
 			# code...
 			break;
@@ -58,6 +61,44 @@ function homepageConnect($array)
 	return false;
 }
 
+function healthChecksTags($tags)
+{
+	$return = 'tag=';
+	if (!$tags) {
+		return '';
+	} elseif ($tags == '*') {
+		return '';
+	} else {
+		if (strpos($tags, ',') !== false) {
+			$list = explode(',', $tags);
+			return $return . implode("&tag=", $list);
+		} else {
+			return $return . $tags;
+		}
+	}
+}
+
+function getHealthChecks($tags = null)
+{
+	if ($GLOBALS['homepageHealthChecksEnabled'] && !empty($GLOBALS['healthChecksToken']) && qualifyRequest($GLOBALS['homepageHealthChecksAuth'])) {
+		$tags = ($tags) ? healthChecksTags($tags) : '';
+		$url = 'https://healthchecks.io/api/v1/checks/' . $tags;
+		try {
+			$headers = array('X-Api-Key' => $GLOBALS['healthChecksToken']);
+			$options = (localURL($url)) ? array('verify' => false) : array();
+			$response = Requests::get($url, $headers, $options);
+			if ($response->success) {
+				$api['content'] = json_decode($response->body, true);
+			}
+		} catch (Requests_Exception $e) {
+			writeLog('error', 'HealthChecks Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
+		};
+		$api['content'] = isset($api['content']) ? $api['content'] : false;
+		return $api;
+	}
+	return false;
+}
+
 function streamType($value)
 {
 	if ($value == "transcode" || $value == "Transcode") {

+ 68 - 0
api/functions/homepage-functions.php

@@ -19,6 +19,7 @@ function homepageOrder()
 		"homepageOrderdeluge" => $GLOBALS['homepageOrderdeluge'],
 		"homepageOrderrTorrent" => $GLOBALS['homepageOrderrTorrent'],
 		"homepageOrderdownloader" => $GLOBALS['homepageOrderdownloader'],
+		"homepageOrderhealthchecks" => $GLOBALS['homepageOrderhealthchecks'],
 	);
 	asort($homepageOrder);
 	return $homepageOrder;
@@ -280,6 +281,18 @@ function buildHomepageItem($homepageItem)
 				';
 			}
 			break;
+		case 'homepageOrderhealthchecks':
+			if ($GLOBALS['homepageHealthChecksEnabled'] && qualifyRequest($GLOBALS['homepageHealthChecksAuth'])) {
+				$item .= '<div class="white-box"><h2 class="text-center" lang="en">Loading Health Checks...</h2></div>';
+				$item .= '
+				<script>
+				// Health Checks
+				homepageHealthChecks("' . $GLOBALS['healthChecksTags'] . '","' . $GLOBALS['homepageHealthChecksRefresh'] . '");
+				// End Health Checks
+				</script>
+				';
+			}
+			break;
 		default:
 			# code...
 			break;
@@ -2045,6 +2058,54 @@ function getHomepageList()
 				)
 			)
 		),
+		array(
+			'name' => 'HealthChecks',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/healthchecks.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageHealthChecksEnabled',
+						'label' => 'Enable',
+						'value' => $GLOBALS['homepageHealthChecksEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageHealthChecksAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $GLOBALS['homepageHealthChecksAuth'],
+						'options' => $groups
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'password-alt',
+						'name' => 'healthChecksToken',
+						'label' => 'Token',
+						'value' => $GLOBALS['healthChecksToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'healthChecksTags',
+						'label' => 'Tags',
+						'value' => $GLOBALS['healthChecksTags'],
+						'help' => 'Pull only checks with this tag - Blank for all',
+						'placeholder' => 'Multiple tags using CSV - tag1,tag2'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageHealthChecksRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $GLOBALS['homepageHealthChecksRefresh'],
+						'options' => optionTime()
+					),
+				),
+			)
+		),
 		array(
 			'name' => 'CustomHTML-1',
 			'enabled' => (strpos('personal,business', $GLOBALS['license']) !== false) ? true : false,
@@ -2225,6 +2286,13 @@ function buildHomepageSettings()
 					$class .= ' faded';
 				}
 				break;
+			case 'homepageOrderhealthchecks':
+				$class = 'bg-healthchecks';
+				$image = 'plugins/images/tabs/healthchecks.png';
+				if (!$GLOBALS['homepageHealthChecksEnabled']) {
+					$class .= ' faded';
+				}
+				break;
 			default:
 				$class = 'blue-bg';
 				$image = '';

+ 1 - 0
api/functions/organizr-functions.php

@@ -25,6 +25,7 @@ function organizrSpecialSettings()
 			),
 			'options' => array(
 				'alternateHomepageHeaders' => $GLOBALS['alternateHomepageHeaders'],
+				'healthChecksTags' => $GLOBALS['healthChecksTags'],
 			)
 		),
 		'sso' => array(

+ 2634 - 2
css/organizr.css

@@ -491,7 +491,9 @@ input#inviteCodeInput {
     font-size: 400%;
     height: 100%;
 }
-
+.bg-org-alt {
+    background: #2d2c2c;
+}
 .bg-plex {
     background: #E5A00D;
 }
@@ -499,7 +501,9 @@ input#inviteCodeInput {
 .bg-emby {
     background: #4CAF50;
 }
-
+.bg-healthchecks {
+    background: #56b059;
+}
 .bg-sab {
     background: #ffb300;
 }
@@ -1304,3 +1308,2631 @@ html {
     display: none;
 }
 */
+.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; }
+
+.display-5 {
+    font-size: 3rem;
+    font-weight: 300;
+    line-height: 1.2; }
+
+.display-6 {
+    font-size: 2.5rem;
+    font-weight: 300;
+    line-height: 1.2; }
+
+.display-7 {
+    font-size: 2rem;
+    font-weight: 300;
+    line-height: 1.2; }
+
+.font-16 {
+    font-size: 16px; }
+
+.font-12 {
+    font-size: 12px; }
+
+.font-14 {
+    font-size: 14px; }
+
+.font-10 {
+    font-size: 10px; }
+
+.font-18 {
+    font-size: 18px; }
+
+.font-20 {
+    font-size: 20px; }
+
+.font-22 {
+    font-size: 22px; }
+
+.font-24 {
+    font-size: 24px; }
+
+.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: 0.25rem !important; }
+
+.mt-1,
+.my-1 {
+    margin-top: 0.25rem !important; }
+
+.mr-1,
+.mx-1 {
+    margin-right: 0.25rem !important; }
+
+.mb-1,
+.my-1 {
+    margin-bottom: 0.25rem !important; }
+
+.ml-1,
+.mx-1 {
+    margin-left: 0.25rem !important; }
+
+.m-2 {
+    margin: 0.5rem !important; }
+
+.mt-2,
+.my-2 {
+    margin-top: 0.5rem !important; }
+
+.mr-2,
+.mx-2 {
+    margin-right: 0.5rem !important; }
+
+.mb-2,
+.my-2 {
+    margin-bottom: 0.5rem !important; }
+
+.ml-2,
+.mx-2 {
+    margin-left: 0.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: 0.25rem !important; }
+
+.pt-1,
+.py-1 {
+    padding-top: 0.25rem !important; }
+
+.pr-1,
+.px-1 {
+    padding-right: 0.25rem !important; }
+
+.pb-1,
+.py-1 {
+    padding-bottom: 0.25rem !important; }
+
+.pl-1,
+.px-1 {
+    padding-left: 0.25rem !important; }
+
+.p-2 {
+    padding: 0.5rem !important; }
+
+.pt-2,
+.py-2 {
+    padding-top: 0.5rem !important; }
+
+.pr-2,
+.px-2 {
+    padding-right: 0.5rem !important; }
+
+.pb-2,
+.py-2 {
+    padding-bottom: 0.5rem !important; }
+
+.pl-2,
+.px-2 {
+    padding-left: 0.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: -0.25rem !important; }
+
+.mt-n1,
+.my-n1 {
+    margin-top: -0.25rem !important; }
+
+.mr-n1,
+.mx-n1 {
+    margin-right: -0.25rem !important; }
+
+.mb-n1,
+.my-n1 {
+    margin-bottom: -0.25rem !important; }
+
+.ml-n1,
+.mx-n1 {
+    margin-left: -0.25rem !important; }
+
+.m-n2 {
+    margin: -0.5rem !important; }
+
+.mt-n2,
+.my-n2 {
+    margin-top: -0.5rem !important; }
+
+.mr-n2,
+.mx-n2 {
+    margin-right: -0.5rem !important; }
+
+.mb-n2,
+.my-n2 {
+    margin-bottom: -0.5rem !important; }
+
+.ml-n2,
+.mx-n2 {
+    margin-left: -0.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: 0.25rem !important; }
+    .mt-sm-1,
+    .my-sm-1 {
+        margin-top: 0.25rem !important; }
+    .mr-sm-1,
+    .mx-sm-1 {
+        margin-right: 0.25rem !important; }
+    .mb-sm-1,
+    .my-sm-1 {
+        margin-bottom: 0.25rem !important; }
+    .ml-sm-1,
+    .mx-sm-1 {
+        margin-left: 0.25rem !important; }
+    .m-sm-2 {
+        margin: 0.5rem !important; }
+    .mt-sm-2,
+    .my-sm-2 {
+        margin-top: 0.5rem !important; }
+    .mr-sm-2,
+    .mx-sm-2 {
+        margin-right: 0.5rem !important; }
+    .mb-sm-2,
+    .my-sm-2 {
+        margin-bottom: 0.5rem !important; }
+    .ml-sm-2,
+    .mx-sm-2 {
+        margin-left: 0.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: 0.25rem !important; }
+    .pt-sm-1,
+    .py-sm-1 {
+        padding-top: 0.25rem !important; }
+    .pr-sm-1,
+    .px-sm-1 {
+        padding-right: 0.25rem !important; }
+    .pb-sm-1,
+    .py-sm-1 {
+        padding-bottom: 0.25rem !important; }
+    .pl-sm-1,
+    .px-sm-1 {
+        padding-left: 0.25rem !important; }
+    .p-sm-2 {
+        padding: 0.5rem !important; }
+    .pt-sm-2,
+    .py-sm-2 {
+        padding-top: 0.5rem !important; }
+    .pr-sm-2,
+    .px-sm-2 {
+        padding-right: 0.5rem !important; }
+    .pb-sm-2,
+    .py-sm-2 {
+        padding-bottom: 0.5rem !important; }
+    .pl-sm-2,
+    .px-sm-2 {
+        padding-left: 0.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: -0.25rem !important; }
+    .mt-sm-n1,
+    .my-sm-n1 {
+        margin-top: -0.25rem !important; }
+    .mr-sm-n1,
+    .mx-sm-n1 {
+        margin-right: -0.25rem !important; }
+    .mb-sm-n1,
+    .my-sm-n1 {
+        margin-bottom: -0.25rem !important; }
+    .ml-sm-n1,
+    .mx-sm-n1 {
+        margin-left: -0.25rem !important; }
+    .m-sm-n2 {
+        margin: -0.5rem !important; }
+    .mt-sm-n2,
+    .my-sm-n2 {
+        margin-top: -0.5rem !important; }
+    .mr-sm-n2,
+    .mx-sm-n2 {
+        margin-right: -0.5rem !important; }
+    .mb-sm-n2,
+    .my-sm-n2 {
+        margin-bottom: -0.5rem !important; }
+    .ml-sm-n2,
+    .mx-sm-n2 {
+        margin-left: -0.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: 0.25rem !important; }
+    .mt-md-1,
+    .my-md-1 {
+        margin-top: 0.25rem !important; }
+    .mr-md-1,
+    .mx-md-1 {
+        margin-right: 0.25rem !important; }
+    .mb-md-1,
+    .my-md-1 {
+        margin-bottom: 0.25rem !important; }
+    .ml-md-1,
+    .mx-md-1 {
+        margin-left: 0.25rem !important; }
+    .m-md-2 {
+        margin: 0.5rem !important; }
+    .mt-md-2,
+    .my-md-2 {
+        margin-top: 0.5rem !important; }
+    .mr-md-2,
+    .mx-md-2 {
+        margin-right: 0.5rem !important; }
+    .mb-md-2,
+    .my-md-2 {
+        margin-bottom: 0.5rem !important; }
+    .ml-md-2,
+    .mx-md-2 {
+        margin-left: 0.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: 0.25rem !important; }
+    .pt-md-1,
+    .py-md-1 {
+        padding-top: 0.25rem !important; }
+    .pr-md-1,
+    .px-md-1 {
+        padding-right: 0.25rem !important; }
+    .pb-md-1,
+    .py-md-1 {
+        padding-bottom: 0.25rem !important; }
+    .pl-md-1,
+    .px-md-1 {
+        padding-left: 0.25rem !important; }
+    .p-md-2 {
+        padding: 0.5rem !important; }
+    .pt-md-2,
+    .py-md-2 {
+        padding-top: 0.5rem !important; }
+    .pr-md-2,
+    .px-md-2 {
+        padding-right: 0.5rem !important; }
+    .pb-md-2,
+    .py-md-2 {
+        padding-bottom: 0.5rem !important; }
+    .pl-md-2,
+    .px-md-2 {
+        padding-left: 0.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: -0.25rem !important; }
+    .mt-md-n1,
+    .my-md-n1 {
+        margin-top: -0.25rem !important; }
+    .mr-md-n1,
+    .mx-md-n1 {
+        margin-right: -0.25rem !important; }
+    .mb-md-n1,
+    .my-md-n1 {
+        margin-bottom: -0.25rem !important; }
+    .ml-md-n1,
+    .mx-md-n1 {
+        margin-left: -0.25rem !important; }
+    .m-md-n2 {
+        margin: -0.5rem !important; }
+    .mt-md-n2,
+    .my-md-n2 {
+        margin-top: -0.5rem !important; }
+    .mr-md-n2,
+    .mx-md-n2 {
+        margin-right: -0.5rem !important; }
+    .mb-md-n2,
+    .my-md-n2 {
+        margin-bottom: -0.5rem !important; }
+    .ml-md-n2,
+    .mx-md-n2 {
+        margin-left: -0.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: 0.25rem !important; }
+    .mt-lg-1,
+    .my-lg-1 {
+        margin-top: 0.25rem !important; }
+    .mr-lg-1,
+    .mx-lg-1 {
+        margin-right: 0.25rem !important; }
+    .mb-lg-1,
+    .my-lg-1 {
+        margin-bottom: 0.25rem !important; }
+    .ml-lg-1,
+    .mx-lg-1 {
+        margin-left: 0.25rem !important; }
+    .m-lg-2 {
+        margin: 0.5rem !important; }
+    .mt-lg-2,
+    .my-lg-2 {
+        margin-top: 0.5rem !important; }
+    .mr-lg-2,
+    .mx-lg-2 {
+        margin-right: 0.5rem !important; }
+    .mb-lg-2,
+    .my-lg-2 {
+        margin-bottom: 0.5rem !important; }
+    .ml-lg-2,
+    .mx-lg-2 {
+        margin-left: 0.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: 0.25rem !important; }
+    .pt-lg-1,
+    .py-lg-1 {
+        padding-top: 0.25rem !important; }
+    .pr-lg-1,
+    .px-lg-1 {
+        padding-right: 0.25rem !important; }
+    .pb-lg-1,
+    .py-lg-1 {
+        padding-bottom: 0.25rem !important; }
+    .pl-lg-1,
+    .px-lg-1 {
+        padding-left: 0.25rem !important; }
+    .p-lg-2 {
+        padding: 0.5rem !important; }
+    .pt-lg-2,
+    .py-lg-2 {
+        padding-top: 0.5rem !important; }
+    .pr-lg-2,
+    .px-lg-2 {
+        padding-right: 0.5rem !important; }
+    .pb-lg-2,
+    .py-lg-2 {
+        padding-bottom: 0.5rem !important; }
+    .pl-lg-2,
+    .px-lg-2 {
+        padding-left: 0.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: -0.25rem !important; }
+    .mt-lg-n1,
+    .my-lg-n1 {
+        margin-top: -0.25rem !important; }
+    .mr-lg-n1,
+    .mx-lg-n1 {
+        margin-right: -0.25rem !important; }
+    .mb-lg-n1,
+    .my-lg-n1 {
+        margin-bottom: -0.25rem !important; }
+    .ml-lg-n1,
+    .mx-lg-n1 {
+        margin-left: -0.25rem !important; }
+    .m-lg-n2 {
+        margin: -0.5rem !important; }
+    .mt-lg-n2,
+    .my-lg-n2 {
+        margin-top: -0.5rem !important; }
+    .mr-lg-n2,
+    .mx-lg-n2 {
+        margin-right: -0.5rem !important; }
+    .mb-lg-n2,
+    .my-lg-n2 {
+        margin-bottom: -0.5rem !important; }
+    .ml-lg-n2,
+    .mx-lg-n2 {
+        margin-left: -0.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: 0.25rem !important; }
+    .mt-xl-1,
+    .my-xl-1 {
+        margin-top: 0.25rem !important; }
+    .mr-xl-1,
+    .mx-xl-1 {
+        margin-right: 0.25rem !important; }
+    .mb-xl-1,
+    .my-xl-1 {
+        margin-bottom: 0.25rem !important; }
+    .ml-xl-1,
+    .mx-xl-1 {
+        margin-left: 0.25rem !important; }
+    .m-xl-2 {
+        margin: 0.5rem !important; }
+    .mt-xl-2,
+    .my-xl-2 {
+        margin-top: 0.5rem !important; }
+    .mr-xl-2,
+    .mx-xl-2 {
+        margin-right: 0.5rem !important; }
+    .mb-xl-2,
+    .my-xl-2 {
+        margin-bottom: 0.5rem !important; }
+    .ml-xl-2,
+    .mx-xl-2 {
+        margin-left: 0.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: 0.25rem !important; }
+    .pt-xl-1,
+    .py-xl-1 {
+        padding-top: 0.25rem !important; }
+    .pr-xl-1,
+    .px-xl-1 {
+        padding-right: 0.25rem !important; }
+    .pb-xl-1,
+    .py-xl-1 {
+        padding-bottom: 0.25rem !important; }
+    .pl-xl-1,
+    .px-xl-1 {
+        padding-left: 0.25rem !important; }
+    .p-xl-2 {
+        padding: 0.5rem !important; }
+    .pt-xl-2,
+    .py-xl-2 {
+        padding-top: 0.5rem !important; }
+    .pr-xl-2,
+    .px-xl-2 {
+        padding-right: 0.5rem !important; }
+    .pb-xl-2,
+    .py-xl-2 {
+        padding-bottom: 0.5rem !important; }
+    .pl-xl-2,
+    .px-xl-2 {
+        padding-left: 0.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: -0.25rem !important; }
+    .mt-xl-n1,
+    .my-xl-n1 {
+        margin-top: -0.25rem !important; }
+    .mr-xl-n1,
+    .mx-xl-n1 {
+        margin-right: -0.25rem !important; }
+    .mb-xl-n1,
+    .my-xl-n1 {
+        margin-bottom: -0.25rem !important; }
+    .ml-xl-n1,
+    .mx-xl-n1 {
+        margin-left: -0.25rem !important; }
+    .m-xl-n2 {
+        margin: -0.5rem !important; }
+    .mt-xl-n2,
+    .my-xl-n2 {
+        margin-top: -0.5rem !important; }
+    .mr-xl-n2,
+    .mx-xl-n2 {
+        margin-right: -0.5rem !important; }
+    .mb-xl-n2,
+    .my-xl-n2 {
+        margin-bottom: -0.5rem !important; }
+    .ml-xl-n2,
+    .mx-xl-n2 {
+        margin-left: -0.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; } }
+
+@media (min-width: 1600px) {
+    .m-xlg-0 {
+        margin: 0 !important; }
+    .mt-xlg-0,
+    .my-xlg-0 {
+        margin-top: 0 !important; }
+    .mr-xlg-0,
+    .mx-xlg-0 {
+        margin-right: 0 !important; }
+    .mb-xlg-0,
+    .my-xlg-0 {
+        margin-bottom: 0 !important; }
+    .ml-xlg-0,
+    .mx-xlg-0 {
+        margin-left: 0 !important; }
+    .m-xlg-1 {
+        margin: 0.25rem !important; }
+    .mt-xlg-1,
+    .my-xlg-1 {
+        margin-top: 0.25rem !important; }
+    .mr-xlg-1,
+    .mx-xlg-1 {
+        margin-right: 0.25rem !important; }
+    .mb-xlg-1,
+    .my-xlg-1 {
+        margin-bottom: 0.25rem !important; }
+    .ml-xlg-1,
+    .mx-xlg-1 {
+        margin-left: 0.25rem !important; }
+    .m-xlg-2 {
+        margin: 0.5rem !important; }
+    .mt-xlg-2,
+    .my-xlg-2 {
+        margin-top: 0.5rem !important; }
+    .mr-xlg-2,
+    .mx-xlg-2 {
+        margin-right: 0.5rem !important; }
+    .mb-xlg-2,
+    .my-xlg-2 {
+        margin-bottom: 0.5rem !important; }
+    .ml-xlg-2,
+    .mx-xlg-2 {
+        margin-left: 0.5rem !important; }
+    .m-xlg-3 {
+        margin: 1rem !important; }
+    .mt-xlg-3,
+    .my-xlg-3 {
+        margin-top: 1rem !important; }
+    .mr-xlg-3,
+    .mx-xlg-3 {
+        margin-right: 1rem !important; }
+    .mb-xlg-3,
+    .my-xlg-3 {
+        margin-bottom: 1rem !important; }
+    .ml-xlg-3,
+    .mx-xlg-3 {
+        margin-left: 1rem !important; }
+    .m-xlg-4 {
+        margin: 1.5rem !important; }
+    .mt-xlg-4,
+    .my-xlg-4 {
+        margin-top: 1.5rem !important; }
+    .mr-xlg-4,
+    .mx-xlg-4 {
+        margin-right: 1.5rem !important; }
+    .mb-xlg-4,
+    .my-xlg-4 {
+        margin-bottom: 1.5rem !important; }
+    .ml-xlg-4,
+    .mx-xlg-4 {
+        margin-left: 1.5rem !important; }
+    .m-xlg-5 {
+        margin: 3rem !important; }
+    .mt-xlg-5,
+    .my-xlg-5 {
+        margin-top: 3rem !important; }
+    .mr-xlg-5,
+    .mx-xlg-5 {
+        margin-right: 3rem !important; }
+    .mb-xlg-5,
+    .my-xlg-5 {
+        margin-bottom: 3rem !important; }
+    .ml-xlg-5,
+    .mx-xlg-5 {
+        margin-left: 3rem !important; }
+    .p-xlg-0 {
+        padding: 0 !important; }
+    .pt-xlg-0,
+    .py-xlg-0 {
+        padding-top: 0 !important; }
+    .pr-xlg-0,
+    .px-xlg-0 {
+        padding-right: 0 !important; }
+    .pb-xlg-0,
+    .py-xlg-0 {
+        padding-bottom: 0 !important; }
+    .pl-xlg-0,
+    .px-xlg-0 {
+        padding-left: 0 !important; }
+    .p-xlg-1 {
+        padding: 0.25rem !important; }
+    .pt-xlg-1,
+    .py-xlg-1 {
+        padding-top: 0.25rem !important; }
+    .pr-xlg-1,
+    .px-xlg-1 {
+        padding-right: 0.25rem !important; }
+    .pb-xlg-1,
+    .py-xlg-1 {
+        padding-bottom: 0.25rem !important; }
+    .pl-xlg-1,
+    .px-xlg-1 {
+        padding-left: 0.25rem !important; }
+    .p-xlg-2 {
+        padding: 0.5rem !important; }
+    .pt-xlg-2,
+    .py-xlg-2 {
+        padding-top: 0.5rem !important; }
+    .pr-xlg-2,
+    .px-xlg-2 {
+        padding-right: 0.5rem !important; }
+    .pb-xlg-2,
+    .py-xlg-2 {
+        padding-bottom: 0.5rem !important; }
+    .pl-xlg-2,
+    .px-xlg-2 {
+        padding-left: 0.5rem !important; }
+    .p-xlg-3 {
+        padding: 1rem !important; }
+    .pt-xlg-3,
+    .py-xlg-3 {
+        padding-top: 1rem !important; }
+    .pr-xlg-3,
+    .px-xlg-3 {
+        padding-right: 1rem !important; }
+    .pb-xlg-3,
+    .py-xlg-3 {
+        padding-bottom: 1rem !important; }
+    .pl-xlg-3,
+    .px-xlg-3 {
+        padding-left: 1rem !important; }
+    .p-xlg-4 {
+        padding: 1.5rem !important; }
+    .pt-xlg-4,
+    .py-xlg-4 {
+        padding-top: 1.5rem !important; }
+    .pr-xlg-4,
+    .px-xlg-4 {
+        padding-right: 1.5rem !important; }
+    .pb-xlg-4,
+    .py-xlg-4 {
+        padding-bottom: 1.5rem !important; }
+    .pl-xlg-4,
+    .px-xlg-4 {
+        padding-left: 1.5rem !important; }
+    .p-xlg-5 {
+        padding: 3rem !important; }
+    .pt-xlg-5,
+    .py-xlg-5 {
+        padding-top: 3rem !important; }
+    .pr-xlg-5,
+    .px-xlg-5 {
+        padding-right: 3rem !important; }
+    .pb-xlg-5,
+    .py-xlg-5 {
+        padding-bottom: 3rem !important; }
+    .pl-xlg-5,
+    .px-xlg-5 {
+        padding-left: 3rem !important; }
+    .m-xlg-n1 {
+        margin: -0.25rem !important; }
+    .mt-xlg-n1,
+    .my-xlg-n1 {
+        margin-top: -0.25rem !important; }
+    .mr-xlg-n1,
+    .mx-xlg-n1 {
+        margin-right: -0.25rem !important; }
+    .mb-xlg-n1,
+    .my-xlg-n1 {
+        margin-bottom: -0.25rem !important; }
+    .ml-xlg-n1,
+    .mx-xlg-n1 {
+        margin-left: -0.25rem !important; }
+    .m-xlg-n2 {
+        margin: -0.5rem !important; }
+    .mt-xlg-n2,
+    .my-xlg-n2 {
+        margin-top: -0.5rem !important; }
+    .mr-xlg-n2,
+    .mx-xlg-n2 {
+        margin-right: -0.5rem !important; }
+    .mb-xlg-n2,
+    .my-xlg-n2 {
+        margin-bottom: -0.5rem !important; }
+    .ml-xlg-n2,
+    .mx-xlg-n2 {
+        margin-left: -0.5rem !important; }
+    .m-xlg-n3 {
+        margin: -1rem !important; }
+    .mt-xlg-n3,
+    .my-xlg-n3 {
+        margin-top: -1rem !important; }
+    .mr-xlg-n3,
+    .mx-xlg-n3 {
+        margin-right: -1rem !important; }
+    .mb-xlg-n3,
+    .my-xlg-n3 {
+        margin-bottom: -1rem !important; }
+    .ml-xlg-n3,
+    .mx-xlg-n3 {
+        margin-left: -1rem !important; }
+    .m-xlg-n4 {
+        margin: -1.5rem !important; }
+    .mt-xlg-n4,
+    .my-xlg-n4 {
+        margin-top: -1.5rem !important; }
+    .mr-xlg-n4,
+    .mx-xlg-n4 {
+        margin-right: -1.5rem !important; }
+    .mb-xlg-n4,
+    .my-xlg-n4 {
+        margin-bottom: -1.5rem !important; }
+    .ml-xlg-n4,
+    .mx-xlg-n4 {
+        margin-left: -1.5rem !important; }
+    .m-xlg-n5 {
+        margin: -3rem !important; }
+    .mt-xlg-n5,
+    .my-xlg-n5 {
+        margin-top: -3rem !important; }
+    .mr-xlg-n5,
+    .mx-xlg-n5 {
+        margin-right: -3rem !important; }
+    .mb-xlg-n5,
+    .my-xlg-n5 {
+        margin-bottom: -3rem !important; }
+    .ml-xlg-n5,
+    .mx-xlg-n5 {
+        margin-left: -3rem !important; }
+    .m-xlg-auto {
+        margin: auto !important; }
+    .mt-xlg-auto,
+    .my-xlg-auto {
+        margin-top: auto !important; }
+    .mr-xlg-auto,
+    .mx-xlg-auto {
+        margin-right: auto !important; }
+    .mb-xlg-auto,
+    .my-xlg-auto {
+        margin-bottom: auto !important; }
+    .ml-xlg-auto,
+    .mx-xlg-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; } }
+
+@media (min-width: 1600px) {
+    .text-xlg-left {
+        text-align: left !important; }
+    .text-xlg-right {
+        text-align: right !important; }
+    .text-xlg-center {
+        text-align: center !important; } }
+
+
+.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: flex !important; }
+
+.d-inline-flex {
+    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: flex !important; }
+    .d-sm-inline-flex {
+        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: flex !important; }
+    .d-md-inline-flex {
+        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: flex !important; }
+    .d-lg-inline-flex {
+        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: flex !important; }
+    .d-xl-inline-flex {
+        display: inline-flex !important; } }
+
+@media (min-width: 1600px) {
+    .d-xlg-none {
+        display: none !important; }
+    .d-xlg-inline {
+        display: inline !important; }
+    .d-xlg-inline-block {
+        display: inline-block !important; }
+    .d-xlg-block {
+        display: block !important; }
+    .d-xlg-table {
+        display: table !important; }
+    .d-xlg-table-row {
+        display: table-row !important; }
+    .d-xlg-table-cell {
+        display: table-cell !important; }
+    .d-xlg-flex {
+        display: flex !important; }
+    .d-xlg-inline-flex {
+        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: flex !important; }
+    .d-print-inline-flex {
+        display: inline-flex !important; } }
+
+.flex-row {
+    flex-direction: row !important; }
+
+.flex-column {
+    flex-direction: column !important; }
+
+.flex-row-reverse {
+    flex-direction: row-reverse !important; }
+
+.flex-column-reverse {
+    flex-direction: column-reverse !important; }
+
+.flex-wrap {
+    flex-wrap: wrap !important; }
+
+.flex-nowrap {
+    flex-wrap: nowrap !important; }
+
+.flex-wrap-reverse {
+    flex-wrap: wrap-reverse !important; }
+
+.flex-fill {
+    flex: 1 1 auto !important; }
+
+.flex-grow-0 {
+    flex-grow: 0 !important; }
+
+.flex-grow-1 {
+    flex-grow: 1 !important; }
+
+.flex-shrink-0 {
+    flex-shrink: 0 !important; }
+
+.flex-shrink-1 {
+    flex-shrink: 1 !important; }
+
+.justify-content-start {
+    justify-content: flex-start !important; }
+
+.justify-content-end {
+    justify-content: flex-end !important; }
+
+.justify-content-center {
+    justify-content: center !important; }
+
+.justify-content-between {
+    justify-content: space-between !important; }
+
+.justify-content-around {
+    justify-content: space-around !important; }
+
+.align-items-start {
+    align-items: flex-start !important; }
+
+.align-items-end {
+    align-items: flex-end !important; }
+
+.align-items-center {
+    align-items: center !important; }
+
+.align-items-baseline {
+    align-items: baseline !important; }
+
+.align-items-stretch {
+    align-items: stretch !important; }
+
+.align-content-start {
+    align-content: flex-start !important; }
+
+.align-content-end {
+    align-content: flex-end !important; }
+
+.align-content-center {
+    align-content: center !important; }
+
+.align-content-between {
+    align-content: space-between !important; }
+
+.align-content-around {
+    align-content: space-around !important; }
+
+.align-content-stretch {
+    align-content: stretch !important; }
+
+.align-self-auto {
+    align-self: auto !important; }
+
+.align-self-start {
+    align-self: flex-start !important; }
+
+.align-self-end {
+    align-self: flex-end !important; }
+
+.align-self-center {
+    align-self: center !important; }
+
+.align-self-baseline {
+    align-self: baseline !important; }
+
+.align-self-stretch {
+    align-self: stretch !important; }
+
+@media (min-width: 576px) {
+    .flex-sm-row {
+        flex-direction: row !important; }
+    .flex-sm-column {
+        flex-direction: column !important; }
+    .flex-sm-row-reverse {
+        flex-direction: row-reverse !important; }
+    .flex-sm-column-reverse {
+        flex-direction: column-reverse !important; }
+    .flex-sm-wrap {
+        flex-wrap: wrap !important; }
+    .flex-sm-nowrap {
+        flex-wrap: nowrap !important; }
+    .flex-sm-wrap-reverse {
+        flex-wrap: wrap-reverse !important; }
+    .flex-sm-fill {
+        flex: 1 1 auto !important; }
+    .flex-sm-grow-0 {
+        flex-grow: 0 !important; }
+    .flex-sm-grow-1 {
+        flex-grow: 1 !important; }
+    .flex-sm-shrink-0 {
+        flex-shrink: 0 !important; }
+    .flex-sm-shrink-1 {
+        flex-shrink: 1 !important; }
+    .justify-content-sm-start {
+        justify-content: flex-start !important; }
+    .justify-content-sm-end {
+        justify-content: flex-end !important; }
+    .justify-content-sm-center {
+        justify-content: center !important; }
+    .justify-content-sm-between {
+        justify-content: space-between !important; }
+    .justify-content-sm-around {
+        justify-content: space-around !important; }
+    .align-items-sm-start {
+        align-items: flex-start !important; }
+    .align-items-sm-end {
+        align-items: flex-end !important; }
+    .align-items-sm-center {
+        align-items: center !important; }
+    .align-items-sm-baseline {
+        align-items: baseline !important; }
+    .align-items-sm-stretch {
+        align-items: stretch !important; }
+    .align-content-sm-start {
+        align-content: flex-start !important; }
+    .align-content-sm-end {
+        align-content: flex-end !important; }
+    .align-content-sm-center {
+        align-content: center !important; }
+    .align-content-sm-between {
+        align-content: space-between !important; }
+    .align-content-sm-around {
+        align-content: space-around !important; }
+    .align-content-sm-stretch {
+        align-content: stretch !important; }
+    .align-self-sm-auto {
+        align-self: auto !important; }
+    .align-self-sm-start {
+        align-self: flex-start !important; }
+    .align-self-sm-end {
+        align-self: flex-end !important; }
+    .align-self-sm-center {
+        align-self: center !important; }
+    .align-self-sm-baseline {
+        align-self: baseline !important; }
+    .align-self-sm-stretch {
+        align-self: stretch !important; } }
+
+@media (min-width: 768px) {
+    .flex-md-row {
+        flex-direction: row !important; }
+    .flex-md-column {
+        flex-direction: column !important; }
+    .flex-md-row-reverse {
+        flex-direction: row-reverse !important; }
+    .flex-md-column-reverse {
+        flex-direction: column-reverse !important; }
+    .flex-md-wrap {
+        flex-wrap: wrap !important; }
+    .flex-md-nowrap {
+        flex-wrap: nowrap !important; }
+    .flex-md-wrap-reverse {
+        flex-wrap: wrap-reverse !important; }
+    .flex-md-fill {
+        flex: 1 1 auto !important; }
+    .flex-md-grow-0 {
+        flex-grow: 0 !important; }
+    .flex-md-grow-1 {
+        flex-grow: 1 !important; }
+    .flex-md-shrink-0 {
+        flex-shrink: 0 !important; }
+    .flex-md-shrink-1 {
+        flex-shrink: 1 !important; }
+    .justify-content-md-start {
+        justify-content: flex-start !important; }
+    .justify-content-md-end {
+        justify-content: flex-end !important; }
+    .justify-content-md-center {
+        justify-content: center !important; }
+    .justify-content-md-between {
+        justify-content: space-between !important; }
+    .justify-content-md-around {
+        justify-content: space-around !important; }
+    .align-items-md-start {
+        align-items: flex-start !important; }
+    .align-items-md-end {
+        align-items: flex-end !important; }
+    .align-items-md-center {
+        align-items: center !important; }
+    .align-items-md-baseline {
+        align-items: baseline !important; }
+    .align-items-md-stretch {
+        align-items: stretch !important; }
+    .align-content-md-start {
+        align-content: flex-start !important; }
+    .align-content-md-end {
+        align-content: flex-end !important; }
+    .align-content-md-center {
+        align-content: center !important; }
+    .align-content-md-between {
+        align-content: space-between !important; }
+    .align-content-md-around {
+        align-content: space-around !important; }
+    .align-content-md-stretch {
+        align-content: stretch !important; }
+    .align-self-md-auto {
+        align-self: auto !important; }
+    .align-self-md-start {
+        align-self: flex-start !important; }
+    .align-self-md-end {
+        align-self: flex-end !important; }
+    .align-self-md-center {
+        align-self: center !important; }
+    .align-self-md-baseline {
+        align-self: baseline !important; }
+    .align-self-md-stretch {
+        align-self: stretch !important; } }
+
+@media (min-width: 992px) {
+    .flex-lg-row {
+        flex-direction: row !important; }
+    .flex-lg-column {
+        flex-direction: column !important; }
+    .flex-lg-row-reverse {
+        flex-direction: row-reverse !important; }
+    .flex-lg-column-reverse {
+        flex-direction: column-reverse !important; }
+    .flex-lg-wrap {
+        flex-wrap: wrap !important; }
+    .flex-lg-nowrap {
+        flex-wrap: nowrap !important; }
+    .flex-lg-wrap-reverse {
+        flex-wrap: wrap-reverse !important; }
+    .flex-lg-fill {
+        flex: 1 1 auto !important; }
+    .flex-lg-grow-0 {
+        flex-grow: 0 !important; }
+    .flex-lg-grow-1 {
+        flex-grow: 1 !important; }
+    .flex-lg-shrink-0 {
+        flex-shrink: 0 !important; }
+    .flex-lg-shrink-1 {
+        flex-shrink: 1 !important; }
+    .justify-content-lg-start {
+        justify-content: flex-start !important; }
+    .justify-content-lg-end {
+        justify-content: flex-end !important; }
+    .justify-content-lg-center {
+        justify-content: center !important; }
+    .justify-content-lg-between {
+        justify-content: space-between !important; }
+    .justify-content-lg-around {
+        justify-content: space-around !important; }
+    .align-items-lg-start {
+        align-items: flex-start !important; }
+    .align-items-lg-end {
+        align-items: flex-end !important; }
+    .align-items-lg-center {
+        align-items: center !important; }
+    .align-items-lg-baseline {
+        align-items: baseline !important; }
+    .align-items-lg-stretch {
+        align-items: stretch !important; }
+    .align-content-lg-start {
+        align-content: flex-start !important; }
+    .align-content-lg-end {
+        align-content: flex-end !important; }
+    .align-content-lg-center {
+        align-content: center !important; }
+    .align-content-lg-between {
+        align-content: space-between !important; }
+    .align-content-lg-around {
+        align-content: space-around !important; }
+    .align-content-lg-stretch {
+        align-content: stretch !important; }
+    .align-self-lg-auto {
+        align-self: auto !important; }
+    .align-self-lg-start {
+        align-self: flex-start !important; }
+    .align-self-lg-end {
+        align-self: flex-end !important; }
+    .align-self-lg-center {
+        align-self: center !important; }
+    .align-self-lg-baseline {
+        align-self: baseline !important; }
+    .align-self-lg-stretch {
+        align-self: stretch !important; } }
+
+@media (min-width: 1200px) {
+    .flex-xl-row {
+        flex-direction: row !important; }
+    .flex-xl-column {
+        flex-direction: column !important; }
+    .flex-xl-row-reverse {
+        flex-direction: row-reverse !important; }
+    .flex-xl-column-reverse {
+        flex-direction: column-reverse !important; }
+    .flex-xl-wrap {
+        flex-wrap: wrap !important; }
+    .flex-xl-nowrap {
+        flex-wrap: nowrap !important; }
+    .flex-xl-wrap-reverse {
+        flex-wrap: wrap-reverse !important; }
+    .flex-xl-fill {
+        flex: 1 1 auto !important; }
+    .flex-xl-grow-0 {
+        flex-grow: 0 !important; }
+    .flex-xl-grow-1 {
+        flex-grow: 1 !important; }
+    .flex-xl-shrink-0 {
+        flex-shrink: 0 !important; }
+    .flex-xl-shrink-1 {
+        flex-shrink: 1 !important; }
+    .justify-content-xl-start {
+        justify-content: flex-start !important; }
+    .justify-content-xl-end {
+        justify-content: flex-end !important; }
+    .justify-content-xl-center {
+        justify-content: center !important; }
+    .justify-content-xl-between {
+        justify-content: space-between !important; }
+    .justify-content-xl-around {
+        justify-content: space-around !important; }
+    .align-items-xl-start {
+        align-items: flex-start !important; }
+    .align-items-xl-end {
+        align-items: flex-end !important; }
+    .align-items-xl-center {
+        align-items: center !important; }
+    .align-items-xl-baseline {
+        align-items: baseline !important; }
+    .align-items-xl-stretch {
+        align-items: stretch !important; }
+    .align-content-xl-start {
+        align-content: flex-start !important; }
+    .align-content-xl-end {
+        align-content: flex-end !important; }
+    .align-content-xl-center {
+        align-content: center !important; }
+    .align-content-xl-between {
+        align-content: space-between !important; }
+    .align-content-xl-around {
+        align-content: space-around !important; }
+    .align-content-xl-stretch {
+        align-content: stretch !important; }
+    .align-self-xl-auto {
+        align-self: auto !important; }
+    .align-self-xl-start {
+        align-self: flex-start !important; }
+    .align-self-xl-end {
+        align-self: flex-end !important; }
+    .align-self-xl-center {
+        align-self: center !important; }
+    .align-self-xl-baseline {
+        align-self: baseline !important; }
+    .align-self-xl-stretch {
+        align-self: stretch !important; } }
+
+@media (min-width: 1600px) {
+    .flex-xlg-row {
+        flex-direction: row !important; }
+    .flex-xlg-column {
+        flex-direction: column !important; }
+    .flex-xlg-row-reverse {
+        flex-direction: row-reverse !important; }
+    .flex-xlg-column-reverse {
+        flex-direction: column-reverse !important; }
+    .flex-xlg-wrap {
+        flex-wrap: wrap !important; }
+    .flex-xlg-nowrap {
+        flex-wrap: nowrap !important; }
+    .flex-xlg-wrap-reverse {
+        flex-wrap: wrap-reverse !important; }
+    .flex-xlg-fill {
+        flex: 1 1 auto !important; }
+    .flex-xlg-grow-0 {
+        flex-grow: 0 !important; }
+    .flex-xlg-grow-1 {
+        flex-grow: 1 !important; }
+    .flex-xlg-shrink-0 {
+        flex-shrink: 0 !important; }
+    .flex-xlg-shrink-1 {
+        flex-shrink: 1 !important; }
+    .justify-content-xlg-start {
+        justify-content: flex-start !important; }
+    .justify-content-xlg-end {
+        justify-content: flex-end !important; }
+    .justify-content-xlg-center {
+        justify-content: center !important; }
+    .justify-content-xlg-between {
+        justify-content: space-between !important; }
+    .justify-content-xlg-around {
+        justify-content: space-around !important; }
+    .align-items-xlg-start {
+        align-items: flex-start !important; }
+    .align-items-xlg-end {
+        align-items: flex-end !important; }
+    .align-items-xlg-center {
+        align-items: center !important; }
+    .align-items-xlg-baseline {
+        align-items: baseline !important; }
+    .align-items-xlg-stretch {
+        align-items: stretch !important; }
+    .align-content-xlg-start {
+        align-content: flex-start !important; }
+    .align-content-xlg-end {
+        align-content: flex-end !important; }
+    .align-content-xlg-center {
+        align-content: center !important; }
+    .align-content-xlg-between {
+        align-content: space-between !important; }
+    .align-content-xlg-around {
+        align-content: space-around !important; }
+    .align-content-xlg-stretch {
+        align-content: stretch !important; }
+    .align-self-xlg-auto {
+        align-self: auto !important; }
+    .align-self-xlg-start {
+        align-self: flex-start !important; }
+    .align-self-xlg-end {
+        align-self: flex-end !important; }
+    .align-self-xlg-center {
+        align-self: center !important; }
+    .align-self-xlg-baseline {
+        align-self: baseline !important; }
+    .align-self-xlg-stretch {
+        align-self: stretch !important; } }
+
+.card {
+    margin-bottom: 30px; }
+.card .card-subtitle {
+    font-weight: 300;
+    margin-bottom: 10px;
+    color: #8898aa; }
+.card .card-title {
+    position: relative;
+    font-weight: 500;
+    font-size: 16px; }
+.card .card-actions {
+    float: right; }
+.card .card-actions a {
+    padding: 0 5px;
+    cursor: pointer; }
+.card .card-header .card-title {
+    margin-bottom: 0px; }
+
+.card-alt {
+    margin: 0 -20px;
+    background: #e4e9ef; }
+
+.card-group {
+    margin-bottom: 30px; }
+.card-group .card {
+    border-right: 1px solid rgba(120, 130, 140, 0.13); }
+
+.card-fullscreen {
+    position: fixed;
+    top: 0px;
+    left: 0px;
+    width: 100%;
+    height: 100%;
+    z-index: 9999;
+    overflow: auto; }
+
+.card-hover {
+    -webkit-transition: all 0.25s ease;
+    -o-transition: all 0.25s ease;
+    -moz-transition: all 0.25s ease;
+    transition: all 0.25s ease; }
+.card-hover:hover {
+    -webkit-transform: translateY(-4px) scale(1.01);
+    -moz-transform: translateY(-4px) scale(1.01);
+    -ms-transform: translateY(-4px) scale(1.01);
+    -o-transform: translateY(-4px) scale(1.01);
+    transform: translateY(-4px) scale(1.01);
+    -webkit-box-shadow: 0 14px 24px rgba(62, 57, 107, 0.1);
+    box-shadow: 0 14px 24px rgba(62, 57, 107, 0.1); }
+
+.draggable-cards .card-header {
+    cursor: move; }
+
+.card-moved .card {
+    background: #2cabe3;
+    color: #fff; }
+
+.accordion .card,
+.accordion .btn,
+.accordion .btn:hover {
+    box-shadow: none;
+    margin-bottom: 1px; }
+
+.card {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    min-width: 0;
+    word-wrap: break-word;
+    background-color: inherit;
+    background-clip: border-box;
+    border: 0px solid transparent;
+    border-radius: 0px; }
+.card > hr {
+    margin-right: 0;
+    margin-left: 0; }
+.card > .list-group:first-child .list-group-item:first-child {
+    border-top-left-radius: 0px;
+    border-top-right-radius: 0px; }
+.card > .list-group:last-child .list-group-item:last-child {
+    border-bottom-right-radius: 0px;
+    border-bottom-left-radius: 0px; }
+
+.card-body {
+    flex: 1 1 auto;
+    padding: 1.57rem; }
+
+.card-title {
+    margin-bottom: 0.75rem; }
+
+.card-subtitle {
+    margin-top: -0.375rem;
+    margin-bottom: 0; }
+
+.card-text:last-child {
+    margin-bottom: 0; }
+
+.card-link:hover {
+    text-decoration: none; }
+
+.card-link + .card-link {
+    margin-left: 1.57rem; }
+
+.card-header {
+    padding: 0.75rem 1.57rem;
+    margin-bottom: 0;
+    background-color: rgba(0, 0, 0, 0.03);
+    border-bottom: 0px solid transparent; }
+.card-header:first-child {
+    border-radius: calc(0px - 0px) calc(0px - 0px) 0 0; }
+.card-header + .list-group .list-group-item:first-child {
+    border-top: 0; }
+
+.card-footer {
+    padding: 0.75rem 1.57rem;
+    background-color: rgba(0, 0, 0, 0.03);
+    border-top: 0px solid transparent; }
+.card-footer:last-child {
+    border-radius: 0 0 calc(0px - 0px) calc(0px - 0px); }
+
+.card-header-tabs {
+    margin-right: -0.785rem;
+    margin-bottom: -0.75rem;
+    margin-left: -0.785rem;
+    border-bottom: 0; }
+
+.card-header-pills {
+    margin-right: -0.785rem;
+    margin-left: -0.785rem; }
+
+.card-img-overlay {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    padding: 1.25rem; }
+
+.card-img {
+    width: 100%;
+    border-radius: calc(0px - 0px); }
+
+.card-img-top {
+    width: 100%;
+    border-top-left-radius: calc(0px - 0px);
+    border-top-right-radius: calc(0px - 0px); }
+
+.card-img-bottom {
+    width: 100%;
+    border-bottom-right-radius: calc(0px - 0px);
+    border-bottom-left-radius: calc(0px - 0px); }
+
+.card-deck {
+    display: flex;
+    flex-direction: column; }
+.card-deck .card {
+    margin-bottom: 15px; }
+@media (min-width: 576px) {
+    .card-deck {
+        flex-flow: row wrap;
+        margin-right: -15px;
+        margin-left: -15px; }
+    .card-deck .card {
+        display: flex;
+        flex: 1 0 0%;
+        flex-direction: column;
+        margin-right: 15px;
+        margin-bottom: 0;
+        margin-left: 15px; } }
+
+.card-group {
+    display: flex;
+    flex-direction: column; }
+.card-group > .card {
+    margin-bottom: 15px; }
+@media (min-width: 576px) {
+    .card-group {
+        flex-flow: row wrap; }
+    .card-group > .card {
+        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-img-top,
+    .card-group > .card:not(:last-child) .card-header {
+        border-top-right-radius: 0; }
+    .card-group > .card:not(:last-child) .card-img-bottom,
+    .card-group > .card:not(:last-child) .card-footer {
+        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-img-top,
+    .card-group > .card:not(:first-child) .card-header {
+        border-top-left-radius: 0; }
+    .card-group > .card:not(:first-child) .card-img-bottom,
+    .card-group > .card:not(:first-child) .card-footer {
+        border-bottom-left-radius: 0; } }
+
+.card-columns .card {
+    margin-bottom: 0.75rem; }
+
+@media (min-width: 576px) {
+    .card-columns {
+        column-count: 3;
+        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: 0px; }

File diff ditekan karena terlalu besar
+ 0 - 0
css/organizr.min.css


+ 124 - 0
js/functions.js

@@ -5320,6 +5320,130 @@ function buildCalendarMetadata(array){
 		`;
 	return metadata;
 }
+function buildHealthChecks(array){
+    var checks = (typeof array.content.checks !== 'undefined') ? array.content.checks.length : false;
+    console.log(checks);
+    return (checks) ? `
+	<div id="allHealthChecks">
+		<div class="el-element-overlay row">
+		    <div class="col-md-12">
+		        <h4 class="pull-left"><span lang="en">Health Checks</span> : </h4><h4 class="pull-left">&nbsp;<span class="label label-info m-l-20 checkbox-circle good-health-checks">`+checks+`</span></h4>
+		        <hr class="hidden-xs">
+		    </div>
+			<div class="clearfix"></div>
+		    <!-- .cards -->
+			`+buildHealthChecksItem(array.content.checks)+`
+		    <!-- /.cards-->
+		</div>
+	</div>
+	<div class="clearfix"></div>
+	` : '';
+}
+function healthCheckIcon(tags){
+    var allTags = tags.split(' ');
+    var useIcon = '';
+    console.log(allTags);
+    $.each(allTags, function(i,v) {
+        //check for image
+        var file =  v.substring(v.lastIndexOf('.')+1, v.length).toLowerCase() || v.toLowerCase();
+        switch (file) {
+            case 'png':
+            case 'jpg':
+            case 'jpeg':
+            case 'gif':
+                useIcon = '<img class="lazyload loginTitle" data-src="'+v+'">&nbsp;';
+                break;
+            default:
+        }
+    });
+    return useIcon;
+}
+function buildHealthChecksItem(array){
+    var checks = '';
+    console.log(array);
+    $.each(array, function(i,v) {
+        var hasIcon = healthCheckIcon(v.tags);
+        v.name = (v.name) ? v.name : 'New Item';
+        switch(v.status){
+            case 'up':
+                var statusColor = 'info';
+                var statusIcon = 'ti-cloud-up';
+                var nextPing = moment.utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
+                var lastPing = moment.utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
+                break;
+            case 'down':
+                var statusColor = 'danger';
+                var statusIcon = 'ti-cloud-down';
+                var nextPing = moment.utc(v.next_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
+                var lastPing = moment.utc(v.last_ping, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
+                break;
+            case 'new':
+                var statusColor = 'warning';
+                var statusIcon = 'ti-timer';
+                var nextPing = 'Waiting...';
+                var lastPing = 'n/a';
+                break;
+            default:
+                var statusColor = 'warning';
+                var statusIcon = 'ti-timer';
+                var nextPing = 'Waiting...';
+                var lastPing = 'n/a';
+        }
+        checks += `
+            <div class="col-xl-2 col-lg-3 col-md-4 col-sm-6 col-xs-12">
+                <div class="card">
+                        <div class="col-12">
+                            <div class="bg-`+statusColor+` p-2">
+                                <div class="text-center text-white display-6">
+                                    <i class="`+statusIcon+`"></i>
+                                </div>
+                            </div>
+                            <div class="card-body bg-org-alt">
+                                <div class="d-flex no-block align-items-center">
+                                    <div>
+                                        <h5 class="font-medium">`+lastPing+`</h5>
+                                        <h5 class="pull-left mb-0" lang="en">Last</h5>
+                                    </div>
+                                    <div class="ml-auto">
+                                        <h5 class="font-medium">`+nextPing+`</h5>
+                                        <h5 class="pull-right mb-0" lang="en">Next</h5>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="bg-info p-2">
+                                <div class="text-center text-white display-6">
+                                    `+hasIcon+`<span>`+v.name+`</span>
+                                </div>
+                            </div>
+                        </div>
+                </div>
+            </div>
+        `
+    });
+    return checks;
+}
+function homepageHealthChecks(tags, timeout){
+    var tags = (typeof tags !== 'undefined') ? tags : activeInfo.settings.homepage.options.healthChecksTags;
+    var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageHealthChecksRefresh;
+    organizrAPI('POST','api/?v1/homepage/connect',{action:'getHealthChecks',tags:tags}).success(function(data) {
+        try {
+            var response = JSON.parse(data);
+        }catch(e) {
+            console.log(e + ' error: ' + data);
+            orgErrorAlert('<h4>' + e + '</h4>' + formatDebug(data));
+            return false;
+        }
+        document.getElementById('homepageOrderhealthchecks').innerHTML = '';
+        if(response.data !== null){
+            $('#homepageOrderhealthchecks').html(buildHealthChecks(response.data));
+        }
+    }).fail(function(xhr) {
+        console.error("Organizr Function: API Connection Failed");
+    });
+    var timeoutTitle = 'HealthChecks-Homepage';
+    if(typeof timeouts[timeoutTitle] !== 'undefined'){ clearTimeout(timeouts[timeoutTitle]); }
+    timeouts[timeoutTitle] = setTimeout(function(){ homepageHealthChecks(tags,timeout); }, timeout);
+}
 function homepageDownloader(type, timeout){
 	var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageDownloadRefresh;
 	//if(isHidden()){ return; }

TEMPAT SAMPAH
plugins/images/tabs/healthchecks.png


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini