diff --git a/classes/Autoloader.php b/classes/Autoloader.php
new file mode 100644
index 0000000..de353d0
--- /dev/null
+++ b/classes/Autoloader.php
@@ -0,0 +1,47 @@
+
\ No newline at end of file
diff --git a/classes/Base.php b/classes/Base.php
new file mode 100644
index 0000000..02a5efa
--- /dev/null
+++ b/classes/Base.php
@@ -0,0 +1,788 @@
+appendChild($toDOM->ownerDocument->importNode($fromDOM, true));
+ }
+
+ // ==========================================
+ // Apply an XSL Stylesheet to an XML Document
+ // ==========================================
+
+ public function applyXSL($XMLString = "", $XSLString = "", $XSLParms = "") {
+
+ if ($XMLString instanceof SimpleXMLElement) {
+ $XMLString = $XMLString->asXML();
+ }
+
+ if (empty($XSLString)) {
+ trigger_error("No XSL Stylesheet provided.");
+ }
+
+ if (!is_array($XSLParms)) {
+ $XSLParms = array();
+ }
+
+ $XSLParms["APPLICATION_NAME"] = self::APPLICATION_NAME;
+ $XSLParms["APPLICATION_MNEMONIC"] = self::APPLICATION_MNEMONIC;
+ $XSLParms["VERSION"] = self::VERSION;
+ $XSLParms["THEME"] = $_SESSION[self::THEME] ?? self::THEME;
+ $XSLParms["ENVIRONMENT"] = $_SESSION[self::ENVIRONMENT] ?? "Production";
+ $XSLParms["USER_NAME"] = $_SESSION[self::USER_NAME] ?? "";
+ $XSLParms["USER_CLIENT_NAME"] = $_SESSION[self::USER_CLIENT_NAME] ?? "";
+ $XSLParms["USER_ROLE"] = $_SESSION[self::USER_ROLE] ?? "Guest";
+ $XSLParms["RANDOM_NUMBER"] = rand();
+ $XSLParms["TODAY_YYYYMMDD"] = date("Y-m-d");
+ $XSLParms["TODAY_MMDDYYYY"] = date("m/d/Y");
+
+ $XML = new DOMDocument();
+ $XSL = new DOMDocument();
+ $XSLT = new XSLTProcessor();
+
+ if ($XMLString) {
+ $XML->loadXML($XMLString);
+ }
+
+ if ($XSLString) {
+ $XSL->loadXML($XSLString);
+ }
+
+ $XSLT->importStylesheet($XSL);
+
+ if ($XSLParms) {
+ $XSLT->setParameter("", $XSLParms);
+ }
+
+ $document = $XSLT->transformToXml($XML);
+
+ return $document;
+ }
+
+ // ============================
+ // Return a Database Connection
+ // ============================
+
+ public function connect() {
+
+ $Settings = $this->getSettings();
+
+ if ($Settings->Environment == 'Production') {
+ $host = 'localhost';
+ } else {
+ $host = '192.168.1.190';
+ }
+
+ try {
+
+ $database = (string) $Settings->DatabaseName;
+ $user = (string) $Settings->DatabaseUser;
+ $password = (string) $Settings->DatabasePassword;
+
+ $connection = new PDO("mysql:host={$host};dbname={$database};charset=utf8", $user, $password);
+
+ $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+ $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ } catch (PDOException | Exception $e) {
+
+ trigger_error($e->getMessage());
+ }
+
+ return $connection;
+ }
+
+ // ===============
+ // Debug an Object
+ // ===============
+
+ public function debug($object = "") {
+
+ if ($_SESSION[self::AJAX]) {
+ error_log(print_r($object, true));
+ } else {
+ echo "
";
+ print_r($object);
+ }
+
+ exit();
+ }
+
+ // =========================
+ // Return a decrypted string
+ // =========================
+
+ protected function decrypt($encrypted = "", $key = "") {
+
+ $key = (empty($key)) ? __CLASS__ : $key;
+
+ $decoded = base64_decode($encrypted);
+ $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
+ $iv = substr($decoded, 0, $ivlen);
+ $hmac = substr($decoded, $ivlen, $sha2len = 32);
+ $raw = substr($decoded, $ivlen + $sha2len);
+ $decrypted = openssl_decrypt($raw, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
+ $calcmac = hash_hmac("sha256", $raw, $key, $as_binary = true);
+
+ if (($hmac === false) or ($calcmac === false)) {
+ return "";
+ }
+
+ return (hash_equals($hmac, $calcmac)) ? $decrypted : "";
+ }
+
+ // ======================
+ // Display a Content Page
+ // ======================
+
+ public function displayContent($content = "") {
+
+ $html = $this->applyXSL("", $this->getXSL("content"));
+ $html = str_replace("$$$-CONTENT-$$$", $content, $html);
+
+ echo $html;
+
+ exit();
+ }
+
+ // ======================================================
+ // Custom error handler to display informative error page
+ // ======================================================
+
+ public function displayError($error_number = "", $error_message = "", $error_file = "", $error_line = "") {
+
+ if (error_reporting() == 0) {
+ return;
+ }
+
+ $error_file = explode("/", $error_file);
+ $error_file = end($error_file);
+ $error_message = str_replace("'", '"', $error_message);
+
+ (new Journal())->journalEntry("{$error_file} | {$error_line} | {$error_message}");
+
+ if (($_SESSION[self::ENVIRONMENT] ?? "Production") == "Production") {
+ (new Email())->sendErrorEmail($error_message, $error_file, $error_line);
+ }
+
+ $XSLParms["FILE_NAME"] = $error_file;
+ $XSLParms["LINE_NUMBER"] = $error_line;
+ $XSLParms["ERROR_MESSAGE"] = $error_message;
+ $XSLParms["ERROR_NUMBER"] = $error_number;
+
+ $content = $this->applyXSL("", $this->getXSL("error"), $XSLParms);
+
+ $this->displayContent($content);
+
+ exit(); // Exit so that only one error is presented.
+ }
+
+ // =====================
+ // Display a Notice Page
+ // =====================
+
+ public function displayNotice($messgae = "") {
+
+ $XSLParms["MESSAGE"] = $messgae;
+
+ $content = $this->applyXSL("", $this->getXSL("notice"), $XSLParms);
+
+ $this->displayContent($content);
+
+ exit();
+ }
+
+ // =====================
+ // Display the Home Page
+ // =====================
+
+ public function displayHome() {
+
+ (new Subscriptions())->userSubscriptions();
+ }
+
+ // =======================
+ // Do the requested Action
+ // =======================
+
+ public function do() {
+
+// $this->debug($_POST);
+
+ $_SESSION[self::TODAY] = date("Y-m-d");
+
+ // Login
+
+ if (($_SESSION[self::USER_AUTHENTICATED] ?? false) === false) {
+
+ (new Users())->login();
+ }
+
+ // Determine if user needs a password change
+ if ($this->userChangePassword() === true) {
+ (new Users())->changePassword();
+ exit();
+ }
+
+ // Determine if this is an AJAX request.
+
+ $_SESSION[self::AJAX] = (isset($_SERVER["HTTP_X_REQUESTED_WITH"]) and strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) === "xmlhttprequest");
+
+ // Get the requested Action
+
+ $action = filter_input(INPUT_POST, "action") ?: "";
+ $Xaction = filter_input(INPUT_GET, "Xaction") ?: "";
+
+ $action = (empty($Xaction) ? $action : $Xaction);
+
+ // Sign Out if requested.
+
+ if (strtolower(trim($action)) === "signout") {
+ $this->initializeSession();
+ }
+
+ // Process the requested Action.
+
+ list($class, $method) = array_pad(explode('.', $action), 2, "");
+
+ if (empty($method)) {
+
+ $method = $class;
+
+ if (method_exists(__CLASS__, $method)) {
+ $this->$method();
+ return;
+ }
+ } else {
+
+ if (method_exists($class, $method)) {
+ (new $class())->$method();
+ return;
+ }
+ }
+
+ // Default to the Home Page.
+ $this->displayHome();
+ }
+
+ // ==========================
+ // Return an encrypted string
+ // ==========================
+
+ protected function encrypt($string = "", $key = "") {
+
+ $key = (empty($key)) ? __CLASS__ : $key;
+
+ $ivlen = openssl_cipher_iv_length($cipher = "AES-128-CBC");
+ $iv = openssl_random_pseudo_bytes($ivlen);
+ $raw = openssl_encrypt($string, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv);
+ $hmac = hash_hmac("sha256", $raw, $key, $as_binary = true);
+ $encrypted = base64_encode($iv . $hmac . $raw);
+
+ return $encrypted;
+ }
+
+ // ========================
+ // Execute an SQL Statement
+ // ========================
+
+ public function executeSQL($SQL = "") {
+
+ if (trim($SQL) == "") {
+ return false;
+ }
+
+ return $this->connect()->query($SQL);
+ }
+
+ // ======================
+ // Format an XML document
+ // ======================
+
+ public function formatXML($XML = "") {
+
+ if (!$XML) {
+ return false;
+ }
+
+ if ($XML instanceof SimpleXMLElement) {
+ $XML = $XML->asXML();
+ }
+
+ $dom = new DOMDocument("1.0");
+ $dom->preserveWhiteSpace = false;
+ $dom->formatOutput = true;
+ $dom->loadXML($XML);
+
+ return $dom->saveXML();
+ }
+
+ // =====================================
+ // Return an Application Settings Object
+ // =====================================
+
+ public function getSettings() {
+
+ $settings = new SimpleXMLElement($this->getXML("settings"));
+
+ return $settings;
+ }
+
+ // ==================================================================
+ // Return Age in Years based on given Birthdate ("yyyy-mm-dd" format)
+ // ==================================================================
+
+ public function getAge($birthdate = "", $date = "") {
+
+ $birthdate = filter_input(INPUT_POST, "birthdate", FILTER_UNSAFE_RAW) ?: $birthdate;
+ $date = filter_input(INPUT_POST, "date", FILTER_UNSAFE_RAW) ?: $date;
+
+ $age = 0;
+
+ $date = (empty($date)) ? new Datetime() : new DateTime($date);
+ $birthdate = (empty($birthdate)) ? new Datetime() : new DateTime($birthdate);
+
+ $age = $birthdate->diff($date)->format("%y");
+
+ if ($_SESSION[self::AJAX]) {
+ echo json_encode($age);
+ } else {
+ return $age;
+ }
+ }
+
+ // =========================
+ // Return a Constants Object
+ // =========================
+
+ public function getConstants() {
+
+ $Constants = new SimpleXMLElement($this->getXML("constants"));
+
+ return $Constants;
+ }
+
+ // ==================
+ // Return a Recordset
+ // ==================
+
+ public function getRecordset($SQL = "") {
+
+ if (empty($SQL)) {
+ return false;
+ }
+
+ $recordSet = $this->connect()->query($SQL);
+
+ return $recordSet;
+ }
+
+ // =======================================
+ // Return Table Data as a SimpleXMLElement
+ // =======================================
+
+ public function getTable($table = "", $SQL = "") {
+
+ if (empty($table)) {
+ return new SimpleXMLElement("");
+ }
+
+ $SXE = new SimpleXMLElement("<{$table}/>");
+
+ $recordset = $this->getRecordset(empty($SQL) ? "select * from {$table}" : $SQL);
+
+ if ($recordset) {
+
+ while ($row = $recordset->fetch(PDO::FETCH_ASSOC)) {
+
+ $record = $SXE->addChild("record");
+
+ foreach ($row as $name => $value) {
+ $record->$name = $value;
+ }
+ }
+ }
+
+ return $SXE;
+ }
+
+ // =======================================
+ // Return Table Data as a SimpleXMLElement
+ // =======================================
+
+ public function getTableXML($table = "", $statement = "") {
+
+ if (empty($table)) {
+ return new SimpleXMLElement("");
+ }
+
+ $SXE = new SimpleXMLElement("<{$table}/>");
+
+ while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
+
+ $record = $SXE->addChild("record");
+
+ foreach ($row as $name => $value) {
+ $record->$name = $value;
+ }
+ }
+
+ return $SXE;
+ }
+
+ // =================================
+ // Return the Time Elapsed since now
+ // =================================
+
+ public function getTimeElapsed($timestamp = "") {
+
+ $now = new DateTime;
+ $then = new DateTime($timestamp);
+ $diff = (array) $now->diff($then);
+
+ $diff["w"] = floor($diff["d"] / 7);
+ $diff["d"] -= $diff["w"] * 7;
+
+ $string = array(
+ "y" => "year",
+ "m" => "month",
+ "w" => "week",
+ "d" => "day",
+ "h" => "hour",
+ "i" => "minute",
+ "s" => "second",
+ );
+
+ foreach ($string as $k => & $v) {
+
+ if ($diff[$k]) {
+ $v = $diff[$k] . " " . $v . ($diff[$k] > 1 ? "s" : "");
+ } else {
+ unset($string[$k]);
+ }
+ }
+
+ $string = array_slice($string, 0, 1);
+
+ return $string ? implode(", ", $string) . " ago" : "just now";
+ }
+
+ // ===================
+ // Return a Time Stamp
+ // ===================
+
+ public function getTimestamp() {
+
+ return date("Y-m-d H:i:s");
+ }
+
+ // ======================
+ // Return an XML Document
+ // ======================
+
+ public function getXML($document = "") {
+
+ if (trim($document) == "") {
+ return "";
+ }
+
+ $document = "xml/" . trim($document) . ".xml";
+ $XML = (file_exists($document) ? file_get_contents($document) : "");
+
+ return $XML;
+ }
+
+ // ========================
+ // Return an XSL Stylesheet
+ // ========================
+
+ public function getXSL($document = "") {
+
+ if (trim($document) == "") {
+ return "";
+ }
+
+ $document = "xsl/" . trim($document) . ".xsl";
+ $XSL = (file_exists($document) ? file_get_contents($document) : "");
+
+ return $XSL;
+ }
+
+ // =======================================
+ // Return a Zip Code Detail Object (Array)
+ // =======================================
+
+ public function getZipcode($zip_code = 0) {
+
+ $zip_code = filter_input(INPUT_POST, "zip_code", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $zip_code = (integer) substr((string) $zip_code, 0, 5);
+
+ $zipCodeDetail = null;
+
+ $SQL = "select *
+ from zipcodes
+ where zipcode_code = {$zip_code}";
+
+ $zipcodes = $this->getTable("zipcodes", $SQL);
+
+ if ($zipcodes->count() > 0) {
+
+ $zipCodeDetail["ZipCode"] = $zip_code;
+ $zipCodeDetail["City"] = (string) $zipcodes->record->zipcode_city;
+ $zipCodeDetail["State"] = (string) $zipcodes->record->zipcode_state;
+ $zipCodeDetail["County"] = (string) $zipcodes->record->zipcode_county;
+ $zipCodeDetail["Country"] = (string) $zipcodes->record->zipcode_country;
+ }
+
+ if ($_SESSION[self::AJAX]) {
+ echo json_encode($zipCodeDetail);
+ } else {
+ return $zipCodeDetail;
+ }
+ }
+
+ // ======================
+ // Initialize the Session
+ // ======================
+
+ public function initializeSession() {
+
+ $settings = $this->getSettings();
+
+ $_SESSION[self::ACTIVE_SESSION] = true;
+ $_SESSION[self::THEME] = "light";
+ $_SESSION[self::ENVIRONMENT] = (string) ($settings->Environment ?? "Production");
+ $_SESSION[self::USER_AUTHENTICATED] = false;
+ $_SESSION[self::USER_SERIAL] = 0;
+ $_SESSION[self::USER_ID] = "";
+ $_SESSION[self::USER_NAME] = "";
+ $_SESSION[self::USER_CLIENT_NAME] = "";
+ $_SESSION[self::USER_EMAIL] = "";
+ $_SESSION[self::USER_ROLE] = "Guest";
+ $_SESSION[self::REPORTS_GET] = "";
+ $_SESSION[self::REPORTS_POST] = "";
+ $_SESSION[self::AJAX] = false;
+ }
+
+ // ============
+ // Log an Error
+ // ============
+
+ public function logError($error_message = "") {
+
+ (new Journal())->journalEntry($error_message);
+
+ $this->displayHome();
+
+ exit();
+ }
+
+ // ==========================
+ // Merge thisXML with thatXML
+ // ==========================
+
+ public function mergeXML($thisXML = "", $thatXML = "") {
+
+ if ($thisXML instanceof SimpleXMLElement) {
+ $thisXML = $thisXML->asXML();
+ }
+
+ if ($thatXML instanceof SimpleXMLElement) {
+ $thatXML = $thatXML->asXML();
+ }
+
+ if (trim($thisXML) == "") {
+ return $thatXML;
+ }
+
+ if (trim($thatXML) == "") {
+ return $thisXML;
+ }
+
+ $thisDOM = new DOMDocument();
+ $thisDOM->loadXML($thisXML);
+
+ $thatDOM = new DOMDocument();
+ $thatDOM->loadXML($thatXML);
+
+ $xpath = new DOMXpath($thisDOM);
+ $xpathQuery = $xpath->query("/*");
+
+ for ($i = 0; $i < $xpathQuery->length; $i++) {
+ $thatDOM->documentElement->appendChild($thatDOM->importNode($xpathQuery->item($i), true));
+ }
+
+ $thatSXE = simplexml_import_dom($thatDOM);
+
+ return $thatSXE->asXML();
+ }
+
+ // ==============
+ // Print a Report
+ // ==============
+
+ public function print() {
+
+ $_SESSION[self::REPORTS_GET] = $_GET;
+ $_SESSION[self::REPORTS_POST] = $_POST;
+
+ $report = filter_input(INPUT_POST, "report") ?: "";
+
+ (new $report())->print();
+ }
+
+ // =================
+ // Sanitize a string
+ // =================
+
+ public function sanitizeString($string = "") {
+
+ return trim(preg_replace("/\s+/", " ", htmlspecialchars($string, ENT_NOQUOTES | ENT_HTML5)));
+ }
+
+ // ========================
+ // Toggle the current Theme
+ // ========================
+
+ public function toggleTheme() {
+
+ $_SESSION[self::THEME] = (($_SESSION[self::THEME] ?? "light") === "dark") ? "light" : "dark";
+ }
+
+ // ===============================
+ // Validate a Date (local or AJAX)
+ // ===============================
+
+ public function validateDate($date = "", $format = "Y-m-d") {
+
+ $date = filter_input(INPUT_POST, "date") ?: $date;
+
+ $datetime = DateTime::createFromFormat($format, $date);
+
+ $valid = $datetime && $datetime->format($format) === $date;
+
+ if ($_SESSION[self::AJAX]) {
+ echo json_encode($valid);
+ } else {
+ return $valid;
+ }
+ }
+
+ // ========================
+ // Generate Random Password
+ // ========================
+
+ public function generateRandomPassword($length = 12) {
+
+ $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-_+=';
+ $password = '';
+
+ for ($i = 0; $i < $length; $i++) {
+ $index = rand(0, strlen($characters) - 1);
+ $password .= $characters[$index];
+ }
+
+ return $password;
+ }
+
+ // ====================
+ // User Change Password
+ // ====================
+
+ public function userChangePassword() {
+
+ $user = (new Users())->getUserByUserName($_SESSION[self::USER_NAME]);
+
+ if ($user->record->user_change_password == 1) {
+
+ return true;
+ }
+
+ return false;
+ }
+
+ // ==============================
+ // Alter Sting to Parahgraph Case
+ // ==============================
+
+ public function toParagraphCase($text) {
+
+ $text = ucwords(strtolower($text));
+
+ return $text;
+ }
+
+ // ==========================
+ // Developer Testing Function
+ // ==========================
+
+ public function testing() {
+
+ $to = "james.richie@onesourceits.com";
+ $subject = "test for dev";
+ $message = "test";
+
+ $email = (new Email())->sendEmail($to, $subject, $message);
+
+ $this->debug($email);
+
+ exit();
+ }
+}
+
+?>
diff --git a/classes/Consolidation.php b/classes/Consolidation.php
new file mode 100644
index 0000000..3fbd6ca
--- /dev/null
+++ b/classes/Consolidation.php
@@ -0,0 +1,254 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ }
+
+ // ======================
+ // Consolidation Sequence
+ // ======================
+
+ public function consolidationSequence() {
+
+ set_time_limit(0);
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $content = $this->applyXSL("", $this->getXSL("consolidationAlert"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "run":
+
+ $sql_insert = "insert into rdiconsolidations
+
+ ( rdiconsolidation_permit_facts_id,
+ rdiconsolidation_entry_date_str,
+ rdiconsolidation_entry_date,
+ rdiconsolidation_permit_number,
+ rdiconsolidation_permit_date_str,
+ rdiconsolidation_permit_date,
+ rdiconsolidation_project_addr,
+ rdiconsolidation_sub_div_name,
+ rdiconsolidation_project_type,
+ rdiconsolidation_company,
+ rdiconsolidation_address,
+ rdiconsolidation_city,
+ rdiconsolidation_state,
+ rdiconsolidation_zip,
+ rdiconsolidation_phone,
+ rdiconsolidation_project_city,
+ rdiconsolidation_project_state,
+ rdiconsolidation_size,
+ rdiconsolidation_units,
+ rdiconsolidation_building_type,
+ rdiconsolidation_value,
+ rdiconsolidation_work_type,
+ rdiconsolidation_county,
+ rdiconsolidation_lot,
+ rdiconsolidation_dist_ll,
+ rdiconsolidation_ct1,
+ rdiconsolidation_owner_name,
+ rdiconsolidation_owner_address,
+ rdiconsolidation_owner_city,
+ rdiconsolidation_owner_state,
+ rdiconsolidation_owner_zip,
+ rdiconsolidation_owner_phone,
+ rdiconsolidation_ytd_permits,
+ rdiconsolidation_ytd_value,
+ rdiconsolidation_12mth_prev_permits,
+ rdiconsolidation_date )
+
+ values ( :rdiconsolidation_permit_facts_id,
+ :rdiconsolidation_entry_date_str,
+ :rdiconsolidation_entry_date,
+ :rdiconsolidation_permit_number,
+ :rdiconsolidation_permit_date_str,
+ :rdiconsolidation_permit_date,
+ :rdiconsolidation_project_addr,
+ :rdiconsolidation_sub_div_name,
+ :rdiconsolidation_project_type,
+ :rdiconsolidation_company,
+ :rdiconsolidation_address,
+ :rdiconsolidation_city,
+ :rdiconsolidation_state,
+ :rdiconsolidation_zip,
+ :rdiconsolidation_phone,
+ :rdiconsolidation_project_city,
+ :rdiconsolidation_project_state,
+ :rdiconsolidation_size,
+ :rdiconsolidation_units,
+ :rdiconsolidation_building_type,
+ :rdiconsolidation_value,
+ :rdiconsolidation_work_type,
+ :rdiconsolidation_county,
+ :rdiconsolidation_lot,
+ :rdiconsolidation_dist_ll,
+ :rdiconsolidation_ct1,
+ :rdiconsolidation_owner_name,
+ :rdiconsolidation_owner_address,
+ :rdiconsolidation_owner_city,
+ :rdiconsolidation_owner_state,
+ :rdiconsolidation_owner_zip,
+ :rdiconsolidation_owner_phone,
+ :rdiconsolidation_ytd_permits,
+ :rdiconsolidation_ytd_value,
+ :rdiconsolidation_12mth_prev_permits,
+ :rdiconsolidation_date ) ";
+
+ $connection = $this->connect();
+
+ $connection->beginTransaction();
+ $statement = $connection->prepare($sql_insert);
+
+ $rdi_records = $this->getRdiTable();
+ $rdi_record_count = $rdi_records->count();
+
+ $processed_record_count = 0;
+
+ foreach ($rdi_records as $record) {
+
+ $rdiconsolidation_permit_facts_id = (integer) $record->permit_facts_id ?: 0;
+ $rdiconsolidation_entry_date_str = (integer) $record->entry_date_str ?: "";
+ $rdiconsolidation_entry_date = (string) $record->entry_date ?: "0000-00-00";
+ $rdiconsolidation_permit_number = (string) $record->permit_number ?: "";
+ $rdiconsolidation_permit_date_str = (string) $record->permit_date_str ?: "";
+ $rdiconsolidation_permit_date = (string) $record->permit_date ?: "0000-00-00";
+ $rdiconsolidation_project_addr = (string) $record->project_addr ?: "";
+ $rdiconsolidation_sub_div_name = (string) $record->sub_div_name ?: "";
+ $rdiconsolidation_project_type = (string) $record->project_type ?: "";
+ $rdiconsolidation_company = (string) $record->company ?: "";
+ $rdiconsolidation_address = (string) $record->address ?: "";
+ $rdiconsolidation_city = (string) $record->city ?: "";
+ $rdiconsolidation_state = (string) $record->state ?: "";
+ $rdiconsolidation_zip = (string) $record->zip ?: "";
+ $rdiconsolidation_phone = (string) $record->phone ?: "";
+ $rdiconsolidation_project_city = (string) $record->project_city ?: "";
+ $rdiconsolidation_project_state = (string) $record->project_state ?: "";
+ $rdiconsolidation_size = (integer) $record->size ?: 0;
+ $rdiconsolidation_units = (integer) $record->units ?: 0;
+ $rdiconsolidation_building_type = (integer) $record->building_type ?: 0;
+ $rdiconsolidation_value = (integer) $record->value ?: 0;
+ $rdiconsolidation_work_type = (integer) $record->work_type ?: 0;
+ $rdiconsolidation_county = (string) $record->county ?: "";
+ $rdiconsolidation_lot = (string) $record->lot ?: "";
+ $rdiconsolidation_dist_ll = (string) $record->dist_ll ?: "";
+ $rdiconsolidation_ct1 = (integer) $record->ct1 ?: 0;
+ $rdiconsolidation_owner_name = (string) $record->owner_name ?: "";
+ $rdiconsolidation_owner_address = (string) $record->owner_address ?: "";
+ $rdiconsolidation_owner_city = (string) $record->owner_city ?: "";
+ $rdiconsolidation_owner_state = (string) $record->owner_state ?: "";
+ $rdiconsolidation_owner_zip = (string) $record->owner_zip ?: "";
+ $rdiconsolidation_owner_phone = (string) $record->owner_phone ?: "";
+ $rdiconsolidation_ytd_permits = (integer) $record->ytd_permits ?: 0;
+ $rdiconsolidation_ytd_value = (integer) $record->ytd_value ?: 0;
+ $rdiconsolidation_12mth_prev_permits = (integer) $record->{"12mth_prev_permits"} ?: 0;
+ $rdiconsolidation_date = date("Y-m-d");
+
+ $statement->bindValue(":rdiconsolidation_permit_facts_id", $rdiconsolidation_permit_facts_id);
+ $statement->bindValue(":rdiconsolidation_entry_date_str", $rdiconsolidation_entry_date_str);
+ $statement->bindValue(":rdiconsolidation_entry_date", $rdiconsolidation_entry_date);
+ $statement->bindValue(":rdiconsolidation_permit_number", $rdiconsolidation_permit_number);
+ $statement->bindValue(":rdiconsolidation_permit_date_str", $rdiconsolidation_permit_date_str);
+ $statement->bindValue(":rdiconsolidation_permit_date", $rdiconsolidation_permit_date);
+ $statement->bindValue(":rdiconsolidation_project_addr", $rdiconsolidation_project_addr);
+ $statement->bindValue(":rdiconsolidation_sub_div_name", $rdiconsolidation_sub_div_name);
+ $statement->bindValue(":rdiconsolidation_project_type", $rdiconsolidation_project_type);
+ $statement->bindValue(":rdiconsolidation_company", $rdiconsolidation_company);
+ $statement->bindValue(":rdiconsolidation_address", $rdiconsolidation_address);
+ $statement->bindValue(":rdiconsolidation_city", $rdiconsolidation_city);
+ $statement->bindValue(":rdiconsolidation_state", $rdiconsolidation_state);
+ $statement->bindValue(":rdiconsolidation_zip", $rdiconsolidation_zip);
+ $statement->bindValue(":rdiconsolidation_phone", $rdiconsolidation_phone);
+ $statement->bindValue(":rdiconsolidation_project_city", $rdiconsolidation_project_city);
+ $statement->bindValue(":rdiconsolidation_project_state", $rdiconsolidation_project_state);
+ $statement->bindValue(":rdiconsolidation_size", $rdiconsolidation_size);
+ $statement->bindValue(":rdiconsolidation_units", $rdiconsolidation_units);
+ $statement->bindValue(":rdiconsolidation_building_type", $rdiconsolidation_building_type);
+ $statement->bindValue(":rdiconsolidation_value", $rdiconsolidation_value);
+ $statement->bindValue(":rdiconsolidation_work_type", $rdiconsolidation_work_type);
+ $statement->bindValue(":rdiconsolidation_county", $rdiconsolidation_county);
+ $statement->bindValue(":rdiconsolidation_lot", $rdiconsolidation_lot);
+ $statement->bindValue(":rdiconsolidation_dist_ll", $rdiconsolidation_dist_ll);
+ $statement->bindValue(":rdiconsolidation_ct1", $rdiconsolidation_ct1);
+ $statement->bindValue(":rdiconsolidation_owner_name", $rdiconsolidation_owner_name);
+ $statement->bindValue(":rdiconsolidation_owner_address", $rdiconsolidation_owner_address);
+ $statement->bindValue(":rdiconsolidation_owner_city", $rdiconsolidation_owner_city);
+ $statement->bindValue(":rdiconsolidation_owner_state", $rdiconsolidation_owner_state);
+ $statement->bindValue(":rdiconsolidation_owner_zip", $rdiconsolidation_owner_zip);
+ $statement->bindValue(":rdiconsolidation_owner_phone", $rdiconsolidation_owner_phone);
+ $statement->bindValue(":rdiconsolidation_ytd_permits", $rdiconsolidation_ytd_permits);
+ $statement->bindValue(":rdiconsolidation_ytd_value", $rdiconsolidation_ytd_value);
+ $statement->bindValue(":rdiconsolidation_12mth_prev_permits", $rdiconsolidation_12mth_prev_permits);
+ $statement->bindValue(":rdiconsolidation_date", $rdiconsolidation_date);
+
+ if (!$statement->execute()) {
+
+ $connection->rollBack();
+ $this->debug($connection->errorInfo()[2]);
+ }
+
+ $processed_record_count++;
+ }
+
+ if ($processed_record_count !== $rdi_record_count) {
+ $connection->rollBack();
+ $XSLParms["CONSOLIDATION_ERROR"] = "Record Counts Did not match. Rolling Back Database. Contact Support.";
+ } else {
+ $connection->commit();
+ $this->executeSQL("truncate rdis");
+ }
+
+ $XSLParms["RDI-RECORD-COUNT"] = $rdi_record_count;
+ $XSLParms["PROCESSED-RECORD-COUNT"] = $processed_record_count;
+ $content = $this->applyXSL("", $this->getXSL("consolidationResults"), $XSLParms);
+ $this->displayContent($content);
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ====================
+ // Return an RDI Object
+ // ====================
+
+ public function getRdiTable() {
+
+ $SQL = "SELECT * FROM rdis";
+
+ return $this->getTable("rdis", $SQL);
+ }
+}
+
+?>
diff --git a/classes/Counties.php b/classes/Counties.php
new file mode 100644
index 0000000..0afc526
--- /dev/null
+++ b/classes/Counties.php
@@ -0,0 +1,389 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==========
+ // Add County
+ // ==========
+
+ public function addCounty() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $constants = $this->getConstants();
+ $content = $this->applyXSL($constants, $this->getXSL("addCounty"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $county_name = filter_input(INPUT_POST, "county_name") ?: "";
+
+ $SQL = "insert into counties
+
+ ( county_name,
+ county_area,
+ county_creator,
+ county_created )
+
+ VALUES ( :county_name,
+ :county_area,
+ :county_creator,
+ :county_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":county_name", $county_name);
+ $statement->bindValue(":county_area", $county_name);
+ $statement->bindValue(":county_creator", $this->current_user_name);
+ $statement->bindValue(":county_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =============
+ // Delete County
+ // =============
+
+ public function deleteCounty() {
+
+ $county_serial = filter_input(INPUT_POST, "county_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $county = $this->getCounty($county_serial);
+
+ if ($county->count() == 0) {
+ $this->logError("Invalid County ({$county_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from counties
+ where county_serial = {$county_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ============================
+ // Determine if a County exists
+ // ============================
+
+ public function countyExists() {
+
+ $county_serial = filter_input(INPUT_POST, "county_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $county_name = filter_input(INPUT_POST, "county_name") ?: "";
+
+ $SQL = "select county_serial
+ from view_counties
+ where county_serial != :county_serial
+ and lower(county_name) = :county_name";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":county_serial", $county_serial);
+ $statement->bindValue(":county_name", strtolower($county_name));
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ======================================
+ // Determine if a County is Active (AJAX)
+ // ======================================
+
+ public function countyActive() {
+
+ $rdi_county = filter_input(INPUT_POST, "rdi_county") ?: "";
+
+ $active = false;
+
+ $SQL = "select rdi_county
+ from rdis
+ where rdi_county = {$rdi_county}
+ limit 1";
+
+ $workorders = $this->getTable("county", $SQL);
+
+ $active = ($workorders->count() > 0) ? true : false;
+
+ echo json_encode($active);
+ }
+
+ // =============
+ // Edit a County
+ // =============
+
+ public function editCounty() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $county_serial = filter_input(INPUT_POST, "county_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $county = $this->getCounty($county_serial);
+
+ if ($county->count() == 0) {
+ $this->logError("Invalid County ({$county_serial}). " . __METHOD__);
+ }
+
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($county, "");
+ $XML = $this->mergeXML($constants, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editCounty"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $county_serial = filter_input(INPUT_POST, "county_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $county_name = filter_input(INPUT_POST, "county_name") ?: "";
+ $county_area = filter_input(INPUT_POST, "county_area") ?: "";
+
+ // Verify the County
+
+ $county = $this->getCounty($county_serial);
+
+ if ($county->count() == 0) {
+ $this->logError("Invalid County ({$county_serial}). " . __METHOD__);
+ }
+
+ $SQL = "update counties
+ set county_name = :county_name,
+ county_area = :county_area,
+ county_creator = :county_creator,
+ county_created = :county_created
+ where county_serial = :county_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":county_serial", $county_serial);
+ $statement->bindValue(":county_name", $county_name);
+ $statement->bindValue(":county_area", $county_area);
+ $statement->bindValue(":county_creator", $this->current_user_name);
+ $statement->bindValue(":county_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ================================
+ // Return an Active Counties Object
+ // ================================
+
+ public function getActiveCounties() {
+
+ $SQL = "select view_counties.*
+ from view_counties
+ where county_active is true";
+
+ return $this->getTable("counties", $SQL);
+ }
+
+ // =======================
+ // Return an County Object
+ // =======================
+
+ public function getCounty($county_serial = 0) {
+
+ $SQL = "select view_counties.*
+ from view_counties
+ where county_serial = {$county_serial}";
+
+ return $this->getTable("counties", $SQL);
+ }
+
+ // ========================
+ // Return a Counties Object
+ // ========================
+
+ public function getCounties() {
+
+ $SQL = "select view_counties.*
+ from view_counties";
+
+ return $this->getTable("counties", $SQL);
+ }
+
+ // ========================
+ // Return a Counties Object
+ // ========================
+
+ public function getCountiesByArea($area) {
+
+ $SQL = "select view_counties.*
+ from view_counties";
+
+ if ($area != "All") {
+ $SQL .= " where view_counties.county_area = '{$area}'";
+ }
+
+ return $this->getTable("counties", $SQL);
+ }
+
+ // ========================
+ // Return a Counties Object
+ // ========================
+
+ public function getCountiesByName($county_name) {
+
+ $SQL = "select view_counties.*
+ from view_counties
+ where view_counties.county_name = '{$county_name}'";
+
+ return $this->getTable("counties", $SQL);
+ }
+
+ // =============================
+ // Return a Counties Page Object
+ // =============================
+
+ public function getCountiesPage() {
+
+ // Find Criteria
+
+ $find_county = filter_input(INPUT_POST, "find_county") ?: "";
+ $find_county = $this->sanitizeString($find_county);
+
+ $find_words = implode("|", explode(" ", $find_county));
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_counties
+ where county_name regexp :county_name";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":county_name", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_counties.*
+ from view_counties
+ where county_name regexp :county_name
+ order by county_name
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":county_name", $find_words);
+
+ $statement->execute();
+
+ $counties = $this->getTableXML("counties", $statement);
+
+ // Insert Pagination Attributes
+
+ $counties->addAttribute("count", $count);
+ $counties->addAttribute("start", $start);
+ $counties->addAttribute("end", $end);
+ $counties->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $counties;
+ }
+
+ // ==============
+ // Setup Counties
+ // ==============
+
+ public function setupCounties() {
+
+ $counties = $this->getCountiesPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($counties, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupCounties"));
+
+ $this->displayContent($content);
+ }
+}
+
+?>
diff --git a/classes/Dropdowns.php b/classes/Dropdowns.php
new file mode 100644
index 0000000..d44a646
--- /dev/null
+++ b/classes/Dropdowns.php
@@ -0,0 +1,733 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ============
+ // Add Dropdown
+ // ============
+
+ public function addDropdown() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdowntype = $this->getDropdowntype($dropdowntype_serial);
+
+ if ($dropdowntype->count() == 0) {
+ $this->logError("Invalid Dropdowntype ({$dropdowntype_serial}). " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($dropdowntype, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("addDropdown"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_value = filter_input(INPUT_POST, "dropdown_value") ?: "";
+
+ $SQL = "insert into dropdowns
+
+ ( dropdown_dropdowntype,
+ dropdown_value,
+ dropdown_creator,
+ dropdown_created )
+
+ VALUES ( :dropdown_dropdowntype,
+ :dropdown_value,
+ :dropdown_creator,
+ :dropdown_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdown_dropdowntype", $dropdowntype_serial);
+ $statement->bindValue(":dropdown_value", $dropdown_value);
+ $statement->bindValue(":dropdown_creator", $this->current_user_name);
+ $statement->bindValue(":dropdown_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ================
+ // Add Dropdowntype
+ // ================
+
+ public function addDropdowntype() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $content = $this->applyXSL("", $this->getXSL("addDropdowntype"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $dropdowntype_name = filter_input(INPUT_POST, "dropdowntype_name") ?: "";
+ $dropdowntype_title = filter_input(INPUT_POST, "dropdowntype_title") ?: "";
+ $dropdowntype_table = filter_input(INPUT_POST, "dropdowntype_table") ?: "";
+ $dropdowntype_column = filter_input(INPUT_POST, "dropdowntype_column") ?: "";
+
+ $SQL = "insert into dropdowntypes
+
+ ( dropdowntype_name,
+ dropdowntype_title,
+ dropdowntype_table,
+ dropdowntype_column,
+ dropdowntype_creator,
+ dropdowntype_created )
+
+ VALUES ( :dropdowntype_name,
+ :dropdowntype_title,
+ :dropdowntype_table,
+ :dropdowntype_column,
+ :dropdowntype_creator,
+ :dropdowntype_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_name", $dropdowntype_name);
+ $statement->bindValue(":dropdowntype_title", $dropdowntype_title);
+ $statement->bindValue(":dropdowntype_table", $dropdowntype_table);
+ $statement->bindValue(":dropdowntype_column", $dropdowntype_column);
+ $statement->bindValue(":dropdowntype_creator", $this->current_user_name);
+ $statement->bindValue(":dropdowntype_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ===============
+ // Delete Dropdown
+ // ===============
+
+ public function deleteDropdown() {
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdown = $this->getDropdown($dropdown_serial);
+
+ if ($dropdown->count() == 0) {
+ $this->logError("Invalid Dropdown ({$dropdown_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from dropdowns
+ where dropdown_serial = {$dropdown_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ===================
+ // Delete Dropdowntype
+ // ===================
+
+ public function deleteDropdowntype() {
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdowntype = $this->getDropdowntype($dropdowntype_serial);
+
+ if ($dropdowntype->count() == 0) {
+ $this->logError("Invalid Dropdowntype ({$dropdowntype_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from dropdowntypes
+ where dropdowntype_serial = {$dropdowntype_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ==============================
+ // Determine if a Dropdown exists
+ // ==============================
+
+ public function dropdownExists() {
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_value = filter_input(INPUT_POST, "dropdown_value") ?: "";
+
+ $dropdown_value = strtolower($dropdown_value);
+
+ $SQL = "select dropdown_serial
+ from view_dropdowns
+ where dropdown_serial != :dropdown_serial
+ and dropdown_dropdowntype = :dropdown_dropdowntype
+ and lower(dropdown_value) = :dropdown_value";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdown_serial", $dropdown_serial);
+ $statement->bindValue(":dropdown_dropdowntype", $dropdowntype_serial);
+ $statement->bindValue(":dropdown_value", $dropdown_value);
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ==================================
+ // Determine if a Dropdowntype exists
+ // ==================================
+
+ public function dropdowntypeExists() {
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdowntype_name = filter_input(INPUT_POST, "dropdowntype_name") ?: "";
+
+ $dropdowntype_name = strtolower($dropdowntype_name);
+
+ $SQL = "select dropdowntype_serial
+ from view_dropdowntypes
+ where dropdowntype_serial != :dropdowntype_serial
+ and lower(dropdowntype_name) = :dropdowntype_name";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_serial", $dropdowntype_serial);
+ $statement->bindValue(":dropdowntype_name", $dropdowntype_name);
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ========================================
+ // Determine if a Dropdowntype Title exists
+ // ========================================
+
+ public function dropdowntypetitleExists() {
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdowntype_title = filter_input(INPUT_POST, "dropdowntype_title") ?: "";
+
+ $dropdowntype_title = strtolower($dropdowntype_title);
+
+ $SQL = "select dropdowntype_serial
+ from view_dropdowntypes
+ where dropdowntype_serial != :dropdowntype_serial
+ and lower(dropdowntype_title) = :dropdowntype_title";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_serial", $dropdowntype_serial);
+ $statement->bindValue(":dropdowntype_title", $dropdowntype_title);
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // =================================
+ // Determine if a Dropdown is Active
+ // =================================
+
+ public function dropdownActive() {
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdown = $this->getDropdown($dropdown_serial);
+
+ if ($dropdown->count() == 0) {
+ $this->logError("Invalid Dropdown ({$dropdown_serial}). " . __METHOD__);
+ }
+
+ $table = (string) $dropdown->record->dropdowntype_table;
+ $column = (string) $dropdown->record->dropdowntype_column;
+
+ $active = false;
+
+ switch ($table) {
+
+ case "*none": // No table, never Active.
+
+ break;
+
+ case "*function": // Requires it's own function to determine if Active.
+
+ if (method_exists(__CLASS__, $column)) {
+ $active = $this->$column($dropdown_serial);
+ }
+
+ break;
+
+ default: // All others, test the Column in the Table.
+
+ $SQL = "select {$column}
+ from {$table}
+ where {$column} = {$dropdown_serial}";
+
+ $results = $this->getTable("results", $SQL);
+
+ $active = ($results->count() > 0) ? true : false;
+
+ break;
+ }
+
+ echo json_encode($active);
+ }
+
+ // =====================================
+ // Determine if a Dropdowntype is Active
+ // =====================================
+
+ public function dropdowntypeActive() {
+
+ $dropdowntype_serial = (integer) filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $SQL = "select dropdown_serial
+ from view_dropdowns
+ where dropdown_dropdowntype = {$dropdowntype_serial}";
+
+ $dropdowns = $this->getTable("dropdowns", $SQL);
+
+ $active = ($dropdowns->count() > 0) ? true : false;
+
+ echo json_encode($active);
+ }
+
+ // ===============
+ // Edit a Dropdown
+ // ===============
+
+ public function editDropdown() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdown = $this->getDropdown($dropdown_serial);
+
+ if ($dropdown->count() == 0) {
+ $this->logError("Invalid Dropdown ({$dropdown_serial}). " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($dropdown, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("editDropdown"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_value = filter_input(INPUT_POST, "dropdown_value") ?: "";
+
+ $dropdown = $this->getDropdown($dropdown_serial);
+
+ if ($dropdown->count() == 0) {
+ $this->logError("Invalid Dropdown ({$dropdown_serial}). " . __METHOD__);
+ }
+
+ $SQL = "update dropdowns
+ set dropdown_value = :dropdown_value,
+ dropdown_changer = :dropdown_changer,
+ dropdown_changed = :dropdown_changed
+ where dropdown_serial = :dropdown_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdown_serial", $dropdown_serial);
+ $statement->bindValue(":dropdown_value", $dropdown_value);
+ $statement->bindValue(":dropdown_changer", $this->current_user_name);
+ $statement->bindValue(":dropdown_changed", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ===================
+ // Edit a Dropdowntype
+ // ===================
+
+ public function editDropdowntype() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $dropdowntype = $this->getDropdowntype($dropdowntype_serial);
+
+ if ($dropdowntype->count() == 0) {
+ $this->logError("Invalid Dropdowntype ({$dropdowntype_serial}). " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($dropdowntype, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("editDropdowntype"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $dropdowntype_serial = filter_input(INPUT_POST, "dropdowntype_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdowntype_name = filter_input(INPUT_POST, "dropdowntype_name") ?: "";
+ $dropdowntype_title = filter_input(INPUT_POST, "dropdowntype_title") ?: "";
+ $dropdowntype_table = filter_input(INPUT_POST, "dropdowntype_table") ?: "";
+ $dropdowntype_column = filter_input(INPUT_POST, "dropdowntype_column") ?: "";
+
+ $dropdowntype = $this->getDropdowntype($dropdowntype_serial);
+
+ if ($dropdowntype->count() == 0) {
+ $this->logError("Invalid Dropdowntype ({$dropdowntype_serial}). " . __METHOD__);
+ }
+
+ $SQL = "update dropdowntypes
+ set dropdowntype_name = :dropdowntype_name,
+ dropdowntype_title = :dropdowntype_title,
+ dropdowntype_table = :dropdowntype_table,
+ dropdowntype_column = :dropdowntype_column,
+ dropdowntype_changer = :dropdowntype_changer,
+ dropdowntype_changed = :dropdowntype_changed
+ where dropdowntype_serial = :dropdowntype_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_serial", $dropdowntype_serial);
+ $statement->bindValue(":dropdowntype_name", $dropdowntype_name);
+ $statement->bindValue(":dropdowntype_title", $dropdowntype_title);
+ $statement->bindValue(":dropdowntype_table", $dropdowntype_table);
+ $statement->bindValue(":dropdowntype_column", $dropdowntype_column);
+ $statement->bindValue(":dropdowntype_changer", $this->current_user_name);
+ $statement->bindValue(":dropdowntype_changed", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =================================
+ // Return an Active Dropdowns Object
+ // =================================
+
+ public function getActiveDropdowns() {
+
+ $SQL = "select view_dropdowns.*
+ from view_dropdowns
+ where dropdown_active is true";
+
+ return $this->getTable("dropdowns", $SQL);
+ }
+
+ // ========================
+ // Return a Dropdown Object
+ // ========================
+
+ public function getDropdown($dropdown_serial = 0) {
+
+ $SQL = "select view_dropdowns.*
+ from view_dropdowns
+ where dropdown_serial = {$dropdown_serial}";
+
+ return $this->getTable("dropdowns", $SQL);
+ }
+
+ // =========================
+ // Return a Dropdowns Object
+ // =========================
+
+ public function getDropdowns() {
+
+ $SQL = "select view_dropdowns.*
+ from view_dropdowns";
+
+ return $this->getTable("dropdowns", $SQL);
+ }
+
+ // ============================
+ // Return a Dropdowntype Object
+ // ============================
+
+ public function getDropdowntype($dropdowntype_serial = 0) {
+
+ $SQL = "select view_dropdowntypes.*
+ from view_dropdowntypes
+ where dropdowntype_serial = {$dropdowntype_serial}";
+
+ return $this->getTable("dropdowntypes", $SQL);
+ }
+
+ // =============================
+ // Return a Dropdowntypes Object
+ // =============================
+
+ public function getDropdowntypes() {
+
+ $SQL = "select view_dropdowntypes.*
+ from view_dropdowntypes";
+
+ return $this->getTable("dropdowntypes", $SQL);
+ }
+
+ // ==================================
+ // Return a Dropdowntypes Page Object
+ // ==================================
+
+ public function getDropdowntypesPage() {
+
+ // Find Criteria
+
+ $find_dropdowntype = filter_input(INPUT_POST, "find_dropdowntype") ?: "";
+ $find_words = $this->sanitizeString($find_dropdowntype);
+
+ // Show Per Page
+
+ $this->pagination_size = filter_input(INPUT_POST, "users_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_dropdowntypes
+ where (dropdowntype_name regexp :dropdowntype_name
+ or dropdowntype_title regexp :dropdowntype_title
+ or dropdowntype_table regexp :dropdowntype_table
+ or dropdowntype_column regexp :dropdowntype_column)";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_name", $find_words);
+ $statement->bindValue(":dropdowntype_title", $find_words);
+ $statement->bindValue(":dropdowntype_table", $find_words);
+ $statement->bindValue(":dropdowntype_column", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_dropdowntypes.*
+ from view_dropdowntypes
+ where (dropdowntype_name regexp :dropdowntype_name
+ or dropdowntype_title regexp :dropdowntype_title
+ or dropdowntype_table regexp :dropdowntype_table
+ or dropdowntype_column regexp :dropdowntype_column)
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":dropdowntype_name", $find_words);
+ $statement->bindValue(":dropdowntype_title", $find_words);
+ $statement->bindValue(":dropdowntype_table", $find_words);
+ $statement->bindValue(":dropdowntype_column", $find_words);
+
+ $statement->execute();
+
+ $dropdowntypes = $this->getTableXML("dropdowntypes", $statement);
+
+ // Insert Pagination Attributes
+
+ $dropdowntypes->addAttribute("count", $count);
+ $dropdowntypes->addAttribute("start", $start);
+ $dropdowntypes->addAttribute("end", $end);
+ $dropdowntypes->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $dropdowntypes;
+ }
+
+ // ===============
+ // Setup Dropdowns
+ // ===============
+
+ public function setupDropdowns() {
+
+ $dropdowntypes = $this->getDropdowntypes();
+ $dropdowns = $this->getDropdowns();
+
+ $XML = $this->mergeXML($dropdowntypes, "");
+ $XML = $this->mergeXML($dropdowns, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupDropdowns"));
+
+ $this->displayContent($content);
+ }
+
+ // ===================
+ // Setup Dropdowntypes
+ // ===================
+
+ public function setupDropdowntypes() {
+
+ $dropdowntypes = $this->getDropdowntypesPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($dropdowntypes, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupDropdowntypes"));
+
+ $this->displayContent($content);
+ }
+
+ // ======================
+ // Update Dropdown Active
+ // ======================
+
+ public function updateDropdownActive() {
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_checked = filter_input(INPUT_POST, "dropdown_checked", FILTER_VALIDATE_BOOLEAN) ?: false;
+
+ $SQL = "update dropdowns
+ set dropdown_active = :dropdown_active,
+ dropdown_changer = :dropdown_changer,
+ dropdown_changed = :dropdown_changed
+ where dropdown_serial = :dropdown_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":dropdown_serial", $dropdown_serial);
+ $statement->bindValue(":dropdown_active", $dropdown_checked, PDO::PARAM_BOOL);
+ $statement->bindValue(":dropdown_changer", $this->current_user_name);
+ $statement->bindValue(":dropdown_changed", $this->getTimestamp());
+
+ $statement->execute();
+ }
+
+ // =======================
+ // Update Dropdown Default
+ // =======================
+
+ public function updateDropdownDefault() {
+
+ $dropdown_serial = filter_input(INPUT_POST, "dropdown_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_dropdowntype = filter_input(INPUT_POST, "dropdown_dropdowntype", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $dropdown_checked = filter_input(INPUT_POST, "dropdown_checked") ?: "false";
+
+ // Unset the Default for the Dropdown Type.
+
+ $SQL = "update dropdowns
+ set dropdown_default = false
+ where dropdown_dropdowntype = {$dropdown_dropdowntype}";
+
+ $this->executeSQL($SQL);
+
+ // Set the Default for the clicked Dropdown.
+
+ $SQL = "update dropdowns
+ set dropdown_default = {$dropdown_checked}
+ where dropdown_serial = {$dropdown_serial}";
+
+ $this->executeSQL($SQL);
+ }
+}
+
+?>
diff --git a/classes/Email.php b/classes/Email.php
new file mode 100644
index 0000000..073eb97
--- /dev/null
+++ b/classes/Email.php
@@ -0,0 +1,186 @@
+current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ }
+
+ // =============================
+ // Email a new users credentials
+ // =============================
+
+ public function emailNewUserCredentials($user, $password) {
+
+ if (!$user instanceof SimpleXMLElement) {
+ return;
+ }
+
+ // Prepare the email
+
+ $to = (string) $user->record->user_email;
+
+ $XSLParms['USER-TEMP-PASSWORD'] = $password;
+
+ $subject = "DEC International DMS - New User Credentials";
+ $message = $this->applyXSL($user, $this->getXSL("emailNewUserCredentials"), $XSLParms);
+
+ // Send the Email
+ $this->sendEmail($to, $subject, $message);
+ }
+
+ // =================================
+ // Email a users Password Reset Link
+ // =================================
+
+ public function emailUserPasswordResetLink($user, $password) {
+
+ if (!$user instanceof SimpleXMLElement) {
+ return;
+ }
+
+ // Prepare the email.
+
+ $XSLParms['USER-TEMP-PASSWORD'] = $password;
+
+ $to = (string) $user->record->user_email;
+ $subject = "DEC International DMS - Password Reset Request";
+ $message = $this->applyXSL($user, $this->getXSL("emailPasswordResetLink"), $XSLParms);
+
+ // Send the Email
+ $this->sendEmail($to, $subject, $message);
+ }
+
+ // =======================================
+ // Send an email with optional attachments
+ // =======================================
+
+ public function sendEmail($to = "", $subject = "", $message = "", $attachments = "", $attachment_names = "unknown") {
+
+ if (empty($to) or empty($subject) or empty($message)) {
+
+ return false;
+ }
+
+ $settings = $this->getSettings();
+
+ $SmtpHost = $settings->SmtpServer;
+ $SmtpUsername = $settings->SmtpUserName;
+ $SmtpPassword = $settings->SmtpPassword;
+ $SmtpPort = $settings->SmtpPort;
+
+ $email = new PHPMailer(true);
+
+ // Only for development
+
+ $message = "" . $message . "";
+
+ try {
+
+ //Server settings
+ $email->isSMTP();
+ $email->Host = $SmtpHost;
+ $email->SMTPAuth = true;
+ $email->Username = $SmtpUsername; // Your Gmail address
+ $email->Password = $SmtpPassword; // App password from Google
+// $email->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // or 'tls'
+ $email->Port = $SmtpPort;
+
+ $email->isHTML(true);
+ $email->SetFrom("info@onesourceits.com", "OneSource IT Solutions LLC");
+
+ if (is_array($to)) {
+ foreach ($to as $address) {
+ $address = trim(str_replace(" ", "", $address));
+ if (empty($address)) {
+ continue;
+ }
+ $email->addAddress($address);
+ }
+ } else {
+ $email->addAddress($to);
+ }
+
+ $email->Subject = $subject;
+ $email->Body = $message;
+
+ if (is_array($attachments)) {
+ foreach ($attachments as $index => $item) {
+ if (!empty($item)) {
+ $email->addStringAttachment($item, ($attachment_names[$index] ?? "unknown"));
+ }
+ }
+ } else {
+ if (!empty($attachments)) {
+ $email->addStringAttachment($attachments, $attachment_names);
+ }
+ }
+
+ $success = $email->Send();
+ } catch (phpMailerException $e) {
+
+ (new Journal())->journalEntry($e->errorMessage());
+ $success = false;
+ } catch (Exception $e) {
+
+ (new Journal())->journalEntry($e->getMessage());
+ $success = false;
+ }
+
+ return $success;
+ }
+
+ // ==============================
+ // Send an Error Email to Support
+ // ==============================
+
+ public function sendErrorEmail($error_message = "", $error_file = "", $error_line = "") {
+
+ $settings = $this->getSettings();
+
+ $Environment = (string) $settings->Environment;
+ $SupportEmail = (string) $settings->SupportEmail;
+
+ if ($Environment == "Development") {
+ return;
+ }
+
+ $application_name = self::APPLICATION_NAME;
+
+ $message = "";
+
+ $message .= "An application error has occurred in the {$application_name} application.
";
+ $message .= "File: {$error_file}
";
+ $message .= "Line: {$error_line}
";
+ $message .= "Error: {$error_message}
";
+
+ $to = $SupportEmail;
+ $subject = "{$application_name} Application Error";
+
+ $this->sendEmail($to, $subject, $message);
+ }
+}
+
+?>
diff --git a/classes/Export.php b/classes/Export.php
new file mode 100644
index 0000000..189764c
--- /dev/null
+++ b/classes/Export.php
@@ -0,0 +1,136 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // =============
+ // Choose Export
+ // =============
+
+ public function chooseExport() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $dropdowns = (new Dropdowns())->getDropdowns();
+
+ $XML = $this->mergeXML($dropdowns, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("chooseExport"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "run":
+
+ $process_date = filter_input(INPUT_POST, "export_processdate") ?: "";
+ $accounting_period = filter_input(INPUT_POST, "export_accounting_period") ?: "";
+ $export_type = filter_input(INPUT_POST, "export_type", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ // Format Dates
+
+ $process_date = ($process_date == "") ? null : date("Y-m-d", strtotime($process_date));
+
+ switch ($export_type) {
+
+ case "1": // ALL Export Types
+
+ break;
+
+ case "2": // Only Hunting & Fishing
+
+ (new HuntingAndFishing())->createHuntingAndFishingExport($process_date, $accounting_period);
+
+ break;
+
+ case "3": // Only PTAX
+
+ break;
+
+ case "4": // Only FRVIS
+
+ break;
+ }
+
+
+ // Send Completion Notifications
+// $this->sendNotifications($workorder_serial);
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ==================================
+ // Send Work Order Notification Email
+ // ==================================
+
+ public function sendNotifications($workorder_serial = 0) {
+
+ if (empty($workorder_serial)) {
+ return;
+ }
+
+ $users = (new Users())->getUsers();
+ $to = array();
+
+ foreach ($users as $user) {
+
+ $user_notifications = (integer) $user->user_notifications;
+ $user_email = (string) $user->user_email;
+
+ if (($user_notifications == true) and (!(empty($user_email)))) {
+ $to[] = $user_email;
+ }
+ }
+
+ $to = array_unique($to);
+
+ $pdf = (new PrintWorkOrder())->print($workorder_serial, "string");
+
+ if (count($to) > 0) {
+
+ $subject = "New ATLHousingReport Work Order";
+ $body = "Attached is a new ATLHousingReport Work Order.";
+
+ (new Email())->sendEmail($to, $subject, $body, $pdf, "WorkOrder.pdf");
+ }
+ }
+}
+
+?>
diff --git a/classes/Import.php b/classes/Import.php
new file mode 100644
index 0000000..cb149a8
--- /dev/null
+++ b/classes/Import.php
@@ -0,0 +1,397 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ }
+
+ // ===============
+ // Upload CSV File
+ // ===============
+
+ public function uploadCSVFile() {
+
+ set_time_limit(0);
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $content = $this->applyXSL("", $this->getXSL("uploadCSVFile"));
+ $this->displayContent($content);
+
+ break;
+
+ case "upload":
+
+ $XSLParms['UPLOAD_STATUS'] = "UPLOAD SUCCESSFUL";
+ $environment = (string) $this->getSettings()->Environment ?: "Production";
+
+ if (empty($environment)) {
+ $this->logError("Invalid Environment ({$environment}). " . __METHOD__);
+ }
+
+ $environment_directory = self::UPLOADS_DIRECTORY . "/{$environment}";
+
+ // Process the Attachment
+
+ if (!empty($_FILES)) {
+
+ if (!is_dir($environment_directory)) {
+ mkdir($environment_directory);
+ }
+
+ $tempname = $_FILES["csvfile"]["tmp_name"];
+ $filename = $_FILES["csvfile"]["name"];
+
+ if (empty($tempname) or empty($filename)) {
+ return;
+ }
+
+ if (!move_uploaded_file($tempname, "{$environment_directory}/{$filename}")) {
+ $XSLParms['UPLOAD_STATUS'] = "UPLOAD FAILED";
+ }
+ }
+
+ $file_directory = "{$environment_directory}/{$filename}";
+
+ $this->parseCSVFile($file_directory);
+
+ $content = $this->applyXSL("", $this->getXSL("uploadMessage"), $XSLParms);
+ $this->displayContent($content);
+
+ break;
+ }
+ }
+
+ // ==============
+ // Parse CSV File
+ // ==============
+
+ public function parseCSVFile($file) {
+
+ $connection = $this->connect();
+
+ $csvfile = fopen($file, 'r');
+
+ $RecordCount = 0;
+
+ while (($data = fgetcsv($csvfile, 0, ",", '"', '\\')) !== FALSE) {
+
+ $PermitFactsId = $data[1];
+ $EntryDate = $this->fixDate($data[2]);
+ $PermitNumber = $data[4];
+ $PermitDate = $this->fixDate($data[5]);
+ $ProjectAddress = $data[7];
+ $SubdivisionName = $data[8];
+ $ProjectType = $data[9];
+ $Company = substr($data[10], 0, 30);
+ $Address = substr($data[11], 0, 30);
+ $City = $data[12];
+ $State = $data[13];
+ $Zip = $data[14];
+ $Phone = $data[15];
+ $ProjectCity = $data[16];
+ $ProjectState = $data[17];
+ $Size = $data[18] ?: 0;
+ $Units = $data[19];
+ $BuildingType = $data[20];
+ $Value = $data[21] ?: 0;
+ $WorkType = $data[22];
+ $County = $data[23];
+ $Lot = $data[24];
+ $DistrictLL = $data[25];
+ $Ctl = $data[26];
+ $OwnerName = substr($data[27], 0, 30);
+ $OwnerAddress = substr($data[28], 0, 30);
+ $OwnerCity = $data[29];
+ $OwnerState = substr($data[30], 0, 2);
+ $OwnerZip = $data[31];
+ $OwnerPhone = $data[32];
+ $YTDPermits = $data[33] ?: 0;
+ $YTDValue = $data[34] ?: 0;
+ $TwelveMonthPreviousPermits = $data[35] ?: 0;
+
+ $County = (new Counties())->getCountiesByName($County)->record->county_serial;
+
+ $SQL = "INSERT INTO rdis (
+ rdi_permit_facts_id,
+ rdi_entry_date,
+ rdi_permit_number,
+ rdi_permit_date,
+ rdi_project_addr,
+ rdi_sub_div_name,
+ rdi_project_type,
+ rdi_company,
+ rdi_address,
+ rdi_city,
+ rdi_state,
+ rdi_zip,
+ rdi_phone,
+ rdi_project_city,
+ rdi_project_state,
+ rdi_size,
+ rdi_units,
+ rdi_building_type,
+ rdi_value,
+ rdi_work_type,
+ rdi_county,
+ rdi_lot,
+ rdi_dist_ll,
+ rdi_ct1,
+ rdi_owner_name,
+ rdi_owner_address,
+ rdi_owner_city,
+ rdi_owner_state,
+ rdi_owner_zip,
+ rdi_owner_phone,
+ rdi_ytd_permits,
+ rdi_ytd_value,
+ rdi_12mth_prev_permits )
+ VALUES (
+ :rdi_permit_facts_id,
+ :rdi_entry_date,
+ :rdi_permit_number,
+ :rdi_permit_date,
+ :rdi_project_addr,
+ :rdi_sub_div_name,
+ :rdi_project_type,
+ :rdi_company,
+ :rdi_address,
+ :rdi_city,
+ :rdi_state,
+ :rdi_zip,
+ :rdi_phone,
+ :rdi_project_city,
+ :rdi_project_state,
+ :rdi_size,
+ :rdi_units,
+ :rdi_building_type,
+ :rdi_value,
+ :rdi_work_type,
+ :rdi_county,
+ :rdi_lot,
+ :rdi_dist_ll,
+ :rdi_ct1,
+ :rdi_owner_name,
+ :rdi_owner_address,
+ :rdi_owner_city,
+ :rdi_owner_state,
+ :rdi_owner_zip,
+ :rdi_owner_phone,
+ :rdi_ytd_permits,
+ :rdi_ytd_value,
+ :rdi_12mth_prev_permits )";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_permit_facts_id", $PermitFactsId);
+ $statement->bindValue(":rdi_permit_number", $PermitNumber);
+ $statement->bindValue(":rdi_entry_date", $EntryDate);
+ $statement->bindValue(":rdi_permit_date", $PermitDate);
+ $statement->bindValue(":rdi_project_addr", $ProjectAddress);
+ $statement->bindValue(":rdi_sub_div_name", $SubdivisionName);
+ $statement->bindValue(":rdi_project_type", $ProjectType);
+ $statement->bindValue(":rdi_company", $Company);
+ $statement->bindValue(":rdi_address", $Address);
+ $statement->bindValue(":rdi_city", $City);
+ $statement->bindValue(":rdi_state", $State);
+ $statement->bindValue(":rdi_zip", $Zip);
+ $statement->bindValue(":rdi_phone", $Phone);
+ $statement->bindValue(":rdi_project_city", $ProjectCity);
+ $statement->bindValue(":rdi_project_state", $ProjectState);
+ $statement->bindValue(":rdi_size", $Size);
+ $statement->bindValue(":rdi_units", $Units);
+ $statement->bindValue(":rdi_building_type", $BuildingType);
+ $statement->bindValue(":rdi_value", $Value);
+ $statement->bindValue(":rdi_work_type", $WorkType);
+ $statement->bindValue(":rdi_county", $County);
+ $statement->bindValue(":rdi_lot", $Lot);
+ $statement->bindValue(":rdi_dist_ll", $DistrictLL);
+ $statement->bindValue(":rdi_ct1", $Ctl);
+ $statement->bindValue(":rdi_owner_name", $OwnerName);
+ $statement->bindValue(":rdi_owner_address", $OwnerAddress);
+ $statement->bindValue(":rdi_owner_city", $OwnerCity);
+ $statement->bindValue(":rdi_owner_state", $OwnerState);
+ $statement->bindValue(":rdi_owner_zip", $OwnerZip);
+ $statement->bindValue(":rdi_owner_phone", $OwnerPhone);
+ $statement->bindValue(":rdi_ytd_permits", $YTDPermits);
+ $statement->bindValue(":rdi_ytd_value", $YTDValue);
+ $statement->bindValue(":rdi_12mth_prev_permits", $TwelveMonthPreviousPermits);
+
+ $statement->execute();
+
+ $RecordCount++;
+ }
+
+ // Run Updates on rdi joining 12 month tables
+
+ $this->update1();
+ $this->update2();
+ $this->update3();
+ $this->update4();
+ $this->update5();
+ $this->update6();
+ }
+
+ // ========================
+ // Return an Formatted Date
+ // ========================
+
+ public function fixDate($givenDate) {
+
+ $formattedDate = date('Y-m-d', strtotime($givenDate));
+
+ return $formattedDate;
+ }
+
+ // ========
+ // Update 1
+ // ========
+
+ public function update1() {
+
+ $sql = "UPDATE rdis AS r
+ INNER JOIN vw_ytd_permits_by_builder_sf v_ytd
+ ON r.rdi_company = v_ytd.company
+ AND r.rdi_city = v_ytd.city
+ AND r.rdi_state = v_ytd.state
+ AND r.rdi_zip = v_ytd.zip
+ SET r.rdi_ytd_permits = v_ytd.ytd_permits,
+ r.rdi_ytd_value = v_ytd.ytd_value
+ WHERE r.rdi_project_type
+ LIKE 'SINGLE%'";
+
+ $this->executeSQL($sql);
+ }
+
+ // ========
+ // Update 2
+ // ========
+
+ public function update2() {
+
+ $sql = "UPDATE rdis AS r
+ LEFT JOIN vw_ytd_permits_by_builder_sf v_ytd
+ ON r.rdi_company = v_ytd.company
+ AND r.rdi_city = v_ytd.city
+ AND r.rdi_state = v_ytd.state
+ AND r.rdi_zip = v_ytd.zip
+ SET r.rdi_ytd_permits = 0,
+ r.rdi_ytd_value = 0
+ WHERE v_ytd.company IS NULL
+ AND r.rdi_project_type
+ LIKE 'SINGLE%';";
+
+ $this->executeSQL($sql);
+ }
+
+ // ========
+ // Update 3
+ // ========
+
+ public function update3() {
+
+ $sql = "UPDATE rdis AS r
+ INNER JOIN vw_12mth_prev_permits_by_builder_sf v_12p
+ on r.rdi_company = v_12p.company
+ AND r.rdi_city = v_12p.city
+ AND r.rdi_state = v_12p.state
+ AND r.rdi_zip = v_12p.zip
+ SET r.rdi_12mth_prev_permits = v_12p.12mth_prev_permits
+ WHERE r.rdi_project_type
+ LIKE 'SINGLE%';";
+
+ $this->executeSQL($sql);
+ }
+
+ // ========
+ // Update 4
+ // ========
+
+ public function update4() {
+
+ $sql = "UPDATE rdis AS r
+ INNER JOIN vw_ytd_permits_by_builder_mf v_ytd
+ ON r.rdi_company = v_ytd.company
+ AND r.rdi_city = v_ytd.city
+ AND r.rdi_state = v_ytd.state
+ AND r.rdi_zip = v_ytd.zip
+ SET r.rdi_ytd_permits = v_ytd.ytd_permits,
+ r.rdi_ytd_value = v_ytd.ytd_value
+ WHERE r.rdi_project_type
+ LIKE 'MULTI%';";
+
+ $this->executeSQL($sql);
+ }
+
+ // ========
+ // Update 5
+ // ========
+
+ public function update5() {
+
+ $sql = "UPDATE rdis AS r
+ LEFT JOIN vw_ytd_permits_by_builder_mf v_ytd
+ ON r.rdi_company = v_ytd.company
+ AND r.rdi_city = v_ytd.city
+ AND r.rdi_state = v_ytd.state
+ AND r.rdi_zip = v_ytd.zip
+ SET r.rdi_ytd_permits = 0,
+ r.rdi_ytd_value = 0
+ WHERE v_ytd.company IS NULL
+ AND r.rdi_project_type
+ LIKE 'MULTI%';";
+
+ $this->executeSQL($sql);
+ }
+
+ // ========
+ // Update 6
+ // ========
+
+ public function update6() {
+
+ $sql = "UPDATE rdis AS r
+ INNER JOIN vw_12mth_prev_permits_by_builder_mf v_12p
+ on r.rdi_company = v_12p.company
+ AND r.rdi_city = v_12p.city
+ AND r.rdi_state = v_12p.state
+ AND r.rdi_zip = v_12p.zip
+ SET r.rdi_12mth_prev_permits = v_12p.12mth_prev_permits
+ WHERE r.rdi_project_type
+ LIKE 'MULTI%';";
+
+ $this->executeSQL($sql);
+ }
+}
+
+?>
diff --git a/classes/Journal.php b/classes/Journal.php
new file mode 100644
index 0000000..8ec1b93
--- /dev/null
+++ b/classes/Journal.php
@@ -0,0 +1,207 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+
+ }
+
+ // =================
+ // Clear the Journal
+ // =================
+
+ public function clearJournal() {
+
+ $SQL = "truncate journal";
+
+ $this->executeSQL($SQL);
+
+ $this->journalEntry("Journal was Cleared.");
+
+ }
+
+ // =======================
+ // Return a Journal Object
+ // =======================
+
+ public function getJournal($limit = 500) {
+
+ $SQL = "select journal.*,
+ date_format(journal.journal_timestamp, '%Y-%m-%d %h:%i %p') as journal_timestamp_verbose
+ from journal
+ order by journal.journal_timestamp desc
+ limit {$limit}";
+
+ return $this->getTable("journal", $SQL);
+
+ }
+
+ // ============================
+ // Return a Journal Page Object
+ // ============================
+
+ public function getJournalPage() {
+
+ // Find Criteria
+
+ $find_journal = filter_input(INPUT_POST, "find_journal") ?: "";
+ $find_words = $this->sanitizeString($find_journal);
+
+ // Show Per Page
+
+ $this->pagination_size = filter_input(INPUT_POST, "journals_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_journal
+ where journal_timestamp regexp :journal_timestamp
+ or journal_origin regexp :journal_origin
+ or journal_ip regexp :journal_ip
+ or journal_entry regexp :journal_entry";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":journal_timestamp", $find_words);
+ $statement->bindValue(":journal_origin", $find_words);
+ $statement->bindValue(":journal_ip", $find_words);
+ $statement->bindValue(":journal_entry", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1; break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1); break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1); break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size); break;
+
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_journal.*
+ from view_journal
+ where journal_timestamp regexp :journal_timestamp
+ or journal_origin regexp :journal_origin
+ or journal_ip regexp :journal_ip
+ or journal_entry regexp :journal_entry
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":journal_timestamp", $find_words);
+ $statement->bindValue(":journal_origin", $find_words);
+ $statement->bindValue(":journal_ip", $find_words);
+ $statement->bindValue(":journal_entry", $find_words);
+
+ $statement->execute();
+
+ $journal = $this->getTableXML("journal", $statement);
+
+ // Insert Pagination Attributes
+
+ $journal->addAttribute("count", $count);
+ $journal->addAttribute("start", $start);
+ $journal->addAttribute("end", $end);
+ $journal->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $journal;
+
+ }
+
+ // ======================
+ // Create a Journal Entry
+ // ======================
+
+ public function journalEntry($journal_entry = "") {
+
+ if (empty($journal_entry)) {
+ return;
+ }
+
+ $SQL = "insert into journal
+
+ ( journal_origin,
+ journal_ip,
+ journal_entry )
+
+ VALUES ( :journal_origin,
+ :journal_ip,
+ :journal_entry )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":journal_origin", $this->current_user_name);
+ $statement->bindValue(":journal_ip", $_SERVER["REMOTE_ADDR"] ?? "");
+ $statement->bindValue(":journal_entry", $journal_entry);
+
+ $statement->execute();
+
+ }
+
+ // ============
+ // View Journal
+ // ============
+
+ public function viewJournal() {
+
+ $journal = $this->getJournalPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($journal, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("viewJournal"));
+
+ $this->displayContent($content);
+
+ }
+
+}
+
+?>
diff --git a/classes/Metrics.php b/classes/Metrics.php
new file mode 100644
index 0000000..2b78b69
--- /dev/null
+++ b/classes/Metrics.php
@@ -0,0 +1,96 @@
+= (date(now()) - interval 6 day)
+ group by day
+ order by workorder_created desc";
+
+ return $this->getTable("dailymetrics", $SQL);
+
+ }
+
+ // =====================================
+ // Return a Monthly Call Metrics Object.
+ // =====================================
+
+ private function getMonthlyWorkOrderMetrics() {
+
+ $SQL = "select monthname(workorder_created) as month,
+ count(*) as count
+ from view_workorders
+ where date(workorder_created) >= (date(now()) - interval 6 month)
+ group by month
+ order by workorder_created desc";
+
+ return $this->getTable("monthlymetrics", $SQL);
+
+ }
+
+ // =========================================
+ // Return a Weekly Work Order Metrics Object
+ // =========================================
+
+ private function getWeeklyWorkOrderMetrics() {
+
+ $SQL = "select week(workorder_created) as week,
+ count(*) as count
+ from view_workorders
+ where date(workorder_created) >= (date(now()) - interval 6 week)
+ group by week
+ order by workorder_created desc";
+
+ return $this->getTable("weeklymetrics", $SQL);
+
+ }
+
+ // =======================
+ // View Work Order Metrics
+ // =======================
+
+ public function viewWorkOrderMetrics() {
+
+ $dailymetrics = $this->getDailyWorkOrderMetrics();
+ $weeklymetrics = $this->getWeeklyWorkOrderMetrics();
+ $monthlymetrics = $this->getMonthlyWorkorderMetrics();
+
+ $XSLParms["DAILYMETRICS"] = $dailymetrics->asXML();
+ $XSLParms["WEEKLYMETRICS"] = $weeklymetrics->asXML();
+ $XSLParms["MONTHLYMETRICS"] = $monthlymetrics->asXML();
+
+ $content = $this->applyXSL("", $this->getXSL("viewWorkOrderMetrics"), $XSLParms);
+
+ $this->displayContent($content);
+
+ exit();
+
+ }
+
+}
+
+?>
diff --git a/classes/Notes.php b/classes/Notes.php
new file mode 100644
index 0000000..1a18ce3
--- /dev/null
+++ b/classes/Notes.php
@@ -0,0 +1,244 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ }
+
+ // ========
+ // Add Note
+ // ========
+
+ public function addNote() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $note_type = filter_input(INPUT_POST, "note_type") ?: "";
+ $note_reference = filter_input(INPUT_POST, "note_reference", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ if (!in_array($note_type, self::VALID_TYPES) or empty($note_reference)) {
+ $this->logError("Invalid Note Type ({$note_type} or Reference {$note_reference} " . __METHOD__);
+ }
+
+ $XSLParms["NOTE_TYPE"] = $note_type;
+ $XSLParms["NOTE_REFERENCE"] = $note_reference;
+
+ $content = $this->applyXSL("", $this->getXSL("addNote"), $XSLParms);
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $note_type = filter_input(INPUT_POST, "note_type") ?: "";
+ $note_reference = filter_input(INPUT_POST, "note_reference", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $note_text = filter_input(INPUT_POST, "note_text") ?: "";
+
+ $SQL = "insert into notes
+
+ ( note_type,
+ note_reference,
+ note_text,
+ note_origin )
+
+ VALUES ( :note_type,
+ :note_reference,
+ :note_text,
+ :note_origin )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":note_type", $note_type);
+ $statement->bindValue(":note_reference", $note_reference);
+ $statement->bindValue(":note_text", $note_text);
+ $statement->bindValue(":note_origin", $this->current_user_name);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ===========
+ // Delete Note
+ // ===========
+
+ public function deleteNote() {
+
+ $note_serial = filter_input(INPUT_POST, "note_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $note = $this->getNote($note_serial);
+
+ if ($note->count() == 0) {
+ $this->logError("Invalid Note ({$note_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from notes
+ where note_serial = {$note_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // =========
+ // Edit Note
+ // =========
+
+ public function editNote() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $note_serial = filter_input(INPUT_POST, "note_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $note = $this->getNote($note_serial);
+
+ if ($note->count() == 0) {
+ $this->logError("Invalid Note ({$note_serial}). " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($note, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("editNote"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $note_serial = filter_input(INPUT_POST, "note_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $note_text = filter_input(INPUT_POST, "note_text") ?: "";
+
+ $SQL = "update notes
+ set note_text = :note_text,
+ note_origin = :note_origin
+ where note_serial = :note_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":note_serial", $note_serial);
+ $statement->bindValue(":note_text", $note_text);
+ $statement->bindValue(":note_origin", $this->current_user_name);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ====================
+ // Return a Note Object
+ // ====================
+
+ public function getNote($note_serial = 0) {
+
+ $SQL = "select view_notes.*
+ from view_notes
+ where note_serial = {$note_serial}";
+
+ return $this->getTable("notes", $SQL);
+ }
+
+ // =====================
+ // Return a Notes Object
+ // =====================
+
+ public function getNotes($note_type = "", $note_reference = 0) {
+
+ $SQL = "select view_notes.*
+ from view_notes
+ where note_type = '{$note_type}'
+ and note_reference = {$note_reference}
+ order by note_timestamp asc";
+
+ return $this->getTable("notes", $SQL);
+ }
+
+ // =====================
+ // Return a Notes Object
+ // =====================
+
+ public function getAllNotes($note_reference = 0) {
+
+ $SQL = "select view_notes.*
+ from view_notes
+ where note_reference = {$note_reference}
+ order by note_timestamp asc";
+
+// $this->debug($SQL);
+
+ return $this->getTable("notes", $SQL);
+ }
+
+ // ==============
+ // Add Note Quick
+ // ==============
+
+ public function addNoteQuick($note_type = "", $note_reference = 0, $note_text = "") {
+
+ $SQL = "insert into notes
+
+ ( note_type,
+ note_reference,
+ note_text,
+ note_origin )
+
+ VALUES ( :note_type,
+ :note_reference,
+ :note_text,
+ :note_origin )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":note_type", $note_type);
+ $statement->bindValue(":note_reference", $note_reference);
+ $statement->bindValue(":note_text", $note_text);
+ $statement->bindValue(":note_origin", $this->current_user_name);
+
+ $statement->execute();
+ }
+}
+
+?>
diff --git a/classes/PermitsByBuilder.php b/classes/PermitsByBuilder.php
new file mode 100644
index 0000000..859f2fc
--- /dev/null
+++ b/classes/PermitsByBuilder.php
@@ -0,0 +1,340 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==============
+ // Search Permits
+ // ==============
+
+ public function searchPermits($subscription_serial = 0) {
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial") ?: $subscription_serial;
+
+ $subscription = (new Subscriptions())->getSubscription($subscription_serial);
+
+ $permit_area = $subscription->record->subscription_area;
+ $projecttype = $subscription->record->subscription_projecttype;
+
+ $searchhistory = (new SearchHistory())->getUsersPreviousSearchParameters($this->current_user_serial, $subscription_serial);
+
+ // Update Search History Record
+ if (empty($searchhistory)) {
+ (new SearchHistory())->saveUserSearchParameters($_POST);
+ } else {
+ (new SearchHistory())->updateUserSearchParameters($_POST);
+ }
+
+ $permits = $this->getPermits($permit_area, $projecttype);
+
+ $popovers = (new Popovers())->getPopovers();
+
+ // Populate Entry Dates with what was searched for if provided or users entry dates if no entry dates were provided
+
+ $searchhistory->record->searchhistory_parameters->rdi_entry_start_date = $permits->record->rdi_entry_start_date;
+ $searchhistory->record->searchhistory_parameters->rdi_entry_end_date = $permits->record->rdi_entry_end_date;
+
+ $XML = $this->mergeXML($permits, "");
+ $XML = $this->mergeXML($subscription, $XML);
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("searchPermitsByBuilder"));
+ $this->displayContent($content);
+ }
+
+ // =====================
+ // Search Permits Object
+ // =====================
+
+ public function getPermits($permit_area, $projecttype) {
+
+ // Sanitize inputs
+ $rdi_company = filter_input(INPUT_POST, "rdi_company") ?: "";
+ $rdi_and_or = filter_input(INPUT_POST, "rdi_and_or") ?: "OR";
+ $rdi_entry_start_date = filter_input(INPUT_POST, "rdi_entry_start_date") ?: "";
+ $rdi_entry_end_date = filter_input(INPUT_POST, "rdi_entry_end_date") ?: "";
+ $rdi_permit_start_date = filter_input(INPUT_POST, "rdi_permit_start_date") ?: "";
+ $rdi_permit_end_date = filter_input(INPUT_POST, "rdi_permit_end_date") ?: "";
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ $rdi_entry_start_date = ($rdi_entry_start_date == "") ? null : date("Y-m-d", strtotime($rdi_entry_start_date));
+ $rdi_entry_end_date = ($rdi_entry_end_date == "") ? null : date("Y-m-d", strtotime($rdi_entry_end_date));
+ $rdi_permit_start_date = ($rdi_permit_start_date == "") ? null : date("Y-m-d", strtotime($rdi_permit_start_date));
+ $rdi_permit_end_date = ($rdi_permit_end_date == "") ? null : date("Y-m-d", strtotime($rdi_permit_end_date));
+
+ // Validate AND/OR
+ if (!in_array(strtoupper($rdi_and_or), ["AND", "OR"])) {
+ $rdi_and_or = "OR";
+ }
+
+ // Pagination settings
+ $this->pagination_size = filter_input(INPUT_POST, "rdis_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+ $rdis_order_by = filter_input(INPUT_POST, "rdis_order_by") ?: "rdi_permit_number";
+ $rdis_order_direction = strtoupper(filter_input(INPUT_POST, "rdis_order_direction") ?: "DESC");
+
+ // Ensure valid order by column
+ $allowed_order_columns = ["rdi_permit_number", "rdi_entry_date", "rdi_permit_date", "rdi_company", "rdi_permit_count"];
+ if (!in_array($rdis_order_by, $allowed_order_columns)) {
+ $rdis_order_by = "rdi_permit_number";
+ }
+
+ // Connect to DB
+ $connection = $this->connect();
+
+ // === count QUERY ===
+ $SQL = "select count(distinct rdi_company, rdi_address, rdi_city, rdi_state, rdi_zip, rdi_phone_verbose,
+ rdi_ytd_permits, rdi_ytd_value, rdi_12mth_prev_permits) as totalcount
+ from view_rdis r
+ join counties c on r.rdi_county = c.county_serial
+ where r.rdi_project_type = :rdi_project_type";
+
+ if ($permit_area != "All") {
+ $SQL .= " and c.county_area = :permit_area";
+ }
+
+ if (!empty($rdi_company)) {
+ $SQL .= " and r.rdi_company REGEXP :rdi_company";
+ }
+
+ if (!empty($rdi_entry_start_date)) {
+ $SQL .= " $rdi_and_or (r.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
+ }
+
+ if (!empty($rdi_permit_start_date)) {
+ $SQL .= " $rdi_and_or (r.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
+ }
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ if ($permit_area != "All") {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_company)) {
+ $statement->bindValue(":rdi_company", $rdi_company, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_entry_start_date)) {
+ $statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
+ $statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
+ }
+ if (!empty($rdi_permit_start_date)) {
+ $statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
+ $statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
+ }
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = $recordset ? (int) $recordset["totalcount"] : 0;
+
+ // === PAGINATION LOGIC ===
+ switch ($pagination) {
+ case "first": $this->pagination_page = 1;
+ break;
+ case "previous": $this->pagination_page = max($this->pagination_page - 1, 1);
+ break;
+ case "next": $this->pagination_page = min($this->pagination_page + 1, ceil($count / $this->pagination_size));
+ break;
+ case "last": $this->pagination_page = (int) ceil($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = max(0, ($this->pagination_page - 1) * $this->pagination_size);
+ $start = $offset + 1;
+ $end = min($count, $start + $this->pagination_size - 1);
+
+ // === DATA QUERY ===
+ $SQL = "select r.rdi_serial, r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
+ count(*) as rdi_permit_count, SUM(r.rdi_value) as rdi_value_verbose,
+ case
+ when rdi_12mth_prev_permits is null or rdi_12mth_prev_permits = 0 then ''
+
+ /* your 75% rule: current is < 75% of last year */
+ when (r.rdi_ytd_permits / rdi_12mth_prev_permits) < 0.75 then '='
+ /* ±5% band */
+ when ((r.rdi_ytd_permits - rdi_12mth_prev_permits) / rdi_12mth_prev_permits) >= 0.05 then 'up'
+ when ((r.rdi_ytd_permits - rdi_12mth_prev_permits) / rdi_12mth_prev_permits) <= -0.05 then 'down'
+ else '='
+ end as permits_trend
+
+ from view_rdis r
+ join counties c on r.rdi_county = c.county_serial
+ where r.rdi_project_type = :rdi_project_type";
+
+ if ($permit_area != "All") {
+ $SQL .= " and c.county_area = :permit_area";
+ }
+ if (!empty($rdi_company)) {
+ $SQL .= " and r.rdi_company REGEXP :rdi_company";
+ }
+ if (!empty($rdi_entry_start_date)) {
+ $SQL .= " $rdi_and_or (r.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
+ }
+ if (!empty($rdi_permit_start_date)) {
+ $SQL .= " $rdi_and_or (r.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
+ }
+
+ $SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits
+ order by $rdis_order_by $rdis_order_direction
+ limit :limit
+ offset :offset";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ if ($permit_area != "All") {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_company)) {
+ $statement->bindValue(":rdi_company", $rdi_company, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_entry_start_date)) {
+ $statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
+ $statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
+ }
+ if (!empty($rdi_permit_start_date)) {
+ $statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
+ $statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
+ }
+
+ $statement->bindValue(":limit", $this->pagination_size, PDO::PARAM_INT);
+ $statement->bindValue(":offset", $offset, PDO::PARAM_INT);
+
+ $statement->execute();
+
+ $rdis = $this->getTableXML("rdis", $statement);
+
+ // Insert Pagination Attributes
+ $rdis->addAttribute("count", $count);
+ $rdis->addAttribute("start", $start);
+ $rdis->addAttribute("end", $end);
+ $rdis->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $rdis;
+ }
+
+ // =============================
+ // Fetch All Permits for Exports
+ // =============================
+
+ public function getAllPermitsByBuilder($permit_area, $projecttype) {
+
+ // Connect to DB
+ $connection = $this->connect();
+
+ // === count QUERY ===
+ $SQL = "SELECT count(DISTINCT rdi_company, rdi_address, rdi_city, rdi_state, rdi_zip, rdi_phone_verbose,
+ rdi_ytd_permits, rdi_ytd_value, rdi_12mth_prev_permits) AS count
+ FROM view_rdis r
+ JOIN counties c on r.rdi_county = c.county_serial
+ WHERE r.rdi_project_type = :rdi_project_type";
+
+ if ($permit_area !== "All") {
+ $SQL .= " and c.county_area = :permit_area";
+ }
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ if ($permit_area !== "All") {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+ $count = $recordset ? (int) $recordset["count"] : 0;
+
+ // === DATA QUERY ===
+ $SQL = "SELECT r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
+ count(*) AS rdi_permit_count, SUM(r.rdi_value) AS rdi_value
+ FROM view_rdis r
+ JOIN counties c on r.rdi_county = c.county_serial
+ WHERE r.rdi_project_type = :rdi_project_type";
+
+ if ($permit_area !== "All") {
+ $SQL .= " and c.county_area = :permit_area";
+ }
+
+ $SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ if ($permit_area !== "All") {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+
+ $statement->execute();
+
+ $rdis = $this->getTableXML("rdis", $statement);
+
+ // Insert Pagination Attributes
+ $rdis->addAttribute("count", $count);
+
+ return $rdis;
+ }
+
+ // ======================
+ // Return a Permit Object
+ // ======================
+
+ public function getSelectedPermits($permit_area, $projecttype, $permit_serial = 0) {
+
+ $SQL = "SELECT r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone_verbose,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits,
+ count(*) AS rdi_permit_count, SUM(r.rdi_value) AS rdi_value
+ FROM view_rdis r
+ JOIN counties c on r.rdi_county = c.county_serial
+ WHERE r.rdi_project_type = '{$projecttype}' ";
+
+ if ($permit_area !== "All") {
+ $SQL .= " and c.county_area = '$permit_area'";
+ }
+
+ $SQL .= " and rdi_serial in ({$permit_serial}) ";
+ $SQL .= " group by r.rdi_company, r.rdi_address, r.rdi_city, r.rdi_state, r.rdi_zip, r.rdi_phone,
+ r.rdi_ytd_permits, r.rdi_ytd_value, r.rdi_12mth_prev_permits";
+
+ return $this->getTable("permits", $SQL);
+ }
+}
+
+?>
diff --git a/classes/PermitsBySubdivision.php b/classes/PermitsBySubdivision.php
new file mode 100644
index 0000000..004be3c
--- /dev/null
+++ b/classes/PermitsBySubdivision.php
@@ -0,0 +1,533 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==============
+ // Search Permits
+ // ==============
+
+ public function searchPermits($subscription_serial = 0) {
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial") ?: $subscription_serial;
+
+ $subscription = (new Subscriptions())->getSubscription($subscription_serial);
+
+ if ($subscription->count() == 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}). " . __METHOD__);
+ }
+
+ $permit_area = $subscription->record->subscription_area;
+ $projecttype = $subscription->record->subscription_projecttype;
+
+ $permits = $this->getPermits($permit_area, $projecttype);
+
+ $counties = (new Counties())->getCountiesByArea($permit_area);
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($permits, "");
+ $XML = $this->mergeXML($counties, $XML);
+ $XML = $this->mergeXML($subscription, $XML);
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("searchPermitsBySubdivision"));
+ $this->displayContent($content);
+ }
+
+ public function getPermits($permit_area, $projecttype) {
+
+ $rdi_county_raw = trim(filter_input(INPUT_POST, "rdi_county") ?: "");
+ $rdi_and_or = trim(filter_input(INPUT_POST, "rdi_and_or") ?: "OR");
+ $rdi_company = trim(filter_input(INPUT_POST, "rdi_company") ?: "");
+ $rdi_sub_div_name = trim(filter_input(INPUT_POST, "rdi_sub_div_name") ?: "");
+ $rdi_project_city = trim(filter_input(INPUT_POST, "rdi_project_city") ?: "");
+ $rdi_project_addr = trim(filter_input(INPUT_POST, "rdi_project_addr") ?: "");
+
+ $rdi_entry_start_date = filter_input(INPUT_POST, "rdi_entry_start_date") ?: "";
+ $rdi_entry_end_date = filter_input(INPUT_POST, "rdi_entry_end_date") ?: "";
+ $rdi_permit_start_date = filter_input(INPUT_POST, "rdi_permit_start_date") ?: "";
+ $rdi_permit_end_date = filter_input(INPUT_POST, "rdi_permit_end_date") ?: "";
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ // Normalize dates to Y-m-d or null
+ $rdi_entry_start_date = ($rdi_entry_start_date === "") ? null : date("Y-m-d", strtotime($rdi_entry_start_date));
+ $rdi_entry_end_date = ($rdi_entry_end_date === "") ? null : date("Y-m-d", strtotime($rdi_entry_end_date));
+ $rdi_permit_start_date = ($rdi_permit_start_date === "") ? null : date("Y-m-d", strtotime($rdi_permit_start_date));
+ $rdi_permit_end_date = ($rdi_permit_end_date === "") ? null : date("Y-m-d", strtotime($rdi_permit_end_date));
+
+ // Validate AND/OR
+ if (!in_array(strtoupper($rdi_and_or), ["AND", "OR"], true)) {
+ $rdi_and_or = "OR";
+ }
+
+ // Pagination / ordering
+ $this->pagination_size = filter_input(INPUT_POST, "rdis_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+ $rdis_order_by = filter_input(INPUT_POST, "rdis_order_by") ?: "rdi_permit_number";
+ $rdis_order_direction = filter_input(INPUT_POST, "rdis_order_direction" ?? "DESC");
+
+ $allowed_order_columns = [
+ "rdi_permit_number",
+ "rdi_county", "rdi_sub_div_name", "rdi_project_addr", "rdi_city",
+ "rdi_state", "rdi_zip", "rdi_company", "rdi_permit_date", "rdi_size", "rdi_value"
+ ];
+
+ if (!in_array($rdis_order_by, $allowed_order_columns, true)) {
+ $rdis_order_by = "rdi_sub_div_name";
+ }
+ if (!in_array(strtoupper((string) $rdis_order_direction), ["ASC", "DESC"], true)) {
+ $rdis_order_direction = "DESC";
+ }
+
+ // Database Connection
+ $connection = $this->connect();
+
+ // -------- County clause (shared) --------
+ // Parse "1,12" -> [1,12], keep only digits, cast to int
+ $countyIds = array_values(array_filter(
+ array_map(
+ fn($v) => ctype_digit(trim($v)) ? (int) trim($v) : null,
+ explode(",", $rdi_county_raw)
+ ),
+ fn($v) => $v !== null
+ ));
+
+ $countyClauseCount = "";
+ $countyClauseData = "";
+ $countyParams = []; // [':county_0' => 1, ':county_1' => 12]
+ $bindArea = false;
+
+ if (!empty($countyIds)) {
+ if (count($countyIds) === 1) {
+ $countyClauseCount = " and rdi_county = :county_0";
+ $countyClauseData = " and view_rdis.rdi_county = :county_0";
+ $countyParams[':county_0'] = $countyIds[0];
+ } else {
+ $ph = [];
+ foreach ($countyIds as $i => $id) {
+ $k = ":county_$i";
+ $ph[] = $k;
+ $countyParams[$k] = $id;
+ }
+ $in = implode(",", $ph);
+ $countyClauseCount = " and rdi_county in ($in)";
+ $countyClauseData = " and view_rdis.rdi_county in ($in)";
+ }
+ } elseif ($permit_area != "All") {
+ $countyClauseCount = " and rdi_county in (select county_serial from view_counties where county_area = :permit_area)";
+ $countyClauseData = " and view_rdis.rdi_county in (select county_serial from view_counties where county_area = :permit_area)";
+ $bindArea = true;
+ } else {
+ // No county/area filter -> omit entirely to keep the plan simple
+ $countyClauseCount = "";
+ $countyClauseData = "";
+ }
+
+ // ===================== COUNT QUERY =====================
+ $SQL = "select count(*) as count
+ from view_rdis
+ where rdi_project_type = :rdi_project_type
+ $countyClauseCount ";
+
+ if (!empty($rdi_company)) {
+ $SQL .= " and rdi_company like :rdi_company";
+ }
+
+ if (!empty($rdi_sub_div_name)) {
+ $SQL .= " and rdi_sub_div_name like :rdi_sub_div_name";
+ }
+
+ if (!empty($rdi_project_city)) {
+ $SQL .= " and rdi_project_city like :rdi_project_city";
+ }
+
+ if (!empty($rdi_project_addr)) {
+ $SQL .= " and rdi_project_addr like :rdi_project_addr";
+ }
+
+ // group date conditions so $rdi_and_or applies between themcx
+
+ $dateConds = [];
+
+ if ($rdi_entry_start_date && $rdi_entry_end_date) {
+ $dateConds[] = "(rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
+ } elseif ($rdi_entry_start_date) {
+ $dateConds[] = "(rdi_entry_date >= :rdi_entry_start_date)";
+ }
+ if ($rdi_permit_start_date && $rdi_permit_end_date) {
+ $dateConds[] = "(rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
+ } elseif ($rdi_permit_start_date) {
+ $dateConds[] = "(rdi_permit_date >= :rdi_permit_start_date)";
+ }
+ if ($dateConds) {
+ $SQL .= " and (" . implode(" $rdi_and_or ", $dateConds) . ")";
+ }
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ foreach ($countyParams as $k => $v) {
+ $statement->bindValue($k, $v, PDO::PARAM_INT);
+ }
+
+ if ($bindArea) {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_company)) {
+ $statement->bindValue(":rdi_company", '%' . $rdi_company . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_sub_div_name)) {
+ $statement->bindValue(":rdi_sub_div_name", '%' . $rdi_sub_div_name . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_project_city)) {
+ $statement->bindValue(":rdi_project_city", '%' . $rdi_project_city . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_project_addr)) {
+ $statement->bindValue(":rdi_project_addr", '%' . $rdi_project_addr . '%', PDO::PARAM_STR);
+ }
+ if ($rdi_entry_start_date) {
+ $statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
+ }
+ if ($rdi_entry_end_date && str_contains($SQL, ":rdi_entry_end_date")) {
+ $statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
+ }
+ if ($rdi_permit_start_date) {
+ $statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
+ }
+ if ($rdi_permit_end_date && str_contains($SQL, ":rdi_permit_end_date")) {
+ $statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
+ }
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = $recordset ? (int) $recordset["count"] : 0;
+
+ // -------- Pagination --------
+
+ switch ($pagination) {
+ case "first": $this->pagination_page = 1;
+ break;
+ case "previous": $this->pagination_page = max($this->pagination_page - 1, 1);
+ break;
+ case "next": $this->pagination_page = min($this->pagination_page + 1, (int) ceil($count / $this->pagination_size));
+ break;
+ case "last": $this->pagination_page = (int) ceil($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = max(0, ($this->pagination_page - 1) * $this->pagination_size);
+ $start = $offset + 1;
+ $end = min($count, $start + $this->pagination_size - 1);
+
+ // ===================== DATA QUERY =====================
+ $SQL = "select view_rdis.*
+ from view_rdis
+ where view_rdis.rdi_project_type = :rdi_project_type
+ $countyClauseData";
+
+ if (!empty($rdi_company)) {
+ $SQL .= " and view_rdis.rdi_company like :rdi_company";
+ }
+
+ if (!empty($rdi_sub_div_name)) {
+ $SQL .= " and view_rdis.rdi_sub_div_name like :rdi_sub_div_name";
+ }
+
+ if (!empty($rdi_project_city)) {
+ $SQL .= " and view_rdis.rdi_project_city like :rdi_project_city";
+ }
+
+ if (!empty($rdi_project_addr)) {
+ $SQL .= " and view_rdis.rdi_project_addr like :rdi_project_addr";
+ }
+
+ $dateConds = [];
+ if ($rdi_entry_start_date && $rdi_entry_end_date) {
+ $dateConds[] = "(view_rdis.rdi_entry_date between :rdi_entry_start_date and :rdi_entry_end_date)";
+ } elseif ($rdi_entry_start_date) {
+ $dateConds[] = "(view_rdis.rdi_entry_date >= :rdi_entry_start_date)";
+ }
+ if ($rdi_permit_start_date && $rdi_permit_end_date) {
+ $dateConds[] = "(view_rdis.rdi_permit_date between :rdi_permit_start_date and :rdi_permit_end_date)";
+ } elseif ($rdi_permit_start_date) {
+ $dateConds[] = "(view_rdis.rdi_permit_date >= :rdi_permit_start_date)";
+ }
+ if ($dateConds) {
+ $SQL .= " and (" . implode(" $rdi_and_or ", $dateConds) . ")";
+ }
+
+ $SQL .= " order by $rdis_order_by $rdis_order_direction
+ limit :limit
+ offset :offset";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+
+ foreach ($countyParams as $k => $v) {
+ $statement->bindValue($k, $v, PDO::PARAM_INT);
+ }
+
+ if ($bindArea) {
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+ }
+ if (!empty($rdi_company)) {
+ $statement->bindValue(":rdi_company", '%' . $rdi_company . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_sub_div_name)) {
+ $statement->bindValue(":rdi_sub_div_name", '%' . $rdi_sub_div_name . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_project_city)) {
+ $statement->bindValue(":rdi_project_city", '%' . $rdi_project_city . '%', PDO::PARAM_STR);
+ }
+ if (!empty($rdi_project_addr)) {
+ $statement->bindValue(":rdi_project_addr", '%' . $rdi_project_addr . '%', PDO::PARAM_STR);
+ }
+ if ($rdi_entry_start_date) {
+ $statement->bindValue(":rdi_entry_start_date", $rdi_entry_start_date);
+ }
+ if ($rdi_entry_end_date && str_contains($SQL, ":rdi_entry_end_date")) {
+ $statement->bindValue(":rdi_entry_end_date", $rdi_entry_end_date);
+ }
+ if ($rdi_permit_start_date) {
+ $statement->bindValue(":rdi_permit_start_date", $rdi_permit_start_date);
+ }
+ if ($rdi_permit_end_date && str_contains($SQL, ":rdi_permit_end_date")) {
+ $statement->bindValue(":rdi_permit_end_date", $rdi_permit_end_date);
+ }
+ $statement->bindValue(":limit", $this->pagination_size, PDO::PARAM_INT);
+ $statement->bindValue(":offset", $offset, PDO::PARAM_INT);
+
+ $statement->execute();
+
+ $rdis = $this->getTableXML("rdis", $statement);
+
+ foreach ($rdis as $rdi) {
+ if (!empty($rdi->rdi_county)) {
+ $county = (new Counties())->getCounty($rdi->rdi_county);
+ $rdi->rdi_county_name_verbose = $county->record->county_name ?? null;
+ }
+ }
+
+ // Pagination attributes
+ $rdis->addAttribute("count", $count);
+ $rdis->addAttribute("start", $start);
+ $rdis->addAttribute("end", $end);
+ $rdis->addAttribute("page", $this->pagination_page);
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $rdis;
+ }
+
+ // =============================
+ // Fetch All Permits for Exports
+ // =============================
+
+ public function getAllPermitsBySubDivision($permit_area, $projecttype) {
+
+ $connection = $this->connect();
+
+ // Count Query
+ $SQL = "select count(*) as count
+ from view_rdis r
+ join counties c on r.rdi_county = c.county_serial
+ where r.rdi_project_type = :rdi_project_type
+ and r.rdi_county in
+ (select county_serial
+ from view_counties
+ where county_area = :permit_area)";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+
+ $statement->execute();
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+ $count = $recordset ? (int) $recordset["count"] : 0;
+
+ // === DATA QUERY ===
+ $SQL = "select r.*, c.county_name as rdi_county_name_verbose
+ from view_rdis r
+ join counties c on r.rdi_county = c.county_serial
+ where r.rdi_project_type = :rdi_project_type
+ and r.rdi_county in
+ (select county_serial
+ from view_counties
+ where county_area = :permit_area)";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_project_type", $projecttype, PDO::PARAM_STR);
+ $statement->bindValue(":permit_area", $permit_area, PDO::PARAM_STR);
+
+ $statement->execute();
+
+ $rdis = $this->getTableXML("rdis", $statement);
+
+ // Insert Pagination Attributes
+ $rdis->addAttribute("count", $count);
+
+ return $rdis;
+ }
+
+ // ======================
+ // Return a Permit Object
+ // ======================
+
+ public function getSelectedPermits($permits = array()) {
+
+ if (empty($permits)) {
+ return;
+ }
+
+ $SQL = "select view_rdis.* from view_rdis where rdi_serial in ({$permits})";
+
+ return $this->getTable("permits", $SQL);
+ }
+
+ // ================================
+ // Return AutoComplete Names (ajax)
+ // ================================
+
+ public function getAutoCompleteSubdivisions() {
+
+ $results = array();
+
+ $subdivision = filter_input(INPUT_GET, "rdi_sub_div_name") ?: "";
+ $subdivision = trim(preg_replace("/\s+/", " ", $subdivision));
+ $subdivision = preg_replace("/'+/", "'", $subdivision);
+ $subdivision = preg_replace('/"+/', '"', $subdivision);
+ $subdivision = str_replace("'", "''", $subdivision);
+
+ $SQL = "select distinct rdi_sub_div_name from view_rdis where rdi_sub_div_name like '%{$subdivision}%' order by rdi_sub_div_name limit 10 offset 0";
+
+ $matches = $this->getTable("subdivisions", $SQL);
+
+ foreach ($matches as $match) {
+ $results[] = (string) $match->rdi_sub_div_name;
+ }
+
+ header('Content-Type: application/json');
+ echo json_encode($results);
+ exit();
+ }
+
+ // ================================
+ // Return AutoComplete Names (ajax)
+ // ================================
+
+ public function getAutoCompleteCities() {
+
+ $results = array();
+
+ $city = filter_input(INPUT_GET, "rdi_project_city") ?: "";
+ $city = trim(preg_replace("/\s+/", " ", $city));
+ $city = preg_replace("/'+/", "'", $city);
+ $city = preg_replace('/"+/', '"', $city);
+ $city = str_replace("'", "''", $city);
+
+ $SQL = "select distinct rdi_project_city from view_rdis where rdi_project_city like '%{$city}%' order by rdi_project_city limit 10 offset 0";
+
+ $matches = $this->getTable("cities", $SQL);
+
+ foreach ($matches as $match) {
+ $results[] = (string) $match->rdi_project_city;
+ }
+
+ header('Content-Type: application/json');
+ echo json_encode($results);
+ exit();
+ }
+
+ // ================================
+ // Return AutoComplete Names (ajax)
+ // ================================
+
+ public function getAutoCompleteStreets() {
+
+ $results = array();
+
+ $street = filter_input(INPUT_GET, "rdi_project_addr") ?: "";
+ $street = trim(preg_replace("/\s+/", " ", $street));
+ $street = preg_replace("/'+/", "'", $street);
+ $street = preg_replace('/"+/', '"', $street);
+ $street = str_replace("'", "''", $street);
+
+ $SQL = "select distinct rdi_project_addr from view_rdis where rdi_project_addr like '%{$street}%' order by rdi_project_addr limit 10 offset 0";
+
+ $matches = $this->getTable("cities", $SQL);
+
+ foreach ($matches as $match) {
+ $results[] = (string) $match->rdi_project_addr;
+ }
+
+ header('Content-Type: application/json');
+ echo json_encode($results);
+ exit();
+ }
+
+ // ======================
+ // Return a Permit Object
+ // ======================
+
+ public function getPermit($rdi_serial = 0) {
+
+ $SQL = "select view_rdis.* from view_rdis where rdi_serial = {$rdi_serial}";
+
+ return $this->getTable("permit", $SQL);
+ }
+
+ // =============================
+ // Return a Permit Record Dialog
+ // =============================
+
+ public function getPermitRecordDialog() {
+
+ $rdi_serial = filter_input(INPUT_POST, "rdi_serial", FILTER_SANITIZE_NUMBER_INT) ?: 9;
+
+ $permit_record = $this->getPermit($rdi_serial);
+
+ $rdi_county = (new Counties())->getCounty($permit_record->record->rdi_county);
+ $permit_record->record->rdi_county = $rdi_county->record->county_name;
+
+ $content = $this->applyXSL($permit_record, $this->getXSL("permitRecordDialog"));
+
+ if ($_SESSION[self::AJAX]) {
+ echo $content;
+ } else {
+ $this->displayContentPage($content);
+ }
+ }
+}
+
+?>
diff --git a/classes/Popovers.php b/classes/Popovers.php
new file mode 100644
index 0000000..a37d247
--- /dev/null
+++ b/classes/Popovers.php
@@ -0,0 +1,352 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ===========
+ // Add Popover
+ // ===========
+
+ public function addPopover() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $content = $this->applyXSL("", $this->getXSL("addPopover"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $popover_name = filter_input(INPUT_POST, "popover_name") ?: "";
+ $popover_title = filter_input(INPUT_POST, "popover_title") ?: "";
+ $popover_placeholder = filter_input(INPUT_POST, "popover_placeholder") ?: "";
+ $popover_text = filter_input(INPUT_POST, "popover_text") ?: "";
+
+ $SQL = "insert into popovers
+
+ ( popover_name,
+ popover_title,
+ popover_placeholder,
+ popover_text,
+ popover_creator,
+ popover_created )
+
+ VALUES ( :popover_name,
+ :popover_title,
+ :popover_placeholder,
+ :popover_text,
+ :popover_creator,
+ :popover_created)";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":popover_name", $popover_name);
+ $statement->bindValue(":popover_title", $popover_title);
+ $statement->bindValue(":popover_placeholder", $popover_placeholder);
+ $statement->bindValue(":popover_text", $popover_text);
+ $statement->bindValue(":popover_creator", $this->current_user_name);
+ $statement->bindValue(":popover_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ==============
+ // Delete Popover
+ // ==============
+
+ public function deletePopover() {
+
+ $popover_serial = filter_input(INPUT_POST, "popover_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $popover = $this->getPopover($popover_serial);
+
+ if ($popover->count() == 0) {
+ $this->logError("Invalid Popover ({$popover_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from popovers
+ where popover_serial = {$popover_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ============
+ // Edit Popover
+ // ============
+
+ public function editPopover() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $popover_serial = filter_input(INPUT_POST, "popover_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $popover = $this->getPopover($popover_serial);
+
+ if ($popover->count() == 0) {
+ $this->logError("Invalid Popover ({$popover_serial}): " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($popover, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("editPopover"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $popover_serial = filter_input(INPUT_POST, "popover_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $popover_name = filter_input(INPUT_POST, "popover_name") ?: "";
+ $popover_title = filter_input(INPUT_POST, "popover_title") ?: "";
+ $popover_placeholder = filter_input(INPUT_POST, "popover_placeholder") ?: "";
+ $popover_text = filter_input(INPUT_POST, "popover_text") ?: "";
+
+ $popover = $this->getPopover($popover_serial);
+
+ if ($popover->count() == 0) {
+ $this->logError("Invalid Popover ({$popover_serial}): " . __METHOD__);
+ }
+
+ $SQL = "update popovers
+ set popover_name = :popover_name,
+ popover_title = :popover_title,
+ popover_placeholder = :popover_placeholder,
+ popover_text = :popover_text,
+ popover_changer = :popover_changer,
+ popover_changed = :popover_changed
+ where popover_serial = :popover_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":popover_serial", $popover_serial);
+ $statement->bindValue(":popover_name", $popover_name);
+ $statement->bindValue(":popover_title", $popover_title);
+ $statement->bindValue(":popover_placeholder", $popover_placeholder);
+ $statement->bindValue(":popover_text", $popover_text);
+ $statement->bindValue(":popover_changer", $this->current_user_name);
+ $statement->bindValue(":popover_changed", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =======================
+ // Return a Popover Object
+ // =======================
+
+ public function getPopover($popover_serial = 0) {
+
+ $SQL = "select view_popovers.*
+ from view_popovers
+ where popover_serial = {$popover_serial}";
+
+ return $this->getTable("popovers", $SQL);
+ }
+
+ // =======================
+ // Return a Popover Object
+ // =======================
+
+ public function getPopoverByName($popover_name = "") {
+
+ $SQL = "select view_popovers.*
+ from view_popovers
+ where popover_name = '{$popover_name}'";
+
+ return $this->getTable("popovers", $SQL);
+ }
+
+ // ========================
+ // Return a Popovers Object
+ // ========================
+
+ public function getPopovers() {
+
+ $SQL = "select view_popovers.*
+ from view_popovers";
+
+ return $this->getTable("popovers", $SQL);
+ }
+
+ // =============================
+ // Return a Popovers Page Object
+ // =============================
+
+ public function getPopoversPage() {
+
+ // Find Criteria
+
+ $find_popover = filter_input(INPUT_POST, "find_popover") ?: "";
+ $find_words = $this->sanitizeString($find_popover);
+
+ // Show Per Page
+
+ $this->pagination_size = filter_input(INPUT_POST, "popovers_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_popovers
+ where popover_name regexp :popover_name
+ or popover_title regexp :popover_title";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":popover_name", $find_words);
+ $statement->bindValue(":popover_title", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_popovers.*
+ from view_popovers
+ where popover_name regexp :popover_name
+ or popover_title regexp :popover_title
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":popover_name", $find_words);
+ $statement->bindValue(":popover_title", $find_words);
+
+ $statement->execute();
+
+ $popovers = $this->getTableXML("popovers", $statement);
+
+ // Insert Pagination Attributes
+
+ $popovers->addAttribute("count", $count);
+ $popovers->addAttribute("start", $start);
+ $popovers->addAttribute("end", $end);
+ $popovers->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $popovers;
+ }
+
+ // =============================
+ // Determine if a Popover exists
+ // =============================
+
+ public function popoverExists() {
+
+ $popover_serial = filter_input(INPUT_POST, "popover_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $popover_name = filter_input(INPUT_POST, "popover_name") ?: "";
+
+ $popover_name = strtolower($popover_name);
+
+ $SQL = "select popover_serial
+ from view_popovers
+ where popover_serial != :popover_serial
+ and lower(popover_name) = :popover_name";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":popover_serial", $popover_serial);
+ $statement->bindValue(":popover_name", $popover_name);
+
+ $statement->execute();
+
+ $popovers = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($popovers) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ==============
+ // Setup Popovers
+ // ==============
+
+ public function setupPopovers() {
+
+ $popovers = $this->getPopoversPage();
+ $XML = $this->mergeXML($popovers, "");
+ $content = $this->applyXSL($XML, $this->getXSL("setupPopovers"));
+
+ $this->displayContent($content);
+ }
+}
+
+?>
diff --git a/classes/RDI.php b/classes/RDI.php
new file mode 100644
index 0000000..c0f1070
--- /dev/null
+++ b/classes/RDI.php
@@ -0,0 +1,549 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==========
+ // Manage RDI
+ // ==========
+
+ public function manageRDI() {
+
+ $rdi = $this->getRDIPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($rdi, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("manageRDI"));
+
+ $this->displayContent($content);
+ }
+
+ // =======
+ // Add RDI
+ // =======
+
+ public function addRDI() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $constants = $this->getConstants();
+ $counties = (new Counties())->getCounties();
+
+ $XML = $this->mergeXML($constants, "");
+ $XML = $this->mergeXML($counties, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("addRDI"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $rdi_permit_facts_id = filter_input(INPUT_POST, "rdi_permit_facts_id", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_permit_number = filter_input(INPUT_POST, "rdi_permit_number") ?: '';
+ $rdi_entry_date = filter_input(INPUT_POST, "rdi_entry_date") ?: '';
+ $rdi_permit_date = filter_input(INPUT_POST, "rdi_permit_date") ?: '';
+ $rdi_sub_div_name = filter_input(INPUT_POST, "rdi_sub_div_name") ?: '';
+ $rdi_project_type = filter_input(INPUT_POST, "rdi_project_type") ?: '';
+ $rdi_county = filter_input(INPUT_POST, "rdi_county") ?: '';
+ $rdi_company = filter_input(INPUT_POST, "rdi_company") ?: '';
+ $rdi_phone = filter_input(INPUT_POST, "rdi_phone") ?: '';
+ $rdi_project_addr = filter_input(INPUT_POST, "rdi_project_addr") ?: '';
+ $rdi_city = filter_input(INPUT_POST, "rdi_city") ?: '';
+ $rdi_state = filter_input(INPUT_POST, "rdi_state") ?: '';
+ $rdi_zip = filter_input(INPUT_POST, "rdi_zip", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_project_city = filter_input(INPUT_POST, "rdi_project_city") ?: '';
+ $rdi_project_state = filter_input(INPUT_POST, "rdi_project_state") ?: '';
+ $rdi_value = filter_input(INPUT_POST, "rdi_value", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_lot = filter_input(INPUT_POST, "rdi_lot", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_dist_ll = filter_input(INPUT_POST, "rdi_dist_ll", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_owner_name = filter_input(INPUT_POST, "rdi_owner_name") ?: '';
+ $rdi_owner_phone = filter_input(INPUT_POST, "rdi_owner_phone", FILTER_SANITIZE_NUMBER_INT) ?: '';
+ $rdi_owner_address = filter_input(INPUT_POST, "rdi_owner_address") ?: '';
+ $rdi_owner_city = filter_input(INPUT_POST, "rdi_owner_city") ?: '';
+ $rdi_owner_state = filter_input(INPUT_POST, "rdi_owner_state") ?: '';
+ $rdi_owner_zip = filter_input(INPUT_POST, "rdi_owner_zip", FILTER_SANITIZE_NUMBER_INT) ?: '';
+ $rdi_size = filter_input(INPUT_POST, "rdi_size", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_units = filter_input(INPUT_POST, "rdi_units", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_building_type = filter_input(INPUT_POST, "rdi_building_type", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_work_type = filter_input(INPUT_POST, "rdi_work_type", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ct1 = filter_input(INPUT_POST, "rdi_ct1", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ytd_permits = filter_input(INPUT_POST, "rdi_ytd_permits", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ytd_value = filter_input(INPUT_POST, "rdi_ytd_value") ?: 0;
+ $rdi_12mth_prev_permits = filter_input(INPUT_POST, "rdi_12mth_prev_permits", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $rdi_entry_date = date("Y-m-d", strtotime($rdi_entry_date));
+ $rdi_permit_date = date("Y-m-d", strtotime($rdi_permit_date));
+ $rdi_value = str_replace(",", "", $rdi_value);
+
+ $SQL = "INSERT INTO rdis (
+ rdi_permit_facts_id,
+ rdi_permit_number,
+ rdi_entry_date,
+ rdi_permit_date,
+ rdi_sub_div_name,
+ rdi_project_type,
+ rdi_county,
+ rdi_company,
+ rdi_phone,
+ rdi_project_addr,
+ rdi_city,
+ rdi_state,
+ rdi_zip,
+ rdi_project_city,
+ rdi_project_state,
+ rdi_value,
+ rdi_lot,
+ rdi_dist_ll,
+ rdi_owner_name,
+ rdi_owner_phone,
+ rdi_owner_address,
+ rdi_owner_city,
+ rdi_owner_state,
+ rdi_owner_zip,
+ rdi_size,
+ rdi_units,
+ rdi_building_type,
+ rdi_work_type,
+ rdi_ct1,
+ rdi_ytd_permits,
+ rdi_ytd_value,
+ rdi_12mth_prev_permits
+ ) VALUES (
+ :rdi_permit_facts_id,
+ :rdi_permit_number,
+ :rdi_entry_date,
+ :rdi_permit_date,
+ :rdi_sub_div_name,
+ :rdi_project_type,
+ :rdi_county,
+ :rdi_company,
+ :rdi_phone,
+ :rdi_project_addr,
+ :rdi_city,
+ :rdi_state,
+ :rdi_zip,
+ :rdi_project_city,
+ :rdi_project_state,
+ :rdi_value,
+ :rdi_lot,
+ :rdi_dist_ll,
+ :rdi_owner_name,
+ :rdi_owner_phone,
+ :rdi_owner_address,
+ :rdi_owner_city,
+ :rdi_owner_state,
+ :rdi_owner_zip,
+ :rdi_size,
+ :rdi_units,
+ :rdi_building_type,
+ :rdi_work_type,
+ :rdi_ct1,
+ :rdi_ytd_permits,
+ :rdi_ytd_value,
+ :rdi_12mth_prev_permits
+ )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":rdi_permit_facts_id", $rdi_permit_facts_id);
+ $statement->bindValue(":rdi_permit_number", $rdi_permit_number);
+ $statement->bindValue(":rdi_entry_date", $rdi_entry_date);
+ $statement->bindValue(":rdi_permit_date", $rdi_permit_date);
+ $statement->bindValue(":rdi_sub_div_name", $rdi_sub_div_name);
+ $statement->bindValue(":rdi_project_type", $rdi_project_type);
+ $statement->bindValue(":rdi_county", $rdi_county);
+ $statement->bindValue(":rdi_company", $rdi_company);
+ $statement->bindValue(":rdi_phone", $rdi_phone);
+ $statement->bindValue(":rdi_project_addr", $rdi_project_addr);
+ $statement->bindValue(":rdi_city", $rdi_city);
+ $statement->bindValue(":rdi_state", $rdi_state);
+ $statement->bindValue(":rdi_zip", $rdi_zip);
+ $statement->bindValue(":rdi_project_city", $rdi_project_city);
+ $statement->bindValue(":rdi_project_state", $rdi_project_state);
+ $statement->bindValue(":rdi_value", $rdi_value);
+ $statement->bindValue(":rdi_lot", $rdi_lot);
+ $statement->bindValue(":rdi_dist_ll", $rdi_dist_ll);
+ $statement->bindValue(":rdi_owner_name", $rdi_owner_name);
+ $statement->bindValue(":rdi_owner_phone", $rdi_owner_phone);
+ $statement->bindValue(":rdi_owner_address", $rdi_owner_address);
+ $statement->bindValue(":rdi_owner_city", $rdi_owner_city);
+ $statement->bindValue(":rdi_owner_state", $rdi_owner_state);
+ $statement->bindValue(":rdi_owner_zip", $rdi_owner_zip);
+ $statement->bindValue(":rdi_size", $rdi_size);
+ $statement->bindValue(":rdi_units", $rdi_units);
+ $statement->bindValue(":rdi_building_type", $rdi_building_type);
+ $statement->bindValue(":rdi_work_type", $rdi_work_type);
+ $statement->bindValue(":rdi_ct1", $rdi_ct1);
+ $statement->bindValue(":rdi_ytd_permits", $rdi_ytd_permits);
+ $statement->bindValue(":rdi_ytd_value", $rdi_ytd_value);
+ $statement->bindValue(":rdi_12mth_prev_permits", $rdi_12mth_prev_permits);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ==========
+ // Delete RDI
+ // ==========
+
+ public function deleteRDI() {
+
+ $rdi_serial = filter_input(INPUT_POST, "rdi_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $rdi = $this->getRDI($rdi_serial);
+
+ if ($rdi->count() == 0) {
+ $this->logError("Invalid RDI ({$rdi_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from rdis
+ where rdi_serial = {$rdi_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ==========
+ // Edit a RDI
+ // ==========
+
+ public function editRDI() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $rdi_serial = filter_input(INPUT_POST, "rdi_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $rdi = $this->getRDI($rdi_serial);
+
+ if ($rdi->count() == 0) {
+ $this->logError("Invalid RDI ({$rdi_serial}). " . __METHOD__);
+ }
+
+ $constants = $this->getConstants();
+ $counties = (new Counties())->getCounties();
+
+ $XML = $this->mergeXML($rdi, "");
+ $XML = $this->mergeXML($constants, $XML);
+ $XML = $this->mergeXML($counties, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editRDI"));
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $rdi_serial = filter_input(INPUT_POST, "rdi_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_permit_facts_id = filter_input(INPUT_POST, "rdi_permit_facts_id", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_permit_number = filter_input(INPUT_POST, "rdi_permit_number") ?: '';
+ $rdi_entry_date = filter_input(INPUT_POST, "rdi_entry_date") ?: '';
+ $rdi_permit_date = filter_input(INPUT_POST, "rdi_permit_date") ?: '';
+ $rdi_sub_div_name = filter_input(INPUT_POST, "rdi_sub_div_name") ?: '';
+ $rdi_project_type = filter_input(INPUT_POST, "rdi_project_type") ?: '';
+ $rdi_county = filter_input(INPUT_POST, "rdi_county") ?: '';
+ $rdi_company = filter_input(INPUT_POST, "rdi_company") ?: '';
+ $rdi_phone = filter_input(INPUT_POST, "rdi_phone") ?: '';
+ $rdi_project_addr = filter_input(INPUT_POST, "rdi_project_addr") ?: '';
+ $rdi_city = filter_input(INPUT_POST, "rdi_city") ?: '';
+ $rdi_state = filter_input(INPUT_POST, "rdi_state") ?: '';
+ $rdi_zip = filter_input(INPUT_POST, "rdi_zip", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_project_city = filter_input(INPUT_POST, "rdi_project_city") ?: '';
+ $rdi_project_state = filter_input(INPUT_POST, "rdi_project_state") ?: '';
+ $rdi_value = filter_input(INPUT_POST, "rdi_value", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_lot = filter_input(INPUT_POST, "rdi_lot", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_dist_ll = filter_input(INPUT_POST, "rdi_dist_ll", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_owner_name = filter_input(INPUT_POST, "rdi_owner_name") ?: '';
+ $rdi_owner_phone = filter_input(INPUT_POST, "rdi_owner_phone", FILTER_SANITIZE_NUMBER_INT) ?: '';
+ $rdi_owner_address = filter_input(INPUT_POST, "rdi_owner_address") ?: '';
+ $rdi_owner_city = filter_input(INPUT_POST, "rdi_owner_city") ?: '';
+ $rdi_owner_state = filter_input(INPUT_POST, "rdi_owner_state") ?: '';
+ $rdi_owner_zip = filter_input(INPUT_POST, "rdi_owner_zip", FILTER_SANITIZE_NUMBER_INT) ?: '';
+ $rdi_size = filter_input(INPUT_POST, "rdi_size", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_units = filter_input(INPUT_POST, "rdi_units", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_building_type = filter_input(INPUT_POST, "rdi_building_type", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_work_type = filter_input(INPUT_POST, "rdi_work_type", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ct1 = filter_input(INPUT_POST, "rdi_ct1", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ytd_permits = filter_input(INPUT_POST, "rdi_ytd_permits", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $rdi_ytd_value = filter_input(INPUT_POST, "rdi_ytd_value") ?: 0;
+ $rdi_12mth_prev_permits = filter_input(INPUT_POST, "rdi_12mth_prev_permits", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $rdi_entry_date = date("Y-m-d", strtotime($rdi_entry_date));
+ $rdi_permit_date = date("Y-m-d", strtotime($rdi_permit_date));
+ $rdi_value = str_replace(",", "", $rdi_value);
+
+ // Verify the RDI
+ $rdi = $this->getRDI($rdi_serial);
+
+ if ($rdi->count() == 0) {
+ $this->logError("Invalid RDI ({$rdi_serial}). " . __METHOD__);
+ }
+
+ $SQL = "UPDATE rdis
+ SET rdi_permit_facts_id = :rdi_permit_facts_id,
+ rdi_permit_number = :rdi_permit_number,
+ rdi_entry_date = :rdi_entry_date,
+ rdi_permit_date = :rdi_permit_date,
+ rdi_sub_div_name = :rdi_sub_div_name,
+ rdi_project_type = :rdi_project_type,
+ rdi_county = :rdi_county,
+ rdi_company = :rdi_company,
+ rdi_phone = :rdi_phone,
+ rdi_project_addr = :rdi_project_addr,
+ rdi_city = :rdi_city,
+ rdi_state = :rdi_state,
+ rdi_zip = :rdi_zip,
+ rdi_project_city = :rdi_project_city,
+ rdi_project_state = :rdi_project_state,
+ rdi_value = :rdi_value,
+ rdi_lot = :rdi_lot,
+ rdi_dist_ll = :rdi_dist_ll,
+ rdi_owner_name = :rdi_owner_name,
+ rdi_owner_phone = :rdi_owner_phone,
+ rdi_owner_address = :rdi_owner_address,
+ rdi_owner_city = :rdi_owner_city,
+ rdi_owner_state = :rdi_owner_state,
+ rdi_owner_zip = :rdi_owner_zip,
+ rdi_size = :rdi_size,
+ rdi_units = :rdi_units,
+ rdi_building_type = :rdi_building_type,
+ rdi_work_type = :rdi_work_type,
+ rdi_ct1 = :rdi_ct1,
+ rdi_ytd_permits = :rdi_ytd_permits,
+ rdi_ytd_value = :rdi_ytd_value,
+ rdi_12mth_prev_permits = :rdi_12mth_prev_permits
+ WHERE rdi_serial = :rdi_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":rdi_serial", $rdi_serial);
+ $statement->bindValue(":rdi_permit_facts_id", $rdi_permit_facts_id);
+ $statement->bindValue(":rdi_permit_number", $rdi_permit_number);
+ $statement->bindValue(":rdi_entry_date", $rdi_entry_date);
+ $statement->bindValue(":rdi_permit_date", $rdi_permit_date);
+ $statement->bindValue(":rdi_sub_div_name", $rdi_sub_div_name);
+ $statement->bindValue(":rdi_project_type", $rdi_project_type);
+ $statement->bindValue(":rdi_county", $rdi_county);
+ $statement->bindValue(":rdi_company", $rdi_company);
+ $statement->bindValue(":rdi_phone", $rdi_phone);
+ $statement->bindValue(":rdi_project_addr", $rdi_project_addr);
+ $statement->bindValue(":rdi_city", $rdi_city);
+ $statement->bindValue(":rdi_state", $rdi_state);
+ $statement->bindValue(":rdi_zip", $rdi_zip);
+ $statement->bindValue(":rdi_project_city", $rdi_project_city);
+ $statement->bindValue(":rdi_project_state", $rdi_project_state);
+ $statement->bindValue(":rdi_value", $rdi_value);
+ $statement->bindValue(":rdi_lot", $rdi_lot);
+ $statement->bindValue(":rdi_dist_ll", $rdi_dist_ll);
+ $statement->bindValue(":rdi_owner_name", $rdi_owner_name);
+ $statement->bindValue(":rdi_owner_phone", $rdi_owner_phone);
+ $statement->bindValue(":rdi_owner_address", $rdi_owner_address);
+ $statement->bindValue(":rdi_owner_city", $rdi_owner_city);
+ $statement->bindValue(":rdi_owner_state", $rdi_owner_state);
+ $statement->bindValue(":rdi_owner_zip", $rdi_owner_zip);
+ $statement->bindValue(":rdi_size", $rdi_size);
+ $statement->bindValue(":rdi_units", $rdi_units);
+ $statement->bindValue(":rdi_building_type", $rdi_building_type);
+ $statement->bindValue(":rdi_work_type", $rdi_work_type);
+ $statement->bindValue(":rdi_ct1", $rdi_ct1);
+ $statement->bindValue(":rdi_ytd_permits", $rdi_ytd_permits);
+ $statement->bindValue(":rdi_ytd_value", $rdi_ytd_value);
+ $statement->bindValue(":rdi_12mth_prev_permits", $rdi_12mth_prev_permits);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ================================
+ // Return an Active RDI Object
+ // ================================
+
+ public function getActiveRDI() {
+
+ $SQL = "select view_rdis.*
+ from view_rdis
+ where rdi_status is true";
+
+ return $this->getTable("rdis", $SQL);
+ }
+
+ // ========================
+ // Return an RDI Object
+ // ========================
+
+ public function getRDI($rdi_serial = 0) {
+
+ $SQL = "select view_rdis.*
+ from view_rdis
+ where rdi_serial = {$rdi_serial}";
+
+ return $this->getTable("rdis", $SQL);
+ }
+
+ // ========================
+ // Return a RDI Object
+ // ========================
+
+ public function getRDIs() {
+
+ $SQL = "select view_rdis.*
+ from view_rdis";
+
+ return $this->getTable("rdis", $SQL);
+ }
+
+ // ========================
+ // Return a RDI Page Object
+ // ========================
+
+ public function getRDIPage() {
+
+ // Find Criteria
+
+ $find_rdi = filter_input(INPUT_POST, "find_rdi") ?: "";
+ $find_rdi = $this->sanitizeString($find_rdi);
+
+ $this->pagination_size = filter_input(INPUT_POST, "rdis_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ $rdis_order_by = filter_input(INPUT_POST, "rdis_order_by") ?: "";
+ $rdis_order_direction = filter_input(INPUT_POST, "rdis_order_direction") ?: "";
+
+ if ($rdis_order_by === "") {
+ $orderby = "rdi_permit_number desc";
+ } else {
+ $orderby = $rdis_order_by . " " . $rdis_order_direction;
+ }
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_rdis
+ where rdi_permit_number regexp :rdi_permit_number
+ or rdi_entry_date_verbose regexp :rdi_entry_date_verbose
+ or rdi_permit_date_verbose regexp :rdi_permit_date_verbose
+ or rdi_sub_div_name regexp :rdi_sub_div_name
+ or rdi_project_type regexp :rdi_project_type";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_permit_number", $find_rdi);
+ $statement->bindValue(":rdi_entry_date_verbose", $find_rdi);
+ $statement->bindValue(":rdi_permit_date_verbose", $find_rdi);
+ $statement->bindValue(":rdi_sub_div_name", $find_rdi);
+ $statement->bindValue(":rdi_project_type", $find_rdi);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_rdis.*
+ from view_rdis
+ where rdi_permit_number regexp :rdi_permit_number
+ or rdi_entry_date_verbose regexp :rdi_entry_date_verbose
+ or rdi_permit_date_verbose regexp :rdi_permit_date_verbose
+ or rdi_sub_div_name regexp :rdi_sub_div_name
+ or rdi_project_type regexp :rdi_project_type
+ order by {$orderby}
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":rdi_permit_number", $find_rdi);
+ $statement->bindValue(":rdi_entry_date_verbose", $find_rdi);
+ $statement->bindValue(":rdi_permit_date_verbose", $find_rdi);
+ $statement->bindValue(":rdi_sub_div_name", $find_rdi);
+ $statement->bindValue(":rdi_project_type", $find_rdi);
+
+ $statement->execute();
+
+ $rdis = $this->getTableXML("rdis", $statement);
+
+ // Insert Pagination Attributes
+
+ $rdis->addAttribute("count", $count);
+ $rdis->addAttribute("start", $start);
+ $rdis->addAttribute("end", $end);
+ $rdis->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $rdis;
+ }
+}
+
+?>
diff --git a/classes/Reports.php b/classes/Reports.php
new file mode 100644
index 0000000..a9900a5
--- /dev/null
+++ b/classes/Reports.php
@@ -0,0 +1,479 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==========
+ // Add Report
+ // ==========
+
+ public function addReport() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($constants, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("addReport"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $report_name = filter_input(INPUT_POST, "report_name") ?: "";
+ $report_class = filter_input(INPUT_POST, "report_class") ?: "";
+ $report_type = filter_input(INPUT_POST, "report_type") ?: "Report";
+ $report_description = filter_input(INPUT_POST, "report_description") ?: "";
+ $report_target = filter_input(INPUT_POST, "report_target") ?: "";
+
+ $report_class = trim(preg_replace("/\s+/", " ", $report_class));
+
+ $SQL = "insert into reports
+
+ ( report_class,
+ report_type,
+ report_name,
+ report_description,
+ report_target )
+
+ VALUES ( :report_class,
+ :report_type,
+ :report_name,
+ :report_description,
+ :report_target)";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":report_class", $report_class);
+ $statement->bindValue(":report_type", $report_type);
+ $statement->bindValue(":report_name", $report_name);
+ $statement->bindValue(":report_description", $report_description);
+ $statement->bindValue(":report_target", $report_target);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =============
+ // Delete Report
+ // =============
+
+ public function deleteReport() {
+
+ $report_serial = filter_input(INPUT_POST, "report_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $reports = $this->getReport($report_serial);
+
+ if ($reports->count() == 0) {
+ $this->logError("Invalid Report ({$report_serial}): " . __METHOD__);
+ }
+
+ $SQL = "delete from reports
+ where report_serial = {$report_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ===========
+ // Edit Report
+ // ===========
+
+ public function editReport() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $report_serial = filter_input(INPUT_POST, "report_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $reports = $this->getReport($report_serial);
+
+ if ($reports->count() == 0) {
+ $this->logError("Invalid Report ({$report_serial}): " . __METHOD__);
+ }
+
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($reports, "");
+ $XML = $this->mergeXML($constants, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editReport"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $report_serial = filter_input(INPUT_POST, "report_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $report_name = filter_input(INPUT_POST, "report_name") ?: "";
+ $report_class = filter_input(INPUT_POST, "report_class") ?: "";
+ $report_type = filter_input(INPUT_POST, "report_type") ?: "Report";
+ $report_description = filter_input(INPUT_POST, "report_description") ?: "";
+ $report_target = filter_input(INPUT_POST, "report_target") ?: "";
+
+ $report_class = trim(preg_replace("/\s+/", " ", $report_class));
+
+ $reports = $this->getReport($report_serial);
+
+ if ($reports->count() == 0) {
+ $this->logError("Invalid Report ({$report_serial}): " . __METHOD__);
+ }
+
+ $SQL = "update reports
+ set report_class = :report_class,
+ report_type = :report_type,
+ report_name = :report_name,
+ report_description = :report_description,
+ report_target = :report_target
+ where report_serial = :report_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":report_serial", $report_serial);
+ $statement->bindValue(":report_class", $report_class);
+ $statement->bindValue(":report_type", $report_type);
+ $statement->bindValue(":report_name", $report_name);
+ $statement->bindValue(":report_description", $report_description);
+ $statement->bindValue(":report_target", $report_target);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ======================
+ // Return a Report Object
+ // ======================
+
+ public function getReport($report_serial = 0) {
+
+ $SQL = "select view_reports.*
+ from view_reports
+ where report_serial = {$report_serial}";
+
+ return $this->getTable("reports", $SQL);
+ }
+
+ // ===========================================
+ // Return the report_serial for a report_class
+ // ===========================================
+
+ public function getReportSerial($report_class = "") {
+
+ $SQL = "select view_reports.report_serial
+ from view_reports
+ where report_class = '{$report_class}'";
+
+ $reports = $this->getTable("reports", $SQL);
+
+ return (integer) ($reports->record->report_serial ?? 0);
+ }
+
+ // =======================
+ // Return a Reports Object
+ // =======================
+
+ public function getReports() {
+
+ $SQL = "select view_reports.*
+ from view_reports";
+
+ return $this->getTable("reports", $SQL);
+ }
+
+ // ============================
+ // Return a Reports Page Object
+ // ============================
+
+ public function getReportsPage() {
+
+ // Find Criteria
+
+ $find_report = filter_input(INPUT_POST, "find_report") ?: "";
+ $find_words = $this->sanitizeString($find_report);
+
+// $find_words = implode("|", explode(" ", $find_report));
+ // Show Per Page
+
+ $this->pagination_size = filter_input(INPUT_POST, "reports_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_reports
+ where (report_class regexp :report_class
+ or report_name regexp :report_name
+ or report_type regexp :report_type
+ or report_description regexp :report_description)";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":report_class", $find_words);
+ $statement->bindValue(":report_name", $find_words);
+ $statement->bindValue(":report_type", $find_words);
+ $statement->bindValue(":report_description", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_reports.*
+ from view_reports
+ where (report_class regexp :report_class
+ or report_name regexp :report_name
+ or report_type regexp :report_type
+ or report_description regexp :report_description)
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":report_class", $find_words);
+ $statement->bindValue(":report_name", $find_words);
+ $statement->bindValue(":report_type", $find_words);
+ $statement->bindValue(":report_description", $find_words);
+
+ $statement->execute();
+
+ $reports = $this->getTableXML("reports", $statement);
+
+ // Insert Pagination Attributes
+
+ $reports->addAttribute("count", $count);
+ $reports->addAttribute("start", $start);
+ $reports->addAttribute("end", $end);
+ $reports->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $reports;
+ }
+
+ // ==================================
+ // Return a Select Report Page Object
+ // ==================================
+
+ public function getSelectReportPage() {
+
+ // Find Criteria
+
+ $select_report = filter_input(INPUT_POST, "select_report") ?: "";
+ $find_words = $this->sanitizeString($select_report);
+
+ // Show Per Page
+
+ $this->pagination_size = filter_input(INPUT_POST, "reports_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_reports
+ where report_name regexp :report_name
+ or report_description regexp :report_description";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":report_name", $find_words);
+ $statement->bindValue(":report_description", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_reports.*
+ from view_reports
+ where report_name regexp :report_name
+ or report_description regexp :report_description
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":report_name", $find_words);
+ $statement->bindValue(":report_description", $find_words);
+
+ $statement->execute();
+
+ $reports = $this->getTableXML("reports", $statement);
+
+ // Insert Pagination Attributes
+
+ $reports->addAttribute("count", $count);
+ $reports->addAttribute("start", $start);
+ $reports->addAttribute("end", $end);
+ $reports->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $reports;
+ }
+
+ // ====================================
+ // Determine if the Report Class Exists
+ // ====================================
+
+ public function reportExists() {
+
+ $exists = false;
+
+ $report_serial = filter_input(INPUT_POST, "report_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $report_class = filter_input(INPUT_POST, "report_class") ?: "";
+
+ $report_class = trim(preg_replace("/\s+/", " ", $report_class));
+
+ $SQL = "select report_serial
+ from view_reports
+ where report_serial != :report_serial
+ and lower(report_class) = :report_class";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":report_serial", $report_serial);
+ $statement->bindValue(":report_class", $report_class);
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ================
+ // Select a Report.
+ // ================
+
+ public function selectReport() {
+
+ $reports = $this->getSelectReportPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($reports, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("selectReport"));
+
+ $this->displayContent($content);
+ }
+
+ // =============
+ // Setup Reports
+ // =============
+
+ public function setupReports() {
+
+ $reports = $this->getReportsPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($reports, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupReports"));
+
+ $this->displayContent($content);
+ }
+}
+
+?>
diff --git a/classes/SearchHistory.php b/classes/SearchHistory.php
new file mode 100644
index 0000000..4d14141
--- /dev/null
+++ b/classes/SearchHistory.php
@@ -0,0 +1,253 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ }
+
+ // ============================
+ // Save Users Search Parameters
+ // ============================
+
+ public function saveUserSearchParameters($searchpayload) {
+
+ $user = $this->current_user_serial;
+ $subscription_serial = $searchpayload['subscription_serial'];
+
+ switch ($subscription_serial) {
+
+ case 5:
+ case 9:
+ case 11:
+ case 13:
+ case 15:
+
+ $searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
+
+ break;
+
+ case 7:
+ case 10:
+ case 12:
+ case 14:
+ case 16:
+
+ $searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
+
+ break;
+
+ default :
+ $this->debug("ERROR....");
+ return;
+ }
+
+ $SQL = "insert into searchhistories
+
+ ( searchhistory_user,
+ searchhistory_subscription,
+ searchhistory_parameters,
+ searchhistory_creator,
+ searchhistory_created )
+
+ values ( :searchhistory_user,
+ :searchhistory_subscription,
+ :searchhistory_parameters,
+ :searchhistory_creator,
+ :searchhistory_created )";
+
+ $connection = $this->connect();
+ $statement = $connection->prepare($SQL);
+ $statement->bindValue(":searchhistory_user", $user);
+ $statement->bindValue(":searchhistory_subscription", $subscription_serial);
+ $statement->bindValue(":searchhistory_parameters", $searchcriteria);
+ $statement->bindValue(":searchhistory_creator", $this->current_user_name);
+ $statement->bindValue(":searchhistory_created", $this->getTimestamp());
+
+ $statement->execute();
+ }
+
+ // ============================
+ // Save Users Search Parameters
+ // ============================
+
+ public function updateUserSearchParameters($searchpayload) {
+
+ $user = $this->current_user_serial;
+ $subscription_serial = $searchpayload['subscription_serial'];
+
+ switch ($subscription_serial) {
+
+ case 5:
+ case 9:
+ case 11:
+ case 13:
+ case 15:
+
+ $searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
+
+ break;
+
+ case 7:
+ case 10:
+ case 12:
+ case 14:
+ case 16:
+
+ $searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
+
+ break;
+
+ default :
+ return;
+ }
+
+ $SQL = "update searchhistories
+ set searchhistory_parameters = :searchhistory_parameters,
+ searchhistory_changer = :searchhistory_changer,
+ searchhistory_changed = :searchhistory_changed
+ where searchhistory_user = :searchhistory_user
+ and searchhistory_subscription = :searchhistory_subscription";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":searchhistory_parameters", $searchcriteria);
+ $statement->bindValue(":searchhistory_changer", $this->current_user_name);
+ $statement->bindValue(":searchhistory_changed", $this->getTimestamp());
+ $statement->bindValue(":searchhistory_user", $user);
+ $statement->bindValue(":searchhistory_subscription", $subscription_serial);
+
+ $statement->execute();
+ }
+
+ // ============================
+ // Gets Users Search Parameters
+ // ============================
+
+ public function getUsersPreviousSearchParameters($user, $subscription) {
+
+ $SQL = "select view_searchhistories.*
+ from view_searchhistories
+ where view_searchhistories.searchhistory_user = {$user}
+ and view_searchhistories.searchhistory_subscription = {$subscription}";
+
+ $recordset = $this->getTable("searchhistory", $SQL);
+
+ return $this->materializeSearchHistoryParameters($recordset);
+ }
+
+ // ============================
+ // Gets Users Search Parameters
+ // ============================
+
+ public function materializeSearchHistoryParameters(SimpleXMLElement $SXE): SimpleXMLElement {
+
+ if (!isset($SXE->record)) {
+ return $SXE;
+ }
+
+ // Keys that should ALWAYS materialize as ..
+ // even if there is only one value.
+ $multiSelectKeys = [
+ 'permitfact_project_city', 'permitfact_county', 'permitfact_project_type', 'permitfact_work_type', 'permitfact_building_type',
+ 'businessfact_city', 'businessfact_city', 'businessfact_county', 'businessfact_action', 'businessfact_business_class',
+ 'pzfact_project_city', 'pzfact_project_city', 'pzfact_project_city', 'pzfact_project_city'
+ ];
+
+ foreach ($SXE->record as $record) {
+
+ if (!isset($record->searchhistory_parameters)) {
+ continue;
+ }
+
+ $json = trim((string) $record->searchhistory_parameters);
+ if ($json === '') {
+ continue;
+ }
+
+ $data = json_decode($json, true);
+ if (!is_array($data)) {
+ continue;
+ }
+
+ // Clear existing text content
+ $record->searchhistory_parameters[0] = null;
+
+ foreach ($data as $key => $value) {
+
+ $nodeName = preg_replace('/[^A-Za-z0-9_\-:.]/', '_', (string) $key);
+
+ $isMulti = in_array($key, $multiSelectKeys, true);
+
+ // If this is a multi-select key:
+ // - Accept arrays (preferred)
+ // - Accept CSV strings (legacy)
+ // - Accept single scalar and wrap it in
+ if ($isMulti) {
+ $parent = $record->searchhistory_parameters->addChild($nodeName);
+
+ if (is_array($value)) {
+ $parts = $value;
+ } else {
+ $valueStr = trim((string) $value);
+
+ // empty -> create empty parent node and move on
+ if ($valueStr === '') {
+ continue;
+ }
+
+ // CSV or single
+ $parts = (strpos($valueStr, ',') !== false) ? explode(',', $valueStr) : [$valueStr];
+ }
+
+ $parts = array_values(array_filter(array_map('trim', $parts), fn($v) => $v !== ''));
+
+ foreach ($parts as $p) {
+ $parent->addChild('id', htmlspecialchars($p, ENT_XML1 | ENT_QUOTES, 'UTF-8'));
+ }
+
+ continue;
+ }
+
+ // Non-multi-select keys (same as your current behavior)
+ if (is_string($value) && strpos($value, ',') !== false) {
+
+ $parent = $record->searchhistory_parameters->addChild($nodeName);
+
+ $parts = array_values(array_filter(array_map('trim', explode(',', $value)), fn($v) => $v !== ''));
+ foreach ($parts as $p) {
+ $parent->addChild('id', htmlspecialchars($p, ENT_XML1 | ENT_QUOTES, 'UTF-8'));
+ }
+ } else {
+ $record->searchhistory_parameters->addChild(
+ $nodeName,
+ htmlspecialchars((string) $value, ENT_XML1 | ENT_QUOTES, 'UTF-8')
+ );
+ }
+ }
+ }
+
+ return $SXE;
+ }
+}
+
+?>
diff --git a/classes/Statuses.php b/classes/Statuses.php
new file mode 100644
index 0000000..f555b8c
--- /dev/null
+++ b/classes/Statuses.php
@@ -0,0 +1,384 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ==========
+ // Add Status
+ // ==========
+
+ public function addStatus() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $content = $this->applyXSL("", $this->getXSL("addStatus"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $status_name = filter_input(INPUT_POST, "status_name") ?: "";
+ $status_classes = filter_input(INPUT_POST, "status_classes") ?: "";
+ $status_active = filter_input(INPUT_POST, "status_active", FILTER_VALIDATE_BOOLEAN) ?: false;
+
+ $SQL = "insert into statuses
+
+ ( status_name,
+ status_classes,
+ status_active,
+ status_creator,
+ status_created )
+
+ VALUES ( :status_name,
+ :status_classes,
+ :status_active,
+ :status_creator,
+ :status_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":status_name", $status_name);
+ $statement->bindValue(":status_classes", $status_classes);
+ $statement->bindValue(":status_active", $status_active, PDO::PARAM_BOOL);
+ $statement->bindValue(":status_creator", $this->current_user_name);
+ $statement->bindValue(":status_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =============
+ // Delete Status
+ // =============
+
+ public function deleteStatus() {
+
+ $status_serial = filter_input(INPUT_POST, "status_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $status = $this->getStatus($status_serial);
+
+ if ($status->count() == 0) {
+ $this->logError("Invalid Status ({$status_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from statuses
+ where status_serial = {$status_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ============================
+ // Determine if a Status exists
+ // ============================
+
+ public function statusExists() {
+
+ $status_serial = filter_input(INPUT_POST, "status_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $status_name = filter_input(INPUT_POST, "status_name") ?: "";
+
+ $SQL = "select status_serial
+ from view_statuses
+ where status_serial != :status_serial
+ and lower(status_name) = :status_name";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":status_serial", $status_serial);
+ $statement->bindValue(":status_name", strtolower($status_name));
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // ======================================
+ // Determine if a Status is Active (AJAX)
+ // ======================================
+
+ public function statusActive() {
+
+ $status_serial = filter_input(INPUT_POST, "status_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $active = false;
+
+ $SQL = "select workorder_status
+ from workorders
+ where workorder_status = {$status_serial}
+ limit 1";
+
+ $workorders = $this->getTable("workorders", $SQL);
+
+ $active = ($workorders->count() > 0) ? true : false;
+
+ echo json_encode($active);
+ }
+
+ // =============
+ // Edit a Status
+ // =============
+
+ public function editStatus() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $status_serial = filter_input(INPUT_POST, "status_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $status = $this->getStatus($status_serial);
+
+ if ($status->count() == 0) {
+ $this->logError("Invalid Status ({$status_serial}). " . __METHOD__);
+ }
+
+ $XML = $this->mergeXML($status, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("editStatus"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $status_serial = filter_input(INPUT_POST, "status_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $status_name = filter_input(INPUT_POST, "status_name") ?: "";
+ $status_classes = filter_input(INPUT_POST, "status_classes") ?: "";
+ $status_active = filter_input(INPUT_POST, "status_active", FILTER_VALIDATE_BOOLEAN) ?: false;
+ $status_default = filter_input(INPUT_POST, "status_default", FILTER_VALIDATE_BOOLEAN) ?: false;
+
+ // Verify the Status
+
+ $status = $this->getStatus($status_serial);
+
+ if ($status->count() == 0) {
+ $this->logError("Invalid Status ({$status_serial}). " . __METHOD__);
+ }
+
+ $SQL = "update statuses
+ set status_name = :status_name,
+ status_classes = :status_classes,
+ status_active = :status_active,
+ status_default = :status_default,
+ status_changer = :status_changer,
+ status_changed = :status_changed
+ where status_serial = :status_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":status_serial", $status_serial);
+ $statement->bindValue(":status_name", $status_name);
+ $statement->bindValue(":status_classes", $status_classes);
+ $statement->bindValue(":status_active", $status_active, PDO::PARAM_BOOL);
+ $statement->bindValue(":status_default", $status_default, PDO::PARAM_BOOL);
+ $statement->bindValue(":status_changer", $this->current_user_name);
+ $statement->bindValue(":status_changed", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ================================
+ // Return an Active Statuses Object
+ // ================================
+
+ public function getActiveStatuses() {
+
+ $SQL = "select view_statuses.*
+ from view_statuses
+ where status_active is true";
+
+ return $this->getTable("statuses", $SQL);
+ }
+
+ // -------------------------
+ // Return the Default Status
+ // -------------------------
+
+ public function getDefaultStatus() {
+
+ $SQL = "select status_serial
+ from view_statuses
+ where status_default is true";
+
+ return $this->getTable("statuses", $SQL);
+ }
+
+ // =======================
+ // Return an Status Object
+ // =======================
+
+ public function getStatus($status_serial = 0) {
+
+ $SQL = "select view_statuses.*
+ from view_statuses
+ where status_serial = {$status_serial}";
+
+ return $this->getTable("statuses", $SQL);
+ }
+
+ // ===========================
+ // Return a Statuss Object
+ // ===========================
+
+ public function getStatuses() {
+
+ $SQL = "select view_statuses.*
+ from view_statuses";
+
+ return $this->getTable("statuses", $SQL);
+ }
+
+ // ============================
+ // Return a Statuss Page Object
+ // ============================
+
+ public function getStatusesPage() {
+
+ // Find Criteria
+
+ $find_status = filter_input(INPUT_POST, "find_status") ?: "";
+ $find_status = $this->sanitizeString($find_status);
+
+ $find_words = implode("|", explode(" ", $find_status));
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_statuses
+ where status_name regexp :status_name
+ or status_classes regexp :status_classes";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":status_name", $find_words);
+ $statement->bindValue(":status_classes", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_statuses.*
+ from view_statuses
+ where status_name regexp :status_name
+ or status_classes regexp :status_classes
+ order by status_name
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":status_name", $find_words);
+ $statement->bindValue(":status_classes", $find_words);
+
+ $statement->execute();
+
+ $statuses = $this->getTableXML("statuses", $statement);
+
+ // Insert Pagination Attributes
+
+ $statuses->addAttribute("count", $count);
+ $statuses->addAttribute("start", $start);
+ $statuses->addAttribute("end", $end);
+ $statuses->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $statuses;
+ }
+
+ // ==============
+ // Setup Statuses
+ // ==============
+
+ public function setupStatuses() {
+
+ $statuses = $this->getStatusesPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($statuses, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupStatuses"));
+
+ $this->displayContent($content);
+ }
+}
+
+?>
diff --git a/classes/Subscriptions.php b/classes/Subscriptions.php
new file mode 100644
index 0000000..2eac4c2
--- /dev/null
+++ b/classes/Subscriptions.php
@@ -0,0 +1,662 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ===================
+ // Setup Subscriptions
+ // ===================
+
+ public function setupSubscriptions() {
+
+ $subscriptions = $this->getSubscriptionsPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($subscriptions, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("setupSubscriptions"));
+
+ $this->displayContent($content);
+ }
+
+ // =========================
+ // Go To Subscription Driver
+ // =========================
+
+ public function goToSubscription($subscription_serial = 0) {
+
+ $subscription_serial = (integer) filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $subscription = $this->getSubscription($subscription_serial);
+
+ if ($subscription->count() === 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}): " . __METHOD__);
+ }
+
+ switch ($subscription_serial) {
+
+ case 5:
+
+ $_SESSION['subscription_serial'] = $subscription_serial;
+
+ (new PermitsByBuilder())->searchPermits($subscription_serial);
+
+ break;
+
+ case 7:
+
+ $_SESSION['subscription_serial'] = $subscription_serial;
+
+ (new PermitsBySubdivision())->searchPermits($subscription_serial);
+
+ break;
+
+ case 9:
+
+ $project_type = "SingleFamily";
+ $area = "South";
+
+ (new PermitsByBuilder())->searchPermits($project_type, $area);
+
+ break;
+
+ case 10:
+
+ $project_type = "SingleFamily";
+ $area = "South";
+
+ (new PermitsBySubdivision())->searchPermits($project_type, $area);
+
+ break;
+
+ case 11:
+
+ $project_type = "SingleFamily";
+ $area = "All";
+
+ (new PermitsByBuilder())->searchPermits($project_type, $area);
+
+ break;
+
+ case 12:
+
+ $project_type = "SingleFamily";
+ $area = "All";
+
+ (new PermitsBySubdivision())->searchPermits($project_type, $area);
+
+ break;
+
+ case 13:
+
+ $project_type = "MultiFamily";
+ $area = "South";
+
+ (new PermitsByBuilder())->searchPermits($project_type, $area);
+
+ break;
+
+ case 14:
+
+ $project_type = "MultiFamily";
+ $area = "South";
+
+ (new PermitsBySubdivision())->searchPermits($project_type, $area);
+
+ break;
+
+ case 15:
+
+ $project_type = "MultiFamily";
+ $area = "North";
+
+ (new PermitsByBuilder())->searchPermits($project_type, $area);
+
+ break;
+
+ case 16:
+
+ $project_type = "MultiFamily";
+ $area = "North";
+
+ (new PermitsBySubdivision())->searchPermits($project_type, $area);
+
+ break;
+ }
+ }
+
+ // ================
+ // Add Subscription
+ // ================
+
+ public function addSubscription() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $constants = $this->getConstants();
+
+ $content = $this->applyXSL($constants, $this->getXSL("addSubscription"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $subscription_title = filter_input(INPUT_POST, "subscription_title") ?: "";
+ $subscription_description = filter_input(INPUT_POST, "subscription_description") ?: "";
+ $subscription_projecttype = filter_input(INPUT_POST, "subscription_projecttype") ?: "";
+ $subscription_area = filter_input(INPUT_POST, "subscription_area") ?: "";
+
+ $SQL = "insert into subscriptions
+
+ ( subscription_title,
+ subscription_description,
+ subscription_projecttype,
+ subscription_area,
+ subscription_creator,
+ subscription_created )
+
+ VALUES ( :subscription_title,
+ :subscription_description,
+ :subscription_projecttype,
+ :subscription_area,
+ :subscription_creator,
+ :subscription_created )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":subscription_title", $subscription_title);
+ $statement->bindValue(":subscription_description", $subscription_description);
+ $statement->bindValue(":subscription_projecttype", $subscription_projecttype);
+ $statement->bindValue(":subscription_area", $subscription_area);
+ $statement->bindValue(":subscription_creator", $this->current_user_name);
+ $statement->bindValue(":subscription_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =================
+ // Edit Subscription
+ // =================
+
+ public function editSubscription() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $subscription_serial = (integer) filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $subscription = $this->getSubscription($subscription_serial);
+
+ if ($subscription->count() === 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}): " . __METHOD__);
+ }
+
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($constants, "");
+ $XML = $this->mergeXML($subscription, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editSubscription"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $subscription_title = filter_input(INPUT_POST, "subscription_title") ?: "";
+ $subscription_description = filter_input(INPUT_POST, "subscription_description") ?: "";
+ $subscription_projecttype = filter_input(INPUT_POST, "subscription_projecttype") ?: "";
+ $subscription_area = filter_input(INPUT_POST, "subscription_area") ?: "";
+
+ $subscriptions = $this->getSubscription($subscription_serial);
+
+ if ($subscriptions->count() == 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}): " . __METHOD__);
+ }
+
+ // Update the Subscription
+
+ $SQL = "update subscriptions
+ set subscription_title = :subscription_title,
+ subscription_description = :subscription_description,
+ subscription_projecttype = :subscription_projecttype,
+ subscription_area = :subscription_area
+ where subscription_serial = :subscription_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":subscription_serial", $subscription_serial);
+ $statement->bindValue(":subscription_title", $subscription_title);
+ $statement->bindValue(":subscription_description", $subscription_description);
+ $statement->bindValue(":subscription_projecttype", $subscription_projecttype);
+ $statement->bindValue(":subscription_area", $subscription_area);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ===================
+ // Delete Subscription
+ // ===================
+
+ public function deleteSubscription() {
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $subscription = $this->getSubscription($subscription_serial);
+
+ if ($subscription->count() == 0) {
+ $this->logError("Invalid Subscription ({$subscription_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from subscriptions
+ where subscription_serial = {$subscription_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ========================
+ // Add Subscription to User
+ // ========================
+
+ public function addSubscriptionToUser() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $user_serial = filter_input(INPUT_POST, "user_reference", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $user = (new Users())->getUser($user_serial);
+ $subscriptions = $this->getSubscriptions();
+
+ $XML = $this->mergeXML($user, "");
+ $XML = $this->mergeXML($subscriptions, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("addSubscriptionToUser"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $subscription_stop_date = filter_input(INPUT_POST, "subscription_stop_date") ?: "";
+
+ $subscription_stop_date = date("Y-m-d", strtotime($subscription_stop_date));
+
+ $SQL = "insert into usersubscriptions
+
+ ( usersubscription_user_serial,
+ usersubscription_subscription_serial,
+ usersubscription_stop_date,
+ usersubscription_origin,
+ usersubscription_timestamp )
+
+ VALUES ( :usersubscription_user_serial,
+ :usersubscription_subscription_serial,
+ :usersubscription_stop_date,
+ :usersubscription_origin,
+ :usersubscription_timestamp )";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":usersubscription_user_serial", $user_serial);
+ $statement->bindValue(":usersubscription_subscription_serial", $subscription_serial);
+ $statement->bindValue(":usersubscription_stop_date", $subscription_stop_date);
+ $statement->bindValue(":usersubscription_timestamp", $this->getTimestamp());
+ $statement->bindValue(":usersubscription_origin", $this->current_user_name);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =========================
+ // Edit a Users Subscription
+ // =========================
+
+ public function editUsersSubscription() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $usersubscription_serial = filter_input(INPUT_POST, "usersubscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $user = (new Users())->getUser($user_serial);
+ $usersubscription = $this->getUsersSubscription($usersubscription_serial);
+ $subscriptions = $this->getSubscriptions();
+
+ $XML = $this->mergeXML($user, "");
+ $XML = $this->mergeXML($usersubscription, $XML);
+ $XML = $this->mergeXML($subscriptions, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editUsersSubscription"));
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $usersubscription_serial = filter_input(INPUT_POST, "usersubscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $subscription_stop_date = filter_input(INPUT_POST, "subscription_stop_date") ?: "";
+
+ $subscription_stop_date = date("Y-m-d", strtotime($subscription_stop_date));
+
+ $SQL = "update usersubscriptions
+ set usersubscription_stop_date = :usersubscription_stop_date,
+ usersubscription_subscription_serial = :usersubscription_subscription_serial,
+ usersubscription_origin = :usersubscription_origin,
+ usersubscription_timestamp = :usersubscription_timestamp
+ where usersubscription_serial = :usersubscription_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":usersubscription_stop_date", $subscription_stop_date);
+ $statement->bindValue(":usersubscription_subscription_serial", $subscription_serial);
+ $statement->bindValue(":usersubscription_origin", $this->current_user_name);
+ $statement->bindValue(":usersubscription_timestamp", $this->getTimestamp());
+ $statement->bindValue(":usersubscription_serial", $usersubscription_serial);
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =========================
+ // Delete Users Subscription
+ // =========================
+
+ public function deleteUsersSubscription() {
+
+ $usersubscription_serial = filter_input(INPUT_POST, "usersubscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $subscription = $this->getUsersSubscription($usersubscription_serial);
+
+ if ($subscription->count() == 0) {
+ $this->logError("Invalid Subscription ({$usersubscription_serial}). " . __METHOD__);
+ }
+
+ $SQL = "delete from usersubscriptions
+ where usersubscription_serial = {$usersubscription_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // ============================
+ // Return a Subscription Object
+ // ============================
+
+ public function getSubscription($subscription_serial = 0) {
+
+ $SQL = "select view_subscriptions.*
+ from view_subscriptions
+ where subscription_serial = {$subscription_serial}";
+
+ return $this->getTable("subscriptions", $SQL);
+ }
+
+ // ============================
+ // Return a Subscription Object
+ // ============================
+
+ public function getSubscriptions() {
+
+ $SQL = "select view_subscriptions.*
+ from view_subscriptions";
+
+ return $this->getTable("subscriptions", $SQL);
+ }
+
+ // ==================================
+ // Return a Subscriptions Page Object
+ // ==================================
+
+ public function getSubscriptionsPage() {
+
+ // Find Criteria
+
+ $find_subscription = filter_input(INPUT_POST, "find_subscription") ?: "";
+ $find_subscription = $this->sanitizeString($find_subscription);
+
+ $find_words = implode("|", explode(" ", $find_subscription));
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_subscriptions
+ where subscription_title regexp :subscription_title
+ or subscription_description regexp :subscription_description
+ or subscription_projecttype regexp :subscription_projecttype
+ or subscription_area regexp :subscription_area";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":subscription_title", $find_words);
+ $statement->bindValue(":subscription_description", $find_words);
+ $statement->bindValue(":subscription_projecttype", $find_words);
+ $statement->bindValue(":subscription_area", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_subscriptions.*
+ from view_subscriptions
+ where subscription_title regexp :subscription_title
+ or subscription_description regexp :subscription_description
+ or subscription_projecttype regexp :subscription_projecttype
+ or subscription_area regexp :subscription_area
+ order by subscription_title
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":subscription_title", $find_words);
+ $statement->bindValue(":subscription_description", $find_words);
+ $statement->bindValue(":subscription_projecttype", $find_words);
+ $statement->bindValue(":subscription_area", $find_words);
+
+ $statement->execute();
+
+ $subscriptions = $this->getTableXML("subscriptions", $statement);
+
+ // Insert Pagination Attributes
+
+ $subscriptions->addAttribute("count", $count);
+ $subscriptions->addAttribute("start", $start);
+ $subscriptions->addAttribute("end", $end);
+ $subscriptions->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $subscriptions;
+ }
+
+ // ==================
+ // User Subscriptions
+ // ==================
+
+ public function userSubscriptions() {
+
+ $subscriptions = $this->getUsersActiveSubscriptions($this->current_user_serial);
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($subscriptions, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("userSubscriptions"));
+
+ $this->displayContent($content);
+ }
+
+ // ============================
+ // Return a Users Subscriptions
+ // ============================
+
+ public function getUsersActiveSubscriptions($user_serial) {
+
+ $SQL = "select view_usersubscriptions.*
+ from view_usersubscriptions
+ where usersubscription_user_serial = {$user_serial}
+ and view_usersubscriptions.usersubscription_status = 'ACTIVE'
+ and view_usersubscriptions.usersubscription_stop_date >= now()
+ order by view_usersubscriptions.subscription_title, view_usersubscriptions.usersubscription_status";
+
+ return $this->getTable("usersubscriptions", $SQL);
+ }
+
+ // ============================
+ // Return a Users Subscriptions
+ // ============================
+
+ public function getAllUsersSubscriptions($user_serial) {
+
+ $SQL = "select view_usersubscriptions.*
+ from view_usersubscriptions
+ where usersubscription_user_serial = {$user_serial}
+ order by view_usersubscriptions.usersubscription_status, view_usersubscriptions.subscription_title";
+
+ return $this->getTable("usersubscriptions", $SQL);
+ }
+
+ // ===========================
+ // Return a Users Subscription
+ // ===========================
+
+ public function getUsersSubscription($usersubscription_serial) {
+
+ $SQL = "select view_usersubscriptions.*
+ from view_usersubscriptions
+ where usersubscription_serial = {$usersubscription_serial}";
+
+ return $this->getTable("usersubscription", $SQL);
+ }
+
+ // ==================================
+ // Determine if a Subscription exists
+ // ==================================
+
+ public function subscriptionExists() {
+
+ $subscription_serial = filter_input(INPUT_POST, "subscription_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $subscription_title = filter_input(INPUT_POST, "subscription_title") ?: "";
+
+ $SQL = "select subscription_serial
+ from view_subscriptions
+ where subscription_serial != :subscription_serial
+ and lower(subscription_title) = :subscription_title";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":subscription_serial", $subscription_serial);
+ $statement->bindValue(":subscription_title", strtolower($subscription_title));
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+}
+
+?>
diff --git a/classes/SupportTickets.php b/classes/SupportTickets.php
new file mode 100644
index 0000000..eec68b4
--- /dev/null
+++ b/classes/SupportTickets.php
@@ -0,0 +1,312 @@
+current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ====================
+ // View Support Tickets
+ // ====================
+
+ public function viewSupportTickets() {
+
+ $supporttickets = $this->getSupportTicketsPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($supporttickets, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("viewSupportTickets"));
+
+ $this->displayContent($content);
+ }
+
+ // ======================
+ // Support Ticket Summary
+ // ======================
+
+ public function viewSupportTicketSummary() {
+
+ $supportticket_serial = filter_input(INPUT_POST, "supportticket_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $supportticket = $this->getSupportTicket($supportticket_serial);
+
+ if ($supportticket->count() == 0) {
+ $this->logError("Invalid Support Ticket ({$supportticket_serial}). " . __METHOD__);
+ }
+
+ $user_name = $supportticket->record->supportticket_creator;
+
+ $user = (new Users())->getUserByUserName($user_name);
+
+ $XML = $this->mergeXML($supportticket, "");
+ $XML = $this->mergeXML($user, $XML);
+
+// echo $XML;
+// die();
+
+ $content = $this->applyXSL($XML, $this->getXSL("ticketSummary"));
+
+ $this->displayContent($content);
+ }
+
+ // ====================================
+ // Return a Support Tickets Page Object
+ // ====================================
+
+ public function getSupportTicketsPage() {
+
+ // Find Criteria
+
+ $find_supportticket = filter_input(INPUT_POST, "find_supportticket") ?: "";
+ $find_supportticket = $this->sanitizeString($find_supportticket);
+
+ $this->pagination_size = filter_input(INPUT_POST, "supporttickets_per_page", FILTER_SANITIZE_NUMBER_INT) ?: $this->pagination_size;
+
+ $supporttickets_order_by = filter_input(INPUT_POST, "supporttickets_order_by") ?: "";
+ $supporttickets_order_direction = filter_input(INPUT_POST, "supporttickets_order_direction") ?: "";
+
+ if ($supporttickets_order_by === "") {
+ $orderby = "supportticket_serial desc";
+ } else {
+ $orderby = $supporttickets_order_by . " " . $supporttickets_order_direction;
+ }
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_supporttickets
+ where supportticket_creator regexp :supportticket_creator
+ or supportticket_catagory_verbose regexp :supportticket_catagory_verbose
+ or supportticket_message regexp :supportticket_message
+ or supportticket_status regexp :supportticket_status
+ or supportticket_subject regexp :supportticket_subject";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":supportticket_creator", $find_supportticket);
+ $statement->bindValue(":supportticket_catagory_verbose", $find_supportticket);
+ $statement->bindValue(":supportticket_message", $find_supportticket);
+ $statement->bindValue(":supportticket_status", $find_supportticket);
+ $statement->bindValue(":supportticket_subject", $find_supportticket);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_supporttickets.*
+ from view_supporttickets
+ where supportticket_creator regexp :supportticket_creator
+ or supportticket_catagory_verbose regexp :supportticket_catagory_verbose
+ or supportticket_message regexp :supportticket_message
+ or supportticket_status regexp :supportticket_status
+ or supportticket_subject regexp :supportticket_subject
+ order by {$orderby}
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":supportticket_creator", $find_supportticket);
+ $statement->bindValue(":supportticket_catagory_verbose", $find_supportticket);
+ $statement->bindValue(":supportticket_message", $find_supportticket);
+ $statement->bindValue(":supportticket_status", $find_supportticket);
+ $statement->bindValue(":supportticket_subject", $find_supportticket);
+
+ $statement->execute();
+
+ $supporttickets = $this->getTableXML("supporttickets", $statement);
+
+ foreach ($supporttickets as $supportticket) {
+ $html_message = trim(strip_tags($supportticket->supportticket_message));
+ $supportticket->supportticket_message_raw = $html_message;
+ }
+
+
+ // Insert Pagination Attributes
+ $supporttickets->addAttribute("count", $count);
+ $supporttickets->addAttribute("start", $start);
+ $supporttickets->addAttribute("end", $end);
+ $supporttickets->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $supporttickets;
+ }
+
+ // ====================
+ // Start Support Ticket
+ // ====================
+
+ public function startSupportTicket() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $user = (new Users())->getUser($this->current_user_serial);
+ $dropdowns = (new Dropdowns())->getDropdowns();
+
+ $XML = $this->mergeXML($user, "");
+ $XML = $this->mergeXML($dropdowns, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("startSupportTicket"));
+ $this->displayContent($content);
+
+ break;
+
+ case "send":
+
+ $supportticket_subject = filter_input(INPUT_POST, "supportticket_subject") ?: "";
+ $supportticket_category = filter_input(INPUT_POST, "supportticket_category") ?: "";
+ $supportticket_category_other = filter_input(INPUT_POST, "supportticket_category_other") ?: "";
+ $supportticket_message = filter_input(INPUT_POST, "supportticket_message") ?: "";
+
+ $SQL = "insert into supporttickets
+
+ ( supportticket_subject,
+ supportticket_category,
+ supportticket_category_other,
+ supportticket_message,
+ supportticket_status,
+ supportticket_creator,
+ supportticket_created )
+
+ VALUES ( :supportticket_subject,
+ :supportticket_category,
+ :supportticket_category_other,
+ :supportticket_message,
+ :supportticket_status,
+ :supportticket_creator,
+ :supportticket_created )";
+
+ $connection = $this->connect();
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":supportticket_subject", $supportticket_subject);
+ $statement->bindValue(":supportticket_category", $supportticket_category);
+ $statement->bindValue(":supportticket_category_other", $supportticket_category_other);
+ $statement->bindValue(":supportticket_message", $supportticket_message);
+ $statement->bindValue(":supportticket_status", 5); // Dropdown value of the dropdown type 2 for ticket statuses
+ $statement->bindValue(":supportticket_creator", $this->current_user_name);
+ $statement->bindValue(":supportticket_created", $this->getTimestamp());
+
+ $statement->execute();
+
+ $supportticket_serial = $connection->lastInsertId();
+
+ // Send Email to Support Center
+ $this->sendNotifications($supportticket_serial);
+
+ $this->displayNotice("Support ticket submitted successfully. The Support team will respond as soon as possible.");
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // =============================================
+ // Send Support Center Ticket Notification Email
+ // =============================================
+
+ public function sendNotifications($supportticket_serial = 0) {
+
+ if (empty($supportticket_serial)) {
+ return;
+ }
+
+ $settings = $this->getSettings();
+
+ $Environment = (string) $settings->Environment;
+ $SupportEmail = (string) $settings->SupportEmail;
+
+ if ($Environment == "Development") {
+ return;
+ }
+
+ $supportticket = $this->getSupportTicket($supportticket_serial);
+
+ $to = $SupportEmail;
+ $subject = "Georgia Housing Report - Support Ticket Submittal";
+ $message = $this->applyXSL($supportticket, $this->getXSL("emailSupportTicket"));
+
+ // Send the Email
+ (new Email())->sendEmail($to, $subject, $message);
+ }
+
+ // ===============================
+ // Return an Support Ticket Object
+ // ===============================
+
+ public function getSupportTicket($supportticket_serial = 0) {
+
+ $SQL = "select view_supporttickets.*
+ from view_supporttickets
+ where view_supporttickets.supportticket_serial = {$supportticket_serial}";
+
+ return $this->getTable("supporttickets", $SQL);
+ }
+}
+
+?>
diff --git a/classes/Users.php b/classes/Users.php
new file mode 100644
index 0000000..5adde4a
--- /dev/null
+++ b/classes/Users.php
@@ -0,0 +1,748 @@
+current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+ $this->current_user_client_name = $_SESSION[self::USER_CLIENT_NAME] ?? "";
+
+ $this->pagination_page = $_SESSION[self::PAGINATION_PAGE] ?? 1;
+ }
+
+ // ===========
+ // Setup Users
+ // ===========
+
+ public function setupUsers() {
+
+ $users = $this->getUsersPage();
+ $popovers = (new Popovers())->getPopovers();
+
+ $XML = $this->mergeXML($users, "");
+ $XML = $this->mergeXML($popovers, $XML);
+
+ $html = $this->applyXSL($XML, $this->getXSL("setupUsers"));
+
+ $this->displayContent($html);
+ }
+
+ // ============
+ // User Summary
+ // ============
+
+ public function userSummary() {
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $user = $this->getUser($user_serial);
+
+ if ($user->count() == 0) {
+ $this->logError("Invalid User ({$user_serial}). " . __METHOD__);
+ }
+
+ $notes = (new Notes())->getAllNotes($user_serial);
+ $subscriptions = (new Subscriptions())->getAllUsersSubscriptions($user_serial);
+
+ $XML = $this->mergeXML($user, "");
+ $XML = $this->mergeXML($subscriptions, $XML);
+ $XML = $this->mergeXML($notes, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("userSummary"));
+
+ $this->displayContent($content);
+ }
+
+ // ========
+ // Add User
+ // ========
+
+ public function addUser() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $popovers = (new Popovers())->getPopovers();
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($popovers, "");
+ $XML = $this->mergeXML($constants, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("addUser"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "add":
+
+ $user_name = filter_input(INPUT_POST, "user_name") ?: "";
+ $user_client_name = filter_input(INPUT_POST, "user_client_name") ?: "";
+ $user_email = filter_input(INPUT_POST, "user_email") ?: "";
+ $user_role = filter_input(INPUT_POST, "user_role") ?: "";
+
+ $user_name = strtoupper(preg_replace("/\s+/", " ", $user_name));
+
+ $user_random_password = $this->generateRandomPassword();
+ $user_temp_password = password_hash($user_random_password, PASSWORD_DEFAULT);
+
+ $user_change_password = (boolean) true;
+ $user_active = (boolean) true;
+
+ // Add the User
+
+ $connection = $this->connect();
+
+ $SQL = "insert into users
+
+ ( user_name,
+ user_email,
+ user_client_name,
+ user_password,
+ user_role,
+ user_change_password,
+ user_active,
+ user_creator,
+ user_created )
+
+ values ( :user_name,
+ :user_email,
+ :user_client_name,
+ :user_password,
+ :user_role,
+ :user_change_password,
+ :user_active,
+ :user_creator,
+ :user_created )";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":user_name", $user_name);
+ $statement->bindValue(":user_email", $user_email);
+ $statement->bindValue(":user_client_name", $user_client_name);
+ $statement->bindValue(":user_password", $user_temp_password);
+ $statement->bindValue(":user_role", $user_role);
+ $statement->bindValue(":user_change_password", $user_change_password, PDO::PARAM_BOOL);
+ $statement->bindValue(":user_active", $user_active, PDO::PARAM_BOOL);
+ $statement->bindValue(":user_creator", $this->current_user_name);
+ $statement->bindValue(":user_created", $this->getTimestamp());
+
+ if (!$statement->execute()) {
+ trigger_error($statement->errorInfo()[2]);
+ }
+
+ $user = $this->getUserByUserName($user_name);
+
+ // Send User Credentials
+
+ (new Email())->emailNewUserCredentials($user, $user_random_password);
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ===========
+ // Delete User
+ // ===========
+
+ public function deleteUser() {
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $users = $this->getUser($user_serial);
+
+ if ($users->count() == 0) {
+ $this->logError("Invalid User ({$user_serial}): " . __METHOD__);
+ }
+
+ $SQL = "delete from users
+ where user_serial = {$user_serial}";
+
+ $this->executeSQL($SQL);
+ }
+
+ // =========
+ // Edit User
+ // =========
+
+ public function editUser() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $user_serial = (integer) filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $user = $this->getUser($user_serial);
+
+ if ($user->count() === 0) {
+ $this->logError("Invalid User ({$user_serial}): " . __METHOD__);
+ }
+
+ $popovers = (new Popovers())->getPopovers();
+ $constants = $this->getConstants();
+
+ $XML = $this->mergeXML($user, "");
+ $XML = $this->mergeXML($popovers, $XML);
+ $XML = $this->mergeXML($constants, $XML);
+
+ $content = $this->applyXSL($XML, $this->getXSL("editUser"));
+
+ $this->displayContent($content);
+
+ break;
+
+ case "update":
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $user_name = filter_input(INPUT_POST, "user_name") ?: "";
+ $user_email = filter_input(INPUT_POST, "user_email") ?: "";
+ $user_client_name = filter_input(INPUT_POST, "user_client_name") ?: "";
+ $user_role = filter_input(INPUT_POST, "user_role") ?: "";
+ $user_active = filter_input(INPUT_POST, "user_active", FILTER_VALIDATE_BOOLEAN) ?: false;
+
+ $users = $this->getUser($user_serial);
+
+ if ($users->count() == 0) {
+ $this->logError("Invalid User ({$user_serial}): " . __METHOD__);
+ }
+
+ // Update the User
+
+ $SQL = "update users
+ set user_name = :user_name,
+ user_email = :user_email,
+ user_client_name = :user_client_name,
+ user_role = :user_role,
+ user_active = :user_active,
+ user_changer = :user_changer,
+ user_changed = :user_changed
+ where user_serial = :user_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":user_serial", $user_serial);
+ $statement->bindValue(":user_name", $user_name);
+ $statement->bindValue(":user_email", $user_email);
+ $statement->bindValue(":user_client_name", $user_client_name);
+ $statement->bindValue(":user_role", $user_role);
+ $statement->bindValue(":user_active", $user_active, PDO::PARAM_BOOL);
+ $statement->bindValue(":user_changer", $this->current_user_name);
+ $statement->bindValue(":user_changed", $this->getTimestamp());
+
+ $statement->execute();
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ====================
+ // Return a User Object
+ // ====================
+
+ public function getUser($user_serial = 0) {
+
+ $SQL = "select view_users.*
+ from view_users
+ where user_serial = {$user_serial}";
+
+ return $this->getTable("users", $SQL);
+ }
+
+ // ====================
+ // Return a User Object
+ // ====================
+
+ public function getUserByUserName($user_name) {
+
+ $SQL = "select view_users.*
+ from view_users
+ where user_name = '{$user_name}'
+ or user_client_name = '{$user_name}'";
+
+ return $this->getTable("user", $SQL);
+ }
+
+ // ======================
+ // Return a User's Serial
+ // ======================
+
+ public function getUserSerial($user_id = "") {
+
+ $users = $this->getUserByUserId($user_id);
+
+ return ($users->count() === 0) ? 0 : (integer) $users->record->user_serial;
+ }
+
+ // =====================
+ // Return a Users Object
+ // =====================
+
+ public function getUsers() {
+
+ $SQL = "select view_users.*
+ from view_users";
+
+ return $this->getTable("users", $SQL);
+ }
+
+ // ==========================
+ // Return a Users Page Object
+ // ==========================
+
+ public function getUsersPage() {
+
+ // Find Criteria
+
+ $find_user = filter_input(INPUT_POST, "find_user") ?: "";
+ $find_user = $this->sanitizeString($find_user);
+
+ $find_words = implode("|", explode(" ", $find_user));
+
+ // Record Count
+
+ $connection = $this->connect();
+
+ $SQL = "select count(*) as count
+ from view_users
+ where user_name regexp :user_name
+ or user_client_name regexp :user_client_name
+ or user_email regexp :user_email
+ or user_role regexp :user_role";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":user_name", $find_words);
+ $statement->bindValue(":user_client_name", $find_words);
+ $statement->bindValue(":user_email", $find_words);
+ $statement->bindValue(":user_role", $find_words);
+
+ $statement->execute();
+
+ $recordset = $statement->fetch(PDO::FETCH_ASSOC);
+
+ $count = (count($recordset) > 0) ? (integer) $recordset["count"] : (integer) 0;
+
+ // Pagination
+
+ $pagination = filter_input(INPUT_POST, "pagination") ?: "";
+
+ switch ($pagination) {
+
+ case "first" : $this->pagination_page = 1;
+ break;
+ case "previous" : $this->pagination_page = max(($this->pagination_page - 1), 1);
+ break;
+ case "next" : $this->pagination_page = ($this->pagination_page + 1);
+ break;
+ case "last" : $this->pagination_page = ($count / $this->pagination_size);
+ break;
+ }
+
+ $offset = (($this->pagination_page * $this->pagination_size) - $this->pagination_size);
+ $start = ($offset + 1);
+ $end = min($count, (($start + $this->pagination_size) - 1));
+
+ // Data
+
+ $SQL = "select view_users.*
+ from view_users
+ where user_name regexp :user_name
+ or user_client_name regexp :user_client_name
+ or user_email regexp :user_email
+ or user_role regexp :user_role
+ limit {$this->pagination_size}
+ offset {$offset}";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":user_name", $find_words);
+ $statement->bindValue(":user_client_name", $find_words);
+ $statement->bindValue(":user_email", $find_words);
+ $statement->bindValue(":user_role", $find_words);
+
+ $statement->execute();
+
+ $users = $this->getTableXML("users", $statement);
+
+ // Insert Pagination Attributes
+
+ $users->addAttribute("count", $count);
+ $users->addAttribute("start", $start);
+ $users->addAttribute("end", $end);
+ $users->addAttribute("page", $this->pagination_page);
+
+ $_SESSION[self::PAGINATION_PAGE] = $this->pagination_page;
+
+ return $users;
+ }
+
+ // ===========================
+ // Return an User Object(AJAX)
+ // ===========================
+
+ public function getUser_AJAX($user_name = "") {
+
+ $user_name = filter_input(INPUT_POST, "user_name") ?: $user_name;
+
+ $users = $this->getUserByUserName($user_name);
+
+ // Create the User Object.
+
+ $User = array();
+
+ $User["exists"] = ($users->count() > 0) ? true : false;
+
+ if ($_SESSION[self::AJAX]) {
+ echo json_encode($User);
+ } else {
+ return $User;
+ }
+ }
+
+ // ==========================
+ // Determine if a User Exists
+ // ==========================
+
+ public function userExists() {
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $user_id = filter_input(INPUT_POST, "user_id") ?: "";
+
+ $user_id = strtolower(trim(preg_replace("/\s+/", " ", $user_id)));
+
+ $SQL = "select user_id
+ from view_users
+ where user_serial != :user_serial
+ and user_id = :user_id";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":user_serial", $user_serial);
+ $statement->bindValue(":user_id", $user_id);
+
+ $statement->execute();
+
+ $recordset = $statement->fetchAll(PDO::FETCH_ASSOC);
+
+ $exists = (count($recordset) > 0) ? true : false;
+
+ echo json_encode($exists);
+ }
+
+ // =============================
+ // Determine if a User is Active
+ // =============================
+
+ public function userActive() {
+
+ $user_serial = (integer) filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $SQL = "select request_serial
+ from requests
+ where request_user = {$user_serial}";
+
+ $requests = $this->getTable("requests", $SQL);
+
+ $active = ($requests->count() > 0) ? true : $active;
+
+ echo json_encode($active);
+ }
+
+ // ========================
+ // Login to the application
+ // ========================
+
+ public function login() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $XSLParms["BTN_SUBMIT"] = "main.php?action=Users.login&step=authenticate";
+ $XSLParms["INVALID_SIGNIN"] = "FALSE";
+
+ echo $this->applyXSL("", $this->getXSL("signIn"), $XSLParms);
+ exit();
+
+ break;
+
+ case "authenticate":
+
+ $user_name = filter_input(INPUT_POST, "user_name") ?: "";
+ $user_password = filter_input(INPUT_POST, "user_password") ?: "";
+
+ // The User must exist in the Users Table
+
+ $user = $this->getUserByUserName($user_name);
+
+ // Automatically deny authentication if user is inactive
+
+ if ($user->record->user_active == 0) {
+ $XSLParms["BTN_SUBMIT"] = "main.php?action=Users.signIn&step=authenticate";
+ $XSLParms["INVALID_SIGNIN"] = "TRUE";
+
+ echo $this->applyXSL("", $this->getXSL("signIn"), $XSLParms);
+ die();
+ }
+
+
+
+ if ($user->count() > 0) {
+
+ $stored_hashed_password = $user->record->user_password;
+
+ // Verify Password
+
+ if (password_verify($user_password, $stored_hashed_password)) {
+
+ $_SESSION[self::USER_AUTHENTICATED] = true;
+ $_SESSION[self::USER_SERIAL] = (integer) $user->record->user_serial;
+ $_SESSION[self::USER_ID] = (string) $user->record->user_id;
+ $_SESSION[self::USER_NAME] = (string) $user->record->user_name;
+ $_SESSION[self::USER_EMAIL] = (string) $user->record->user_email;
+ $_SESSION[self::USER_CLIENT_NAME] = (string) $user->record->user_client_name;
+ $_SESSION[self::USER_ROLE] = (string) $user->record->user_role;
+
+ $this->current_user_id = $_SESSION[self::USER_ID] ?? "";
+ $this->current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
+ $this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
+ $this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
+
+ // Determine if this is a System Administrator
+
+ if (count($this->getSettings()->xpath("//SystemAdministrator[. = '{$user_name}']")) > 0) {
+
+ $_SESSION[self::USER_ROLE] = "System Administrator";
+ }
+
+ // Create Journal Entry and finish
+ (new Journal())->journalEntry("{$_SESSION[self::USER_NAME]} logged in ({$_SESSION[self::USER_ROLE]}).");
+
+ $this->updateLogin();
+
+ header("Location: ./");
+ exit();
+ } else {
+
+ $XSLParms["BTN_SUBMIT"] = "main.php?action=Users.signIn&step=authenticate";
+ $XSLParms["INVALID_SIGNIN"] = "TRUE";
+
+ echo $this->applyXSL("", $this->getXSL("signIn"), $XSLParms);
+ die();
+ }
+ } else {
+
+ $XSLParms["BTN_SUBMIT"] = "main.php?action=Users.signIn&step=authenticate";
+ $XSLParms["INVALID_SIGNIN"] = "TRUE";
+
+ echo $this->applyXSL("", $this->getXSL("signIn"), $XSLParms);
+ die();
+ }
+ break;
+
+ default:
+ // User NOT Validated.
+ header("Location: ./");
+ exit();
+ }
+ }
+
+ // ===============
+ // Change Password
+ // ===============
+
+ public function changePassword() {
+
+ $step = filter_input(INPUT_POST, "step") ?: "prompt";
+
+ switch ($step) {
+
+ case "prompt":
+
+ $popovers = (new Popovers())->getPopovers();
+ $XML = $this->mergeXML($popovers, "");
+
+ $content = $this->applyXSL($XML, $this->getXSL("changePassword"));
+ $this->displayContent($content);
+
+ break;
+
+ case "change":
+
+ $user_serial = $_SESSION[self::USER_SERIAL];
+ $user_new_password = filter_input(INPUT_POST, "user_new_password") ?: "";
+ $user_verify_password = filter_input(INPUT_POST, "user_verify_password") ?: "";
+
+ if (!$user_new_password == $user_verify_password) {
+ $this->initializeSession();
+ }
+
+ $user_new_hashed_password = password_hash($user_new_password, PASSWORD_DEFAULT);
+
+ // Update User Password
+
+ $connection = $this->connect();
+
+ $SQL = "update users
+ set user_password = :user_password,
+ user_change_password = :user_change_password,
+ user_changer = :user_changer,
+ user_changed = :user_changed
+ where user_serial = :user_serial";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":user_serial", $user_serial);
+ $statement->bindValue(":user_password", $user_new_hashed_password);
+ $statement->bindValue(":user_change_password", 0);
+ $statement->bindValue(":user_changer", $this->current_user_name);
+ $statement->bindValue(":user_changed", $this->getTimestamp());
+
+ if (!$statement->execute()) {
+ $this->debug($statement->errorInfo()[2]);
+ }
+
+ (new Journal())->journalEntry("{$_SESSION[self::USER_NAME]} changed their password.");
+
+ break;
+
+ default:
+
+ $this->displayHome();
+ }
+ }
+
+ // ==============
+ // Reset Password
+ // ==============
+
+ public function resetPassword() {
+
+ $reset = false;
+
+ $user_serial = filter_input(INPUT_POST, "user_serial") ?: "";
+
+ $user = $this->getUser($user_serial);
+
+ $user_name = $user->record->user_name;
+
+ $user_random_password = $this->generateRandomPassword();
+ $user_temp_password = password_hash($user_random_password, PASSWORD_DEFAULT);
+
+ // Update User Password
+
+ $connection = $this->connect();
+
+ $SQL = "update users
+ set user_password = :user_password,
+ user_change_password = :user_change_password
+ where user_serial = :user_serial";
+
+ $statement = $connection->prepare($SQL);
+
+ $statement->bindValue(":user_serial", $user_serial);
+ $statement->bindValue(":user_password", $user_temp_password);
+ $statement->bindValue(":user_change_password", 1);
+
+ if (!$statement->execute()) {
+ $this->debug($statement->errorInfo()[2]);
+ } else {
+ $reset = true;
+ }
+
+ // Send User Credentials
+
+ (new Email())->emailUserPasswordResetLink($user, $user_random_password);
+
+ (new Journal())->journalEntry("{$_SESSION[self::USER_NAME]} reset {$user_name}'s password.");
+
+ echo json_encode($reset);
+ }
+
+ // ===============================================
+ // Update the Login timestamp for the current User
+ // ===============================================
+
+ public function updateLogin() {
+
+ $SQL = "update users
+ set user_login = :user_login
+ where user_serial = :user_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":user_login", $this->getTimestamp());
+ $statement->bindValue(":user_serial", $this->current_user_serial);
+
+ $statement->execute();
+ }
+
+ // ====================
+ // Update Active Status
+ // ====================
+
+ public function updateActiveStatus() {
+
+ $user_serial = filter_input(INPUT_POST, "user_serial", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+ $user_active = filter_input(INPUT_POST, "user_active", FILTER_SANITIZE_NUMBER_INT) ?: 0;
+
+ $SQL = "update users
+ set user_active = :user_active,
+ user_changed = :user_changed,
+ user_changer = :user_changer
+ where user_serial = :user_serial";
+
+ $statement = $this->connect()->prepare($SQL);
+
+ $statement->bindValue(":user_serial", $user_serial);
+ $statement->bindValue(":user_active", $user_active);
+ $statement->bindValue(":user_changed", $this->getTimestamp());
+ $statement->bindValue(":user_changer", $this->current_user_name);
+
+ if (!$statement->execute()) {
+ error_log($statement->errorInfo()[2]);
+ }
+ }
+}
+
+?>
diff --git a/css/base.css b/css/base.css
new file mode 100644
index 0000000..433ff42
--- /dev/null
+++ b/css/base.css
@@ -0,0 +1,330 @@
+
+.navbar.bg-primary {
+ background-image: none;
+}
+
+.navbar-dark,
+.navbar[data-bs-theme=dark] {
+ --bs-navbar-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.95);
+}
+
+.btn-primary {
+ background-image: none;
+}
+
+.btn-primary:not(.disabled):hover {
+ background-image: none;
+}
+
+.table {
+ --bs-table-color: var(--bs-body-color);
+ --bs-table-striped-color: var(--bs-body-color);
+ --bs-table-hover-color: var(--bs-body-color);
+}
+
+.content {
+ margin-top: 5rem;
+}
+
+.content .navbar {
+ min-height: 4rem;
+}
+
+.content .user-dropdown {
+ margin-left: 0 !important;
+}
+
+.content footer {
+ line-height: 1;
+}
+
+.content #btnTop {
+ display: none;
+ position: fixed;
+ bottom: 2em;
+ right: 4em;
+ z-index: 9999;
+}
+
+.nav-link.disabled {
+ color: rgba(255,255,255,.8) !important;
+}
+
+@media (min-width: 768px) {
+
+ .content .navbar {
+ min-height: 4rem;
+ }
+
+}
+
+@media (max-width: 991.98px) {
+
+ .nav-link.disabled {
+ display: none;
+ }
+
+}
+
+i.bi {
+ -webkit-text-stroke: .3px;
+}
+
+[data-bs-toggle="collapse"] i.caret-toggle::before {
+ transform: rotate(90deg) !important;
+}
+
+[data-bs-toggle="collapse"].collapsed i.caret-toggle::before {
+ transform: rotate(0deg) !important;
+}
+
+.tooltip {
+ pointer-events: none;
+}
+
+.tooltip-inner {
+ max-width: 100% !important;
+}
+
+.alert {
+ display: inline-block;
+}
+
+textarea {
+ resize: none;
+}
+
+textarea-scroll {
+ overflow-y: scroll;
+ resize: none;
+}
+
+.datepicker {
+ font-size: 1rem;
+ padding: 10px !important;
+}
+
+.datepicker table tr td.highlighted-dates {
+ background-color: #99ccff;
+ border-radius: 0;
+}
+
+button.form-select {
+ background: none !important;
+ padding-right: .50rem !important;
+ background-color: #ffffff !important;
+}
+
+.bs-searchbox .form-control {
+ font-size: .875rem;
+ height: 2rem;
+}
+
+.bootstrap-select .dropdown-menu a.dropdown-item {
+ font-size: .875rem;
+ padding: 0rem 1.5rem;
+}
+
+.none-available {
+ font-size: 1rem;
+ display: none;
+ display: inline-block;
+}
+
+.dropdown-header {
+ font-size: 1.2rem;
+ padding: .1rem 1.5rem;
+}
+
+.dropdown-item {
+ font-size: 14px;
+}
+
+.base-table {
+ font-size: .875rem;
+ margin-bottom: 0px;
+}
+
+.base-table thead,
+.base-table tbody,
+.base-table thead th,
+.base-table tbody td,
+.base-table tbody tr {
+ border: none;
+}
+
+.base-table th,
+.base-table td {
+ padding: .10rem;
+ padding-left: .5rem;
+}
+
+.base-table th:last-child,
+.base-table td:last-child {
+ padding-right: .5rem;
+}
+
+.base-table th {
+ border: none;
+ text-decoration: underline;
+}
+
+.base-table tbody tr.hoverable:hover {
+ cursor: pointer;
+}
+
+.base-table td.hidden {
+ display: none;
+}
+
+.fixed-table {
+ table-layout: fixed;
+ width: 100%;
+}
+
+.fixed-table td {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ width: 100%;
+ max-width: 100%;
+}
+
+table.table-auto {
+ width: auto !important;
+ table-layout: auto !important;
+}
+
+table.table-auto thead th, table.table-auto tfoot th {
+ width: auto !important;
+}
+
+table.table-auto thead th:not(:last-of-type), table.table-auto tfoot th:not(:last-of-type) {
+ padding-right: 1.5rem !important;
+}
+
+table.table-auto tbody td, table.table-auto tfoot td {
+ width: auto !important;
+}
+
+table.table-auto tbody td:not(:last-of-type), table.table-auto tfoot td:not(:last-of-type) {
+ padding-right: 1.5rem !important;
+}
+
+.fs-100 {
+ font-size: 1rem !important;
+}
+
+.fs-875 {
+ font-size: .875rem;
+}
+
+.fs-750 {
+ font-size: .750rem;
+}
+
+.pre-wrap {
+ white-space: pre-wrap;
+}
+
+.scrollable {
+ max-height: 50vh;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.scrollable-30 {
+ max-height: 30vh;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.scrollable-40 {
+ max-height: 40vh;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.scrollable-70 {
+ max-height: 70vh;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.modal-title {
+ width: 90%;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 90%;
+}
+
+.custom-popover {
+ --bs-popover-max-width: 400px;
+ --bs-popover-border-color: var(--bs-danger);
+ --bs-popover-header-bg: var(--bs-danger);
+ --bs-popover-header-color: var(--bs-white);
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ line-height: 1.3;
+ font-size: 1rem;
+}
+
+.custom-tooltip {
+ --bs-tooltip-color: var(--bs-white);
+ --bs-tooltip-bg: var(--bs-red);
+ font-size: 1rem;
+}
+
+.custom-popover p:last-of-type {
+ margin-bottom: 0;
+}
+
+.custom-tooltip p:last-of-type {
+ margin-bottom: 0;
+}
+
+.nav-tabs .nav-link {
+ padding: .35rem .5rem;
+ font-size: .875rem;
+}
+
+.form-control-xs {
+ min-height: 1em;
+ padding: 0.10rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.25rem;
+}
+
+.card-header-button {
+ padding: .25rem;
+ border: 2px solid white;
+ color: white;
+ margin-right: 5px;
+ margin-top: 1px;
+}
+
+/* Selection Checkboxes */
+
+.selection-checkboxes input[type=checkbox] {
+ opacity: 0;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+}
+
+.selection-checkboxes input[type=checkbox] + span:before {
+ content: "\f584";
+ font-family: bootstrap-icons;
+}
+
+.selection-checkboxes input[type=checkbox]:checked + span:before {
+ content: "\f26D";
+ color: #cd0200;
+ font-family: bootstrap-icons;
+}
+
+.manageRDI th.sortable:hover {
+ cursor: pointer;
+}
diff --git a/css/bootstrap-datepicker.css b/css/bootstrap-datepicker.css
new file mode 100644
index 0000000..c155527
--- /dev/null
+++ b/css/bootstrap-datepicker.css
@@ -0,0 +1,476 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker {
+ padding: 4px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ direction: ltr;
+}
+.datepicker-inline {
+ width: 220px;
+}
+.datepicker-rtl {
+ direction: rtl;
+}
+.datepicker-rtl.dropdown-menu {
+ left: auto;
+}
+.datepicker-rtl table tr td span {
+ float: right;
+}
+.datepicker-dropdown {
+ top: 0;
+ left: 0;
+}
+.datepicker-dropdown:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #999;
+ border-top: 0;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+}
+.datepicker-dropdown:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #fff;
+ border-top: 0;
+ position: absolute;
+}
+.datepicker-dropdown.datepicker-orient-left:before {
+ left: 6px;
+}
+.datepicker-dropdown.datepicker-orient-left:after {
+ left: 7px;
+}
+.datepicker-dropdown.datepicker-orient-right:before {
+ right: 6px;
+}
+.datepicker-dropdown.datepicker-orient-right:after {
+ right: 7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:before {
+ top: -7px;
+}
+.datepicker-dropdown.datepicker-orient-bottom:after {
+ top: -6px;
+}
+.datepicker-dropdown.datepicker-orient-top:before {
+ bottom: -7px;
+ border-bottom: 0;
+ border-top: 7px solid #999;
+}
+.datepicker-dropdown.datepicker-orient-top:after {
+ bottom: -6px;
+ border-bottom: 0;
+ border-top: 6px solid #fff;
+}
+.datepicker table {
+ margin: 0;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.datepicker td,
+.datepicker th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ border: none;
+}
+.table-striped .datepicker table tr td,
+.table-striped .datepicker table tr th {
+ background-color: transparent;
+}
+.datepicker table tr td.day:hover,
+.datepicker table tr td.day.focused {
+ background: #eee;
+ cursor: pointer;
+}
+.datepicker table tr td.old,
+.datepicker table tr td.new {
+ color: #999;
+}
+.datepicker table tr td.disabled,
+.datepicker table tr td.disabled:hover {
+ background: none;
+ color: #999;
+ cursor: default;
+}
+.datepicker table tr td.highlighted {
+ background: #d9edf7;
+ border-radius: 0;
+}
+.datepicker table tr td.today,
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today.disabled:hover {
+ background-color: #fde19a;
+ background-image: -moz-linear-gradient(to bottom, #fdd49a, #fdf59a);
+ background-image: -ms-linear-gradient(to bottom, #fdd49a, #fdf59a);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+ background-image: -webkit-linear-gradient(to bottom, #fdd49a, #fdf59a);
+ background-image: -o-linear-gradient(to bottom, #fdd49a, #fdf59a);
+ background-image: linear-gradient(to bottom, #fdd49a, #fdf59a);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+ border-color: #fdf59a #fdf59a #fbed50;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #000;
+}
+.datepicker table tr td.today:hover,
+.datepicker table tr td.today:hover:hover,
+.datepicker table tr td.today.disabled:hover,
+.datepicker table tr td.today.disabled:hover:hover,
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active,
+.datepicker table tr td.today.disabled,
+.datepicker table tr td.today:hover.disabled,
+.datepicker table tr td.today.disabled.disabled,
+.datepicker table tr td.today.disabled:hover.disabled,
+.datepicker table tr td.today[disabled],
+.datepicker table tr td.today:hover[disabled],
+.datepicker table tr td.today.disabled[disabled],
+.datepicker table tr td.today.disabled:hover[disabled] {
+ background-color: #fdf59a;
+}
+.datepicker table tr td.today:active,
+.datepicker table tr td.today:hover:active,
+.datepicker table tr td.today.disabled:active,
+.datepicker table tr td.today.disabled:hover:active,
+.datepicker table tr td.today.active,
+.datepicker table tr td.today:hover.active,
+.datepicker table tr td.today.disabled.active,
+.datepicker table tr td.today.disabled:hover.active {
+ background-color: #fbf069 \9;
+}
+.datepicker table tr td.today:hover:hover {
+ color: #000;
+}
+.datepicker table tr td.today.active:hover {
+ color: #fff;
+}
+.datepicker table tr td.range,
+.datepicker table tr td.range:hover,
+.datepicker table tr td.range.disabled,
+.datepicker table tr td.range.disabled:hover {
+ background: #eee;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.datepicker table tr td.range.today,
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today.disabled:hover {
+ background-color: #f3d17a;
+ background-image: -moz-linear-gradient(to bottom, #f3c17a, #f3e97a);
+ background-image: -ms-linear-gradient(to bottom, #f3c17a, #f3e97a);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
+ background-image: -webkit-linear-gradient(to bottom, #f3c17a, #f3e97a);
+ background-image: -o-linear-gradient(to bottom, #f3c17a, #f3e97a);
+ background-image: linear-gradient(to bottom, #f3c17a, #f3e97a);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
+ border-color: #f3e97a #f3e97a #edde34;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.datepicker table tr td.range.today:hover,
+.datepicker table tr td.range.today:hover:hover,
+.datepicker table tr td.range.today.disabled:hover,
+.datepicker table tr td.range.today.disabled:hover:hover,
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active,
+.datepicker table tr td.range.today.disabled,
+.datepicker table tr td.range.today:hover.disabled,
+.datepicker table tr td.range.today.disabled.disabled,
+.datepicker table tr td.range.today.disabled:hover.disabled,
+.datepicker table tr td.range.today[disabled],
+.datepicker table tr td.range.today:hover[disabled],
+.datepicker table tr td.range.today.disabled[disabled],
+.datepicker table tr td.range.today.disabled:hover[disabled] {
+ background-color: #f3e97a;
+}
+.datepicker table tr td.range.today:active,
+.datepicker table tr td.range.today:hover:active,
+.datepicker table tr td.range.today.disabled:active,
+.datepicker table tr td.range.today.disabled:hover:active,
+.datepicker table tr td.range.today.active,
+.datepicker table tr td.range.today:hover.active,
+.datepicker table tr td.range.today.disabled.active,
+.datepicker table tr td.range.today.disabled:hover.active {
+ background-color: #efe24b \9;
+}
+.datepicker table tr td.selected,
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected.disabled:hover {
+ background-color: #9e9e9e;
+ background-image: -moz-linear-gradient(to bottom, #b3b3b3, #808080);
+ background-image: -ms-linear-gradient(to bottom, #b3b3b3, #808080);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
+ background-image: -webkit-linear-gradient(to bottom, #b3b3b3, #808080);
+ background-image: -o-linear-gradient(to bottom, #b3b3b3, #808080);
+ background-image: linear-gradient(to bottom, #b3b3b3, #808080);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
+ border-color: #808080 #808080 #595959;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.selected:hover,
+.datepicker table tr td.selected:hover:hover,
+.datepicker table tr td.selected.disabled:hover,
+.datepicker table tr td.selected.disabled:hover:hover,
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active,
+.datepicker table tr td.selected.disabled,
+.datepicker table tr td.selected:hover.disabled,
+.datepicker table tr td.selected.disabled.disabled,
+.datepicker table tr td.selected.disabled:hover.disabled,
+.datepicker table tr td.selected[disabled],
+.datepicker table tr td.selected:hover[disabled],
+.datepicker table tr td.selected.disabled[disabled],
+.datepicker table tr td.selected.disabled:hover[disabled] {
+ background-color: #808080;
+}
+.datepicker table tr td.selected:active,
+.datepicker table tr td.selected:hover:active,
+.datepicker table tr td.selected.disabled:active,
+.datepicker table tr td.selected.disabled:hover:active,
+.datepicker table tr td.selected.active,
+.datepicker table tr td.selected:hover.active,
+.datepicker table tr td.selected.disabled.active,
+.datepicker table tr td.selected.disabled:hover.active {
+ background-color: #666666 \9;
+}
+.datepicker table tr td.active,
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+ background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: linear-gradient(to bottom, #08c, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td.active:hover,
+.datepicker table tr td.active:hover:hover,
+.datepicker table tr td.active.disabled:hover,
+.datepicker table tr td.active.disabled:hover:hover,
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active,
+.datepicker table tr td.active.disabled,
+.datepicker table tr td.active:hover.disabled,
+.datepicker table tr td.active.disabled.disabled,
+.datepicker table tr td.active.disabled:hover.disabled,
+.datepicker table tr td.active[disabled],
+.datepicker table tr td.active:hover[disabled],
+.datepicker table tr td.active.disabled[disabled],
+.datepicker table tr td.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker table tr td.active:active,
+.datepicker table tr td.active:hover:active,
+.datepicker table tr td.active.disabled:active,
+.datepicker table tr td.active.disabled:hover:active,
+.datepicker table tr td.active.active,
+.datepicker table tr td.active:hover.active,
+.datepicker table tr td.active.disabled.active,
+.datepicker table tr td.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker table tr td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.datepicker table tr td span:hover,
+.datepicker table tr td span.focused {
+ background: #eee;
+}
+.datepicker table tr td span.disabled,
+.datepicker table tr td span.disabled:hover {
+ background: none;
+ color: #999;
+ cursor: default;
+}
+.datepicker table tr td span.active,
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -ms-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#0044cc));
+ background-image: -webkit-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: -o-linear-gradient(to bottom, #08c, #0044cc);
+ background-image: linear-gradient(to bottom, #08c, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker table tr td span.active:hover,
+.datepicker table tr td span.active:hover:hover,
+.datepicker table tr td span.active.disabled:hover,
+.datepicker table tr td span.active.disabled:hover:hover,
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active,
+.datepicker table tr td span.active.disabled,
+.datepicker table tr td span.active:hover.disabled,
+.datepicker table tr td span.active.disabled.disabled,
+.datepicker table tr td span.active.disabled:hover.disabled,
+.datepicker table tr td span.active[disabled],
+.datepicker table tr td span.active:hover[disabled],
+.datepicker table tr td span.active.disabled[disabled],
+.datepicker table tr td span.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker table tr td span.active:active,
+.datepicker table tr td span.active:hover:active,
+.datepicker table tr td span.active.disabled:active,
+.datepicker table tr td span.active.disabled:hover:active,
+.datepicker table tr td span.active.active,
+.datepicker table tr td span.active:hover.active,
+.datepicker table tr td span.active.disabled.active,
+.datepicker table tr td span.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker table tr td span.old,
+.datepicker table tr td span.new {
+ color: #999;
+}
+.datepicker .datepicker-switch {
+ width: 145px;
+}
+.datepicker .datepicker-switch,
+.datepicker .prev,
+.datepicker .next,
+.datepicker tfoot tr th {
+ cursor: pointer;
+}
+.datepicker .datepicker-switch:hover,
+.datepicker .prev:hover,
+.datepicker .next:hover,
+.datepicker tfoot tr th:hover {
+ background: #eee;
+}
+.datepicker .prev.disabled,
+.datepicker .next.disabled {
+ visibility: hidden;
+}
+.datepicker .cw {
+ font-size: 10px;
+ width: 12px;
+ padding: 0 2px 0 5px;
+ vertical-align: middle;
+}
+.input-append.date .add-on,
+.input-prepend.date .add-on {
+ cursor: pointer;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+ margin-top: 3px;
+}
+.input-daterange input {
+ text-align: center;
+}
+.input-daterange input:first-child {
+ -webkit-border-radius: 3px 0 0 3px;
+ -moz-border-radius: 3px 0 0 3px;
+ border-radius: 3px 0 0 3px;
+}
+.input-daterange input:last-child {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+.input-daterange .add-on {
+ display: inline-block;
+ width: auto;
+ min-width: 16px;
+ height: 18px;
+ padding: 4px 5px;
+ font-weight: normal;
+ line-height: 18px;
+ text-align: center;
+ text-shadow: 0 1px 0 #fff;
+ vertical-align: middle;
+ background-color: #eee;
+ border: 1px solid #ccc;
+ margin-left: -5px;
+ margin-right: -5px;
+}
\ No newline at end of file
diff --git a/css/bootstrap-datepicker.min.css b/css/bootstrap-datepicker.min.css
new file mode 100644
index 0000000..be7c8c6
--- /dev/null
+++ b/css/bootstrap-datepicker.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.highlighted{background:#d9edf7;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{background-color:#fde19a;background-image:-moz-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:-o-linear-gradient(to bottom,#fdd49a,#fdf59a);background-image:linear-gradient(to bottom,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today:active,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today[disabled]{background-color:#fdf59a}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active{background-color:#fbf069\9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-ms-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f3c17a),to(#f3e97a));background-image:-webkit-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:-o-linear-gradient(to bottom,#f3c17a,#f3e97a);background-image:linear-gradient(to bottom,#f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active{background-color:#efe24b\9}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(to bottom,#b3b3b3,grey);background-image:-ms-linear-gradient(to bottom,#b3b3b3,grey);background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3b3b3),to(grey));background-image:-webkit-linear-gradient(to bottom,#b3b3b3,grey);background-image:-o-linear-gradient(to bottom,#b3b3b3,grey);background-image:linear-gradient(to bottom,#b3b3b3,grey);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:grey grey #595959;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected[disabled]{background-color:grey}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active{background-color:#666\9}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{background-color:#006dcc;background-image:-moz-linear-gradient(to bottom,#08c,#04c);background-image:-ms-linear-gradient(to bottom,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(to bottom,#08c,#04c);background-image:-o-linear-gradient(to bottom,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active:active,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active[disabled]{background-color:#04c}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active{background-color:#039\9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span.focused,.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{background-color:#006dcc;background-image:-moz-linear-gradient(to bottom,#08c,#04c);background-image:-ms-linear-gradient(to bottom,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(to bottom,#08c,#04c);background-image:-o-linear-gradient(to bottom,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#08c', endColorstr='#0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active[disabled]{background-color:#04c}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active{background-color:#039\9}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .next.disabled,.datepicker .prev.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:400;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}
diff --git a/css/bootstrap-icons.css b/css/bootstrap-icons.css
new file mode 100644
index 0000000..b63230c
--- /dev/null
+++ b/css/bootstrap-icons.css
@@ -0,0 +1,2018 @@
+@font-face {
+ font-display: block;
+ font-family: "bootstrap-icons";
+ src: url("./fonts/bootstrap-icons.woff2?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff2"),
+url("./fonts/bootstrap-icons.woff?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff");
+}
+
+.bi::before,
+[class^="bi-"]::before,
+[class*=" bi-"]::before {
+ display: inline-block;
+ font-family: bootstrap-icons !important;
+ font-style: normal;
+/* font-weight: normal !important; */
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ vertical-align: -.125em;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.bi-123::before { content: "\f67f"; }
+.bi-alarm-fill::before { content: "\f101"; }
+.bi-alarm::before { content: "\f102"; }
+.bi-align-bottom::before { content: "\f103"; }
+.bi-align-center::before { content: "\f104"; }
+.bi-align-end::before { content: "\f105"; }
+.bi-align-middle::before { content: "\f106"; }
+.bi-align-start::before { content: "\f107"; }
+.bi-align-top::before { content: "\f108"; }
+.bi-alt::before { content: "\f109"; }
+.bi-app-indicator::before { content: "\f10a"; }
+.bi-app::before { content: "\f10b"; }
+.bi-archive-fill::before { content: "\f10c"; }
+.bi-archive::before { content: "\f10d"; }
+.bi-arrow-90deg-down::before { content: "\f10e"; }
+.bi-arrow-90deg-left::before { content: "\f10f"; }
+.bi-arrow-90deg-right::before { content: "\f110"; }
+.bi-arrow-90deg-up::before { content: "\f111"; }
+.bi-arrow-bar-down::before { content: "\f112"; }
+.bi-arrow-bar-left::before { content: "\f113"; }
+.bi-arrow-bar-right::before { content: "\f114"; }
+.bi-arrow-bar-up::before { content: "\f115"; }
+.bi-arrow-clockwise::before { content: "\f116"; }
+.bi-arrow-counterclockwise::before { content: "\f117"; }
+.bi-arrow-down-circle-fill::before { content: "\f118"; }
+.bi-arrow-down-circle::before { content: "\f119"; }
+.bi-arrow-down-left-circle-fill::before { content: "\f11a"; }
+.bi-arrow-down-left-circle::before { content: "\f11b"; }
+.bi-arrow-down-left-square-fill::before { content: "\f11c"; }
+.bi-arrow-down-left-square::before { content: "\f11d"; }
+.bi-arrow-down-left::before { content: "\f11e"; }
+.bi-arrow-down-right-circle-fill::before { content: "\f11f"; }
+.bi-arrow-down-right-circle::before { content: "\f120"; }
+.bi-arrow-down-right-square-fill::before { content: "\f121"; }
+.bi-arrow-down-right-square::before { content: "\f122"; }
+.bi-arrow-down-right::before { content: "\f123"; }
+.bi-arrow-down-short::before { content: "\f124"; }
+.bi-arrow-down-square-fill::before { content: "\f125"; }
+.bi-arrow-down-square::before { content: "\f126"; }
+.bi-arrow-down-up::before { content: "\f127"; }
+.bi-arrow-down::before { content: "\f128"; }
+.bi-arrow-left-circle-fill::before { content: "\f129"; }
+.bi-arrow-left-circle::before { content: "\f12a"; }
+.bi-arrow-left-right::before { content: "\f12b"; }
+.bi-arrow-left-short::before { content: "\f12c"; }
+.bi-arrow-left-square-fill::before { content: "\f12d"; }
+.bi-arrow-left-square::before { content: "\f12e"; }
+.bi-arrow-left::before { content: "\f12f"; }
+.bi-arrow-repeat::before { content: "\f130"; }
+.bi-arrow-return-left::before { content: "\f131"; }
+.bi-arrow-return-right::before { content: "\f132"; }
+.bi-arrow-right-circle-fill::before { content: "\f133"; }
+.bi-arrow-right-circle::before { content: "\f134"; }
+.bi-arrow-right-short::before { content: "\f135"; }
+.bi-arrow-right-square-fill::before { content: "\f136"; }
+.bi-arrow-right-square::before { content: "\f137"; }
+.bi-arrow-right::before { content: "\f138"; }
+.bi-arrow-up-circle-fill::before { content: "\f139"; }
+.bi-arrow-up-circle::before { content: "\f13a"; }
+.bi-arrow-up-left-circle-fill::before { content: "\f13b"; }
+.bi-arrow-up-left-circle::before { content: "\f13c"; }
+.bi-arrow-up-left-square-fill::before { content: "\f13d"; }
+.bi-arrow-up-left-square::before { content: "\f13e"; }
+.bi-arrow-up-left::before { content: "\f13f"; }
+.bi-arrow-up-right-circle-fill::before { content: "\f140"; }
+.bi-arrow-up-right-circle::before { content: "\f141"; }
+.bi-arrow-up-right-square-fill::before { content: "\f142"; }
+.bi-arrow-up-right-square::before { content: "\f143"; }
+.bi-arrow-up-right::before { content: "\f144"; }
+.bi-arrow-up-short::before { content: "\f145"; }
+.bi-arrow-up-square-fill::before { content: "\f146"; }
+.bi-arrow-up-square::before { content: "\f147"; }
+.bi-arrow-up::before { content: "\f148"; }
+.bi-arrows-angle-contract::before { content: "\f149"; }
+.bi-arrows-angle-expand::before { content: "\f14a"; }
+.bi-arrows-collapse::before { content: "\f14b"; }
+.bi-arrows-expand::before { content: "\f14c"; }
+.bi-arrows-fullscreen::before { content: "\f14d"; }
+.bi-arrows-move::before { content: "\f14e"; }
+.bi-aspect-ratio-fill::before { content: "\f14f"; }
+.bi-aspect-ratio::before { content: "\f150"; }
+.bi-asterisk::before { content: "\f151"; }
+.bi-at::before { content: "\f152"; }
+.bi-award-fill::before { content: "\f153"; }
+.bi-award::before { content: "\f154"; }
+.bi-back::before { content: "\f155"; }
+.bi-backspace-fill::before { content: "\f156"; }
+.bi-backspace-reverse-fill::before { content: "\f157"; }
+.bi-backspace-reverse::before { content: "\f158"; }
+.bi-backspace::before { content: "\f159"; }
+.bi-badge-3d-fill::before { content: "\f15a"; }
+.bi-badge-3d::before { content: "\f15b"; }
+.bi-badge-4k-fill::before { content: "\f15c"; }
+.bi-badge-4k::before { content: "\f15d"; }
+.bi-badge-8k-fill::before { content: "\f15e"; }
+.bi-badge-8k::before { content: "\f15f"; }
+.bi-badge-ad-fill::before { content: "\f160"; }
+.bi-badge-ad::before { content: "\f161"; }
+.bi-badge-ar-fill::before { content: "\f162"; }
+.bi-badge-ar::before { content: "\f163"; }
+.bi-badge-cc-fill::before { content: "\f164"; }
+.bi-badge-cc::before { content: "\f165"; }
+.bi-badge-hd-fill::before { content: "\f166"; }
+.bi-badge-hd::before { content: "\f167"; }
+.bi-badge-tm-fill::before { content: "\f168"; }
+.bi-badge-tm::before { content: "\f169"; }
+.bi-badge-vo-fill::before { content: "\f16a"; }
+.bi-badge-vo::before { content: "\f16b"; }
+.bi-badge-vr-fill::before { content: "\f16c"; }
+.bi-badge-vr::before { content: "\f16d"; }
+.bi-badge-wc-fill::before { content: "\f16e"; }
+.bi-badge-wc::before { content: "\f16f"; }
+.bi-bag-check-fill::before { content: "\f170"; }
+.bi-bag-check::before { content: "\f171"; }
+.bi-bag-dash-fill::before { content: "\f172"; }
+.bi-bag-dash::before { content: "\f173"; }
+.bi-bag-fill::before { content: "\f174"; }
+.bi-bag-plus-fill::before { content: "\f175"; }
+.bi-bag-plus::before { content: "\f176"; }
+.bi-bag-x-fill::before { content: "\f177"; }
+.bi-bag-x::before { content: "\f178"; }
+.bi-bag::before { content: "\f179"; }
+.bi-bar-chart-fill::before { content: "\f17a"; }
+.bi-bar-chart-line-fill::before { content: "\f17b"; }
+.bi-bar-chart-line::before { content: "\f17c"; }
+.bi-bar-chart-steps::before { content: "\f17d"; }
+.bi-bar-chart::before { content: "\f17e"; }
+.bi-basket-fill::before { content: "\f17f"; }
+.bi-basket::before { content: "\f180"; }
+.bi-basket2-fill::before { content: "\f181"; }
+.bi-basket2::before { content: "\f182"; }
+.bi-basket3-fill::before { content: "\f183"; }
+.bi-basket3::before { content: "\f184"; }
+.bi-battery-charging::before { content: "\f185"; }
+.bi-battery-full::before { content: "\f186"; }
+.bi-battery-half::before { content: "\f187"; }
+.bi-battery::before { content: "\f188"; }
+.bi-bell-fill::before { content: "\f189"; }
+.bi-bell::before { content: "\f18a"; }
+.bi-bezier::before { content: "\f18b"; }
+.bi-bezier2::before { content: "\f18c"; }
+.bi-bicycle::before { content: "\f18d"; }
+.bi-binoculars-fill::before { content: "\f18e"; }
+.bi-binoculars::before { content: "\f18f"; }
+.bi-blockquote-left::before { content: "\f190"; }
+.bi-blockquote-right::before { content: "\f191"; }
+.bi-book-fill::before { content: "\f192"; }
+.bi-book-half::before { content: "\f193"; }
+.bi-book::before { content: "\f194"; }
+.bi-bookmark-check-fill::before { content: "\f195"; }
+.bi-bookmark-check::before { content: "\f196"; }
+.bi-bookmark-dash-fill::before { content: "\f197"; }
+.bi-bookmark-dash::before { content: "\f198"; }
+.bi-bookmark-fill::before { content: "\f199"; }
+.bi-bookmark-heart-fill::before { content: "\f19a"; }
+.bi-bookmark-heart::before { content: "\f19b"; }
+.bi-bookmark-plus-fill::before { content: "\f19c"; }
+.bi-bookmark-plus::before { content: "\f19d"; }
+.bi-bookmark-star-fill::before { content: "\f19e"; }
+.bi-bookmark-star::before { content: "\f19f"; }
+.bi-bookmark-x-fill::before { content: "\f1a0"; }
+.bi-bookmark-x::before { content: "\f1a1"; }
+.bi-bookmark::before { content: "\f1a2"; }
+.bi-bookmarks-fill::before { content: "\f1a3"; }
+.bi-bookmarks::before { content: "\f1a4"; }
+.bi-bookshelf::before { content: "\f1a5"; }
+.bi-bootstrap-fill::before { content: "\f1a6"; }
+.bi-bootstrap-reboot::before { content: "\f1a7"; }
+.bi-bootstrap::before { content: "\f1a8"; }
+.bi-border-all::before { content: "\f1a9"; }
+.bi-border-bottom::before { content: "\f1aa"; }
+.bi-border-center::before { content: "\f1ab"; }
+.bi-border-inner::before { content: "\f1ac"; }
+.bi-border-left::before { content: "\f1ad"; }
+.bi-border-middle::before { content: "\f1ae"; }
+.bi-border-outer::before { content: "\f1af"; }
+.bi-border-right::before { content: "\f1b0"; }
+.bi-border-style::before { content: "\f1b1"; }
+.bi-border-top::before { content: "\f1b2"; }
+.bi-border-width::before { content: "\f1b3"; }
+.bi-border::before { content: "\f1b4"; }
+.bi-bounding-box-circles::before { content: "\f1b5"; }
+.bi-bounding-box::before { content: "\f1b6"; }
+.bi-box-arrow-down-left::before { content: "\f1b7"; }
+.bi-box-arrow-down-right::before { content: "\f1b8"; }
+.bi-box-arrow-down::before { content: "\f1b9"; }
+.bi-box-arrow-in-down-left::before { content: "\f1ba"; }
+.bi-box-arrow-in-down-right::before { content: "\f1bb"; }
+.bi-box-arrow-in-down::before { content: "\f1bc"; }
+.bi-box-arrow-in-left::before { content: "\f1bd"; }
+.bi-box-arrow-in-right::before { content: "\f1be"; }
+.bi-box-arrow-in-up-left::before { content: "\f1bf"; }
+.bi-box-arrow-in-up-right::before { content: "\f1c0"; }
+.bi-box-arrow-in-up::before { content: "\f1c1"; }
+.bi-box-arrow-left::before { content: "\f1c2"; }
+.bi-box-arrow-right::before { content: "\f1c3"; }
+.bi-box-arrow-up-left::before { content: "\f1c4"; }
+.bi-box-arrow-up-right::before { content: "\f1c5"; }
+.bi-box-arrow-up::before { content: "\f1c6"; }
+.bi-box-seam::before { content: "\f1c7"; }
+.bi-box::before { content: "\f1c8"; }
+.bi-braces::before { content: "\f1c9"; }
+.bi-bricks::before { content: "\f1ca"; }
+.bi-briefcase-fill::before { content: "\f1cb"; }
+.bi-briefcase::before { content: "\f1cc"; }
+.bi-brightness-alt-high-fill::before { content: "\f1cd"; }
+.bi-brightness-alt-high::before { content: "\f1ce"; }
+.bi-brightness-alt-low-fill::before { content: "\f1cf"; }
+.bi-brightness-alt-low::before { content: "\f1d0"; }
+.bi-brightness-high-fill::before { content: "\f1d1"; }
+.bi-brightness-high::before { content: "\f1d2"; }
+.bi-brightness-low-fill::before { content: "\f1d3"; }
+.bi-brightness-low::before { content: "\f1d4"; }
+.bi-broadcast-pin::before { content: "\f1d5"; }
+.bi-broadcast::before { content: "\f1d6"; }
+.bi-brush-fill::before { content: "\f1d7"; }
+.bi-brush::before { content: "\f1d8"; }
+.bi-bucket-fill::before { content: "\f1d9"; }
+.bi-bucket::before { content: "\f1da"; }
+.bi-bug-fill::before { content: "\f1db"; }
+.bi-bug::before { content: "\f1dc"; }
+.bi-building::before { content: "\f1dd"; }
+.bi-bullseye::before { content: "\f1de"; }
+.bi-calculator-fill::before { content: "\f1df"; }
+.bi-calculator::before { content: "\f1e0"; }
+.bi-calendar-check-fill::before { content: "\f1e1"; }
+.bi-calendar-check::before { content: "\f1e2"; }
+.bi-calendar-date-fill::before { content: "\f1e3"; }
+.bi-calendar-date::before { content: "\f1e4"; }
+.bi-calendar-day-fill::before { content: "\f1e5"; }
+.bi-calendar-day::before { content: "\f1e6"; }
+.bi-calendar-event-fill::before { content: "\f1e7"; }
+.bi-calendar-event::before { content: "\f1e8"; }
+.bi-calendar-fill::before { content: "\f1e9"; }
+.bi-calendar-minus-fill::before { content: "\f1ea"; }
+.bi-calendar-minus::before { content: "\f1eb"; }
+.bi-calendar-month-fill::before { content: "\f1ec"; }
+.bi-calendar-month::before { content: "\f1ed"; }
+.bi-calendar-plus-fill::before { content: "\f1ee"; }
+.bi-calendar-plus::before { content: "\f1ef"; }
+.bi-calendar-range-fill::before { content: "\f1f0"; }
+.bi-calendar-range::before { content: "\f1f1"; }
+.bi-calendar-week-fill::before { content: "\f1f2"; }
+.bi-calendar-week::before { content: "\f1f3"; }
+.bi-calendar-x-fill::before { content: "\f1f4"; }
+.bi-calendar-x::before { content: "\f1f5"; }
+.bi-calendar::before { content: "\f1f6"; }
+.bi-calendar2-check-fill::before { content: "\f1f7"; }
+.bi-calendar2-check::before { content: "\f1f8"; }
+.bi-calendar2-date-fill::before { content: "\f1f9"; }
+.bi-calendar2-date::before { content: "\f1fa"; }
+.bi-calendar2-day-fill::before { content: "\f1fb"; }
+.bi-calendar2-day::before { content: "\f1fc"; }
+.bi-calendar2-event-fill::before { content: "\f1fd"; }
+.bi-calendar2-event::before { content: "\f1fe"; }
+.bi-calendar2-fill::before { content: "\f1ff"; }
+.bi-calendar2-minus-fill::before { content: "\f200"; }
+.bi-calendar2-minus::before { content: "\f201"; }
+.bi-calendar2-month-fill::before { content: "\f202"; }
+.bi-calendar2-month::before { content: "\f203"; }
+.bi-calendar2-plus-fill::before { content: "\f204"; }
+.bi-calendar2-plus::before { content: "\f205"; }
+.bi-calendar2-range-fill::before { content: "\f206"; }
+.bi-calendar2-range::before { content: "\f207"; }
+.bi-calendar2-week-fill::before { content: "\f208"; }
+.bi-calendar2-week::before { content: "\f209"; }
+.bi-calendar2-x-fill::before { content: "\f20a"; }
+.bi-calendar2-x::before { content: "\f20b"; }
+.bi-calendar2::before { content: "\f20c"; }
+.bi-calendar3-event-fill::before { content: "\f20d"; }
+.bi-calendar3-event::before { content: "\f20e"; }
+.bi-calendar3-fill::before { content: "\f20f"; }
+.bi-calendar3-range-fill::before { content: "\f210"; }
+.bi-calendar3-range::before { content: "\f211"; }
+.bi-calendar3-week-fill::before { content: "\f212"; }
+.bi-calendar3-week::before { content: "\f213"; }
+.bi-calendar3::before { content: "\f214"; }
+.bi-calendar4-event::before { content: "\f215"; }
+.bi-calendar4-range::before { content: "\f216"; }
+.bi-calendar4-week::before { content: "\f217"; }
+.bi-calendar4::before { content: "\f218"; }
+.bi-camera-fill::before { content: "\f219"; }
+.bi-camera-reels-fill::before { content: "\f21a"; }
+.bi-camera-reels::before { content: "\f21b"; }
+.bi-camera-video-fill::before { content: "\f21c"; }
+.bi-camera-video-off-fill::before { content: "\f21d"; }
+.bi-camera-video-off::before { content: "\f21e"; }
+.bi-camera-video::before { content: "\f21f"; }
+.bi-camera::before { content: "\f220"; }
+.bi-camera2::before { content: "\f221"; }
+.bi-capslock-fill::before { content: "\f222"; }
+.bi-capslock::before { content: "\f223"; }
+.bi-card-checklist::before { content: "\f224"; }
+.bi-card-heading::before { content: "\f225"; }
+.bi-card-image::before { content: "\f226"; }
+.bi-card-list::before { content: "\f227"; }
+.bi-card-text::before { content: "\f228"; }
+.bi-caret-down-fill::before { content: "\f229"; }
+.bi-caret-down-square-fill::before { content: "\f22a"; }
+.bi-caret-down-square::before { content: "\f22b"; }
+.bi-caret-down::before { content: "\f22c"; }
+.bi-caret-left-fill::before { content: "\f22d"; }
+.bi-caret-left-square-fill::before { content: "\f22e"; }
+.bi-caret-left-square::before { content: "\f22f"; }
+.bi-caret-left::before { content: "\f230"; }
+.bi-caret-right-fill::before { content: "\f231"; }
+.bi-caret-right-square-fill::before { content: "\f232"; }
+.bi-caret-right-square::before { content: "\f233"; }
+.bi-caret-right::before { content: "\f234"; }
+.bi-caret-up-fill::before { content: "\f235"; }
+.bi-caret-up-square-fill::before { content: "\f236"; }
+.bi-caret-up-square::before { content: "\f237"; }
+.bi-caret-up::before { content: "\f238"; }
+.bi-cart-check-fill::before { content: "\f239"; }
+.bi-cart-check::before { content: "\f23a"; }
+.bi-cart-dash-fill::before { content: "\f23b"; }
+.bi-cart-dash::before { content: "\f23c"; }
+.bi-cart-fill::before { content: "\f23d"; }
+.bi-cart-plus-fill::before { content: "\f23e"; }
+.bi-cart-plus::before { content: "\f23f"; }
+.bi-cart-x-fill::before { content: "\f240"; }
+.bi-cart-x::before { content: "\f241"; }
+.bi-cart::before { content: "\f242"; }
+.bi-cart2::before { content: "\f243"; }
+.bi-cart3::before { content: "\f244"; }
+.bi-cart4::before { content: "\f245"; }
+.bi-cash-stack::before { content: "\f246"; }
+.bi-cash::before { content: "\f247"; }
+.bi-cast::before { content: "\f248"; }
+.bi-chat-dots-fill::before { content: "\f249"; }
+.bi-chat-dots::before { content: "\f24a"; }
+.bi-chat-fill::before { content: "\f24b"; }
+.bi-chat-left-dots-fill::before { content: "\f24c"; }
+.bi-chat-left-dots::before { content: "\f24d"; }
+.bi-chat-left-fill::before { content: "\f24e"; }
+.bi-chat-left-quote-fill::before { content: "\f24f"; }
+.bi-chat-left-quote::before { content: "\f250"; }
+.bi-chat-left-text-fill::before { content: "\f251"; }
+.bi-chat-left-text::before { content: "\f252"; }
+.bi-chat-left::before { content: "\f253"; }
+.bi-chat-quote-fill::before { content: "\f254"; }
+.bi-chat-quote::before { content: "\f255"; }
+.bi-chat-right-dots-fill::before { content: "\f256"; }
+.bi-chat-right-dots::before { content: "\f257"; }
+.bi-chat-right-fill::before { content: "\f258"; }
+.bi-chat-right-quote-fill::before { content: "\f259"; }
+.bi-chat-right-quote::before { content: "\f25a"; }
+.bi-chat-right-text-fill::before { content: "\f25b"; }
+.bi-chat-right-text::before { content: "\f25c"; }
+.bi-chat-right::before { content: "\f25d"; }
+.bi-chat-square-dots-fill::before { content: "\f25e"; }
+.bi-chat-square-dots::before { content: "\f25f"; }
+.bi-chat-square-fill::before { content: "\f260"; }
+.bi-chat-square-quote-fill::before { content: "\f261"; }
+.bi-chat-square-quote::before { content: "\f262"; }
+.bi-chat-square-text-fill::before { content: "\f263"; }
+.bi-chat-square-text::before { content: "\f264"; }
+.bi-chat-square::before { content: "\f265"; }
+.bi-chat-text-fill::before { content: "\f266"; }
+.bi-chat-text::before { content: "\f267"; }
+.bi-chat::before { content: "\f268"; }
+.bi-check-all::before { content: "\f269"; }
+.bi-check-circle-fill::before { content: "\f26a"; }
+.bi-check-circle::before { content: "\f26b"; }
+.bi-check-square-fill::before { content: "\f26c"; }
+.bi-check-square::before { content: "\f26d"; }
+.bi-check::before { content: "\f26e"; }
+.bi-check2-all::before { content: "\f26f"; }
+.bi-check2-circle::before { content: "\f270"; }
+.bi-check2-square::before { content: "\f271"; }
+.bi-check2::before { content: "\f272"; }
+.bi-chevron-bar-contract::before { content: "\f273"; }
+.bi-chevron-bar-down::before { content: "\f274"; }
+.bi-chevron-bar-expand::before { content: "\f275"; }
+.bi-chevron-bar-left::before { content: "\f276"; }
+.bi-chevron-bar-right::before { content: "\f277"; }
+.bi-chevron-bar-up::before { content: "\f278"; }
+.bi-chevron-compact-down::before { content: "\f279"; }
+.bi-chevron-compact-left::before { content: "\f27a"; }
+.bi-chevron-compact-right::before { content: "\f27b"; }
+.bi-chevron-compact-up::before { content: "\f27c"; }
+.bi-chevron-contract::before { content: "\f27d"; }
+.bi-chevron-double-down::before { content: "\f27e"; }
+.bi-chevron-double-left::before { content: "\f27f"; }
+.bi-chevron-double-right::before { content: "\f280"; }
+.bi-chevron-double-up::before { content: "\f281"; }
+.bi-chevron-down::before { content: "\f282"; }
+.bi-chevron-expand::before { content: "\f283"; }
+.bi-chevron-left::before { content: "\f284"; }
+.bi-chevron-right::before { content: "\f285"; }
+.bi-chevron-up::before { content: "\f286"; }
+.bi-circle-fill::before { content: "\f287"; }
+.bi-circle-half::before { content: "\f288"; }
+.bi-circle-square::before { content: "\f289"; }
+.bi-circle::before { content: "\f28a"; }
+.bi-clipboard-check::before { content: "\f28b"; }
+.bi-clipboard-data::before { content: "\f28c"; }
+.bi-clipboard-minus::before { content: "\f28d"; }
+.bi-clipboard-plus::before { content: "\f28e"; }
+.bi-clipboard-x::before { content: "\f28f"; }
+.bi-clipboard::before { content: "\f290"; }
+.bi-clock-fill::before { content: "\f291"; }
+.bi-clock-history::before { content: "\f292"; }
+.bi-clock::before { content: "\f293"; }
+.bi-cloud-arrow-down-fill::before { content: "\f294"; }
+.bi-cloud-arrow-down::before { content: "\f295"; }
+.bi-cloud-arrow-up-fill::before { content: "\f296"; }
+.bi-cloud-arrow-up::before { content: "\f297"; }
+.bi-cloud-check-fill::before { content: "\f298"; }
+.bi-cloud-check::before { content: "\f299"; }
+.bi-cloud-download-fill::before { content: "\f29a"; }
+.bi-cloud-download::before { content: "\f29b"; }
+.bi-cloud-drizzle-fill::before { content: "\f29c"; }
+.bi-cloud-drizzle::before { content: "\f29d"; }
+.bi-cloud-fill::before { content: "\f29e"; }
+.bi-cloud-fog-fill::before { content: "\f29f"; }
+.bi-cloud-fog::before { content: "\f2a0"; }
+.bi-cloud-fog2-fill::before { content: "\f2a1"; }
+.bi-cloud-fog2::before { content: "\f2a2"; }
+.bi-cloud-hail-fill::before { content: "\f2a3"; }
+.bi-cloud-hail::before { content: "\f2a4"; }
+.bi-cloud-haze-1::before { content: "\f2a5"; }
+.bi-cloud-haze-fill::before { content: "\f2a6"; }
+.bi-cloud-haze::before { content: "\f2a7"; }
+.bi-cloud-haze2-fill::before { content: "\f2a8"; }
+.bi-cloud-lightning-fill::before { content: "\f2a9"; }
+.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; }
+.bi-cloud-lightning-rain::before { content: "\f2ab"; }
+.bi-cloud-lightning::before { content: "\f2ac"; }
+.bi-cloud-minus-fill::before { content: "\f2ad"; }
+.bi-cloud-minus::before { content: "\f2ae"; }
+.bi-cloud-moon-fill::before { content: "\f2af"; }
+.bi-cloud-moon::before { content: "\f2b0"; }
+.bi-cloud-plus-fill::before { content: "\f2b1"; }
+.bi-cloud-plus::before { content: "\f2b2"; }
+.bi-cloud-rain-fill::before { content: "\f2b3"; }
+.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; }
+.bi-cloud-rain-heavy::before { content: "\f2b5"; }
+.bi-cloud-rain::before { content: "\f2b6"; }
+.bi-cloud-slash-fill::before { content: "\f2b7"; }
+.bi-cloud-slash::before { content: "\f2b8"; }
+.bi-cloud-sleet-fill::before { content: "\f2b9"; }
+.bi-cloud-sleet::before { content: "\f2ba"; }
+.bi-cloud-snow-fill::before { content: "\f2bb"; }
+.bi-cloud-snow::before { content: "\f2bc"; }
+.bi-cloud-sun-fill::before { content: "\f2bd"; }
+.bi-cloud-sun::before { content: "\f2be"; }
+.bi-cloud-upload-fill::before { content: "\f2bf"; }
+.bi-cloud-upload::before { content: "\f2c0"; }
+.bi-cloud::before { content: "\f2c1"; }
+.bi-clouds-fill::before { content: "\f2c2"; }
+.bi-clouds::before { content: "\f2c3"; }
+.bi-cloudy-fill::before { content: "\f2c4"; }
+.bi-cloudy::before { content: "\f2c5"; }
+.bi-code-slash::before { content: "\f2c6"; }
+.bi-code-square::before { content: "\f2c7"; }
+.bi-code::before { content: "\f2c8"; }
+.bi-collection-fill::before { content: "\f2c9"; }
+.bi-collection-play-fill::before { content: "\f2ca"; }
+.bi-collection-play::before { content: "\f2cb"; }
+.bi-collection::before { content: "\f2cc"; }
+.bi-columns-gap::before { content: "\f2cd"; }
+.bi-columns::before { content: "\f2ce"; }
+.bi-command::before { content: "\f2cf"; }
+.bi-compass-fill::before { content: "\f2d0"; }
+.bi-compass::before { content: "\f2d1"; }
+.bi-cone-striped::before { content: "\f2d2"; }
+.bi-cone::before { content: "\f2d3"; }
+.bi-controller::before { content: "\f2d4"; }
+.bi-cpu-fill::before { content: "\f2d5"; }
+.bi-cpu::before { content: "\f2d6"; }
+.bi-credit-card-2-back-fill::before { content: "\f2d7"; }
+.bi-credit-card-2-back::before { content: "\f2d8"; }
+.bi-credit-card-2-front-fill::before { content: "\f2d9"; }
+.bi-credit-card-2-front::before { content: "\f2da"; }
+.bi-credit-card-fill::before { content: "\f2db"; }
+.bi-credit-card::before { content: "\f2dc"; }
+.bi-crop::before { content: "\f2dd"; }
+.bi-cup-fill::before { content: "\f2de"; }
+.bi-cup-straw::before { content: "\f2df"; }
+.bi-cup::before { content: "\f2e0"; }
+.bi-cursor-fill::before { content: "\f2e1"; }
+.bi-cursor-text::before { content: "\f2e2"; }
+.bi-cursor::before { content: "\f2e3"; }
+.bi-dash-circle-dotted::before { content: "\f2e4"; }
+.bi-dash-circle-fill::before { content: "\f2e5"; }
+.bi-dash-circle::before { content: "\f2e6"; }
+.bi-dash-square-dotted::before { content: "\f2e7"; }
+.bi-dash-square-fill::before { content: "\f2e8"; }
+.bi-dash-square::before { content: "\f2e9"; }
+.bi-dash::before { content: "\f2ea"; }
+.bi-diagram-2-fill::before { content: "\f2eb"; }
+.bi-diagram-2::before { content: "\f2ec"; }
+.bi-diagram-3-fill::before { content: "\f2ed"; }
+.bi-diagram-3::before { content: "\f2ee"; }
+.bi-diamond-fill::before { content: "\f2ef"; }
+.bi-diamond-half::before { content: "\f2f0"; }
+.bi-diamond::before { content: "\f2f1"; }
+.bi-dice-1-fill::before { content: "\f2f2"; }
+.bi-dice-1::before { content: "\f2f3"; }
+.bi-dice-2-fill::before { content: "\f2f4"; }
+.bi-dice-2::before { content: "\f2f5"; }
+.bi-dice-3-fill::before { content: "\f2f6"; }
+.bi-dice-3::before { content: "\f2f7"; }
+.bi-dice-4-fill::before { content: "\f2f8"; }
+.bi-dice-4::before { content: "\f2f9"; }
+.bi-dice-5-fill::before { content: "\f2fa"; }
+.bi-dice-5::before { content: "\f2fb"; }
+.bi-dice-6-fill::before { content: "\f2fc"; }
+.bi-dice-6::before { content: "\f2fd"; }
+.bi-disc-fill::before { content: "\f2fe"; }
+.bi-disc::before { content: "\f2ff"; }
+.bi-discord::before { content: "\f300"; }
+.bi-display-fill::before { content: "\f301"; }
+.bi-display::before { content: "\f302"; }
+.bi-distribute-horizontal::before { content: "\f303"; }
+.bi-distribute-vertical::before { content: "\f304"; }
+.bi-door-closed-fill::before { content: "\f305"; }
+.bi-door-closed::before { content: "\f306"; }
+.bi-door-open-fill::before { content: "\f307"; }
+.bi-door-open::before { content: "\f308"; }
+.bi-dot::before { content: "\f309"; }
+.bi-download::before { content: "\f30a"; }
+.bi-droplet-fill::before { content: "\f30b"; }
+.bi-droplet-half::before { content: "\f30c"; }
+.bi-droplet::before { content: "\f30d"; }
+.bi-earbuds::before { content: "\f30e"; }
+.bi-easel-fill::before { content: "\f30f"; }
+.bi-easel::before { content: "\f310"; }
+.bi-egg-fill::before { content: "\f311"; }
+.bi-egg-fried::before { content: "\f312"; }
+.bi-egg::before { content: "\f313"; }
+.bi-eject-fill::before { content: "\f314"; }
+.bi-eject::before { content: "\f315"; }
+.bi-emoji-angry-fill::before { content: "\f316"; }
+.bi-emoji-angry::before { content: "\f317"; }
+.bi-emoji-dizzy-fill::before { content: "\f318"; }
+.bi-emoji-dizzy::before { content: "\f319"; }
+.bi-emoji-expressionless-fill::before { content: "\f31a"; }
+.bi-emoji-expressionless::before { content: "\f31b"; }
+.bi-emoji-frown-fill::before { content: "\f31c"; }
+.bi-emoji-frown::before { content: "\f31d"; }
+.bi-emoji-heart-eyes-fill::before { content: "\f31e"; }
+.bi-emoji-heart-eyes::before { content: "\f31f"; }
+.bi-emoji-laughing-fill::before { content: "\f320"; }
+.bi-emoji-laughing::before { content: "\f321"; }
+.bi-emoji-neutral-fill::before { content: "\f322"; }
+.bi-emoji-neutral::before { content: "\f323"; }
+.bi-emoji-smile-fill::before { content: "\f324"; }
+.bi-emoji-smile-upside-down-fill::before { content: "\f325"; }
+.bi-emoji-smile-upside-down::before { content: "\f326"; }
+.bi-emoji-smile::before { content: "\f327"; }
+.bi-emoji-sunglasses-fill::before { content: "\f328"; }
+.bi-emoji-sunglasses::before { content: "\f329"; }
+.bi-emoji-wink-fill::before { content: "\f32a"; }
+.bi-emoji-wink::before { content: "\f32b"; }
+.bi-envelope-fill::before { content: "\f32c"; }
+.bi-envelope-open-fill::before { content: "\f32d"; }
+.bi-envelope-open::before { content: "\f32e"; }
+.bi-envelope::before { content: "\f32f"; }
+.bi-eraser-fill::before { content: "\f330"; }
+.bi-eraser::before { content: "\f331"; }
+.bi-exclamation-circle-fill::before { content: "\f332"; }
+.bi-exclamation-circle::before { content: "\f333"; }
+.bi-exclamation-diamond-fill::before { content: "\f334"; }
+.bi-exclamation-diamond::before { content: "\f335"; }
+.bi-exclamation-octagon-fill::before { content: "\f336"; }
+.bi-exclamation-octagon::before { content: "\f337"; }
+.bi-exclamation-square-fill::before { content: "\f338"; }
+.bi-exclamation-square::before { content: "\f339"; }
+.bi-exclamation-triangle-fill::before { content: "\f33a"; }
+.bi-exclamation-triangle::before { content: "\f33b"; }
+.bi-exclamation::before { content: "\f33c"; }
+.bi-exclude::before { content: "\f33d"; }
+.bi-eye-fill::before { content: "\f33e"; }
+.bi-eye-slash-fill::before { content: "\f33f"; }
+.bi-eye-slash::before { content: "\f340"; }
+.bi-eye::before { content: "\f341"; }
+.bi-eyedropper::before { content: "\f342"; }
+.bi-eyeglasses::before { content: "\f343"; }
+.bi-facebook::before { content: "\f344"; }
+.bi-file-arrow-down-fill::before { content: "\f345"; }
+.bi-file-arrow-down::before { content: "\f346"; }
+.bi-file-arrow-up-fill::before { content: "\f347"; }
+.bi-file-arrow-up::before { content: "\f348"; }
+.bi-file-bar-graph-fill::before { content: "\f349"; }
+.bi-file-bar-graph::before { content: "\f34a"; }
+.bi-file-binary-fill::before { content: "\f34b"; }
+.bi-file-binary::before { content: "\f34c"; }
+.bi-file-break-fill::before { content: "\f34d"; }
+.bi-file-break::before { content: "\f34e"; }
+.bi-file-check-fill::before { content: "\f34f"; }
+.bi-file-check::before { content: "\f350"; }
+.bi-file-code-fill::before { content: "\f351"; }
+.bi-file-code::before { content: "\f352"; }
+.bi-file-diff-fill::before { content: "\f353"; }
+.bi-file-diff::before { content: "\f354"; }
+.bi-file-earmark-arrow-down-fill::before { content: "\f355"; }
+.bi-file-earmark-arrow-down::before { content: "\f356"; }
+.bi-file-earmark-arrow-up-fill::before { content: "\f357"; }
+.bi-file-earmark-arrow-up::before { content: "\f358"; }
+.bi-file-earmark-bar-graph-fill::before { content: "\f359"; }
+.bi-file-earmark-bar-graph::before { content: "\f35a"; }
+.bi-file-earmark-binary-fill::before { content: "\f35b"; }
+.bi-file-earmark-binary::before { content: "\f35c"; }
+.bi-file-earmark-break-fill::before { content: "\f35d"; }
+.bi-file-earmark-break::before { content: "\f35e"; }
+.bi-file-earmark-check-fill::before { content: "\f35f"; }
+.bi-file-earmark-check::before { content: "\f360"; }
+.bi-file-earmark-code-fill::before { content: "\f361"; }
+.bi-file-earmark-code::before { content: "\f362"; }
+.bi-file-earmark-diff-fill::before { content: "\f363"; }
+.bi-file-earmark-diff::before { content: "\f364"; }
+.bi-file-earmark-easel-fill::before { content: "\f365"; }
+.bi-file-earmark-easel::before { content: "\f366"; }
+.bi-file-earmark-excel-fill::before { content: "\f367"; }
+.bi-file-earmark-excel::before { content: "\f368"; }
+.bi-file-earmark-fill::before { content: "\f369"; }
+.bi-file-earmark-font-fill::before { content: "\f36a"; }
+.bi-file-earmark-font::before { content: "\f36b"; }
+.bi-file-earmark-image-fill::before { content: "\f36c"; }
+.bi-file-earmark-image::before { content: "\f36d"; }
+.bi-file-earmark-lock-fill::before { content: "\f36e"; }
+.bi-file-earmark-lock::before { content: "\f36f"; }
+.bi-file-earmark-lock2-fill::before { content: "\f370"; }
+.bi-file-earmark-lock2::before { content: "\f371"; }
+.bi-file-earmark-medical-fill::before { content: "\f372"; }
+.bi-file-earmark-medical::before { content: "\f373"; }
+.bi-file-earmark-minus-fill::before { content: "\f374"; }
+.bi-file-earmark-minus::before { content: "\f375"; }
+.bi-file-earmark-music-fill::before { content: "\f376"; }
+.bi-file-earmark-music::before { content: "\f377"; }
+.bi-file-earmark-person-fill::before { content: "\f378"; }
+.bi-file-earmark-person::before { content: "\f379"; }
+.bi-file-earmark-play-fill::before { content: "\f37a"; }
+.bi-file-earmark-play::before { content: "\f37b"; }
+.bi-file-earmark-plus-fill::before { content: "\f37c"; }
+.bi-file-earmark-plus::before { content: "\f37d"; }
+.bi-file-earmark-post-fill::before { content: "\f37e"; }
+.bi-file-earmark-post::before { content: "\f37f"; }
+.bi-file-earmark-ppt-fill::before { content: "\f380"; }
+.bi-file-earmark-ppt::before { content: "\f381"; }
+.bi-file-earmark-richtext-fill::before { content: "\f382"; }
+.bi-file-earmark-richtext::before { content: "\f383"; }
+.bi-file-earmark-ruled-fill::before { content: "\f384"; }
+.bi-file-earmark-ruled::before { content: "\f385"; }
+.bi-file-earmark-slides-fill::before { content: "\f386"; }
+.bi-file-earmark-slides::before { content: "\f387"; }
+.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; }
+.bi-file-earmark-spreadsheet::before { content: "\f389"; }
+.bi-file-earmark-text-fill::before { content: "\f38a"; }
+.bi-file-earmark-text::before { content: "\f38b"; }
+.bi-file-earmark-word-fill::before { content: "\f38c"; }
+.bi-file-earmark-word::before { content: "\f38d"; }
+.bi-file-earmark-x-fill::before { content: "\f38e"; }
+.bi-file-earmark-x::before { content: "\f38f"; }
+.bi-file-earmark-zip-fill::before { content: "\f390"; }
+.bi-file-earmark-zip::before { content: "\f391"; }
+.bi-file-earmark::before { content: "\f392"; }
+.bi-file-easel-fill::before { content: "\f393"; }
+.bi-file-easel::before { content: "\f394"; }
+.bi-file-excel-fill::before { content: "\f395"; }
+.bi-file-excel::before { content: "\f396"; }
+.bi-file-fill::before { content: "\f397"; }
+.bi-file-font-fill::before { content: "\f398"; }
+.bi-file-font::before { content: "\f399"; }
+.bi-file-image-fill::before { content: "\f39a"; }
+.bi-file-image::before { content: "\f39b"; }
+.bi-file-lock-fill::before { content: "\f39c"; }
+.bi-file-lock::before { content: "\f39d"; }
+.bi-file-lock2-fill::before { content: "\f39e"; }
+.bi-file-lock2::before { content: "\f39f"; }
+.bi-file-medical-fill::before { content: "\f3a0"; }
+.bi-file-medical::before { content: "\f3a1"; }
+.bi-file-minus-fill::before { content: "\f3a2"; }
+.bi-file-minus::before { content: "\f3a3"; }
+.bi-file-music-fill::before { content: "\f3a4"; }
+.bi-file-music::before { content: "\f3a5"; }
+.bi-file-person-fill::before { content: "\f3a6"; }
+.bi-file-person::before { content: "\f3a7"; }
+.bi-file-play-fill::before { content: "\f3a8"; }
+.bi-file-play::before { content: "\f3a9"; }
+.bi-file-plus-fill::before { content: "\f3aa"; }
+.bi-file-plus::before { content: "\f3ab"; }
+.bi-file-post-fill::before { content: "\f3ac"; }
+.bi-file-post::before { content: "\f3ad"; }
+.bi-file-ppt-fill::before { content: "\f3ae"; }
+.bi-file-ppt::before { content: "\f3af"; }
+.bi-file-richtext-fill::before { content: "\f3b0"; }
+.bi-file-richtext::before { content: "\f3b1"; }
+.bi-file-ruled-fill::before { content: "\f3b2"; }
+.bi-file-ruled::before { content: "\f3b3"; }
+.bi-file-slides-fill::before { content: "\f3b4"; }
+.bi-file-slides::before { content: "\f3b5"; }
+.bi-file-spreadsheet-fill::before { content: "\f3b6"; }
+.bi-file-spreadsheet::before { content: "\f3b7"; }
+.bi-file-text-fill::before { content: "\f3b8"; }
+.bi-file-text::before { content: "\f3b9"; }
+.bi-file-word-fill::before { content: "\f3ba"; }
+.bi-file-word::before { content: "\f3bb"; }
+.bi-file-x-fill::before { content: "\f3bc"; }
+.bi-file-x::before { content: "\f3bd"; }
+.bi-file-zip-fill::before { content: "\f3be"; }
+.bi-file-zip::before { content: "\f3bf"; }
+.bi-file::before { content: "\f3c0"; }
+.bi-files-alt::before { content: "\f3c1"; }
+.bi-files::before { content: "\f3c2"; }
+.bi-film::before { content: "\f3c3"; }
+.bi-filter-circle-fill::before { content: "\f3c4"; }
+.bi-filter-circle::before { content: "\f3c5"; }
+.bi-filter-left::before { content: "\f3c6"; }
+.bi-filter-right::before { content: "\f3c7"; }
+.bi-filter-square-fill::before { content: "\f3c8"; }
+.bi-filter-square::before { content: "\f3c9"; }
+.bi-filter::before { content: "\f3ca"; }
+.bi-flag-fill::before { content: "\f3cb"; }
+.bi-flag::before { content: "\f3cc"; }
+.bi-flower1::before { content: "\f3cd"; }
+.bi-flower2::before { content: "\f3ce"; }
+.bi-flower3::before { content: "\f3cf"; }
+.bi-folder-check::before { content: "\f3d0"; }
+.bi-folder-fill::before { content: "\f3d1"; }
+.bi-folder-minus::before { content: "\f3d2"; }
+.bi-folder-plus::before { content: "\f3d3"; }
+.bi-folder-symlink-fill::before { content: "\f3d4"; }
+.bi-folder-symlink::before { content: "\f3d5"; }
+.bi-folder-x::before { content: "\f3d6"; }
+.bi-folder::before { content: "\f3d7"; }
+.bi-folder2-open::before { content: "\f3d8"; }
+.bi-folder2::before { content: "\f3d9"; }
+.bi-fonts::before { content: "\f3da"; }
+.bi-forward-fill::before { content: "\f3db"; }
+.bi-forward::before { content: "\f3dc"; }
+.bi-front::before { content: "\f3dd"; }
+.bi-fullscreen-exit::before { content: "\f3de"; }
+.bi-fullscreen::before { content: "\f3df"; }
+.bi-funnel-fill::before { content: "\f3e0"; }
+.bi-funnel::before { content: "\f3e1"; }
+.bi-gear-fill::before { content: "\f3e2"; }
+.bi-gear-wide-connected::before { content: "\f3e3"; }
+.bi-gear-wide::before { content: "\f3e4"; }
+.bi-gear::before { content: "\f3e5"; }
+.bi-gem::before { content: "\f3e6"; }
+.bi-geo-alt-fill::before { content: "\f3e7"; }
+.bi-geo-alt::before { content: "\f3e8"; }
+.bi-geo-fill::before { content: "\f3e9"; }
+.bi-geo::before { content: "\f3ea"; }
+.bi-gift-fill::before { content: "\f3eb"; }
+.bi-gift::before { content: "\f3ec"; }
+.bi-github::before { content: "\f3ed"; }
+.bi-globe::before { content: "\f3ee"; }
+.bi-globe2::before { content: "\f3ef"; }
+.bi-google::before { content: "\f3f0"; }
+.bi-graph-down::before { content: "\f3f1"; }
+.bi-graph-up::before { content: "\f3f2"; }
+.bi-grid-1x2-fill::before { content: "\f3f3"; }
+.bi-grid-1x2::before { content: "\f3f4"; }
+.bi-grid-3x2-gap-fill::before { content: "\f3f5"; }
+.bi-grid-3x2-gap::before { content: "\f3f6"; }
+.bi-grid-3x2::before { content: "\f3f7"; }
+.bi-grid-3x3-gap-fill::before { content: "\f3f8"; }
+.bi-grid-3x3-gap::before { content: "\f3f9"; }
+.bi-grid-3x3::before { content: "\f3fa"; }
+.bi-grid-fill::before { content: "\f3fb"; }
+.bi-grid::before { content: "\f3fc"; }
+.bi-grip-horizontal::before { content: "\f3fd"; }
+.bi-grip-vertical::before { content: "\f3fe"; }
+.bi-hammer::before { content: "\f3ff"; }
+.bi-hand-index-fill::before { content: "\f400"; }
+.bi-hand-index-thumb-fill::before { content: "\f401"; }
+.bi-hand-index-thumb::before { content: "\f402"; }
+.bi-hand-index::before { content: "\f403"; }
+.bi-hand-thumbs-down-fill::before { content: "\f404"; }
+.bi-hand-thumbs-down::before { content: "\f405"; }
+.bi-hand-thumbs-up-fill::before { content: "\f406"; }
+.bi-hand-thumbs-up::before { content: "\f407"; }
+.bi-handbag-fill::before { content: "\f408"; }
+.bi-handbag::before { content: "\f409"; }
+.bi-hash::before { content: "\f40a"; }
+.bi-hdd-fill::before { content: "\f40b"; }
+.bi-hdd-network-fill::before { content: "\f40c"; }
+.bi-hdd-network::before { content: "\f40d"; }
+.bi-hdd-rack-fill::before { content: "\f40e"; }
+.bi-hdd-rack::before { content: "\f40f"; }
+.bi-hdd-stack-fill::before { content: "\f410"; }
+.bi-hdd-stack::before { content: "\f411"; }
+.bi-hdd::before { content: "\f412"; }
+.bi-headphones::before { content: "\f413"; }
+.bi-headset::before { content: "\f414"; }
+.bi-heart-fill::before { content: "\f415"; }
+.bi-heart-half::before { content: "\f416"; }
+.bi-heart::before { content: "\f417"; }
+.bi-heptagon-fill::before { content: "\f418"; }
+.bi-heptagon-half::before { content: "\f419"; }
+.bi-heptagon::before { content: "\f41a"; }
+.bi-hexagon-fill::before { content: "\f41b"; }
+.bi-hexagon-half::before { content: "\f41c"; }
+.bi-hexagon::before { content: "\f41d"; }
+.bi-hourglass-bottom::before { content: "\f41e"; }
+.bi-hourglass-split::before { content: "\f41f"; }
+.bi-hourglass-top::before { content: "\f420"; }
+.bi-hourglass::before { content: "\f421"; }
+.bi-house-door-fill::before { content: "\f422"; }
+.bi-house-door::before { content: "\f423"; }
+.bi-house-fill::before { content: "\f424"; }
+.bi-house::before { content: "\f425"; }
+.bi-hr::before { content: "\f426"; }
+.bi-hurricane::before { content: "\f427"; }
+.bi-image-alt::before { content: "\f428"; }
+.bi-image-fill::before { content: "\f429"; }
+.bi-image::before { content: "\f42a"; }
+.bi-images::before { content: "\f42b"; }
+.bi-inbox-fill::before { content: "\f42c"; }
+.bi-inbox::before { content: "\f42d"; }
+.bi-inboxes-fill::before { content: "\f42e"; }
+.bi-inboxes::before { content: "\f42f"; }
+.bi-info-circle-fill::before { content: "\f430"; }
+.bi-info-circle::before { content: "\f431"; }
+.bi-info-square-fill::before { content: "\f432"; }
+.bi-info-square::before { content: "\f433"; }
+.bi-info::before { content: "\f434"; }
+.bi-input-cursor-text::before { content: "\f435"; }
+.bi-input-cursor::before { content: "\f436"; }
+.bi-instagram::before { content: "\f437"; }
+.bi-intersect::before { content: "\f438"; }
+.bi-journal-album::before { content: "\f439"; }
+.bi-journal-arrow-down::before { content: "\f43a"; }
+.bi-journal-arrow-up::before { content: "\f43b"; }
+.bi-journal-bookmark-fill::before { content: "\f43c"; }
+.bi-journal-bookmark::before { content: "\f43d"; }
+.bi-journal-check::before { content: "\f43e"; }
+.bi-journal-code::before { content: "\f43f"; }
+.bi-journal-medical::before { content: "\f440"; }
+.bi-journal-minus::before { content: "\f441"; }
+.bi-journal-plus::before { content: "\f442"; }
+.bi-journal-richtext::before { content: "\f443"; }
+.bi-journal-text::before { content: "\f444"; }
+.bi-journal-x::before { content: "\f445"; }
+.bi-journal::before { content: "\f446"; }
+.bi-journals::before { content: "\f447"; }
+.bi-joystick::before { content: "\f448"; }
+.bi-justify-left::before { content: "\f449"; }
+.bi-justify-right::before { content: "\f44a"; }
+.bi-justify::before { content: "\f44b"; }
+.bi-kanban-fill::before { content: "\f44c"; }
+.bi-kanban::before { content: "\f44d"; }
+.bi-key-fill::before { content: "\f44e"; }
+.bi-key::before { content: "\f44f"; }
+.bi-keyboard-fill::before { content: "\f450"; }
+.bi-keyboard::before { content: "\f451"; }
+.bi-ladder::before { content: "\f452"; }
+.bi-lamp-fill::before { content: "\f453"; }
+.bi-lamp::before { content: "\f454"; }
+.bi-laptop-fill::before { content: "\f455"; }
+.bi-laptop::before { content: "\f456"; }
+.bi-layer-backward::before { content: "\f457"; }
+.bi-layer-forward::before { content: "\f458"; }
+.bi-layers-fill::before { content: "\f459"; }
+.bi-layers-half::before { content: "\f45a"; }
+.bi-layers::before { content: "\f45b"; }
+.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; }
+.bi-layout-sidebar-inset::before { content: "\f45d"; }
+.bi-layout-sidebar-reverse::before { content: "\f45e"; }
+.bi-layout-sidebar::before { content: "\f45f"; }
+.bi-layout-split::before { content: "\f460"; }
+.bi-layout-text-sidebar-reverse::before { content: "\f461"; }
+.bi-layout-text-sidebar::before { content: "\f462"; }
+.bi-layout-text-window-reverse::before { content: "\f463"; }
+.bi-layout-text-window::before { content: "\f464"; }
+.bi-layout-three-columns::before { content: "\f465"; }
+.bi-layout-wtf::before { content: "\f466"; }
+.bi-life-preserver::before { content: "\f467"; }
+.bi-lightbulb-fill::before { content: "\f468"; }
+.bi-lightbulb-off-fill::before { content: "\f469"; }
+.bi-lightbulb-off::before { content: "\f46a"; }
+.bi-lightbulb::before { content: "\f46b"; }
+.bi-lightning-charge-fill::before { content: "\f46c"; }
+.bi-lightning-charge::before { content: "\f46d"; }
+.bi-lightning-fill::before { content: "\f46e"; }
+.bi-lightning::before { content: "\f46f"; }
+.bi-link-45deg::before { content: "\f470"; }
+.bi-link::before { content: "\f471"; }
+.bi-linkedin::before { content: "\f472"; }
+.bi-list-check::before { content: "\f473"; }
+.bi-list-nested::before { content: "\f474"; }
+.bi-list-ol::before { content: "\f475"; }
+.bi-list-stars::before { content: "\f476"; }
+.bi-list-task::before { content: "\f477"; }
+.bi-list-ul::before { content: "\f478"; }
+.bi-list::before { content: "\f479"; }
+.bi-lock-fill::before { content: "\f47a"; }
+.bi-lock::before { content: "\f47b"; }
+.bi-mailbox::before { content: "\f47c"; }
+.bi-mailbox2::before { content: "\f47d"; }
+.bi-map-fill::before { content: "\f47e"; }
+.bi-map::before { content: "\f47f"; }
+.bi-markdown-fill::before { content: "\f480"; }
+.bi-markdown::before { content: "\f481"; }
+.bi-mask::before { content: "\f482"; }
+.bi-megaphone-fill::before { content: "\f483"; }
+.bi-megaphone::before { content: "\f484"; }
+.bi-menu-app-fill::before { content: "\f485"; }
+.bi-menu-app::before { content: "\f486"; }
+.bi-menu-button-fill::before { content: "\f487"; }
+.bi-menu-button-wide-fill::before { content: "\f488"; }
+.bi-menu-button-wide::before { content: "\f489"; }
+.bi-menu-button::before { content: "\f48a"; }
+.bi-menu-down::before { content: "\f48b"; }
+.bi-menu-up::before { content: "\f48c"; }
+.bi-mic-fill::before { content: "\f48d"; }
+.bi-mic-mute-fill::before { content: "\f48e"; }
+.bi-mic-mute::before { content: "\f48f"; }
+.bi-mic::before { content: "\f490"; }
+.bi-minecart-loaded::before { content: "\f491"; }
+.bi-minecart::before { content: "\f492"; }
+.bi-moisture::before { content: "\f493"; }
+.bi-moon-fill::before { content: "\f494"; }
+.bi-moon-stars-fill::before { content: "\f495"; }
+.bi-moon-stars::before { content: "\f496"; }
+.bi-moon::before { content: "\f497"; }
+.bi-mouse-fill::before { content: "\f498"; }
+.bi-mouse::before { content: "\f499"; }
+.bi-mouse2-fill::before { content: "\f49a"; }
+.bi-mouse2::before { content: "\f49b"; }
+.bi-mouse3-fill::before { content: "\f49c"; }
+.bi-mouse3::before { content: "\f49d"; }
+.bi-music-note-beamed::before { content: "\f49e"; }
+.bi-music-note-list::before { content: "\f49f"; }
+.bi-music-note::before { content: "\f4a0"; }
+.bi-music-player-fill::before { content: "\f4a1"; }
+.bi-music-player::before { content: "\f4a2"; }
+.bi-newspaper::before { content: "\f4a3"; }
+.bi-node-minus-fill::before { content: "\f4a4"; }
+.bi-node-minus::before { content: "\f4a5"; }
+.bi-node-plus-fill::before { content: "\f4a6"; }
+.bi-node-plus::before { content: "\f4a7"; }
+.bi-nut-fill::before { content: "\f4a8"; }
+.bi-nut::before { content: "\f4a9"; }
+.bi-octagon-fill::before { content: "\f4aa"; }
+.bi-octagon-half::before { content: "\f4ab"; }
+.bi-octagon::before { content: "\f4ac"; }
+.bi-option::before { content: "\f4ad"; }
+.bi-outlet::before { content: "\f4ae"; }
+.bi-paint-bucket::before { content: "\f4af"; }
+.bi-palette-fill::before { content: "\f4b0"; }
+.bi-palette::before { content: "\f4b1"; }
+.bi-palette2::before { content: "\f4b2"; }
+.bi-paperclip::before { content: "\f4b3"; }
+.bi-paragraph::before { content: "\f4b4"; }
+.bi-patch-check-fill::before { content: "\f4b5"; }
+.bi-patch-check::before { content: "\f4b6"; }
+.bi-patch-exclamation-fill::before { content: "\f4b7"; }
+.bi-patch-exclamation::before { content: "\f4b8"; }
+.bi-patch-minus-fill::before { content: "\f4b9"; }
+.bi-patch-minus::before { content: "\f4ba"; }
+.bi-patch-plus-fill::before { content: "\f4bb"; }
+.bi-patch-plus::before { content: "\f4bc"; }
+.bi-patch-question-fill::before { content: "\f4bd"; }
+.bi-patch-question::before { content: "\f4be"; }
+.bi-pause-btn-fill::before { content: "\f4bf"; }
+.bi-pause-btn::before { content: "\f4c0"; }
+.bi-pause-circle-fill::before { content: "\f4c1"; }
+.bi-pause-circle::before { content: "\f4c2"; }
+.bi-pause-fill::before { content: "\f4c3"; }
+.bi-pause::before { content: "\f4c4"; }
+.bi-peace-fill::before { content: "\f4c5"; }
+.bi-peace::before { content: "\f4c6"; }
+.bi-pen-fill::before { content: "\f4c7"; }
+.bi-pen::before { content: "\f4c8"; }
+.bi-pencil-fill::before { content: "\f4c9"; }
+.bi-pencil-square::before { content: "\f4ca"; }
+.bi-pencil::before { content: "\f4cb"; }
+.bi-pentagon-fill::before { content: "\f4cc"; }
+.bi-pentagon-half::before { content: "\f4cd"; }
+.bi-pentagon::before { content: "\f4ce"; }
+.bi-people-fill::before { content: "\f4cf"; }
+.bi-people::before { content: "\f4d0"; }
+.bi-percent::before { content: "\f4d1"; }
+.bi-person-badge-fill::before { content: "\f4d2"; }
+.bi-person-badge::before { content: "\f4d3"; }
+.bi-person-bounding-box::before { content: "\f4d4"; }
+.bi-person-check-fill::before { content: "\f4d5"; }
+.bi-person-check::before { content: "\f4d6"; }
+.bi-person-circle::before { content: "\f4d7"; }
+.bi-person-dash-fill::before { content: "\f4d8"; }
+.bi-person-dash::before { content: "\f4d9"; }
+.bi-person-fill::before { content: "\f4da"; }
+.bi-person-lines-fill::before { content: "\f4db"; }
+.bi-person-plus-fill::before { content: "\f4dc"; }
+.bi-person-plus::before { content: "\f4dd"; }
+.bi-person-square::before { content: "\f4de"; }
+.bi-person-x-fill::before { content: "\f4df"; }
+.bi-person-x::before { content: "\f4e0"; }
+.bi-person::before { content: "\f4e1"; }
+.bi-phone-fill::before { content: "\f4e2"; }
+.bi-phone-landscape-fill::before { content: "\f4e3"; }
+.bi-phone-landscape::before { content: "\f4e4"; }
+.bi-phone-vibrate-fill::before { content: "\f4e5"; }
+.bi-phone-vibrate::before { content: "\f4e6"; }
+.bi-phone::before { content: "\f4e7"; }
+.bi-pie-chart-fill::before { content: "\f4e8"; }
+.bi-pie-chart::before { content: "\f4e9"; }
+.bi-pin-angle-fill::before { content: "\f4ea"; }
+.bi-pin-angle::before { content: "\f4eb"; }
+.bi-pin-fill::before { content: "\f4ec"; }
+.bi-pin::before { content: "\f4ed"; }
+.bi-pip-fill::before { content: "\f4ee"; }
+.bi-pip::before { content: "\f4ef"; }
+.bi-play-btn-fill::before { content: "\f4f0"; }
+.bi-play-btn::before { content: "\f4f1"; }
+.bi-play-circle-fill::before { content: "\f4f2"; }
+.bi-play-circle::before { content: "\f4f3"; }
+.bi-play-fill::before { content: "\f4f4"; }
+.bi-play::before { content: "\f4f5"; }
+.bi-plug-fill::before { content: "\f4f6"; }
+.bi-plug::before { content: "\f4f7"; }
+.bi-plus-circle-dotted::before { content: "\f4f8"; }
+.bi-plus-circle-fill::before { content: "\f4f9"; }
+.bi-plus-circle::before { content: "\f4fa"; }
+.bi-plus-square-dotted::before { content: "\f4fb"; }
+.bi-plus-square-fill::before { content: "\f4fc"; }
+.bi-plus-square::before { content: "\f4fd"; }
+.bi-plus::before { content: "\f4fe"; }
+.bi-power::before { content: "\f4ff"; }
+.bi-printer-fill::before { content: "\f500"; }
+.bi-printer::before { content: "\f501"; }
+.bi-puzzle-fill::before { content: "\f502"; }
+.bi-puzzle::before { content: "\f503"; }
+.bi-question-circle-fill::before { content: "\f504"; }
+.bi-question-circle::before { content: "\f505"; }
+.bi-question-diamond-fill::before { content: "\f506"; }
+.bi-question-diamond::before { content: "\f507"; }
+.bi-question-octagon-fill::before { content: "\f508"; }
+.bi-question-octagon::before { content: "\f509"; }
+.bi-question-square-fill::before { content: "\f50a"; }
+.bi-question-square::before { content: "\f50b"; }
+.bi-question::before { content: "\f50c"; }
+.bi-rainbow::before { content: "\f50d"; }
+.bi-receipt-cutoff::before { content: "\f50e"; }
+.bi-receipt::before { content: "\f50f"; }
+.bi-reception-0::before { content: "\f510"; }
+.bi-reception-1::before { content: "\f511"; }
+.bi-reception-2::before { content: "\f512"; }
+.bi-reception-3::before { content: "\f513"; }
+.bi-reception-4::before { content: "\f514"; }
+.bi-record-btn-fill::before { content: "\f515"; }
+.bi-record-btn::before { content: "\f516"; }
+.bi-record-circle-fill::before { content: "\f517"; }
+.bi-record-circle::before { content: "\f518"; }
+.bi-record-fill::before { content: "\f519"; }
+.bi-record::before { content: "\f51a"; }
+.bi-record2-fill::before { content: "\f51b"; }
+.bi-record2::before { content: "\f51c"; }
+.bi-reply-all-fill::before { content: "\f51d"; }
+.bi-reply-all::before { content: "\f51e"; }
+.bi-reply-fill::before { content: "\f51f"; }
+.bi-reply::before { content: "\f520"; }
+.bi-rss-fill::before { content: "\f521"; }
+.bi-rss::before { content: "\f522"; }
+.bi-rulers::before { content: "\f523"; }
+.bi-save-fill::before { content: "\f524"; }
+.bi-save::before { content: "\f525"; }
+.bi-save2-fill::before { content: "\f526"; }
+.bi-save2::before { content: "\f527"; }
+.bi-scissors::before { content: "\f528"; }
+.bi-screwdriver::before { content: "\f529"; }
+.bi-search::before { content: "\f52a"; }
+.bi-segmented-nav::before { content: "\f52b"; }
+.bi-server::before { content: "\f52c"; }
+.bi-share-fill::before { content: "\f52d"; }
+.bi-share::before { content: "\f52e"; }
+.bi-shield-check::before { content: "\f52f"; }
+.bi-shield-exclamation::before { content: "\f530"; }
+.bi-shield-fill-check::before { content: "\f531"; }
+.bi-shield-fill-exclamation::before { content: "\f532"; }
+.bi-shield-fill-minus::before { content: "\f533"; }
+.bi-shield-fill-plus::before { content: "\f534"; }
+.bi-shield-fill-x::before { content: "\f535"; }
+.bi-shield-fill::before { content: "\f536"; }
+.bi-shield-lock-fill::before { content: "\f537"; }
+.bi-shield-lock::before { content: "\f538"; }
+.bi-shield-minus::before { content: "\f539"; }
+.bi-shield-plus::before { content: "\f53a"; }
+.bi-shield-shaded::before { content: "\f53b"; }
+.bi-shield-slash-fill::before { content: "\f53c"; }
+.bi-shield-slash::before { content: "\f53d"; }
+.bi-shield-x::before { content: "\f53e"; }
+.bi-shield::before { content: "\f53f"; }
+.bi-shift-fill::before { content: "\f540"; }
+.bi-shift::before { content: "\f541"; }
+.bi-shop-window::before { content: "\f542"; }
+.bi-shop::before { content: "\f543"; }
+.bi-shuffle::before { content: "\f544"; }
+.bi-signpost-2-fill::before { content: "\f545"; }
+.bi-signpost-2::before { content: "\f546"; }
+.bi-signpost-fill::before { content: "\f547"; }
+.bi-signpost-split-fill::before { content: "\f548"; }
+.bi-signpost-split::before { content: "\f549"; }
+.bi-signpost::before { content: "\f54a"; }
+.bi-sim-fill::before { content: "\f54b"; }
+.bi-sim::before { content: "\f54c"; }
+.bi-skip-backward-btn-fill::before { content: "\f54d"; }
+.bi-skip-backward-btn::before { content: "\f54e"; }
+.bi-skip-backward-circle-fill::before { content: "\f54f"; }
+.bi-skip-backward-circle::before { content: "\f550"; }
+.bi-skip-backward-fill::before { content: "\f551"; }
+.bi-skip-backward::before { content: "\f552"; }
+.bi-skip-end-btn-fill::before { content: "\f553"; }
+.bi-skip-end-btn::before { content: "\f554"; }
+.bi-skip-end-circle-fill::before { content: "\f555"; }
+.bi-skip-end-circle::before { content: "\f556"; }
+.bi-skip-end-fill::before { content: "\f557"; }
+.bi-skip-end::before { content: "\f558"; }
+.bi-skip-forward-btn-fill::before { content: "\f559"; }
+.bi-skip-forward-btn::before { content: "\f55a"; }
+.bi-skip-forward-circle-fill::before { content: "\f55b"; }
+.bi-skip-forward-circle::before { content: "\f55c"; }
+.bi-skip-forward-fill::before { content: "\f55d"; }
+.bi-skip-forward::before { content: "\f55e"; }
+.bi-skip-start-btn-fill::before { content: "\f55f"; }
+.bi-skip-start-btn::before { content: "\f560"; }
+.bi-skip-start-circle-fill::before { content: "\f561"; }
+.bi-skip-start-circle::before { content: "\f562"; }
+.bi-skip-start-fill::before { content: "\f563"; }
+.bi-skip-start::before { content: "\f564"; }
+.bi-slack::before { content: "\f565"; }
+.bi-slash-circle-fill::before { content: "\f566"; }
+.bi-slash-circle::before { content: "\f567"; }
+.bi-slash-square-fill::before { content: "\f568"; }
+.bi-slash-square::before { content: "\f569"; }
+.bi-slash::before { content: "\f56a"; }
+.bi-sliders::before { content: "\f56b"; }
+.bi-smartwatch::before { content: "\f56c"; }
+.bi-snow::before { content: "\f56d"; }
+.bi-snow2::before { content: "\f56e"; }
+.bi-snow3::before { content: "\f56f"; }
+.bi-sort-alpha-down-alt::before { content: "\f570"; }
+.bi-sort-alpha-down::before { content: "\f571"; }
+.bi-sort-alpha-up-alt::before { content: "\f572"; }
+.bi-sort-alpha-up::before { content: "\f573"; }
+.bi-sort-down-alt::before { content: "\f574"; }
+.bi-sort-down::before { content: "\f575"; }
+.bi-sort-numeric-down-alt::before { content: "\f576"; }
+.bi-sort-numeric-down::before { content: "\f577"; }
+.bi-sort-numeric-up-alt::before { content: "\f578"; }
+.bi-sort-numeric-up::before { content: "\f579"; }
+.bi-sort-up-alt::before { content: "\f57a"; }
+.bi-sort-up::before { content: "\f57b"; }
+.bi-soundwave::before { content: "\f57c"; }
+.bi-speaker-fill::before { content: "\f57d"; }
+.bi-speaker::before { content: "\f57e"; }
+.bi-speedometer::before { content: "\f57f"; }
+.bi-speedometer2::before { content: "\f580"; }
+.bi-spellcheck::before { content: "\f581"; }
+.bi-square-fill::before { content: "\f582"; }
+.bi-square-half::before { content: "\f583"; }
+.bi-square::before { content: "\f584"; }
+.bi-stack::before { content: "\f585"; }
+.bi-star-fill::before { content: "\f586"; }
+.bi-star-half::before { content: "\f587"; }
+.bi-star::before { content: "\f588"; }
+.bi-stars::before { content: "\f589"; }
+.bi-stickies-fill::before { content: "\f58a"; }
+.bi-stickies::before { content: "\f58b"; }
+.bi-sticky-fill::before { content: "\f58c"; }
+.bi-sticky::before { content: "\f58d"; }
+.bi-stop-btn-fill::before { content: "\f58e"; }
+.bi-stop-btn::before { content: "\f58f"; }
+.bi-stop-circle-fill::before { content: "\f590"; }
+.bi-stop-circle::before { content: "\f591"; }
+.bi-stop-fill::before { content: "\f592"; }
+.bi-stop::before { content: "\f593"; }
+.bi-stoplights-fill::before { content: "\f594"; }
+.bi-stoplights::before { content: "\f595"; }
+.bi-stopwatch-fill::before { content: "\f596"; }
+.bi-stopwatch::before { content: "\f597"; }
+.bi-subtract::before { content: "\f598"; }
+.bi-suit-club-fill::before { content: "\f599"; }
+.bi-suit-club::before { content: "\f59a"; }
+.bi-suit-diamond-fill::before { content: "\f59b"; }
+.bi-suit-diamond::before { content: "\f59c"; }
+.bi-suit-heart-fill::before { content: "\f59d"; }
+.bi-suit-heart::before { content: "\f59e"; }
+.bi-suit-spade-fill::before { content: "\f59f"; }
+.bi-suit-spade::before { content: "\f5a0"; }
+.bi-sun-fill::before { content: "\f5a1"; }
+.bi-sun::before { content: "\f5a2"; }
+.bi-sunglasses::before { content: "\f5a3"; }
+.bi-sunrise-fill::before { content: "\f5a4"; }
+.bi-sunrise::before { content: "\f5a5"; }
+.bi-sunset-fill::before { content: "\f5a6"; }
+.bi-sunset::before { content: "\f5a7"; }
+.bi-symmetry-horizontal::before { content: "\f5a8"; }
+.bi-symmetry-vertical::before { content: "\f5a9"; }
+.bi-table::before { content: "\f5aa"; }
+.bi-tablet-fill::before { content: "\f5ab"; }
+.bi-tablet-landscape-fill::before { content: "\f5ac"; }
+.bi-tablet-landscape::before { content: "\f5ad"; }
+.bi-tablet::before { content: "\f5ae"; }
+.bi-tag-fill::before { content: "\f5af"; }
+.bi-tag::before { content: "\f5b0"; }
+.bi-tags-fill::before { content: "\f5b1"; }
+.bi-tags::before { content: "\f5b2"; }
+.bi-telegram::before { content: "\f5b3"; }
+.bi-telephone-fill::before { content: "\f5b4"; }
+.bi-telephone-forward-fill::before { content: "\f5b5"; }
+.bi-telephone-forward::before { content: "\f5b6"; }
+.bi-telephone-inbound-fill::before { content: "\f5b7"; }
+.bi-telephone-inbound::before { content: "\f5b8"; }
+.bi-telephone-minus-fill::before { content: "\f5b9"; }
+.bi-telephone-minus::before { content: "\f5ba"; }
+.bi-telephone-outbound-fill::before { content: "\f5bb"; }
+.bi-telephone-outbound::before { content: "\f5bc"; }
+.bi-telephone-plus-fill::before { content: "\f5bd"; }
+.bi-telephone-plus::before { content: "\f5be"; }
+.bi-telephone-x-fill::before { content: "\f5bf"; }
+.bi-telephone-x::before { content: "\f5c0"; }
+.bi-telephone::before { content: "\f5c1"; }
+.bi-terminal-fill::before { content: "\f5c2"; }
+.bi-terminal::before { content: "\f5c3"; }
+.bi-text-center::before { content: "\f5c4"; }
+.bi-text-indent-left::before { content: "\f5c5"; }
+.bi-text-indent-right::before { content: "\f5c6"; }
+.bi-text-left::before { content: "\f5c7"; }
+.bi-text-paragraph::before { content: "\f5c8"; }
+.bi-text-right::before { content: "\f5c9"; }
+.bi-textarea-resize::before { content: "\f5ca"; }
+.bi-textarea-t::before { content: "\f5cb"; }
+.bi-textarea::before { content: "\f5cc"; }
+.bi-thermometer-half::before { content: "\f5cd"; }
+.bi-thermometer-high::before { content: "\f5ce"; }
+.bi-thermometer-low::before { content: "\f5cf"; }
+.bi-thermometer-snow::before { content: "\f5d0"; }
+.bi-thermometer-sun::before { content: "\f5d1"; }
+.bi-thermometer::before { content: "\f5d2"; }
+.bi-three-dots-vertical::before { content: "\f5d3"; }
+.bi-three-dots::before { content: "\f5d4"; }
+.bi-toggle-off::before { content: "\f5d5"; }
+.bi-toggle-on::before { content: "\f5d6"; }
+.bi-toggle2-off::before { content: "\f5d7"; }
+.bi-toggle2-on::before { content: "\f5d8"; }
+.bi-toggles::before { content: "\f5d9"; }
+.bi-toggles2::before { content: "\f5da"; }
+.bi-tools::before { content: "\f5db"; }
+.bi-tornado::before { content: "\f5dc"; }
+.bi-trash-fill::before { content: "\f5dd"; }
+.bi-trash::before { content: "\f5de"; }
+.bi-trash2-fill::before { content: "\f5df"; }
+.bi-trash2::before { content: "\f5e0"; }
+.bi-tree-fill::before { content: "\f5e1"; }
+.bi-tree::before { content: "\f5e2"; }
+.bi-triangle-fill::before { content: "\f5e3"; }
+.bi-triangle-half::before { content: "\f5e4"; }
+.bi-triangle::before { content: "\f5e5"; }
+.bi-trophy-fill::before { content: "\f5e6"; }
+.bi-trophy::before { content: "\f5e7"; }
+.bi-tropical-storm::before { content: "\f5e8"; }
+.bi-truck-flatbed::before { content: "\f5e9"; }
+.bi-truck::before { content: "\f5ea"; }
+.bi-tsunami::before { content: "\f5eb"; }
+.bi-tv-fill::before { content: "\f5ec"; }
+.bi-tv::before { content: "\f5ed"; }
+.bi-twitch::before { content: "\f5ee"; }
+.bi-twitter::before { content: "\f5ef"; }
+.bi-type-bold::before { content: "\f5f0"; }
+.bi-type-h1::before { content: "\f5f1"; }
+.bi-type-h2::before { content: "\f5f2"; }
+.bi-type-h3::before { content: "\f5f3"; }
+.bi-type-italic::before { content: "\f5f4"; }
+.bi-type-strikethrough::before { content: "\f5f5"; }
+.bi-type-underline::before { content: "\f5f6"; }
+.bi-type::before { content: "\f5f7"; }
+.bi-ui-checks-grid::before { content: "\f5f8"; }
+.bi-ui-checks::before { content: "\f5f9"; }
+.bi-ui-radios-grid::before { content: "\f5fa"; }
+.bi-ui-radios::before { content: "\f5fb"; }
+.bi-umbrella-fill::before { content: "\f5fc"; }
+.bi-umbrella::before { content: "\f5fd"; }
+.bi-union::before { content: "\f5fe"; }
+.bi-unlock-fill::before { content: "\f5ff"; }
+.bi-unlock::before { content: "\f600"; }
+.bi-upc-scan::before { content: "\f601"; }
+.bi-upc::before { content: "\f602"; }
+.bi-upload::before { content: "\f603"; }
+.bi-vector-pen::before { content: "\f604"; }
+.bi-view-list::before { content: "\f605"; }
+.bi-view-stacked::before { content: "\f606"; }
+.bi-vinyl-fill::before { content: "\f607"; }
+.bi-vinyl::before { content: "\f608"; }
+.bi-voicemail::before { content: "\f609"; }
+.bi-volume-down-fill::before { content: "\f60a"; }
+.bi-volume-down::before { content: "\f60b"; }
+.bi-volume-mute-fill::before { content: "\f60c"; }
+.bi-volume-mute::before { content: "\f60d"; }
+.bi-volume-off-fill::before { content: "\f60e"; }
+.bi-volume-off::before { content: "\f60f"; }
+.bi-volume-up-fill::before { content: "\f610"; }
+.bi-volume-up::before { content: "\f611"; }
+.bi-vr::before { content: "\f612"; }
+.bi-wallet-fill::before { content: "\f613"; }
+.bi-wallet::before { content: "\f614"; }
+.bi-wallet2::before { content: "\f615"; }
+.bi-watch::before { content: "\f616"; }
+.bi-water::before { content: "\f617"; }
+.bi-whatsapp::before { content: "\f618"; }
+.bi-wifi-1::before { content: "\f619"; }
+.bi-wifi-2::before { content: "\f61a"; }
+.bi-wifi-off::before { content: "\f61b"; }
+.bi-wifi::before { content: "\f61c"; }
+.bi-wind::before { content: "\f61d"; }
+.bi-window-dock::before { content: "\f61e"; }
+.bi-window-sidebar::before { content: "\f61f"; }
+.bi-window::before { content: "\f620"; }
+.bi-wrench::before { content: "\f621"; }
+.bi-x-circle-fill::before { content: "\f622"; }
+.bi-x-circle::before { content: "\f623"; }
+.bi-x-diamond-fill::before { content: "\f624"; }
+.bi-x-diamond::before { content: "\f625"; }
+.bi-x-octagon-fill::before { content: "\f626"; }
+.bi-x-octagon::before { content: "\f627"; }
+.bi-x-square-fill::before { content: "\f628"; }
+.bi-x-square::before { content: "\f629"; }
+.bi-x::before { content: "\f62a"; }
+.bi-youtube::before { content: "\f62b"; }
+.bi-zoom-in::before { content: "\f62c"; }
+.bi-zoom-out::before { content: "\f62d"; }
+.bi-bank::before { content: "\f62e"; }
+.bi-bank2::before { content: "\f62f"; }
+.bi-bell-slash-fill::before { content: "\f630"; }
+.bi-bell-slash::before { content: "\f631"; }
+.bi-cash-coin::before { content: "\f632"; }
+.bi-check-lg::before { content: "\f633"; }
+.bi-coin::before { content: "\f634"; }
+.bi-currency-bitcoin::before { content: "\f635"; }
+.bi-currency-dollar::before { content: "\f636"; }
+.bi-currency-euro::before { content: "\f637"; }
+.bi-currency-exchange::before { content: "\f638"; }
+.bi-currency-pound::before { content: "\f639"; }
+.bi-currency-yen::before { content: "\f63a"; }
+.bi-dash-lg::before { content: "\f63b"; }
+.bi-exclamation-lg::before { content: "\f63c"; }
+.bi-file-earmark-pdf-fill::before { content: "\f63d"; }
+.bi-file-earmark-pdf::before { content: "\f63e"; }
+.bi-file-pdf-fill::before { content: "\f63f"; }
+.bi-file-pdf::before { content: "\f640"; }
+.bi-gender-ambiguous::before { content: "\f641"; }
+.bi-gender-female::before { content: "\f642"; }
+.bi-gender-male::before { content: "\f643"; }
+.bi-gender-trans::before { content: "\f644"; }
+.bi-headset-vr::before { content: "\f645"; }
+.bi-info-lg::before { content: "\f646"; }
+.bi-mastodon::before { content: "\f647"; }
+.bi-messenger::before { content: "\f648"; }
+.bi-piggy-bank-fill::before { content: "\f649"; }
+.bi-piggy-bank::before { content: "\f64a"; }
+.bi-pin-map-fill::before { content: "\f64b"; }
+.bi-pin-map::before { content: "\f64c"; }
+.bi-plus-lg::before { content: "\f64d"; }
+.bi-question-lg::before { content: "\f64e"; }
+.bi-recycle::before { content: "\f64f"; }
+.bi-reddit::before { content: "\f650"; }
+.bi-safe-fill::before { content: "\f651"; }
+.bi-safe2-fill::before { content: "\f652"; }
+.bi-safe2::before { content: "\f653"; }
+.bi-sd-card-fill::before { content: "\f654"; }
+.bi-sd-card::before { content: "\f655"; }
+.bi-skype::before { content: "\f656"; }
+.bi-slash-lg::before { content: "\f657"; }
+.bi-translate::before { content: "\f658"; }
+.bi-x-lg::before { content: "\f659"; }
+.bi-safe::before { content: "\f65a"; }
+.bi-apple::before { content: "\f65b"; }
+.bi-microsoft::before { content: "\f65d"; }
+.bi-windows::before { content: "\f65e"; }
+.bi-behance::before { content: "\f65c"; }
+.bi-dribbble::before { content: "\f65f"; }
+.bi-line::before { content: "\f660"; }
+.bi-medium::before { content: "\f661"; }
+.bi-paypal::before { content: "\f662"; }
+.bi-pinterest::before { content: "\f663"; }
+.bi-signal::before { content: "\f664"; }
+.bi-snapchat::before { content: "\f665"; }
+.bi-spotify::before { content: "\f666"; }
+.bi-stack-overflow::before { content: "\f667"; }
+.bi-strava::before { content: "\f668"; }
+.bi-wordpress::before { content: "\f669"; }
+.bi-vimeo::before { content: "\f66a"; }
+.bi-activity::before { content: "\f66b"; }
+.bi-easel2-fill::before { content: "\f66c"; }
+.bi-easel2::before { content: "\f66d"; }
+.bi-easel3-fill::before { content: "\f66e"; }
+.bi-easel3::before { content: "\f66f"; }
+.bi-fan::before { content: "\f670"; }
+.bi-fingerprint::before { content: "\f671"; }
+.bi-graph-down-arrow::before { content: "\f672"; }
+.bi-graph-up-arrow::before { content: "\f673"; }
+.bi-hypnotize::before { content: "\f674"; }
+.bi-magic::before { content: "\f675"; }
+.bi-person-rolodex::before { content: "\f676"; }
+.bi-person-video::before { content: "\f677"; }
+.bi-person-video2::before { content: "\f678"; }
+.bi-person-video3::before { content: "\f679"; }
+.bi-person-workspace::before { content: "\f67a"; }
+.bi-radioactive::before { content: "\f67b"; }
+.bi-webcam-fill::before { content: "\f67c"; }
+.bi-webcam::before { content: "\f67d"; }
+.bi-yin-yang::before { content: "\f67e"; }
+.bi-bandaid-fill::before { content: "\f680"; }
+.bi-bandaid::before { content: "\f681"; }
+.bi-bluetooth::before { content: "\f682"; }
+.bi-body-text::before { content: "\f683"; }
+.bi-boombox::before { content: "\f684"; }
+.bi-boxes::before { content: "\f685"; }
+.bi-dpad-fill::before { content: "\f686"; }
+.bi-dpad::before { content: "\f687"; }
+.bi-ear-fill::before { content: "\f688"; }
+.bi-ear::before { content: "\f689"; }
+.bi-envelope-check-1::before { content: "\f68a"; }
+.bi-envelope-check-fill::before { content: "\f68b"; }
+.bi-envelope-check::before { content: "\f68c"; }
+.bi-envelope-dash-1::before { content: "\f68d"; }
+.bi-envelope-dash-fill::before { content: "\f68e"; }
+.bi-envelope-dash::before { content: "\f68f"; }
+.bi-envelope-exclamation-1::before { content: "\f690"; }
+.bi-envelope-exclamation-fill::before { content: "\f691"; }
+.bi-envelope-exclamation::before { content: "\f692"; }
+.bi-envelope-plus-fill::before { content: "\f693"; }
+.bi-envelope-plus::before { content: "\f694"; }
+.bi-envelope-slash-1::before { content: "\f695"; }
+.bi-envelope-slash-fill::before { content: "\f696"; }
+.bi-envelope-slash::before { content: "\f697"; }
+.bi-envelope-x-1::before { content: "\f698"; }
+.bi-envelope-x-fill::before { content: "\f699"; }
+.bi-envelope-x::before { content: "\f69a"; }
+.bi-explicit-fill::before { content: "\f69b"; }
+.bi-explicit::before { content: "\f69c"; }
+.bi-git::before { content: "\f69d"; }
+.bi-infinity::before { content: "\f69e"; }
+.bi-list-columns-reverse::before { content: "\f69f"; }
+.bi-list-columns::before { content: "\f6a0"; }
+.bi-meta::before { content: "\f6a1"; }
+.bi-mortorboard-fill::before { content: "\f6a2"; }
+.bi-mortorboard::before { content: "\f6a3"; }
+.bi-nintendo-switch::before { content: "\f6a4"; }
+.bi-pc-display-horizontal::before { content: "\f6a5"; }
+.bi-pc-display::before { content: "\f6a6"; }
+.bi-pc-horizontal::before { content: "\f6a7"; }
+.bi-pc::before { content: "\f6a8"; }
+.bi-playstation::before { content: "\f6a9"; }
+.bi-plus-slash-minus::before { content: "\f6aa"; }
+.bi-projector-fill::before { content: "\f6ab"; }
+.bi-projector::before { content: "\f6ac"; }
+.bi-qr-code-scan::before { content: "\f6ad"; }
+.bi-qr-code::before { content: "\f6ae"; }
+.bi-quora::before { content: "\f6af"; }
+.bi-quote::before { content: "\f6b0"; }
+.bi-robot::before { content: "\f6b1"; }
+.bi-send-check-fill::before { content: "\f6b2"; }
+.bi-send-check::before { content: "\f6b3"; }
+.bi-send-dash-fill::before { content: "\f6b4"; }
+.bi-send-dash::before { content: "\f6b5"; }
+.bi-send-exclamation-1::before { content: "\f6b6"; }
+.bi-send-exclamation-fill::before { content: "\f6b7"; }
+.bi-send-exclamation::before { content: "\f6b8"; }
+.bi-send-fill::before { content: "\f6b9"; }
+.bi-send-plus-fill::before { content: "\f6ba"; }
+.bi-send-plus::before { content: "\f6bb"; }
+.bi-send-slash-fill::before { content: "\f6bc"; }
+.bi-send-slash::before { content: "\f6bd"; }
+.bi-send-x-fill::before { content: "\f6be"; }
+.bi-send-x::before { content: "\f6bf"; }
+.bi-send::before { content: "\f6c0"; }
+.bi-steam::before { content: "\f6c1"; }
+.bi-terminal-dash-1::before { content: "\f6c2"; }
+.bi-terminal-dash::before { content: "\f6c3"; }
+.bi-terminal-plus::before { content: "\f6c4"; }
+.bi-terminal-split::before { content: "\f6c5"; }
+.bi-ticket-detailed-fill::before { content: "\f6c6"; }
+.bi-ticket-detailed::before { content: "\f6c7"; }
+.bi-ticket-fill::before { content: "\f6c8"; }
+.bi-ticket-perforated-fill::before { content: "\f6c9"; }
+.bi-ticket-perforated::before { content: "\f6ca"; }
+.bi-ticket::before { content: "\f6cb"; }
+.bi-tiktok::before { content: "\f6cc"; }
+.bi-window-dash::before { content: "\f6cd"; }
+.bi-window-desktop::before { content: "\f6ce"; }
+.bi-window-fullscreen::before { content: "\f6cf"; }
+.bi-window-plus::before { content: "\f6d0"; }
+.bi-window-split::before { content: "\f6d1"; }
+.bi-window-stack::before { content: "\f6d2"; }
+.bi-window-x::before { content: "\f6d3"; }
+.bi-xbox::before { content: "\f6d4"; }
+.bi-ethernet::before { content: "\f6d5"; }
+.bi-hdmi-fill::before { content: "\f6d6"; }
+.bi-hdmi::before { content: "\f6d7"; }
+.bi-usb-c-fill::before { content: "\f6d8"; }
+.bi-usb-c::before { content: "\f6d9"; }
+.bi-usb-fill::before { content: "\f6da"; }
+.bi-usb-plug-fill::before { content: "\f6db"; }
+.bi-usb-plug::before { content: "\f6dc"; }
+.bi-usb-symbol::before { content: "\f6dd"; }
+.bi-usb::before { content: "\f6de"; }
+.bi-boombox-fill::before { content: "\f6df"; }
+.bi-displayport-1::before { content: "\f6e0"; }
+.bi-displayport::before { content: "\f6e1"; }
+.bi-gpu-card::before { content: "\f6e2"; }
+.bi-memory::before { content: "\f6e3"; }
+.bi-modem-fill::before { content: "\f6e4"; }
+.bi-modem::before { content: "\f6e5"; }
+.bi-motherboard-fill::before { content: "\f6e6"; }
+.bi-motherboard::before { content: "\f6e7"; }
+.bi-optical-audio-fill::before { content: "\f6e8"; }
+.bi-optical-audio::before { content: "\f6e9"; }
+.bi-pci-card::before { content: "\f6ea"; }
+.bi-router-fill::before { content: "\f6eb"; }
+.bi-router::before { content: "\f6ec"; }
+.bi-ssd-fill::before { content: "\f6ed"; }
+.bi-ssd::before { content: "\f6ee"; }
+.bi-thunderbolt-fill::before { content: "\f6ef"; }
+.bi-thunderbolt::before { content: "\f6f0"; }
+.bi-usb-drive-fill::before { content: "\f6f1"; }
+.bi-usb-drive::before { content: "\f6f2"; }
+.bi-usb-micro-fill::before { content: "\f6f3"; }
+.bi-usb-micro::before { content: "\f6f4"; }
+.bi-usb-mini-fill::before { content: "\f6f5"; }
+.bi-usb-mini::before { content: "\f6f6"; }
+.bi-cloud-haze2::before { content: "\f6f7"; }
+.bi-device-hdd-fill::before { content: "\f6f8"; }
+.bi-device-hdd::before { content: "\f6f9"; }
+.bi-device-ssd-fill::before { content: "\f6fa"; }
+.bi-device-ssd::before { content: "\f6fb"; }
+.bi-displayport-fill::before { content: "\f6fc"; }
+.bi-mortarboard-fill::before { content: "\f6fd"; }
+.bi-mortarboard::before { content: "\f6fe"; }
+.bi-terminal-x::before { content: "\f6ff"; }
+.bi-arrow-through-heart-fill::before { content: "\f700"; }
+.bi-arrow-through-heart::before { content: "\f701"; }
+.bi-badge-sd-fill::before { content: "\f702"; }
+.bi-badge-sd::before { content: "\f703"; }
+.bi-bag-heart-fill::before { content: "\f704"; }
+.bi-bag-heart::before { content: "\f705"; }
+.bi-balloon-fill::before { content: "\f706"; }
+.bi-balloon-heart-fill::before { content: "\f707"; }
+.bi-balloon-heart::before { content: "\f708"; }
+.bi-balloon::before { content: "\f709"; }
+.bi-box2-fill::before { content: "\f70a"; }
+.bi-box2-heart-fill::before { content: "\f70b"; }
+.bi-box2-heart::before { content: "\f70c"; }
+.bi-box2::before { content: "\f70d"; }
+.bi-braces-asterisk::before { content: "\f70e"; }
+.bi-calendar-heart-fill::before { content: "\f70f"; }
+.bi-calendar-heart::before { content: "\f710"; }
+.bi-calendar2-heart-fill::before { content: "\f711"; }
+.bi-calendar2-heart::before { content: "\f712"; }
+.bi-chat-heart-fill::before { content: "\f713"; }
+.bi-chat-heart::before { content: "\f714"; }
+.bi-chat-left-heart-fill::before { content: "\f715"; }
+.bi-chat-left-heart::before { content: "\f716"; }
+.bi-chat-right-heart-fill::before { content: "\f717"; }
+.bi-chat-right-heart::before { content: "\f718"; }
+.bi-chat-square-heart-fill::before { content: "\f719"; }
+.bi-chat-square-heart::before { content: "\f71a"; }
+.bi-clipboard-check-fill::before { content: "\f71b"; }
+.bi-clipboard-data-fill::before { content: "\f71c"; }
+.bi-clipboard-fill::before { content: "\f71d"; }
+.bi-clipboard-heart-fill::before { content: "\f71e"; }
+.bi-clipboard-heart::before { content: "\f71f"; }
+.bi-clipboard-minus-fill::before { content: "\f720"; }
+.bi-clipboard-plus-fill::before { content: "\f721"; }
+.bi-clipboard-pulse::before { content: "\f722"; }
+.bi-clipboard-x-fill::before { content: "\f723"; }
+.bi-clipboard2-check-fill::before { content: "\f724"; }
+.bi-clipboard2-check::before { content: "\f725"; }
+.bi-clipboard2-data-fill::before { content: "\f726"; }
+.bi-clipboard2-data::before { content: "\f727"; }
+.bi-clipboard2-fill::before { content: "\f728"; }
+.bi-clipboard2-heart-fill::before { content: "\f729"; }
+.bi-clipboard2-heart::before { content: "\f72a"; }
+.bi-clipboard2-minus-fill::before { content: "\f72b"; }
+.bi-clipboard2-minus::before { content: "\f72c"; }
+.bi-clipboard2-plus-fill::before { content: "\f72d"; }
+.bi-clipboard2-plus::before { content: "\f72e"; }
+.bi-clipboard2-pulse-fill::before { content: "\f72f"; }
+.bi-clipboard2-pulse::before { content: "\f730"; }
+.bi-clipboard2-x-fill::before { content: "\f731"; }
+.bi-clipboard2-x::before { content: "\f732"; }
+.bi-clipboard2::before { content: "\f733"; }
+.bi-emoji-kiss-fill::before { content: "\f734"; }
+.bi-emoji-kiss::before { content: "\f735"; }
+.bi-envelope-heart-fill::before { content: "\f736"; }
+.bi-envelope-heart::before { content: "\f737"; }
+.bi-envelope-open-heart-fill::before { content: "\f738"; }
+.bi-envelope-open-heart::before { content: "\f739"; }
+.bi-envelope-paper-fill::before { content: "\f73a"; }
+.bi-envelope-paper-heart-fill::before { content: "\f73b"; }
+.bi-envelope-paper-heart::before { content: "\f73c"; }
+.bi-envelope-paper::before { content: "\f73d"; }
+.bi-filetype-aac::before { content: "\f73e"; }
+.bi-filetype-ai::before { content: "\f73f"; }
+.bi-filetype-bmp::before { content: "\f740"; }
+.bi-filetype-cs::before { content: "\f741"; }
+.bi-filetype-css::before { content: "\f742"; }
+.bi-filetype-csv::before { content: "\f743"; }
+.bi-filetype-doc::before { content: "\f744"; }
+.bi-filetype-docx::before { content: "\f745"; }
+.bi-filetype-exe::before { content: "\f746"; }
+.bi-filetype-gif::before { content: "\f747"; }
+.bi-filetype-heic::before { content: "\f748"; }
+.bi-filetype-html::before { content: "\f749"; }
+.bi-filetype-java::before { content: "\f74a"; }
+.bi-filetype-jpg::before { content: "\f74b"; }
+.bi-filetype-js::before { content: "\f74c"; }
+.bi-filetype-jsx::before { content: "\f74d"; }
+.bi-filetype-key::before { content: "\f74e"; }
+.bi-filetype-m4p::before { content: "\f74f"; }
+.bi-filetype-md::before { content: "\f750"; }
+.bi-filetype-mdx::before { content: "\f751"; }
+.bi-filetype-mov::before { content: "\f752"; }
+.bi-filetype-mp3::before { content: "\f753"; }
+.bi-filetype-mp4::before { content: "\f754"; }
+.bi-filetype-otf::before { content: "\f755"; }
+.bi-filetype-pdf::before { content: "\f756"; }
+.bi-filetype-php::before { content: "\f757"; }
+.bi-filetype-png::before { content: "\f758"; }
+.bi-filetype-ppt-1::before { content: "\f759"; }
+.bi-filetype-ppt::before { content: "\f75a"; }
+.bi-filetype-psd::before { content: "\f75b"; }
+.bi-filetype-py::before { content: "\f75c"; }
+.bi-filetype-raw::before { content: "\f75d"; }
+.bi-filetype-rb::before { content: "\f75e"; }
+.bi-filetype-sass::before { content: "\f75f"; }
+.bi-filetype-scss::before { content: "\f760"; }
+.bi-filetype-sh::before { content: "\f761"; }
+.bi-filetype-svg::before { content: "\f762"; }
+.bi-filetype-tiff::before { content: "\f763"; }
+.bi-filetype-tsx::before { content: "\f764"; }
+.bi-filetype-ttf::before { content: "\f765"; }
+.bi-filetype-txt::before { content: "\f766"; }
+.bi-filetype-wav::before { content: "\f767"; }
+.bi-filetype-woff::before { content: "\f768"; }
+.bi-filetype-xls-1::before { content: "\f769"; }
+.bi-filetype-xls::before { content: "\f76a"; }
+.bi-filetype-xml::before { content: "\f76b"; }
+.bi-filetype-yml::before { content: "\f76c"; }
+.bi-heart-arrow::before { content: "\f76d"; }
+.bi-heart-pulse-fill::before { content: "\f76e"; }
+.bi-heart-pulse::before { content: "\f76f"; }
+.bi-heartbreak-fill::before { content: "\f770"; }
+.bi-heartbreak::before { content: "\f771"; }
+.bi-hearts::before { content: "\f772"; }
+.bi-hospital-fill::before { content: "\f773"; }
+.bi-hospital::before { content: "\f774"; }
+.bi-house-heart-fill::before { content: "\f775"; }
+.bi-house-heart::before { content: "\f776"; }
+.bi-incognito::before { content: "\f777"; }
+.bi-magnet-fill::before { content: "\f778"; }
+.bi-magnet::before { content: "\f779"; }
+.bi-person-heart::before { content: "\f77a"; }
+.bi-person-hearts::before { content: "\f77b"; }
+.bi-phone-flip::before { content: "\f77c"; }
+.bi-plugin::before { content: "\f77d"; }
+.bi-postage-fill::before { content: "\f77e"; }
+.bi-postage-heart-fill::before { content: "\f77f"; }
+.bi-postage-heart::before { content: "\f780"; }
+.bi-postage::before { content: "\f781"; }
+.bi-postcard-fill::before { content: "\f782"; }
+.bi-postcard-heart-fill::before { content: "\f783"; }
+.bi-postcard-heart::before { content: "\f784"; }
+.bi-postcard::before { content: "\f785"; }
+.bi-search-heart-fill::before { content: "\f786"; }
+.bi-search-heart::before { content: "\f787"; }
+.bi-sliders2-vertical::before { content: "\f788"; }
+.bi-sliders2::before { content: "\f789"; }
+.bi-trash3-fill::before { content: "\f78a"; }
+.bi-trash3::before { content: "\f78b"; }
+.bi-valentine::before { content: "\f78c"; }
+.bi-valentine2::before { content: "\f78d"; }
+.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; }
+.bi-wrench-adjustable-circle::before { content: "\f78f"; }
+.bi-wrench-adjustable::before { content: "\f790"; }
+.bi-filetype-json::before { content: "\f791"; }
+.bi-filetype-pptx::before { content: "\f792"; }
+.bi-filetype-xlsx::before { content: "\f793"; }
+.bi-1-circle-1::before { content: "\f794"; }
+.bi-1-circle-fill-1::before { content: "\f795"; }
+.bi-1-circle-fill::before { content: "\f796"; }
+.bi-1-circle::before { content: "\f797"; }
+.bi-1-square-fill::before { content: "\f798"; }
+.bi-1-square::before { content: "\f799"; }
+.bi-2-circle-1::before { content: "\f79a"; }
+.bi-2-circle-fill-1::before { content: "\f79b"; }
+.bi-2-circle-fill::before { content: "\f79c"; }
+.bi-2-circle::before { content: "\f79d"; }
+.bi-2-square-fill::before { content: "\f79e"; }
+.bi-2-square::before { content: "\f79f"; }
+.bi-3-circle-1::before { content: "\f7a0"; }
+.bi-3-circle-fill-1::before { content: "\f7a1"; }
+.bi-3-circle-fill::before { content: "\f7a2"; }
+.bi-3-circle::before { content: "\f7a3"; }
+.bi-3-square-fill::before { content: "\f7a4"; }
+.bi-3-square::before { content: "\f7a5"; }
+.bi-4-circle-1::before { content: "\f7a6"; }
+.bi-4-circle-fill-1::before { content: "\f7a7"; }
+.bi-4-circle-fill::before { content: "\f7a8"; }
+.bi-4-circle::before { content: "\f7a9"; }
+.bi-4-square-fill::before { content: "\f7aa"; }
+.bi-4-square::before { content: "\f7ab"; }
+.bi-5-circle-1::before { content: "\f7ac"; }
+.bi-5-circle-fill-1::before { content: "\f7ad"; }
+.bi-5-circle-fill::before { content: "\f7ae"; }
+.bi-5-circle::before { content: "\f7af"; }
+.bi-5-square-fill::before { content: "\f7b0"; }
+.bi-5-square::before { content: "\f7b1"; }
+.bi-6-circle-1::before { content: "\f7b2"; }
+.bi-6-circle-fill-1::before { content: "\f7b3"; }
+.bi-6-circle-fill::before { content: "\f7b4"; }
+.bi-6-circle::before { content: "\f7b5"; }
+.bi-6-square-fill::before { content: "\f7b6"; }
+.bi-6-square::before { content: "\f7b7"; }
+.bi-7-circle-1::before { content: "\f7b8"; }
+.bi-7-circle-fill-1::before { content: "\f7b9"; }
+.bi-7-circle-fill::before { content: "\f7ba"; }
+.bi-7-circle::before { content: "\f7bb"; }
+.bi-7-square-fill::before { content: "\f7bc"; }
+.bi-7-square::before { content: "\f7bd"; }
+.bi-8-circle-1::before { content: "\f7be"; }
+.bi-8-circle-fill-1::before { content: "\f7bf"; }
+.bi-8-circle-fill::before { content: "\f7c0"; }
+.bi-8-circle::before { content: "\f7c1"; }
+.bi-8-square-fill::before { content: "\f7c2"; }
+.bi-8-square::before { content: "\f7c3"; }
+.bi-9-circle-1::before { content: "\f7c4"; }
+.bi-9-circle-fill-1::before { content: "\f7c5"; }
+.bi-9-circle-fill::before { content: "\f7c6"; }
+.bi-9-circle::before { content: "\f7c7"; }
+.bi-9-square-fill::before { content: "\f7c8"; }
+.bi-9-square::before { content: "\f7c9"; }
+.bi-airplane-engines-fill::before { content: "\f7ca"; }
+.bi-airplane-engines::before { content: "\f7cb"; }
+.bi-airplane-fill::before { content: "\f7cc"; }
+.bi-airplane::before { content: "\f7cd"; }
+.bi-alexa::before { content: "\f7ce"; }
+.bi-alipay::before { content: "\f7cf"; }
+.bi-android::before { content: "\f7d0"; }
+.bi-android2::before { content: "\f7d1"; }
+.bi-box-fill::before { content: "\f7d2"; }
+.bi-box-seam-fill::before { content: "\f7d3"; }
+.bi-browser-chrome::before { content: "\f7d4"; }
+.bi-browser-edge::before { content: "\f7d5"; }
+.bi-browser-firefox::before { content: "\f7d6"; }
+.bi-browser-safari::before { content: "\f7d7"; }
+.bi-c-circle-1::before { content: "\f7d8"; }
+.bi-c-circle-fill-1::before { content: "\f7d9"; }
+.bi-c-circle-fill::before { content: "\f7da"; }
+.bi-c-circle::before { content: "\f7db"; }
+.bi-c-square-fill::before { content: "\f7dc"; }
+.bi-c-square::before { content: "\f7dd"; }
+.bi-capsule-pill::before { content: "\f7de"; }
+.bi-capsule::before { content: "\f7df"; }
+.bi-car-front-fill::before { content: "\f7e0"; }
+.bi-car-front::before { content: "\f7e1"; }
+.bi-cassette-fill::before { content: "\f7e2"; }
+.bi-cassette::before { content: "\f7e3"; }
+.bi-cc-circle-1::before { content: "\f7e4"; }
+.bi-cc-circle-fill-1::before { content: "\f7e5"; }
+.bi-cc-circle-fill::before { content: "\f7e6"; }
+.bi-cc-circle::before { content: "\f7e7"; }
+.bi-cc-square-fill::before { content: "\f7e8"; }
+.bi-cc-square::before { content: "\f7e9"; }
+.bi-cup-hot-fill::before { content: "\f7ea"; }
+.bi-cup-hot::before { content: "\f7eb"; }
+.bi-currency-rupee::before { content: "\f7ec"; }
+.bi-dropbox::before { content: "\f7ed"; }
+.bi-escape::before { content: "\f7ee"; }
+.bi-fast-forward-btn-fill::before { content: "\f7ef"; }
+.bi-fast-forward-btn::before { content: "\f7f0"; }
+.bi-fast-forward-circle-fill::before { content: "\f7f1"; }
+.bi-fast-forward-circle::before { content: "\f7f2"; }
+.bi-fast-forward-fill::before { content: "\f7f3"; }
+.bi-fast-forward::before { content: "\f7f4"; }
+.bi-filetype-sql::before { content: "\f7f5"; }
+.bi-fire::before { content: "\f7f6"; }
+.bi-google-play::before { content: "\f7f7"; }
+.bi-h-circle-1::before { content: "\f7f8"; }
+.bi-h-circle-fill-1::before { content: "\f7f9"; }
+.bi-h-circle-fill::before { content: "\f7fa"; }
+.bi-h-circle::before { content: "\f7fb"; }
+.bi-h-square-fill::before { content: "\f7fc"; }
+.bi-h-square::before { content: "\f7fd"; }
+.bi-indent::before { content: "\f7fe"; }
+.bi-lungs-fill::before { content: "\f7ff"; }
+.bi-lungs::before { content: "\f800"; }
+.bi-microsoft-teams::before { content: "\f801"; }
+.bi-p-circle-1::before { content: "\f802"; }
+.bi-p-circle-fill-1::before { content: "\f803"; }
+.bi-p-circle-fill::before { content: "\f804"; }
+.bi-p-circle::before { content: "\f805"; }
+.bi-p-square-fill::before { content: "\f806"; }
+.bi-p-square::before { content: "\f807"; }
+.bi-pass-fill::before { content: "\f808"; }
+.bi-pass::before { content: "\f809"; }
+.bi-prescription::before { content: "\f80a"; }
+.bi-prescription2::before { content: "\f80b"; }
+.bi-r-circle-1::before { content: "\f80c"; }
+.bi-r-circle-fill-1::before { content: "\f80d"; }
+.bi-r-circle-fill::before { content: "\f80e"; }
+.bi-r-circle::before { content: "\f80f"; }
+.bi-r-square-fill::before { content: "\f810"; }
+.bi-r-square::before { content: "\f811"; }
+.bi-repeat-1::before { content: "\f812"; }
+.bi-repeat::before { content: "\f813"; }
+.bi-rewind-btn-fill::before { content: "\f814"; }
+.bi-rewind-btn::before { content: "\f815"; }
+.bi-rewind-circle-fill::before { content: "\f816"; }
+.bi-rewind-circle::before { content: "\f817"; }
+.bi-rewind-fill::before { content: "\f818"; }
+.bi-rewind::before { content: "\f819"; }
+.bi-train-freight-front-fill::before { content: "\f81a"; }
+.bi-train-freight-front::before { content: "\f81b"; }
+.bi-train-front-fill::before { content: "\f81c"; }
+.bi-train-front::before { content: "\f81d"; }
+.bi-train-lightrail-front-fill::before { content: "\f81e"; }
+.bi-train-lightrail-front::before { content: "\f81f"; }
+.bi-truck-front-fill::before { content: "\f820"; }
+.bi-truck-front::before { content: "\f821"; }
+.bi-ubuntu::before { content: "\f822"; }
+.bi-unindent::before { content: "\f823"; }
+.bi-unity::before { content: "\f824"; }
+.bi-universal-access-circle::before { content: "\f825"; }
+.bi-universal-access::before { content: "\f826"; }
+.bi-virus::before { content: "\f827"; }
+.bi-virus2::before { content: "\f828"; }
+.bi-wechat::before { content: "\f829"; }
+.bi-yelp::before { content: "\f82a"; }
+.bi-sign-stop-fill::before { content: "\f82b"; }
+.bi-sign-stop-lights-fill::before { content: "\f82c"; }
+.bi-sign-stop-lights::before { content: "\f82d"; }
+.bi-sign-stop::before { content: "\f82e"; }
+.bi-sign-turn-left-fill::before { content: "\f82f"; }
+.bi-sign-turn-left::before { content: "\f830"; }
+.bi-sign-turn-right-fill::before { content: "\f831"; }
+.bi-sign-turn-right::before { content: "\f832"; }
+.bi-sign-turn-slight-left-fill::before { content: "\f833"; }
+.bi-sign-turn-slight-left::before { content: "\f834"; }
+.bi-sign-turn-slight-right-fill::before { content: "\f835"; }
+.bi-sign-turn-slight-right::before { content: "\f836"; }
+.bi-sign-yield-fill::before { content: "\f837"; }
+.bi-sign-yield::before { content: "\f838"; }
+.bi-ev-station-fill::before { content: "\f839"; }
+.bi-ev-station::before { content: "\f83a"; }
+.bi-fuel-pump-diesel-fill::before { content: "\f83b"; }
+.bi-fuel-pump-diesel::before { content: "\f83c"; }
+.bi-fuel-pump-fill::before { content: "\f83d"; }
+.bi-fuel-pump::before { content: "\f83e"; }
+.bi-0-circle-fill::before { content: "\f83f"; }
+.bi-0-circle::before { content: "\f840"; }
+.bi-0-square-fill::before { content: "\f841"; }
+.bi-0-square::before { content: "\f842"; }
+.bi-rocket-fill::before { content: "\f843"; }
+.bi-rocket-takeoff-fill::before { content: "\f844"; }
+.bi-rocket-takeoff::before { content: "\f845"; }
+.bi-rocket::before { content: "\f846"; }
+.bi-stripe::before { content: "\f847"; }
+.bi-subscript::before { content: "\f848"; }
+.bi-superscript::before { content: "\f849"; }
+.bi-trello::before { content: "\f84a"; }
+.bi-envelope-at-fill::before { content: "\f84b"; }
+.bi-envelope-at::before { content: "\f84c"; }
+.bi-regex::before { content: "\f84d"; }
+.bi-text-wrap::before { content: "\f84e"; }
+.bi-sign-dead-end-fill::before { content: "\f84f"; }
+.bi-sign-dead-end::before { content: "\f850"; }
+.bi-sign-do-not-enter-fill::before { content: "\f851"; }
+.bi-sign-do-not-enter::before { content: "\f852"; }
+.bi-sign-intersection-fill::before { content: "\f853"; }
+.bi-sign-intersection-side-fill::before { content: "\f854"; }
+.bi-sign-intersection-side::before { content: "\f855"; }
+.bi-sign-intersection-t-fill::before { content: "\f856"; }
+.bi-sign-intersection-t::before { content: "\f857"; }
+.bi-sign-intersection-y-fill::before { content: "\f858"; }
+.bi-sign-intersection-y::before { content: "\f859"; }
+.bi-sign-intersection::before { content: "\f85a"; }
+.bi-sign-merge-left-fill::before { content: "\f85b"; }
+.bi-sign-merge-left::before { content: "\f85c"; }
+.bi-sign-merge-right-fill::before { content: "\f85d"; }
+.bi-sign-merge-right::before { content: "\f85e"; }
+.bi-sign-no-left-turn-fill::before { content: "\f85f"; }
+.bi-sign-no-left-turn::before { content: "\f860"; }
+.bi-sign-no-parking-fill::before { content: "\f861"; }
+.bi-sign-no-parking::before { content: "\f862"; }
+.bi-sign-no-right-turn-fill::before { content: "\f863"; }
+.bi-sign-no-right-turn::before { content: "\f864"; }
+.bi-sign-railroad-fill::before { content: "\f865"; }
+.bi-sign-railroad::before { content: "\f866"; }
+.bi-building-add::before { content: "\f867"; }
+.bi-building-check::before { content: "\f868"; }
+.bi-building-dash::before { content: "\f869"; }
+.bi-building-down::before { content: "\f86a"; }
+.bi-building-exclamation::before { content: "\f86b"; }
+.bi-building-fill-add::before { content: "\f86c"; }
+.bi-building-fill-check::before { content: "\f86d"; }
+.bi-building-fill-dash::before { content: "\f86e"; }
+.bi-building-fill-down::before { content: "\f86f"; }
+.bi-building-fill-exclamation::before { content: "\f870"; }
+.bi-building-fill-gear::before { content: "\f871"; }
+.bi-building-fill-lock::before { content: "\f872"; }
+.bi-building-fill-slash::before { content: "\f873"; }
+.bi-building-fill-up::before { content: "\f874"; }
+.bi-building-fill-x::before { content: "\f875"; }
+.bi-building-fill::before { content: "\f876"; }
+.bi-building-gear::before { content: "\f877"; }
+.bi-building-lock::before { content: "\f878"; }
+.bi-building-slash::before { content: "\f879"; }
+.bi-building-up::before { content: "\f87a"; }
+.bi-building-x::before { content: "\f87b"; }
+.bi-buildings-fill::before { content: "\f87c"; }
+.bi-buildings::before { content: "\f87d"; }
+.bi-bus-front-fill::before { content: "\f87e"; }
+.bi-bus-front::before { content: "\f87f"; }
+.bi-ev-front-fill::before { content: "\f880"; }
+.bi-ev-front::before { content: "\f881"; }
+.bi-globe-americas::before { content: "\f882"; }
+.bi-globe-asia-australia::before { content: "\f883"; }
+.bi-globe-central-south-asia::before { content: "\f884"; }
+.bi-globe-europe-africa::before { content: "\f885"; }
+.bi-house-add-fill::before { content: "\f886"; }
+.bi-house-add::before { content: "\f887"; }
+.bi-house-check-fill::before { content: "\f888"; }
+.bi-house-check::before { content: "\f889"; }
+.bi-house-dash-fill::before { content: "\f88a"; }
+.bi-house-dash::before { content: "\f88b"; }
+.bi-house-down-fill::before { content: "\f88c"; }
+.bi-house-down::before { content: "\f88d"; }
+.bi-house-exclamation-fill::before { content: "\f88e"; }
+.bi-house-exclamation::before { content: "\f88f"; }
+.bi-house-gear-fill::before { content: "\f890"; }
+.bi-house-gear::before { content: "\f891"; }
+.bi-house-lock-fill::before { content: "\f892"; }
+.bi-house-lock::before { content: "\f893"; }
+.bi-house-slash-fill::before { content: "\f894"; }
+.bi-house-slash::before { content: "\f895"; }
+.bi-house-up-fill::before { content: "\f896"; }
+.bi-house-up::before { content: "\f897"; }
+.bi-house-x-fill::before { content: "\f898"; }
+.bi-house-x::before { content: "\f899"; }
+.bi-person-add::before { content: "\f89a"; }
+.bi-person-down::before { content: "\f89b"; }
+.bi-person-exclamation::before { content: "\f89c"; }
+.bi-person-fill-add::before { content: "\f89d"; }
+.bi-person-fill-check::before { content: "\f89e"; }
+.bi-person-fill-dash::before { content: "\f89f"; }
+.bi-person-fill-down::before { content: "\f8a0"; }
+.bi-person-fill-exclamation::before { content: "\f8a1"; }
+.bi-person-fill-gear::before { content: "\f8a2"; }
+.bi-person-fill-lock::before { content: "\f8a3"; }
+.bi-person-fill-slash::before { content: "\f8a4"; }
+.bi-person-fill-up::before { content: "\f8a5"; }
+.bi-person-fill-x::before { content: "\f8a6"; }
+.bi-person-gear::before { content: "\f8a7"; }
+.bi-person-lock::before { content: "\f8a8"; }
+.bi-person-slash::before { content: "\f8a9"; }
+.bi-person-up::before { content: "\f8aa"; }
+.bi-scooter::before { content: "\f8ab"; }
+.bi-taxi-front-fill::before { content: "\f8ac"; }
+.bi-taxi-front::before { content: "\f8ad"; }
+.bi-amd::before { content: "\f8ae"; }
+.bi-database-add::before { content: "\f8af"; }
+.bi-database-check::before { content: "\f8b0"; }
+.bi-database-dash::before { content: "\f8b1"; }
+.bi-database-down::before { content: "\f8b2"; }
+.bi-database-exclamation::before { content: "\f8b3"; }
+.bi-database-fill-add::before { content: "\f8b4"; }
+.bi-database-fill-check::before { content: "\f8b5"; }
+.bi-database-fill-dash::before { content: "\f8b6"; }
+.bi-database-fill-down::before { content: "\f8b7"; }
+.bi-database-fill-exclamation::before { content: "\f8b8"; }
+.bi-database-fill-gear::before { content: "\f8b9"; }
+.bi-database-fill-lock::before { content: "\f8ba"; }
+.bi-database-fill-slash::before { content: "\f8bb"; }
+.bi-database-fill-up::before { content: "\f8bc"; }
+.bi-database-fill-x::before { content: "\f8bd"; }
+.bi-database-fill::before { content: "\f8be"; }
+.bi-database-gear::before { content: "\f8bf"; }
+.bi-database-lock::before { content: "\f8c0"; }
+.bi-database-slash::before { content: "\f8c1"; }
+.bi-database-up::before { content: "\f8c2"; }
+.bi-database-x::before { content: "\f8c3"; }
+.bi-database::before { content: "\f8c4"; }
+.bi-houses-fill::before { content: "\f8c5"; }
+.bi-houses::before { content: "\f8c6"; }
+.bi-nvidia::before { content: "\f8c7"; }
+.bi-person-vcard-fill::before { content: "\f8c8"; }
+.bi-person-vcard::before { content: "\f8c9"; }
+.bi-sina-weibo::before { content: "\f8ca"; }
+.bi-tencent-qq::before { content: "\f8cb"; }
+.bi-wikipedia::before { content: "\f8cc"; }
diff --git a/css/bootstrap-icons.min.css b/css/bootstrap-icons.min.css
new file mode 100644
index 0000000..823403f
--- /dev/null
+++ b/css/bootstrap-icons.min.css
@@ -0,0 +1,6171 @@
+/*!
+ * Bootstrap Icons v1.11.3 (https://icons.getbootstrap.com/)
+ * Copyright 2019-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE)
+ */@font-face{
+ font-display:block;
+ font-family:bootstrap-icons;
+ src:url("fonts/bootstrap-icons.woff2?dd67030699838ea613ee6dbda90effa6") format("woff2"),url("fonts/bootstrap-icons.woff?dd67030699838ea613ee6dbda90effa6") format("woff")
+}
+.bi::before,[class*=" bi-"]::before,[class^=bi-]::before{
+ display:inline-block;
+ font-family:bootstrap-icons!important;
+ font-style:normal;
+ font-weight:400!important;
+ font-variant:normal;
+ text-transform:none;
+ line-height:1;
+ vertical-align:-.125em;
+ -webkit-font-smoothing:antialiased;
+ -moz-osx-font-smoothing:grayscale
+}
+.bi-123::before{
+ content:"\f67f"
+}
+.bi-alarm-fill::before{
+ content:"\f101"
+}
+.bi-alarm::before{
+ content:"\f102"
+}
+.bi-align-bottom::before{
+ content:"\f103"
+}
+.bi-align-center::before{
+ content:"\f104"
+}
+.bi-align-end::before{
+ content:"\f105"
+}
+.bi-align-middle::before{
+ content:"\f106"
+}
+.bi-align-start::before{
+ content:"\f107"
+}
+.bi-align-top::before{
+ content:"\f108"
+}
+.bi-alt::before{
+ content:"\f109"
+}
+.bi-app-indicator::before{
+ content:"\f10a"
+}
+.bi-app::before{
+ content:"\f10b"
+}
+.bi-archive-fill::before{
+ content:"\f10c"
+}
+.bi-archive::before{
+ content:"\f10d"
+}
+.bi-arrow-90deg-down::before{
+ content:"\f10e"
+}
+.bi-arrow-90deg-left::before{
+ content:"\f10f"
+}
+.bi-arrow-90deg-right::before{
+ content:"\f110"
+}
+.bi-arrow-90deg-up::before{
+ content:"\f111"
+}
+.bi-arrow-bar-down::before{
+ content:"\f112"
+}
+.bi-arrow-bar-left::before{
+ content:"\f113"
+}
+.bi-arrow-bar-right::before{
+ content:"\f114"
+}
+.bi-arrow-bar-up::before{
+ content:"\f115"
+}
+.bi-arrow-clockwise::before{
+ content:"\f116"
+}
+.bi-arrow-counterclockwise::before{
+ content:"\f117"
+}
+.bi-arrow-down-circle-fill::before{
+ content:"\f118"
+}
+.bi-arrow-down-circle::before{
+ content:"\f119"
+}
+.bi-arrow-down-left-circle-fill::before{
+ content:"\f11a"
+}
+.bi-arrow-down-left-circle::before{
+ content:"\f11b"
+}
+.bi-arrow-down-left-square-fill::before{
+ content:"\f11c"
+}
+.bi-arrow-down-left-square::before{
+ content:"\f11d"
+}
+.bi-arrow-down-left::before{
+ content:"\f11e"
+}
+.bi-arrow-down-right-circle-fill::before{
+ content:"\f11f"
+}
+.bi-arrow-down-right-circle::before{
+ content:"\f120"
+}
+.bi-arrow-down-right-square-fill::before{
+ content:"\f121"
+}
+.bi-arrow-down-right-square::before{
+ content:"\f122"
+}
+.bi-arrow-down-right::before{
+ content:"\f123"
+}
+.bi-arrow-down-short::before{
+ content:"\f124"
+}
+.bi-arrow-down-square-fill::before{
+ content:"\f125"
+}
+.bi-arrow-down-square::before{
+ content:"\f126"
+}
+.bi-arrow-down-up::before{
+ content:"\f127"
+}
+.bi-arrow-down::before{
+ content:"\f128"
+}
+.bi-arrow-left-circle-fill::before{
+ content:"\f129"
+}
+.bi-arrow-left-circle::before{
+ content:"\f12a"
+}
+.bi-arrow-left-right::before{
+ content:"\f12b"
+}
+.bi-arrow-left-short::before{
+ content:"\f12c"
+}
+.bi-arrow-left-square-fill::before{
+ content:"\f12d"
+}
+.bi-arrow-left-square::before{
+ content:"\f12e"
+}
+.bi-arrow-left::before{
+ content:"\f12f"
+}
+.bi-arrow-repeat::before{
+ content:"\f130"
+}
+.bi-arrow-return-left::before{
+ content:"\f131"
+}
+.bi-arrow-return-right::before{
+ content:"\f132"
+}
+.bi-arrow-right-circle-fill::before{
+ content:"\f133"
+}
+.bi-arrow-right-circle::before{
+ content:"\f134"
+}
+.bi-arrow-right-short::before{
+ content:"\f135"
+}
+.bi-arrow-right-square-fill::before{
+ content:"\f136"
+}
+.bi-arrow-right-square::before{
+ content:"\f137"
+}
+.bi-arrow-right::before{
+ content:"\f138"
+}
+.bi-arrow-up-circle-fill::before{
+ content:"\f139"
+}
+.bi-arrow-up-circle::before{
+ content:"\f13a"
+}
+.bi-arrow-up-left-circle-fill::before{
+ content:"\f13b"
+}
+.bi-arrow-up-left-circle::before{
+ content:"\f13c"
+}
+.bi-arrow-up-left-square-fill::before{
+ content:"\f13d"
+}
+.bi-arrow-up-left-square::before{
+ content:"\f13e"
+}
+.bi-arrow-up-left::before{
+ content:"\f13f"
+}
+.bi-arrow-up-right-circle-fill::before{
+ content:"\f140"
+}
+.bi-arrow-up-right-circle::before{
+ content:"\f141"
+}
+.bi-arrow-up-right-square-fill::before{
+ content:"\f142"
+}
+.bi-arrow-up-right-square::before{
+ content:"\f143"
+}
+.bi-arrow-up-right::before{
+ content:"\f144"
+}
+.bi-arrow-up-short::before{
+ content:"\f145"
+}
+.bi-arrow-up-square-fill::before{
+ content:"\f146"
+}
+.bi-arrow-up-square::before{
+ content:"\f147"
+}
+.bi-arrow-up::before{
+ content:"\f148"
+}
+.bi-arrows-angle-contract::before{
+ content:"\f149"
+}
+.bi-arrows-angle-expand::before{
+ content:"\f14a"
+}
+.bi-arrows-collapse::before{
+ content:"\f14b"
+}
+.bi-arrows-expand::before{
+ content:"\f14c"
+}
+.bi-arrows-fullscreen::before{
+ content:"\f14d"
+}
+.bi-arrows-move::before{
+ content:"\f14e"
+}
+.bi-aspect-ratio-fill::before{
+ content:"\f14f"
+}
+.bi-aspect-ratio::before{
+ content:"\f150"
+}
+.bi-asterisk::before{
+ content:"\f151"
+}
+.bi-at::before{
+ content:"\f152"
+}
+.bi-award-fill::before{
+ content:"\f153"
+}
+.bi-award::before{
+ content:"\f154"
+}
+.bi-back::before{
+ content:"\f155"
+}
+.bi-backspace-fill::before{
+ content:"\f156"
+}
+.bi-backspace-reverse-fill::before{
+ content:"\f157"
+}
+.bi-backspace-reverse::before{
+ content:"\f158"
+}
+.bi-backspace::before{
+ content:"\f159"
+}
+.bi-badge-3d-fill::before{
+ content:"\f15a"
+}
+.bi-badge-3d::before{
+ content:"\f15b"
+}
+.bi-badge-4k-fill::before{
+ content:"\f15c"
+}
+.bi-badge-4k::before{
+ content:"\f15d"
+}
+.bi-badge-8k-fill::before{
+ content:"\f15e"
+}
+.bi-badge-8k::before{
+ content:"\f15f"
+}
+.bi-badge-ad-fill::before{
+ content:"\f160"
+}
+.bi-badge-ad::before{
+ content:"\f161"
+}
+.bi-badge-ar-fill::before{
+ content:"\f162"
+}
+.bi-badge-ar::before{
+ content:"\f163"
+}
+.bi-badge-cc-fill::before{
+ content:"\f164"
+}
+.bi-badge-cc::before{
+ content:"\f165"
+}
+.bi-badge-hd-fill::before{
+ content:"\f166"
+}
+.bi-badge-hd::before{
+ content:"\f167"
+}
+.bi-badge-tm-fill::before{
+ content:"\f168"
+}
+.bi-badge-tm::before{
+ content:"\f169"
+}
+.bi-badge-vo-fill::before{
+ content:"\f16a"
+}
+.bi-badge-vo::before{
+ content:"\f16b"
+}
+.bi-badge-vr-fill::before{
+ content:"\f16c"
+}
+.bi-badge-vr::before{
+ content:"\f16d"
+}
+.bi-badge-wc-fill::before{
+ content:"\f16e"
+}
+.bi-badge-wc::before{
+ content:"\f16f"
+}
+.bi-bag-check-fill::before{
+ content:"\f170"
+}
+.bi-bag-check::before{
+ content:"\f171"
+}
+.bi-bag-dash-fill::before{
+ content:"\f172"
+}
+.bi-bag-dash::before{
+ content:"\f173"
+}
+.bi-bag-fill::before{
+ content:"\f174"
+}
+.bi-bag-plus-fill::before{
+ content:"\f175"
+}
+.bi-bag-plus::before{
+ content:"\f176"
+}
+.bi-bag-x-fill::before{
+ content:"\f177"
+}
+.bi-bag-x::before{
+ content:"\f178"
+}
+.bi-bag::before{
+ content:"\f179"
+}
+.bi-bar-chart-fill::before{
+ content:"\f17a"
+}
+.bi-bar-chart-line-fill::before{
+ content:"\f17b"
+}
+.bi-bar-chart-line::before{
+ content:"\f17c"
+}
+.bi-bar-chart-steps::before{
+ content:"\f17d"
+}
+.bi-bar-chart::before{
+ content:"\f17e"
+}
+.bi-basket-fill::before{
+ content:"\f17f"
+}
+.bi-basket::before{
+ content:"\f180"
+}
+.bi-basket2-fill::before{
+ content:"\f181"
+}
+.bi-basket2::before{
+ content:"\f182"
+}
+.bi-basket3-fill::before{
+ content:"\f183"
+}
+.bi-basket3::before{
+ content:"\f184"
+}
+.bi-battery-charging::before{
+ content:"\f185"
+}
+.bi-battery-full::before{
+ content:"\f186"
+}
+.bi-battery-half::before{
+ content:"\f187"
+}
+.bi-battery::before{
+ content:"\f188"
+}
+.bi-bell-fill::before{
+ content:"\f189"
+}
+.bi-bell::before{
+ content:"\f18a"
+}
+.bi-bezier::before{
+ content:"\f18b"
+}
+.bi-bezier2::before{
+ content:"\f18c"
+}
+.bi-bicycle::before{
+ content:"\f18d"
+}
+.bi-binoculars-fill::before{
+ content:"\f18e"
+}
+.bi-binoculars::before{
+ content:"\f18f"
+}
+.bi-blockquote-left::before{
+ content:"\f190"
+}
+.bi-blockquote-right::before{
+ content:"\f191"
+}
+.bi-book-fill::before{
+ content:"\f192"
+}
+.bi-book-half::before{
+ content:"\f193"
+}
+.bi-book::before{
+ content:"\f194"
+}
+.bi-bookmark-check-fill::before{
+ content:"\f195"
+}
+.bi-bookmark-check::before{
+ content:"\f196"
+}
+.bi-bookmark-dash-fill::before{
+ content:"\f197"
+}
+.bi-bookmark-dash::before{
+ content:"\f198"
+}
+.bi-bookmark-fill::before{
+ content:"\f199"
+}
+.bi-bookmark-heart-fill::before{
+ content:"\f19a"
+}
+.bi-bookmark-heart::before{
+ content:"\f19b"
+}
+.bi-bookmark-plus-fill::before{
+ content:"\f19c"
+}
+.bi-bookmark-plus::before{
+ content:"\f19d"
+}
+.bi-bookmark-star-fill::before{
+ content:"\f19e"
+}
+.bi-bookmark-star::before{
+ content:"\f19f"
+}
+.bi-bookmark-x-fill::before{
+ content:"\f1a0"
+}
+.bi-bookmark-x::before{
+ content:"\f1a1"
+}
+.bi-bookmark::before{
+ content:"\f1a2"
+}
+.bi-bookmarks-fill::before{
+ content:"\f1a3"
+}
+.bi-bookmarks::before{
+ content:"\f1a4"
+}
+.bi-bookshelf::before{
+ content:"\f1a5"
+}
+.bi-bootstrap-fill::before{
+ content:"\f1a6"
+}
+.bi-bootstrap-reboot::before{
+ content:"\f1a7"
+}
+.bi-bootstrap::before{
+ content:"\f1a8"
+}
+.bi-border-all::before{
+ content:"\f1a9"
+}
+.bi-border-bottom::before{
+ content:"\f1aa"
+}
+.bi-border-center::before{
+ content:"\f1ab"
+}
+.bi-border-inner::before{
+ content:"\f1ac"
+}
+.bi-border-left::before{
+ content:"\f1ad"
+}
+.bi-border-middle::before{
+ content:"\f1ae"
+}
+.bi-border-outer::before{
+ content:"\f1af"
+}
+.bi-border-right::before{
+ content:"\f1b0"
+}
+.bi-border-style::before{
+ content:"\f1b1"
+}
+.bi-border-top::before{
+ content:"\f1b2"
+}
+.bi-border-width::before{
+ content:"\f1b3"
+}
+.bi-border::before{
+ content:"\f1b4"
+}
+.bi-bounding-box-circles::before{
+ content:"\f1b5"
+}
+.bi-bounding-box::before{
+ content:"\f1b6"
+}
+.bi-box-arrow-down-left::before{
+ content:"\f1b7"
+}
+.bi-box-arrow-down-right::before{
+ content:"\f1b8"
+}
+.bi-box-arrow-down::before{
+ content:"\f1b9"
+}
+.bi-box-arrow-in-down-left::before{
+ content:"\f1ba"
+}
+.bi-box-arrow-in-down-right::before{
+ content:"\f1bb"
+}
+.bi-box-arrow-in-down::before{
+ content:"\f1bc"
+}
+.bi-box-arrow-in-left::before{
+ content:"\f1bd"
+}
+.bi-box-arrow-in-right::before{
+ content:"\f1be"
+}
+.bi-box-arrow-in-up-left::before{
+ content:"\f1bf"
+}
+.bi-box-arrow-in-up-right::before{
+ content:"\f1c0"
+}
+.bi-box-arrow-in-up::before{
+ content:"\f1c1"
+}
+.bi-box-arrow-left::before{
+ content:"\f1c2"
+}
+.bi-box-arrow-right::before{
+ content:"\f1c3"
+}
+.bi-box-arrow-up-left::before{
+ content:"\f1c4"
+}
+.bi-box-arrow-up-right::before{
+ content:"\f1c5"
+}
+.bi-box-arrow-up::before{
+ content:"\f1c6"
+}
+.bi-box-seam::before{
+ content:"\f1c7"
+}
+.bi-box::before{
+ content:"\f1c8"
+}
+.bi-braces::before{
+ content:"\f1c9"
+}
+.bi-bricks::before{
+ content:"\f1ca"
+}
+.bi-briefcase-fill::before{
+ content:"\f1cb"
+}
+.bi-briefcase::before{
+ content:"\f1cc"
+}
+.bi-brightness-alt-high-fill::before{
+ content:"\f1cd"
+}
+.bi-brightness-alt-high::before{
+ content:"\f1ce"
+}
+.bi-brightness-alt-low-fill::before{
+ content:"\f1cf"
+}
+.bi-brightness-alt-low::before{
+ content:"\f1d0"
+}
+.bi-brightness-high-fill::before{
+ content:"\f1d1"
+}
+.bi-brightness-high::before{
+ content:"\f1d2"
+}
+.bi-brightness-low-fill::before{
+ content:"\f1d3"
+}
+.bi-brightness-low::before{
+ content:"\f1d4"
+}
+.bi-broadcast-pin::before{
+ content:"\f1d5"
+}
+.bi-broadcast::before{
+ content:"\f1d6"
+}
+.bi-brush-fill::before{
+ content:"\f1d7"
+}
+.bi-brush::before{
+ content:"\f1d8"
+}
+.bi-bucket-fill::before{
+ content:"\f1d9"
+}
+.bi-bucket::before{
+ content:"\f1da"
+}
+.bi-bug-fill::before{
+ content:"\f1db"
+}
+.bi-bug::before{
+ content:"\f1dc"
+}
+.bi-building::before{
+ content:"\f1dd"
+}
+.bi-bullseye::before{
+ content:"\f1de"
+}
+.bi-calculator-fill::before{
+ content:"\f1df"
+}
+.bi-calculator::before{
+ content:"\f1e0"
+}
+.bi-calendar-check-fill::before{
+ content:"\f1e1"
+}
+.bi-calendar-check::before{
+ content:"\f1e2"
+}
+.bi-calendar-date-fill::before{
+ content:"\f1e3"
+}
+.bi-calendar-date::before{
+ content:"\f1e4"
+}
+.bi-calendar-day-fill::before{
+ content:"\f1e5"
+}
+.bi-calendar-day::before{
+ content:"\f1e6"
+}
+.bi-calendar-event-fill::before{
+ content:"\f1e7"
+}
+.bi-calendar-event::before{
+ content:"\f1e8"
+}
+.bi-calendar-fill::before{
+ content:"\f1e9"
+}
+.bi-calendar-minus-fill::before{
+ content:"\f1ea"
+}
+.bi-calendar-minus::before{
+ content:"\f1eb"
+}
+.bi-calendar-month-fill::before{
+ content:"\f1ec"
+}
+.bi-calendar-month::before{
+ content:"\f1ed"
+}
+.bi-calendar-plus-fill::before{
+ content:"\f1ee"
+}
+.bi-calendar-plus::before{
+ content:"\f1ef"
+}
+.bi-calendar-range-fill::before{
+ content:"\f1f0"
+}
+.bi-calendar-range::before{
+ content:"\f1f1"
+}
+.bi-calendar-week-fill::before{
+ content:"\f1f2"
+}
+.bi-calendar-week::before{
+ content:"\f1f3"
+}
+.bi-calendar-x-fill::before{
+ content:"\f1f4"
+}
+.bi-calendar-x::before{
+ content:"\f1f5"
+}
+.bi-calendar::before{
+ content:"\f1f6"
+}
+.bi-calendar2-check-fill::before{
+ content:"\f1f7"
+}
+.bi-calendar2-check::before{
+ content:"\f1f8"
+}
+.bi-calendar2-date-fill::before{
+ content:"\f1f9"
+}
+.bi-calendar2-date::before{
+ content:"\f1fa"
+}
+.bi-calendar2-day-fill::before{
+ content:"\f1fb"
+}
+.bi-calendar2-day::before{
+ content:"\f1fc"
+}
+.bi-calendar2-event-fill::before{
+ content:"\f1fd"
+}
+.bi-calendar2-event::before{
+ content:"\f1fe"
+}
+.bi-calendar2-fill::before{
+ content:"\f1ff"
+}
+.bi-calendar2-minus-fill::before{
+ content:"\f200"
+}
+.bi-calendar2-minus::before{
+ content:"\f201"
+}
+.bi-calendar2-month-fill::before{
+ content:"\f202"
+}
+.bi-calendar2-month::before{
+ content:"\f203"
+}
+.bi-calendar2-plus-fill::before{
+ content:"\f204"
+}
+.bi-calendar2-plus::before{
+ content:"\f205"
+}
+.bi-calendar2-range-fill::before{
+ content:"\f206"
+}
+.bi-calendar2-range::before{
+ content:"\f207"
+}
+.bi-calendar2-week-fill::before{
+ content:"\f208"
+}
+.bi-calendar2-week::before{
+ content:"\f209"
+}
+.bi-calendar2-x-fill::before{
+ content:"\f20a"
+}
+.bi-calendar2-x::before{
+ content:"\f20b"
+}
+.bi-calendar2::before{
+ content:"\f20c"
+}
+.bi-calendar3-event-fill::before{
+ content:"\f20d"
+}
+.bi-calendar3-event::before{
+ content:"\f20e"
+}
+.bi-calendar3-fill::before{
+ content:"\f20f"
+}
+.bi-calendar3-range-fill::before{
+ content:"\f210"
+}
+.bi-calendar3-range::before{
+ content:"\f211"
+}
+.bi-calendar3-week-fill::before{
+ content:"\f212"
+}
+.bi-calendar3-week::before{
+ content:"\f213"
+}
+.bi-calendar3::before{
+ content:"\f214"
+}
+.bi-calendar4-event::before{
+ content:"\f215"
+}
+.bi-calendar4-range::before{
+ content:"\f216"
+}
+.bi-calendar4-week::before{
+ content:"\f217"
+}
+.bi-calendar4::before{
+ content:"\f218"
+}
+.bi-camera-fill::before{
+ content:"\f219"
+}
+.bi-camera-reels-fill::before{
+ content:"\f21a"
+}
+.bi-camera-reels::before{
+ content:"\f21b"
+}
+.bi-camera-video-fill::before{
+ content:"\f21c"
+}
+.bi-camera-video-off-fill::before{
+ content:"\f21d"
+}
+.bi-camera-video-off::before{
+ content:"\f21e"
+}
+.bi-camera-video::before{
+ content:"\f21f"
+}
+.bi-camera::before{
+ content:"\f220"
+}
+.bi-camera2::before{
+ content:"\f221"
+}
+.bi-capslock-fill::before{
+ content:"\f222"
+}
+.bi-capslock::before{
+ content:"\f223"
+}
+.bi-card-checklist::before{
+ content:"\f224"
+}
+.bi-card-heading::before{
+ content:"\f225"
+}
+.bi-card-image::before{
+ content:"\f226"
+}
+.bi-card-list::before{
+ content:"\f227"
+}
+.bi-card-text::before{
+ content:"\f228"
+}
+.bi-caret-down-fill::before{
+ content:"\f229"
+}
+.bi-caret-down-square-fill::before{
+ content:"\f22a"
+}
+.bi-caret-down-square::before{
+ content:"\f22b"
+}
+.bi-caret-down::before{
+ content:"\f22c"
+}
+.bi-caret-left-fill::before{
+ content:"\f22d"
+}
+.bi-caret-left-square-fill::before{
+ content:"\f22e"
+}
+.bi-caret-left-square::before{
+ content:"\f22f"
+}
+.bi-caret-left::before{
+ content:"\f230"
+}
+.bi-caret-right-fill::before{
+ content:"\f231"
+}
+.bi-caret-right-square-fill::before{
+ content:"\f232"
+}
+.bi-caret-right-square::before{
+ content:"\f233"
+}
+.bi-caret-right::before{
+ content:"\f234"
+}
+.bi-caret-up-fill::before{
+ content:"\f235"
+}
+.bi-caret-up-square-fill::before{
+ content:"\f236"
+}
+.bi-caret-up-square::before{
+ content:"\f237"
+}
+.bi-caret-up::before{
+ content:"\f238"
+}
+.bi-cart-check-fill::before{
+ content:"\f239"
+}
+.bi-cart-check::before{
+ content:"\f23a"
+}
+.bi-cart-dash-fill::before{
+ content:"\f23b"
+}
+.bi-cart-dash::before{
+ content:"\f23c"
+}
+.bi-cart-fill::before{
+ content:"\f23d"
+}
+.bi-cart-plus-fill::before{
+ content:"\f23e"
+}
+.bi-cart-plus::before{
+ content:"\f23f"
+}
+.bi-cart-x-fill::before{
+ content:"\f240"
+}
+.bi-cart-x::before{
+ content:"\f241"
+}
+.bi-cart::before{
+ content:"\f242"
+}
+.bi-cart2::before{
+ content:"\f243"
+}
+.bi-cart3::before{
+ content:"\f244"
+}
+.bi-cart4::before{
+ content:"\f245"
+}
+.bi-cash-stack::before{
+ content:"\f246"
+}
+.bi-cash::before{
+ content:"\f247"
+}
+.bi-cast::before{
+ content:"\f248"
+}
+.bi-chat-dots-fill::before{
+ content:"\f249"
+}
+.bi-chat-dots::before{
+ content:"\f24a"
+}
+.bi-chat-fill::before{
+ content:"\f24b"
+}
+.bi-chat-left-dots-fill::before{
+ content:"\f24c"
+}
+.bi-chat-left-dots::before{
+ content:"\f24d"
+}
+.bi-chat-left-fill::before{
+ content:"\f24e"
+}
+.bi-chat-left-quote-fill::before{
+ content:"\f24f"
+}
+.bi-chat-left-quote::before{
+ content:"\f250"
+}
+.bi-chat-left-text-fill::before{
+ content:"\f251"
+}
+.bi-chat-left-text::before{
+ content:"\f252"
+}
+.bi-chat-left::before{
+ content:"\f253"
+}
+.bi-chat-quote-fill::before{
+ content:"\f254"
+}
+.bi-chat-quote::before{
+ content:"\f255"
+}
+.bi-chat-right-dots-fill::before{
+ content:"\f256"
+}
+.bi-chat-right-dots::before{
+ content:"\f257"
+}
+.bi-chat-right-fill::before{
+ content:"\f258"
+}
+.bi-chat-right-quote-fill::before{
+ content:"\f259"
+}
+.bi-chat-right-quote::before{
+ content:"\f25a"
+}
+.bi-chat-right-text-fill::before{
+ content:"\f25b"
+}
+.bi-chat-right-text::before{
+ content:"\f25c"
+}
+.bi-chat-right::before{
+ content:"\f25d"
+}
+.bi-chat-square-dots-fill::before{
+ content:"\f25e"
+}
+.bi-chat-square-dots::before{
+ content:"\f25f"
+}
+.bi-chat-square-fill::before{
+ content:"\f260"
+}
+.bi-chat-square-quote-fill::before{
+ content:"\f261"
+}
+.bi-chat-square-quote::before{
+ content:"\f262"
+}
+.bi-chat-square-text-fill::before{
+ content:"\f263"
+}
+.bi-chat-square-text::before{
+ content:"\f264"
+}
+.bi-chat-square::before{
+ content:"\f265"
+}
+.bi-chat-text-fill::before{
+ content:"\f266"
+}
+.bi-chat-text::before{
+ content:"\f267"
+}
+.bi-chat::before{
+ content:"\f268"
+}
+.bi-check-all::before{
+ content:"\f269"
+}
+.bi-check-circle-fill::before{
+ content:"\f26a"
+}
+.bi-check-circle::before{
+ content:"\f26b"
+}
+.bi-check-square-fill::before{
+ content:"\f26c"
+}
+.bi-check-square::before{
+ content:"\f26d"
+}
+.bi-check::before{
+ content:"\f26e"
+}
+.bi-check2-all::before{
+ content:"\f26f"
+}
+.bi-check2-circle::before{
+ content:"\f270"
+}
+.bi-check2-square::before{
+ content:"\f271"
+}
+.bi-check2::before{
+ content:"\f272"
+}
+.bi-chevron-bar-contract::before{
+ content:"\f273"
+}
+.bi-chevron-bar-down::before{
+ content:"\f274"
+}
+.bi-chevron-bar-expand::before{
+ content:"\f275"
+}
+.bi-chevron-bar-left::before{
+ content:"\f276"
+}
+.bi-chevron-bar-right::before{
+ content:"\f277"
+}
+.bi-chevron-bar-up::before{
+ content:"\f278"
+}
+.bi-chevron-compact-down::before{
+ content:"\f279"
+}
+.bi-chevron-compact-left::before{
+ content:"\f27a"
+}
+.bi-chevron-compact-right::before{
+ content:"\f27b"
+}
+.bi-chevron-compact-up::before{
+ content:"\f27c"
+}
+.bi-chevron-contract::before{
+ content:"\f27d"
+}
+.bi-chevron-double-down::before{
+ content:"\f27e"
+}
+.bi-chevron-double-left::before{
+ content:"\f27f"
+}
+.bi-chevron-double-right::before{
+ content:"\f280"
+}
+.bi-chevron-double-up::before{
+ content:"\f281"
+}
+.bi-chevron-down::before{
+ content:"\f282"
+}
+.bi-chevron-expand::before{
+ content:"\f283"
+}
+.bi-chevron-left::before{
+ content:"\f284"
+}
+.bi-chevron-right::before{
+ content:"\f285"
+}
+.bi-chevron-up::before{
+ content:"\f286"
+}
+.bi-circle-fill::before{
+ content:"\f287"
+}
+.bi-circle-half::before{
+ content:"\f288"
+}
+.bi-circle-square::before{
+ content:"\f289"
+}
+.bi-circle::before{
+ content:"\f28a"
+}
+.bi-clipboard-check::before{
+ content:"\f28b"
+}
+.bi-clipboard-data::before{
+ content:"\f28c"
+}
+.bi-clipboard-minus::before{
+ content:"\f28d"
+}
+.bi-clipboard-plus::before{
+ content:"\f28e"
+}
+.bi-clipboard-x::before{
+ content:"\f28f"
+}
+.bi-clipboard::before{
+ content:"\f290"
+}
+.bi-clock-fill::before{
+ content:"\f291"
+}
+.bi-clock-history::before{
+ content:"\f292"
+}
+.bi-clock::before{
+ content:"\f293"
+}
+.bi-cloud-arrow-down-fill::before{
+ content:"\f294"
+}
+.bi-cloud-arrow-down::before{
+ content:"\f295"
+}
+.bi-cloud-arrow-up-fill::before{
+ content:"\f296"
+}
+.bi-cloud-arrow-up::before{
+ content:"\f297"
+}
+.bi-cloud-check-fill::before{
+ content:"\f298"
+}
+.bi-cloud-check::before{
+ content:"\f299"
+}
+.bi-cloud-download-fill::before{
+ content:"\f29a"
+}
+.bi-cloud-download::before{
+ content:"\f29b"
+}
+.bi-cloud-drizzle-fill::before{
+ content:"\f29c"
+}
+.bi-cloud-drizzle::before{
+ content:"\f29d"
+}
+.bi-cloud-fill::before{
+ content:"\f29e"
+}
+.bi-cloud-fog-fill::before{
+ content:"\f29f"
+}
+.bi-cloud-fog::before{
+ content:"\f2a0"
+}
+.bi-cloud-fog2-fill::before{
+ content:"\f2a1"
+}
+.bi-cloud-fog2::before{
+ content:"\f2a2"
+}
+.bi-cloud-hail-fill::before{
+ content:"\f2a3"
+}
+.bi-cloud-hail::before{
+ content:"\f2a4"
+}
+.bi-cloud-haze-fill::before{
+ content:"\f2a6"
+}
+.bi-cloud-haze::before{
+ content:"\f2a7"
+}
+.bi-cloud-haze2-fill::before{
+ content:"\f2a8"
+}
+.bi-cloud-lightning-fill::before{
+ content:"\f2a9"
+}
+.bi-cloud-lightning-rain-fill::before{
+ content:"\f2aa"
+}
+.bi-cloud-lightning-rain::before{
+ content:"\f2ab"
+}
+.bi-cloud-lightning::before{
+ content:"\f2ac"
+}
+.bi-cloud-minus-fill::before{
+ content:"\f2ad"
+}
+.bi-cloud-minus::before{
+ content:"\f2ae"
+}
+.bi-cloud-moon-fill::before{
+ content:"\f2af"
+}
+.bi-cloud-moon::before{
+ content:"\f2b0"
+}
+.bi-cloud-plus-fill::before{
+ content:"\f2b1"
+}
+.bi-cloud-plus::before{
+ content:"\f2b2"
+}
+.bi-cloud-rain-fill::before{
+ content:"\f2b3"
+}
+.bi-cloud-rain-heavy-fill::before{
+ content:"\f2b4"
+}
+.bi-cloud-rain-heavy::before{
+ content:"\f2b5"
+}
+.bi-cloud-rain::before{
+ content:"\f2b6"
+}
+.bi-cloud-slash-fill::before{
+ content:"\f2b7"
+}
+.bi-cloud-slash::before{
+ content:"\f2b8"
+}
+.bi-cloud-sleet-fill::before{
+ content:"\f2b9"
+}
+.bi-cloud-sleet::before{
+ content:"\f2ba"
+}
+.bi-cloud-snow-fill::before{
+ content:"\f2bb"
+}
+.bi-cloud-snow::before{
+ content:"\f2bc"
+}
+.bi-cloud-sun-fill::before{
+ content:"\f2bd"
+}
+.bi-cloud-sun::before{
+ content:"\f2be"
+}
+.bi-cloud-upload-fill::before{
+ content:"\f2bf"
+}
+.bi-cloud-upload::before{
+ content:"\f2c0"
+}
+.bi-cloud::before{
+ content:"\f2c1"
+}
+.bi-clouds-fill::before{
+ content:"\f2c2"
+}
+.bi-clouds::before{
+ content:"\f2c3"
+}
+.bi-cloudy-fill::before{
+ content:"\f2c4"
+}
+.bi-cloudy::before{
+ content:"\f2c5"
+}
+.bi-code-slash::before{
+ content:"\f2c6"
+}
+.bi-code-square::before{
+ content:"\f2c7"
+}
+.bi-code::before{
+ content:"\f2c8"
+}
+.bi-collection-fill::before{
+ content:"\f2c9"
+}
+.bi-collection-play-fill::before{
+ content:"\f2ca"
+}
+.bi-collection-play::before{
+ content:"\f2cb"
+}
+.bi-collection::before{
+ content:"\f2cc"
+}
+.bi-columns-gap::before{
+ content:"\f2cd"
+}
+.bi-columns::before{
+ content:"\f2ce"
+}
+.bi-command::before{
+ content:"\f2cf"
+}
+.bi-compass-fill::before{
+ content:"\f2d0"
+}
+.bi-compass::before{
+ content:"\f2d1"
+}
+.bi-cone-striped::before{
+ content:"\f2d2"
+}
+.bi-cone::before{
+ content:"\f2d3"
+}
+.bi-controller::before{
+ content:"\f2d4"
+}
+.bi-cpu-fill::before{
+ content:"\f2d5"
+}
+.bi-cpu::before{
+ content:"\f2d6"
+}
+.bi-credit-card-2-back-fill::before{
+ content:"\f2d7"
+}
+.bi-credit-card-2-back::before{
+ content:"\f2d8"
+}
+.bi-credit-card-2-front-fill::before{
+ content:"\f2d9"
+}
+.bi-credit-card-2-front::before{
+ content:"\f2da"
+}
+.bi-credit-card-fill::before{
+ content:"\f2db"
+}
+.bi-credit-card::before{
+ content:"\f2dc"
+}
+.bi-crop::before{
+ content:"\f2dd"
+}
+.bi-cup-fill::before{
+ content:"\f2de"
+}
+.bi-cup-straw::before{
+ content:"\f2df"
+}
+.bi-cup::before{
+ content:"\f2e0"
+}
+.bi-cursor-fill::before{
+ content:"\f2e1"
+}
+.bi-cursor-text::before{
+ content:"\f2e2"
+}
+.bi-cursor::before{
+ content:"\f2e3"
+}
+.bi-dash-circle-dotted::before{
+ content:"\f2e4"
+}
+.bi-dash-circle-fill::before{
+ content:"\f2e5"
+}
+.bi-dash-circle::before{
+ content:"\f2e6"
+}
+.bi-dash-square-dotted::before{
+ content:"\f2e7"
+}
+.bi-dash-square-fill::before{
+ content:"\f2e8"
+}
+.bi-dash-square::before{
+ content:"\f2e9"
+}
+.bi-dash::before{
+ content:"\f2ea"
+}
+.bi-diagram-2-fill::before{
+ content:"\f2eb"
+}
+.bi-diagram-2::before{
+ content:"\f2ec"
+}
+.bi-diagram-3-fill::before{
+ content:"\f2ed"
+}
+.bi-diagram-3::before{
+ content:"\f2ee"
+}
+.bi-diamond-fill::before{
+ content:"\f2ef"
+}
+.bi-diamond-half::before{
+ content:"\f2f0"
+}
+.bi-diamond::before{
+ content:"\f2f1"
+}
+.bi-dice-1-fill::before{
+ content:"\f2f2"
+}
+.bi-dice-1::before{
+ content:"\f2f3"
+}
+.bi-dice-2-fill::before{
+ content:"\f2f4"
+}
+.bi-dice-2::before{
+ content:"\f2f5"
+}
+.bi-dice-3-fill::before{
+ content:"\f2f6"
+}
+.bi-dice-3::before{
+ content:"\f2f7"
+}
+.bi-dice-4-fill::before{
+ content:"\f2f8"
+}
+.bi-dice-4::before{
+ content:"\f2f9"
+}
+.bi-dice-5-fill::before{
+ content:"\f2fa"
+}
+.bi-dice-5::before{
+ content:"\f2fb"
+}
+.bi-dice-6-fill::before{
+ content:"\f2fc"
+}
+.bi-dice-6::before{
+ content:"\f2fd"
+}
+.bi-disc-fill::before{
+ content:"\f2fe"
+}
+.bi-disc::before{
+ content:"\f2ff"
+}
+.bi-discord::before{
+ content:"\f300"
+}
+.bi-display-fill::before{
+ content:"\f301"
+}
+.bi-display::before{
+ content:"\f302"
+}
+.bi-distribute-horizontal::before{
+ content:"\f303"
+}
+.bi-distribute-vertical::before{
+ content:"\f304"
+}
+.bi-door-closed-fill::before{
+ content:"\f305"
+}
+.bi-door-closed::before{
+ content:"\f306"
+}
+.bi-door-open-fill::before{
+ content:"\f307"
+}
+.bi-door-open::before{
+ content:"\f308"
+}
+.bi-dot::before{
+ content:"\f309"
+}
+.bi-download::before{
+ content:"\f30a"
+}
+.bi-droplet-fill::before{
+ content:"\f30b"
+}
+.bi-droplet-half::before{
+ content:"\f30c"
+}
+.bi-droplet::before{
+ content:"\f30d"
+}
+.bi-earbuds::before{
+ content:"\f30e"
+}
+.bi-easel-fill::before{
+ content:"\f30f"
+}
+.bi-easel::before{
+ content:"\f310"
+}
+.bi-egg-fill::before{
+ content:"\f311"
+}
+.bi-egg-fried::before{
+ content:"\f312"
+}
+.bi-egg::before{
+ content:"\f313"
+}
+.bi-eject-fill::before{
+ content:"\f314"
+}
+.bi-eject::before{
+ content:"\f315"
+}
+.bi-emoji-angry-fill::before{
+ content:"\f316"
+}
+.bi-emoji-angry::before{
+ content:"\f317"
+}
+.bi-emoji-dizzy-fill::before{
+ content:"\f318"
+}
+.bi-emoji-dizzy::before{
+ content:"\f319"
+}
+.bi-emoji-expressionless-fill::before{
+ content:"\f31a"
+}
+.bi-emoji-expressionless::before{
+ content:"\f31b"
+}
+.bi-emoji-frown-fill::before{
+ content:"\f31c"
+}
+.bi-emoji-frown::before{
+ content:"\f31d"
+}
+.bi-emoji-heart-eyes-fill::before{
+ content:"\f31e"
+}
+.bi-emoji-heart-eyes::before{
+ content:"\f31f"
+}
+.bi-emoji-laughing-fill::before{
+ content:"\f320"
+}
+.bi-emoji-laughing::before{
+ content:"\f321"
+}
+.bi-emoji-neutral-fill::before{
+ content:"\f322"
+}
+.bi-emoji-neutral::before{
+ content:"\f323"
+}
+.bi-emoji-smile-fill::before{
+ content:"\f324"
+}
+.bi-emoji-smile-upside-down-fill::before{
+ content:"\f325"
+}
+.bi-emoji-smile-upside-down::before{
+ content:"\f326"
+}
+.bi-emoji-smile::before{
+ content:"\f327"
+}
+.bi-emoji-sunglasses-fill::before{
+ content:"\f328"
+}
+.bi-emoji-sunglasses::before{
+ content:"\f329"
+}
+.bi-emoji-wink-fill::before{
+ content:"\f32a"
+}
+.bi-emoji-wink::before{
+ content:"\f32b"
+}
+.bi-envelope-fill::before{
+ content:"\f32c"
+}
+.bi-envelope-open-fill::before{
+ content:"\f32d"
+}
+.bi-envelope-open::before{
+ content:"\f32e"
+}
+.bi-envelope::before{
+ content:"\f32f"
+}
+.bi-eraser-fill::before{
+ content:"\f330"
+}
+.bi-eraser::before{
+ content:"\f331"
+}
+.bi-exclamation-circle-fill::before{
+ content:"\f332"
+}
+.bi-exclamation-circle::before{
+ content:"\f333"
+}
+.bi-exclamation-diamond-fill::before{
+ content:"\f334"
+}
+.bi-exclamation-diamond::before{
+ content:"\f335"
+}
+.bi-exclamation-octagon-fill::before{
+ content:"\f336"
+}
+.bi-exclamation-octagon::before{
+ content:"\f337"
+}
+.bi-exclamation-square-fill::before{
+ content:"\f338"
+}
+.bi-exclamation-square::before{
+ content:"\f339"
+}
+.bi-exclamation-triangle-fill::before{
+ content:"\f33a"
+}
+.bi-exclamation-triangle::before{
+ content:"\f33b"
+}
+.bi-exclamation::before{
+ content:"\f33c"
+}
+.bi-exclude::before{
+ content:"\f33d"
+}
+.bi-eye-fill::before{
+ content:"\f33e"
+}
+.bi-eye-slash-fill::before{
+ content:"\f33f"
+}
+.bi-eye-slash::before{
+ content:"\f340"
+}
+.bi-eye::before{
+ content:"\f341"
+}
+.bi-eyedropper::before{
+ content:"\f342"
+}
+.bi-eyeglasses::before{
+ content:"\f343"
+}
+.bi-facebook::before{
+ content:"\f344"
+}
+.bi-file-arrow-down-fill::before{
+ content:"\f345"
+}
+.bi-file-arrow-down::before{
+ content:"\f346"
+}
+.bi-file-arrow-up-fill::before{
+ content:"\f347"
+}
+.bi-file-arrow-up::before{
+ content:"\f348"
+}
+.bi-file-bar-graph-fill::before{
+ content:"\f349"
+}
+.bi-file-bar-graph::before{
+ content:"\f34a"
+}
+.bi-file-binary-fill::before{
+ content:"\f34b"
+}
+.bi-file-binary::before{
+ content:"\f34c"
+}
+.bi-file-break-fill::before{
+ content:"\f34d"
+}
+.bi-file-break::before{
+ content:"\f34e"
+}
+.bi-file-check-fill::before{
+ content:"\f34f"
+}
+.bi-file-check::before{
+ content:"\f350"
+}
+.bi-file-code-fill::before{
+ content:"\f351"
+}
+.bi-file-code::before{
+ content:"\f352"
+}
+.bi-file-diff-fill::before{
+ content:"\f353"
+}
+.bi-file-diff::before{
+ content:"\f354"
+}
+.bi-file-earmark-arrow-down-fill::before{
+ content:"\f355"
+}
+.bi-file-earmark-arrow-down::before{
+ content:"\f356"
+}
+.bi-file-earmark-arrow-up-fill::before{
+ content:"\f357"
+}
+.bi-file-earmark-arrow-up::before{
+ content:"\f358"
+}
+.bi-file-earmark-bar-graph-fill::before{
+ content:"\f359"
+}
+.bi-file-earmark-bar-graph::before{
+ content:"\f35a"
+}
+.bi-file-earmark-binary-fill::before{
+ content:"\f35b"
+}
+.bi-file-earmark-binary::before{
+ content:"\f35c"
+}
+.bi-file-earmark-break-fill::before{
+ content:"\f35d"
+}
+.bi-file-earmark-break::before{
+ content:"\f35e"
+}
+.bi-file-earmark-check-fill::before{
+ content:"\f35f"
+}
+.bi-file-earmark-check::before{
+ content:"\f360"
+}
+.bi-file-earmark-code-fill::before{
+ content:"\f361"
+}
+.bi-file-earmark-code::before{
+ content:"\f362"
+}
+.bi-file-earmark-diff-fill::before{
+ content:"\f363"
+}
+.bi-file-earmark-diff::before{
+ content:"\f364"
+}
+.bi-file-earmark-easel-fill::before{
+ content:"\f365"
+}
+.bi-file-earmark-easel::before{
+ content:"\f366"
+}
+.bi-file-earmark-excel-fill::before{
+ content:"\f367"
+}
+.bi-file-earmark-excel::before{
+ content:"\f368"
+}
+.bi-file-earmark-fill::before{
+ content:"\f369"
+}
+.bi-file-earmark-font-fill::before{
+ content:"\f36a"
+}
+.bi-file-earmark-font::before{
+ content:"\f36b"
+}
+.bi-file-earmark-image-fill::before{
+ content:"\f36c"
+}
+.bi-file-earmark-image::before{
+ content:"\f36d"
+}
+.bi-file-earmark-lock-fill::before{
+ content:"\f36e"
+}
+.bi-file-earmark-lock::before{
+ content:"\f36f"
+}
+.bi-file-earmark-lock2-fill::before{
+ content:"\f370"
+}
+.bi-file-earmark-lock2::before{
+ content:"\f371"
+}
+.bi-file-earmark-medical-fill::before{
+ content:"\f372"
+}
+.bi-file-earmark-medical::before{
+ content:"\f373"
+}
+.bi-file-earmark-minus-fill::before{
+ content:"\f374"
+}
+.bi-file-earmark-minus::before{
+ content:"\f375"
+}
+.bi-file-earmark-music-fill::before{
+ content:"\f376"
+}
+.bi-file-earmark-music::before{
+ content:"\f377"
+}
+.bi-file-earmark-person-fill::before{
+ content:"\f378"
+}
+.bi-file-earmark-person::before{
+ content:"\f379"
+}
+.bi-file-earmark-play-fill::before{
+ content:"\f37a"
+}
+.bi-file-earmark-play::before{
+ content:"\f37b"
+}
+.bi-file-earmark-plus-fill::before{
+ content:"\f37c"
+}
+.bi-file-earmark-plus::before{
+ content:"\f37d"
+}
+.bi-file-earmark-post-fill::before{
+ content:"\f37e"
+}
+.bi-file-earmark-post::before{
+ content:"\f37f"
+}
+.bi-file-earmark-ppt-fill::before{
+ content:"\f380"
+}
+.bi-file-earmark-ppt::before{
+ content:"\f381"
+}
+.bi-file-earmark-richtext-fill::before{
+ content:"\f382"
+}
+.bi-file-earmark-richtext::before{
+ content:"\f383"
+}
+.bi-file-earmark-ruled-fill::before{
+ content:"\f384"
+}
+.bi-file-earmark-ruled::before{
+ content:"\f385"
+}
+.bi-file-earmark-slides-fill::before{
+ content:"\f386"
+}
+.bi-file-earmark-slides::before{
+ content:"\f387"
+}
+.bi-file-earmark-spreadsheet-fill::before{
+ content:"\f388"
+}
+.bi-file-earmark-spreadsheet::before{
+ content:"\f389"
+}
+.bi-file-earmark-text-fill::before{
+ content:"\f38a"
+}
+.bi-file-earmark-text::before{
+ content:"\f38b"
+}
+.bi-file-earmark-word-fill::before{
+ content:"\f38c"
+}
+.bi-file-earmark-word::before{
+ content:"\f38d"
+}
+.bi-file-earmark-x-fill::before{
+ content:"\f38e"
+}
+.bi-file-earmark-x::before{
+ content:"\f38f"
+}
+.bi-file-earmark-zip-fill::before{
+ content:"\f390"
+}
+.bi-file-earmark-zip::before{
+ content:"\f391"
+}
+.bi-file-earmark::before{
+ content:"\f392"
+}
+.bi-file-easel-fill::before{
+ content:"\f393"
+}
+.bi-file-easel::before{
+ content:"\f394"
+}
+.bi-file-excel-fill::before{
+ content:"\f395"
+}
+.bi-file-excel::before{
+ content:"\f396"
+}
+.bi-file-fill::before{
+ content:"\f397"
+}
+.bi-file-font-fill::before{
+ content:"\f398"
+}
+.bi-file-font::before{
+ content:"\f399"
+}
+.bi-file-image-fill::before{
+ content:"\f39a"
+}
+.bi-file-image::before{
+ content:"\f39b"
+}
+.bi-file-lock-fill::before{
+ content:"\f39c"
+}
+.bi-file-lock::before{
+ content:"\f39d"
+}
+.bi-file-lock2-fill::before{
+ content:"\f39e"
+}
+.bi-file-lock2::before{
+ content:"\f39f"
+}
+.bi-file-medical-fill::before{
+ content:"\f3a0"
+}
+.bi-file-medical::before{
+ content:"\f3a1"
+}
+.bi-file-minus-fill::before{
+ content:"\f3a2"
+}
+.bi-file-minus::before{
+ content:"\f3a3"
+}
+.bi-file-music-fill::before{
+ content:"\f3a4"
+}
+.bi-file-music::before{
+ content:"\f3a5"
+}
+.bi-file-person-fill::before{
+ content:"\f3a6"
+}
+.bi-file-person::before{
+ content:"\f3a7"
+}
+.bi-file-play-fill::before{
+ content:"\f3a8"
+}
+.bi-file-play::before{
+ content:"\f3a9"
+}
+.bi-file-plus-fill::before{
+ content:"\f3aa"
+}
+.bi-file-plus::before{
+ content:"\f3ab"
+}
+.bi-file-post-fill::before{
+ content:"\f3ac"
+}
+.bi-file-post::before{
+ content:"\f3ad"
+}
+.bi-file-ppt-fill::before{
+ content:"\f3ae"
+}
+.bi-file-ppt::before{
+ content:"\f3af"
+}
+.bi-file-richtext-fill::before{
+ content:"\f3b0"
+}
+.bi-file-richtext::before{
+ content:"\f3b1"
+}
+.bi-file-ruled-fill::before{
+ content:"\f3b2"
+}
+.bi-file-ruled::before{
+ content:"\f3b3"
+}
+.bi-file-slides-fill::before{
+ content:"\f3b4"
+}
+.bi-file-slides::before{
+ content:"\f3b5"
+}
+.bi-file-spreadsheet-fill::before{
+ content:"\f3b6"
+}
+.bi-file-spreadsheet::before{
+ content:"\f3b7"
+}
+.bi-file-text-fill::before{
+ content:"\f3b8"
+}
+.bi-file-text::before{
+ content:"\f3b9"
+}
+.bi-file-word-fill::before{
+ content:"\f3ba"
+}
+.bi-file-word::before{
+ content:"\f3bb"
+}
+.bi-file-x-fill::before{
+ content:"\f3bc"
+}
+.bi-file-x::before{
+ content:"\f3bd"
+}
+.bi-file-zip-fill::before{
+ content:"\f3be"
+}
+.bi-file-zip::before{
+ content:"\f3bf"
+}
+.bi-file::before{
+ content:"\f3c0"
+}
+.bi-files-alt::before{
+ content:"\f3c1"
+}
+.bi-files::before{
+ content:"\f3c2"
+}
+.bi-film::before{
+ content:"\f3c3"
+}
+.bi-filter-circle-fill::before{
+ content:"\f3c4"
+}
+.bi-filter-circle::before{
+ content:"\f3c5"
+}
+.bi-filter-left::before{
+ content:"\f3c6"
+}
+.bi-filter-right::before{
+ content:"\f3c7"
+}
+.bi-filter-square-fill::before{
+ content:"\f3c8"
+}
+.bi-filter-square::before{
+ content:"\f3c9"
+}
+.bi-filter::before{
+ content:"\f3ca"
+}
+.bi-flag-fill::before{
+ content:"\f3cb"
+}
+.bi-flag::before{
+ content:"\f3cc"
+}
+.bi-flower1::before{
+ content:"\f3cd"
+}
+.bi-flower2::before{
+ content:"\f3ce"
+}
+.bi-flower3::before{
+ content:"\f3cf"
+}
+.bi-folder-check::before{
+ content:"\f3d0"
+}
+.bi-folder-fill::before{
+ content:"\f3d1"
+}
+.bi-folder-minus::before{
+ content:"\f3d2"
+}
+.bi-folder-plus::before{
+ content:"\f3d3"
+}
+.bi-folder-symlink-fill::before{
+ content:"\f3d4"
+}
+.bi-folder-symlink::before{
+ content:"\f3d5"
+}
+.bi-folder-x::before{
+ content:"\f3d6"
+}
+.bi-folder::before{
+ content:"\f3d7"
+}
+.bi-folder2-open::before{
+ content:"\f3d8"
+}
+.bi-folder2::before{
+ content:"\f3d9"
+}
+.bi-fonts::before{
+ content:"\f3da"
+}
+.bi-forward-fill::before{
+ content:"\f3db"
+}
+.bi-forward::before{
+ content:"\f3dc"
+}
+.bi-front::before{
+ content:"\f3dd"
+}
+.bi-fullscreen-exit::before{
+ content:"\f3de"
+}
+.bi-fullscreen::before{
+ content:"\f3df"
+}
+.bi-funnel-fill::before{
+ content:"\f3e0"
+}
+.bi-funnel::before{
+ content:"\f3e1"
+}
+.bi-gear-fill::before{
+ content:"\f3e2"
+}
+.bi-gear-wide-connected::before{
+ content:"\f3e3"
+}
+.bi-gear-wide::before{
+ content:"\f3e4"
+}
+.bi-gear::before{
+ content:"\f3e5"
+}
+.bi-gem::before{
+ content:"\f3e6"
+}
+.bi-geo-alt-fill::before{
+ content:"\f3e7"
+}
+.bi-geo-alt::before{
+ content:"\f3e8"
+}
+.bi-geo-fill::before{
+ content:"\f3e9"
+}
+.bi-geo::before{
+ content:"\f3ea"
+}
+.bi-gift-fill::before{
+ content:"\f3eb"
+}
+.bi-gift::before{
+ content:"\f3ec"
+}
+.bi-github::before{
+ content:"\f3ed"
+}
+.bi-globe::before{
+ content:"\f3ee"
+}
+.bi-globe2::before{
+ content:"\f3ef"
+}
+.bi-google::before{
+ content:"\f3f0"
+}
+.bi-graph-down::before{
+ content:"\f3f1"
+}
+.bi-graph-up::before{
+ content:"\f3f2"
+}
+.bi-grid-1x2-fill::before{
+ content:"\f3f3"
+}
+.bi-grid-1x2::before{
+ content:"\f3f4"
+}
+.bi-grid-3x2-gap-fill::before{
+ content:"\f3f5"
+}
+.bi-grid-3x2-gap::before{
+ content:"\f3f6"
+}
+.bi-grid-3x2::before{
+ content:"\f3f7"
+}
+.bi-grid-3x3-gap-fill::before{
+ content:"\f3f8"
+}
+.bi-grid-3x3-gap::before{
+ content:"\f3f9"
+}
+.bi-grid-3x3::before{
+ content:"\f3fa"
+}
+.bi-grid-fill::before{
+ content:"\f3fb"
+}
+.bi-grid::before{
+ content:"\f3fc"
+}
+.bi-grip-horizontal::before{
+ content:"\f3fd"
+}
+.bi-grip-vertical::before{
+ content:"\f3fe"
+}
+.bi-hammer::before{
+ content:"\f3ff"
+}
+.bi-hand-index-fill::before{
+ content:"\f400"
+}
+.bi-hand-index-thumb-fill::before{
+ content:"\f401"
+}
+.bi-hand-index-thumb::before{
+ content:"\f402"
+}
+.bi-hand-index::before{
+ content:"\f403"
+}
+.bi-hand-thumbs-down-fill::before{
+ content:"\f404"
+}
+.bi-hand-thumbs-down::before{
+ content:"\f405"
+}
+.bi-hand-thumbs-up-fill::before{
+ content:"\f406"
+}
+.bi-hand-thumbs-up::before{
+ content:"\f407"
+}
+.bi-handbag-fill::before{
+ content:"\f408"
+}
+.bi-handbag::before{
+ content:"\f409"
+}
+.bi-hash::before{
+ content:"\f40a"
+}
+.bi-hdd-fill::before{
+ content:"\f40b"
+}
+.bi-hdd-network-fill::before{
+ content:"\f40c"
+}
+.bi-hdd-network::before{
+ content:"\f40d"
+}
+.bi-hdd-rack-fill::before{
+ content:"\f40e"
+}
+.bi-hdd-rack::before{
+ content:"\f40f"
+}
+.bi-hdd-stack-fill::before{
+ content:"\f410"
+}
+.bi-hdd-stack::before{
+ content:"\f411"
+}
+.bi-hdd::before{
+ content:"\f412"
+}
+.bi-headphones::before{
+ content:"\f413"
+}
+.bi-headset::before{
+ content:"\f414"
+}
+.bi-heart-fill::before{
+ content:"\f415"
+}
+.bi-heart-half::before{
+ content:"\f416"
+}
+.bi-heart::before{
+ content:"\f417"
+}
+.bi-heptagon-fill::before{
+ content:"\f418"
+}
+.bi-heptagon-half::before{
+ content:"\f419"
+}
+.bi-heptagon::before{
+ content:"\f41a"
+}
+.bi-hexagon-fill::before{
+ content:"\f41b"
+}
+.bi-hexagon-half::before{
+ content:"\f41c"
+}
+.bi-hexagon::before{
+ content:"\f41d"
+}
+.bi-hourglass-bottom::before{
+ content:"\f41e"
+}
+.bi-hourglass-split::before{
+ content:"\f41f"
+}
+.bi-hourglass-top::before{
+ content:"\f420"
+}
+.bi-hourglass::before{
+ content:"\f421"
+}
+.bi-house-door-fill::before{
+ content:"\f422"
+}
+.bi-house-door::before{
+ content:"\f423"
+}
+.bi-house-fill::before{
+ content:"\f424"
+}
+.bi-house::before{
+ content:"\f425"
+}
+.bi-hr::before{
+ content:"\f426"
+}
+.bi-hurricane::before{
+ content:"\f427"
+}
+.bi-image-alt::before{
+ content:"\f428"
+}
+.bi-image-fill::before{
+ content:"\f429"
+}
+.bi-image::before{
+ content:"\f42a"
+}
+.bi-images::before{
+ content:"\f42b"
+}
+.bi-inbox-fill::before{
+ content:"\f42c"
+}
+.bi-inbox::before{
+ content:"\f42d"
+}
+.bi-inboxes-fill::before{
+ content:"\f42e"
+}
+.bi-inboxes::before{
+ content:"\f42f"
+}
+.bi-info-circle-fill::before{
+ content:"\f430"
+}
+.bi-info-circle::before{
+ content:"\f431"
+}
+.bi-info-square-fill::before{
+ content:"\f432"
+}
+.bi-info-square::before{
+ content:"\f433"
+}
+.bi-info::before{
+ content:"\f434"
+}
+.bi-input-cursor-text::before{
+ content:"\f435"
+}
+.bi-input-cursor::before{
+ content:"\f436"
+}
+.bi-instagram::before{
+ content:"\f437"
+}
+.bi-intersect::before{
+ content:"\f438"
+}
+.bi-journal-album::before{
+ content:"\f439"
+}
+.bi-journal-arrow-down::before{
+ content:"\f43a"
+}
+.bi-journal-arrow-up::before{
+ content:"\f43b"
+}
+.bi-journal-bookmark-fill::before{
+ content:"\f43c"
+}
+.bi-journal-bookmark::before{
+ content:"\f43d"
+}
+.bi-journal-check::before{
+ content:"\f43e"
+}
+.bi-journal-code::before{
+ content:"\f43f"
+}
+.bi-journal-medical::before{
+ content:"\f440"
+}
+.bi-journal-minus::before{
+ content:"\f441"
+}
+.bi-journal-plus::before{
+ content:"\f442"
+}
+.bi-journal-richtext::before{
+ content:"\f443"
+}
+.bi-journal-text::before{
+ content:"\f444"
+}
+.bi-journal-x::before{
+ content:"\f445"
+}
+.bi-journal::before{
+ content:"\f446"
+}
+.bi-journals::before{
+ content:"\f447"
+}
+.bi-joystick::before{
+ content:"\f448"
+}
+.bi-justify-left::before{
+ content:"\f449"
+}
+.bi-justify-right::before{
+ content:"\f44a"
+}
+.bi-justify::before{
+ content:"\f44b"
+}
+.bi-kanban-fill::before{
+ content:"\f44c"
+}
+.bi-kanban::before{
+ content:"\f44d"
+}
+.bi-key-fill::before{
+ content:"\f44e"
+}
+.bi-key::before{
+ content:"\f44f"
+}
+.bi-keyboard-fill::before{
+ content:"\f450"
+}
+.bi-keyboard::before{
+ content:"\f451"
+}
+.bi-ladder::before{
+ content:"\f452"
+}
+.bi-lamp-fill::before{
+ content:"\f453"
+}
+.bi-lamp::before{
+ content:"\f454"
+}
+.bi-laptop-fill::before{
+ content:"\f455"
+}
+.bi-laptop::before{
+ content:"\f456"
+}
+.bi-layer-backward::before{
+ content:"\f457"
+}
+.bi-layer-forward::before{
+ content:"\f458"
+}
+.bi-layers-fill::before{
+ content:"\f459"
+}
+.bi-layers-half::before{
+ content:"\f45a"
+}
+.bi-layers::before{
+ content:"\f45b"
+}
+.bi-layout-sidebar-inset-reverse::before{
+ content:"\f45c"
+}
+.bi-layout-sidebar-inset::before{
+ content:"\f45d"
+}
+.bi-layout-sidebar-reverse::before{
+ content:"\f45e"
+}
+.bi-layout-sidebar::before{
+ content:"\f45f"
+}
+.bi-layout-split::before{
+ content:"\f460"
+}
+.bi-layout-text-sidebar-reverse::before{
+ content:"\f461"
+}
+.bi-layout-text-sidebar::before{
+ content:"\f462"
+}
+.bi-layout-text-window-reverse::before{
+ content:"\f463"
+}
+.bi-layout-text-window::before{
+ content:"\f464"
+}
+.bi-layout-three-columns::before{
+ content:"\f465"
+}
+.bi-layout-wtf::before{
+ content:"\f466"
+}
+.bi-life-preserver::before{
+ content:"\f467"
+}
+.bi-lightbulb-fill::before{
+ content:"\f468"
+}
+.bi-lightbulb-off-fill::before{
+ content:"\f469"
+}
+.bi-lightbulb-off::before{
+ content:"\f46a"
+}
+.bi-lightbulb::before{
+ content:"\f46b"
+}
+.bi-lightning-charge-fill::before{
+ content:"\f46c"
+}
+.bi-lightning-charge::before{
+ content:"\f46d"
+}
+.bi-lightning-fill::before{
+ content:"\f46e"
+}
+.bi-lightning::before{
+ content:"\f46f"
+}
+.bi-link-45deg::before{
+ content:"\f470"
+}
+.bi-link::before{
+ content:"\f471"
+}
+.bi-linkedin::before{
+ content:"\f472"
+}
+.bi-list-check::before{
+ content:"\f473"
+}
+.bi-list-nested::before{
+ content:"\f474"
+}
+.bi-list-ol::before{
+ content:"\f475"
+}
+.bi-list-stars::before{
+ content:"\f476"
+}
+.bi-list-task::before{
+ content:"\f477"
+}
+.bi-list-ul::before{
+ content:"\f478"
+}
+.bi-list::before{
+ content:"\f479"
+}
+.bi-lock-fill::before{
+ content:"\f47a"
+}
+.bi-lock::before{
+ content:"\f47b"
+}
+.bi-mailbox::before{
+ content:"\f47c"
+}
+.bi-mailbox2::before{
+ content:"\f47d"
+}
+.bi-map-fill::before{
+ content:"\f47e"
+}
+.bi-map::before{
+ content:"\f47f"
+}
+.bi-markdown-fill::before{
+ content:"\f480"
+}
+.bi-markdown::before{
+ content:"\f481"
+}
+.bi-mask::before{
+ content:"\f482"
+}
+.bi-megaphone-fill::before{
+ content:"\f483"
+}
+.bi-megaphone::before{
+ content:"\f484"
+}
+.bi-menu-app-fill::before{
+ content:"\f485"
+}
+.bi-menu-app::before{
+ content:"\f486"
+}
+.bi-menu-button-fill::before{
+ content:"\f487"
+}
+.bi-menu-button-wide-fill::before{
+ content:"\f488"
+}
+.bi-menu-button-wide::before{
+ content:"\f489"
+}
+.bi-menu-button::before{
+ content:"\f48a"
+}
+.bi-menu-down::before{
+ content:"\f48b"
+}
+.bi-menu-up::before{
+ content:"\f48c"
+}
+.bi-mic-fill::before{
+ content:"\f48d"
+}
+.bi-mic-mute-fill::before{
+ content:"\f48e"
+}
+.bi-mic-mute::before{
+ content:"\f48f"
+}
+.bi-mic::before{
+ content:"\f490"
+}
+.bi-minecart-loaded::before{
+ content:"\f491"
+}
+.bi-minecart::before{
+ content:"\f492"
+}
+.bi-moisture::before{
+ content:"\f493"
+}
+.bi-moon-fill::before{
+ content:"\f494"
+}
+.bi-moon-stars-fill::before{
+ content:"\f495"
+}
+.bi-moon-stars::before{
+ content:"\f496"
+}
+.bi-moon::before{
+ content:"\f497"
+}
+.bi-mouse-fill::before{
+ content:"\f498"
+}
+.bi-mouse::before{
+ content:"\f499"
+}
+.bi-mouse2-fill::before{
+ content:"\f49a"
+}
+.bi-mouse2::before{
+ content:"\f49b"
+}
+.bi-mouse3-fill::before{
+ content:"\f49c"
+}
+.bi-mouse3::before{
+ content:"\f49d"
+}
+.bi-music-note-beamed::before{
+ content:"\f49e"
+}
+.bi-music-note-list::before{
+ content:"\f49f"
+}
+.bi-music-note::before{
+ content:"\f4a0"
+}
+.bi-music-player-fill::before{
+ content:"\f4a1"
+}
+.bi-music-player::before{
+ content:"\f4a2"
+}
+.bi-newspaper::before{
+ content:"\f4a3"
+}
+.bi-node-minus-fill::before{
+ content:"\f4a4"
+}
+.bi-node-minus::before{
+ content:"\f4a5"
+}
+.bi-node-plus-fill::before{
+ content:"\f4a6"
+}
+.bi-node-plus::before{
+ content:"\f4a7"
+}
+.bi-nut-fill::before{
+ content:"\f4a8"
+}
+.bi-nut::before{
+ content:"\f4a9"
+}
+.bi-octagon-fill::before{
+ content:"\f4aa"
+}
+.bi-octagon-half::before{
+ content:"\f4ab"
+}
+.bi-octagon::before{
+ content:"\f4ac"
+}
+.bi-option::before{
+ content:"\f4ad"
+}
+.bi-outlet::before{
+ content:"\f4ae"
+}
+.bi-paint-bucket::before{
+ content:"\f4af"
+}
+.bi-palette-fill::before{
+ content:"\f4b0"
+}
+.bi-palette::before{
+ content:"\f4b1"
+}
+.bi-palette2::before{
+ content:"\f4b2"
+}
+.bi-paperclip::before{
+ content:"\f4b3"
+}
+.bi-paragraph::before{
+ content:"\f4b4"
+}
+.bi-patch-check-fill::before{
+ content:"\f4b5"
+}
+.bi-patch-check::before{
+ content:"\f4b6"
+}
+.bi-patch-exclamation-fill::before{
+ content:"\f4b7"
+}
+.bi-patch-exclamation::before{
+ content:"\f4b8"
+}
+.bi-patch-minus-fill::before{
+ content:"\f4b9"
+}
+.bi-patch-minus::before{
+ content:"\f4ba"
+}
+.bi-patch-plus-fill::before{
+ content:"\f4bb"
+}
+.bi-patch-plus::before{
+ content:"\f4bc"
+}
+.bi-patch-question-fill::before{
+ content:"\f4bd"
+}
+.bi-patch-question::before{
+ content:"\f4be"
+}
+.bi-pause-btn-fill::before{
+ content:"\f4bf"
+}
+.bi-pause-btn::before{
+ content:"\f4c0"
+}
+.bi-pause-circle-fill::before{
+ content:"\f4c1"
+}
+.bi-pause-circle::before{
+ content:"\f4c2"
+}
+.bi-pause-fill::before{
+ content:"\f4c3"
+}
+.bi-pause::before{
+ content:"\f4c4"
+}
+.bi-peace-fill::before{
+ content:"\f4c5"
+}
+.bi-peace::before{
+ content:"\f4c6"
+}
+.bi-pen-fill::before{
+ content:"\f4c7"
+}
+.bi-pen::before{
+ content:"\f4c8"
+}
+.bi-pencil-fill::before{
+ content:"\f4c9"
+}
+.bi-pencil-square::before{
+ content:"\f4ca"
+}
+.bi-pencil::before{
+ content:"\f4cb"
+}
+.bi-pentagon-fill::before{
+ content:"\f4cc"
+}
+.bi-pentagon-half::before{
+ content:"\f4cd"
+}
+.bi-pentagon::before{
+ content:"\f4ce"
+}
+.bi-people-fill::before{
+ content:"\f4cf"
+}
+.bi-people::before{
+ content:"\f4d0"
+}
+.bi-percent::before{
+ content:"\f4d1"
+}
+.bi-person-badge-fill::before{
+ content:"\f4d2"
+}
+.bi-person-badge::before{
+ content:"\f4d3"
+}
+.bi-person-bounding-box::before{
+ content:"\f4d4"
+}
+.bi-person-check-fill::before{
+ content:"\f4d5"
+}
+.bi-person-check::before{
+ content:"\f4d6"
+}
+.bi-person-circle::before{
+ content:"\f4d7"
+}
+.bi-person-dash-fill::before{
+ content:"\f4d8"
+}
+.bi-person-dash::before{
+ content:"\f4d9"
+}
+.bi-person-fill::before{
+ content:"\f4da"
+}
+.bi-person-lines-fill::before{
+ content:"\f4db"
+}
+.bi-person-plus-fill::before{
+ content:"\f4dc"
+}
+.bi-person-plus::before{
+ content:"\f4dd"
+}
+.bi-person-square::before{
+ content:"\f4de"
+}
+.bi-person-x-fill::before{
+ content:"\f4df"
+}
+.bi-person-x::before{
+ content:"\f4e0"
+}
+.bi-person::before{
+ content:"\f4e1"
+}
+.bi-phone-fill::before{
+ content:"\f4e2"
+}
+.bi-phone-landscape-fill::before{
+ content:"\f4e3"
+}
+.bi-phone-landscape::before{
+ content:"\f4e4"
+}
+.bi-phone-vibrate-fill::before{
+ content:"\f4e5"
+}
+.bi-phone-vibrate::before{
+ content:"\f4e6"
+}
+.bi-phone::before{
+ content:"\f4e7"
+}
+.bi-pie-chart-fill::before{
+ content:"\f4e8"
+}
+.bi-pie-chart::before{
+ content:"\f4e9"
+}
+.bi-pin-angle-fill::before{
+ content:"\f4ea"
+}
+.bi-pin-angle::before{
+ content:"\f4eb"
+}
+.bi-pin-fill::before{
+ content:"\f4ec"
+}
+.bi-pin::before{
+ content:"\f4ed"
+}
+.bi-pip-fill::before{
+ content:"\f4ee"
+}
+.bi-pip::before{
+ content:"\f4ef"
+}
+.bi-play-btn-fill::before{
+ content:"\f4f0"
+}
+.bi-play-btn::before{
+ content:"\f4f1"
+}
+.bi-play-circle-fill::before{
+ content:"\f4f2"
+}
+.bi-play-circle::before{
+ content:"\f4f3"
+}
+.bi-play-fill::before{
+ content:"\f4f4"
+}
+.bi-play::before{
+ content:"\f4f5"
+}
+.bi-plug-fill::before{
+ content:"\f4f6"
+}
+.bi-plug::before{
+ content:"\f4f7"
+}
+.bi-plus-circle-dotted::before{
+ content:"\f4f8"
+}
+.bi-plus-circle-fill::before{
+ content:"\f4f9"
+}
+.bi-plus-circle::before{
+ content:"\f4fa"
+}
+.bi-plus-square-dotted::before{
+ content:"\f4fb"
+}
+.bi-plus-square-fill::before{
+ content:"\f4fc"
+}
+.bi-plus-square::before{
+ content:"\f4fd"
+}
+.bi-plus::before{
+ content:"\f4fe"
+}
+.bi-power::before{
+ content:"\f4ff"
+}
+.bi-printer-fill::before{
+ content:"\f500"
+}
+.bi-printer::before{
+ content:"\f501"
+}
+.bi-puzzle-fill::before{
+ content:"\f502"
+}
+.bi-puzzle::before{
+ content:"\f503"
+}
+.bi-question-circle-fill::before{
+ content:"\f504"
+}
+.bi-question-circle::before{
+ content:"\f505"
+}
+.bi-question-diamond-fill::before{
+ content:"\f506"
+}
+.bi-question-diamond::before{
+ content:"\f507"
+}
+.bi-question-octagon-fill::before{
+ content:"\f508"
+}
+.bi-question-octagon::before{
+ content:"\f509"
+}
+.bi-question-square-fill::before{
+ content:"\f50a"
+}
+.bi-question-square::before{
+ content:"\f50b"
+}
+.bi-question::before{
+ content:"\f50c"
+}
+.bi-rainbow::before{
+ content:"\f50d"
+}
+.bi-receipt-cutoff::before{
+ content:"\f50e"
+}
+.bi-receipt::before{
+ content:"\f50f"
+}
+.bi-reception-0::before{
+ content:"\f510"
+}
+.bi-reception-1::before{
+ content:"\f511"
+}
+.bi-reception-2::before{
+ content:"\f512"
+}
+.bi-reception-3::before{
+ content:"\f513"
+}
+.bi-reception-4::before{
+ content:"\f514"
+}
+.bi-record-btn-fill::before{
+ content:"\f515"
+}
+.bi-record-btn::before{
+ content:"\f516"
+}
+.bi-record-circle-fill::before{
+ content:"\f517"
+}
+.bi-record-circle::before{
+ content:"\f518"
+}
+.bi-record-fill::before{
+ content:"\f519"
+}
+.bi-record::before{
+ content:"\f51a"
+}
+.bi-record2-fill::before{
+ content:"\f51b"
+}
+.bi-record2::before{
+ content:"\f51c"
+}
+.bi-reply-all-fill::before{
+ content:"\f51d"
+}
+.bi-reply-all::before{
+ content:"\f51e"
+}
+.bi-reply-fill::before{
+ content:"\f51f"
+}
+.bi-reply::before{
+ content:"\f520"
+}
+.bi-rss-fill::before{
+ content:"\f521"
+}
+.bi-rss::before{
+ content:"\f522"
+}
+.bi-rulers::before{
+ content:"\f523"
+}
+.bi-save-fill::before{
+ content:"\f524"
+}
+.bi-save::before{
+ content:"\f525"
+}
+.bi-save2-fill::before{
+ content:"\f526"
+}
+.bi-save2::before{
+ content:"\f527"
+}
+.bi-scissors::before{
+ content:"\f528"
+}
+.bi-screwdriver::before{
+ content:"\f529"
+}
+.bi-search::before{
+ content:"\f52a"
+}
+.bi-segmented-nav::before{
+ content:"\f52b"
+}
+.bi-server::before{
+ content:"\f52c"
+}
+.bi-share-fill::before{
+ content:"\f52d"
+}
+.bi-share::before{
+ content:"\f52e"
+}
+.bi-shield-check::before{
+ content:"\f52f"
+}
+.bi-shield-exclamation::before{
+ content:"\f530"
+}
+.bi-shield-fill-check::before{
+ content:"\f531"
+}
+.bi-shield-fill-exclamation::before{
+ content:"\f532"
+}
+.bi-shield-fill-minus::before{
+ content:"\f533"
+}
+.bi-shield-fill-plus::before{
+ content:"\f534"
+}
+.bi-shield-fill-x::before{
+ content:"\f535"
+}
+.bi-shield-fill::before{
+ content:"\f536"
+}
+.bi-shield-lock-fill::before{
+ content:"\f537"
+}
+.bi-shield-lock::before{
+ content:"\f538"
+}
+.bi-shield-minus::before{
+ content:"\f539"
+}
+.bi-shield-plus::before{
+ content:"\f53a"
+}
+.bi-shield-shaded::before{
+ content:"\f53b"
+}
+.bi-shield-slash-fill::before{
+ content:"\f53c"
+}
+.bi-shield-slash::before{
+ content:"\f53d"
+}
+.bi-shield-x::before{
+ content:"\f53e"
+}
+.bi-shield::before{
+ content:"\f53f"
+}
+.bi-shift-fill::before{
+ content:"\f540"
+}
+.bi-shift::before{
+ content:"\f541"
+}
+.bi-shop-window::before{
+ content:"\f542"
+}
+.bi-shop::before{
+ content:"\f543"
+}
+.bi-shuffle::before{
+ content:"\f544"
+}
+.bi-signpost-2-fill::before{
+ content:"\f545"
+}
+.bi-signpost-2::before{
+ content:"\f546"
+}
+.bi-signpost-fill::before{
+ content:"\f547"
+}
+.bi-signpost-split-fill::before{
+ content:"\f548"
+}
+.bi-signpost-split::before{
+ content:"\f549"
+}
+.bi-signpost::before{
+ content:"\f54a"
+}
+.bi-sim-fill::before{
+ content:"\f54b"
+}
+.bi-sim::before{
+ content:"\f54c"
+}
+.bi-skip-backward-btn-fill::before{
+ content:"\f54d"
+}
+.bi-skip-backward-btn::before{
+ content:"\f54e"
+}
+.bi-skip-backward-circle-fill::before{
+ content:"\f54f"
+}
+.bi-skip-backward-circle::before{
+ content:"\f550"
+}
+.bi-skip-backward-fill::before{
+ content:"\f551"
+}
+.bi-skip-backward::before{
+ content:"\f552"
+}
+.bi-skip-end-btn-fill::before{
+ content:"\f553"
+}
+.bi-skip-end-btn::before{
+ content:"\f554"
+}
+.bi-skip-end-circle-fill::before{
+ content:"\f555"
+}
+.bi-skip-end-circle::before{
+ content:"\f556"
+}
+.bi-skip-end-fill::before{
+ content:"\f557"
+}
+.bi-skip-end::before{
+ content:"\f558"
+}
+.bi-skip-forward-btn-fill::before{
+ content:"\f559"
+}
+.bi-skip-forward-btn::before{
+ content:"\f55a"
+}
+.bi-skip-forward-circle-fill::before{
+ content:"\f55b"
+}
+.bi-skip-forward-circle::before{
+ content:"\f55c"
+}
+.bi-skip-forward-fill::before{
+ content:"\f55d"
+}
+.bi-skip-forward::before{
+ content:"\f55e"
+}
+.bi-skip-start-btn-fill::before{
+ content:"\f55f"
+}
+.bi-skip-start-btn::before{
+ content:"\f560"
+}
+.bi-skip-start-circle-fill::before{
+ content:"\f561"
+}
+.bi-skip-start-circle::before{
+ content:"\f562"
+}
+.bi-skip-start-fill::before{
+ content:"\f563"
+}
+.bi-skip-start::before{
+ content:"\f564"
+}
+.bi-slack::before{
+ content:"\f565"
+}
+.bi-slash-circle-fill::before{
+ content:"\f566"
+}
+.bi-slash-circle::before{
+ content:"\f567"
+}
+.bi-slash-square-fill::before{
+ content:"\f568"
+}
+.bi-slash-square::before{
+ content:"\f569"
+}
+.bi-slash::before{
+ content:"\f56a"
+}
+.bi-sliders::before{
+ content:"\f56b"
+}
+.bi-smartwatch::before{
+ content:"\f56c"
+}
+.bi-snow::before{
+ content:"\f56d"
+}
+.bi-snow2::before{
+ content:"\f56e"
+}
+.bi-snow3::before{
+ content:"\f56f"
+}
+.bi-sort-alpha-down-alt::before{
+ content:"\f570"
+}
+.bi-sort-alpha-down::before{
+ content:"\f571"
+}
+.bi-sort-alpha-up-alt::before{
+ content:"\f572"
+}
+.bi-sort-alpha-up::before{
+ content:"\f573"
+}
+.bi-sort-down-alt::before{
+ content:"\f574"
+}
+.bi-sort-down::before{
+ content:"\f575"
+}
+.bi-sort-numeric-down-alt::before{
+ content:"\f576"
+}
+.bi-sort-numeric-down::before{
+ content:"\f577"
+}
+.bi-sort-numeric-up-alt::before{
+ content:"\f578"
+}
+.bi-sort-numeric-up::before{
+ content:"\f579"
+}
+.bi-sort-up-alt::before{
+ content:"\f57a"
+}
+.bi-sort-up::before{
+ content:"\f57b"
+}
+.bi-soundwave::before{
+ content:"\f57c"
+}
+.bi-speaker-fill::before{
+ content:"\f57d"
+}
+.bi-speaker::before{
+ content:"\f57e"
+}
+.bi-speedometer::before{
+ content:"\f57f"
+}
+.bi-speedometer2::before{
+ content:"\f580"
+}
+.bi-spellcheck::before{
+ content:"\f581"
+}
+.bi-square-fill::before{
+ content:"\f582"
+}
+.bi-square-half::before{
+ content:"\f583"
+}
+.bi-square::before{
+ content:"\f584"
+}
+.bi-stack::before{
+ content:"\f585"
+}
+.bi-star-fill::before{
+ content:"\f586"
+}
+.bi-star-half::before{
+ content:"\f587"
+}
+.bi-star::before{
+ content:"\f588"
+}
+.bi-stars::before{
+ content:"\f589"
+}
+.bi-stickies-fill::before{
+ content:"\f58a"
+}
+.bi-stickies::before{
+ content:"\f58b"
+}
+.bi-sticky-fill::before{
+ content:"\f58c"
+}
+.bi-sticky::before{
+ content:"\f58d"
+}
+.bi-stop-btn-fill::before{
+ content:"\f58e"
+}
+.bi-stop-btn::before{
+ content:"\f58f"
+}
+.bi-stop-circle-fill::before{
+ content:"\f590"
+}
+.bi-stop-circle::before{
+ content:"\f591"
+}
+.bi-stop-fill::before{
+ content:"\f592"
+}
+.bi-stop::before{
+ content:"\f593"
+}
+.bi-stoplights-fill::before{
+ content:"\f594"
+}
+.bi-stoplights::before{
+ content:"\f595"
+}
+.bi-stopwatch-fill::before{
+ content:"\f596"
+}
+.bi-stopwatch::before{
+ content:"\f597"
+}
+.bi-subtract::before{
+ content:"\f598"
+}
+.bi-suit-club-fill::before{
+ content:"\f599"
+}
+.bi-suit-club::before{
+ content:"\f59a"
+}
+.bi-suit-diamond-fill::before{
+ content:"\f59b"
+}
+.bi-suit-diamond::before{
+ content:"\f59c"
+}
+.bi-suit-heart-fill::before{
+ content:"\f59d"
+}
+.bi-suit-heart::before{
+ content:"\f59e"
+}
+.bi-suit-spade-fill::before{
+ content:"\f59f"
+}
+.bi-suit-spade::before{
+ content:"\f5a0"
+}
+.bi-sun-fill::before{
+ content:"\f5a1"
+}
+.bi-sun::before{
+ content:"\f5a2"
+}
+.bi-sunglasses::before{
+ content:"\f5a3"
+}
+.bi-sunrise-fill::before{
+ content:"\f5a4"
+}
+.bi-sunrise::before{
+ content:"\f5a5"
+}
+.bi-sunset-fill::before{
+ content:"\f5a6"
+}
+.bi-sunset::before{
+ content:"\f5a7"
+}
+.bi-symmetry-horizontal::before{
+ content:"\f5a8"
+}
+.bi-symmetry-vertical::before{
+ content:"\f5a9"
+}
+.bi-table::before{
+ content:"\f5aa"
+}
+.bi-tablet-fill::before{
+ content:"\f5ab"
+}
+.bi-tablet-landscape-fill::before{
+ content:"\f5ac"
+}
+.bi-tablet-landscape::before{
+ content:"\f5ad"
+}
+.bi-tablet::before{
+ content:"\f5ae"
+}
+.bi-tag-fill::before{
+ content:"\f5af"
+}
+.bi-tag::before{
+ content:"\f5b0"
+}
+.bi-tags-fill::before{
+ content:"\f5b1"
+}
+.bi-tags::before{
+ content:"\f5b2"
+}
+.bi-telegram::before{
+ content:"\f5b3"
+}
+.bi-telephone-fill::before{
+ content:"\f5b4"
+}
+.bi-telephone-forward-fill::before{
+ content:"\f5b5"
+}
+.bi-telephone-forward::before{
+ content:"\f5b6"
+}
+.bi-telephone-inbound-fill::before{
+ content:"\f5b7"
+}
+.bi-telephone-inbound::before{
+ content:"\f5b8"
+}
+.bi-telephone-minus-fill::before{
+ content:"\f5b9"
+}
+.bi-telephone-minus::before{
+ content:"\f5ba"
+}
+.bi-telephone-outbound-fill::before{
+ content:"\f5bb"
+}
+.bi-telephone-outbound::before{
+ content:"\f5bc"
+}
+.bi-telephone-plus-fill::before{
+ content:"\f5bd"
+}
+.bi-telephone-plus::before{
+ content:"\f5be"
+}
+.bi-telephone-x-fill::before{
+ content:"\f5bf"
+}
+.bi-telephone-x::before{
+ content:"\f5c0"
+}
+.bi-telephone::before{
+ content:"\f5c1"
+}
+.bi-terminal-fill::before{
+ content:"\f5c2"
+}
+.bi-terminal::before{
+ content:"\f5c3"
+}
+.bi-text-center::before{
+ content:"\f5c4"
+}
+.bi-text-indent-left::before{
+ content:"\f5c5"
+}
+.bi-text-indent-right::before{
+ content:"\f5c6"
+}
+.bi-text-left::before{
+ content:"\f5c7"
+}
+.bi-text-paragraph::before{
+ content:"\f5c8"
+}
+.bi-text-right::before{
+ content:"\f5c9"
+}
+.bi-textarea-resize::before{
+ content:"\f5ca"
+}
+.bi-textarea-t::before{
+ content:"\f5cb"
+}
+.bi-textarea::before{
+ content:"\f5cc"
+}
+.bi-thermometer-half::before{
+ content:"\f5cd"
+}
+.bi-thermometer-high::before{
+ content:"\f5ce"
+}
+.bi-thermometer-low::before{
+ content:"\f5cf"
+}
+.bi-thermometer-snow::before{
+ content:"\f5d0"
+}
+.bi-thermometer-sun::before{
+ content:"\f5d1"
+}
+.bi-thermometer::before{
+ content:"\f5d2"
+}
+.bi-three-dots-vertical::before{
+ content:"\f5d3"
+}
+.bi-three-dots::before{
+ content:"\f5d4"
+}
+.bi-toggle-off::before{
+ content:"\f5d5"
+}
+.bi-toggle-on::before{
+ content:"\f5d6"
+}
+.bi-toggle2-off::before{
+ content:"\f5d7"
+}
+.bi-toggle2-on::before{
+ content:"\f5d8"
+}
+.bi-toggles::before{
+ content:"\f5d9"
+}
+.bi-toggles2::before{
+ content:"\f5da"
+}
+.bi-tools::before{
+ content:"\f5db"
+}
+.bi-tornado::before{
+ content:"\f5dc"
+}
+.bi-trash-fill::before{
+ content:"\f5dd"
+}
+.bi-trash::before{
+ content:"\f5de"
+}
+.bi-trash2-fill::before{
+ content:"\f5df"
+}
+.bi-trash2::before{
+ content:"\f5e0"
+}
+.bi-tree-fill::before{
+ content:"\f5e1"
+}
+.bi-tree::before{
+ content:"\f5e2"
+}
+.bi-triangle-fill::before{
+ content:"\f5e3"
+}
+.bi-triangle-half::before{
+ content:"\f5e4"
+}
+.bi-triangle::before{
+ content:"\f5e5"
+}
+.bi-trophy-fill::before{
+ content:"\f5e6"
+}
+.bi-trophy::before{
+ content:"\f5e7"
+}
+.bi-tropical-storm::before{
+ content:"\f5e8"
+}
+.bi-truck-flatbed::before{
+ content:"\f5e9"
+}
+.bi-truck::before{
+ content:"\f5ea"
+}
+.bi-tsunami::before{
+ content:"\f5eb"
+}
+.bi-tv-fill::before{
+ content:"\f5ec"
+}
+.bi-tv::before{
+ content:"\f5ed"
+}
+.bi-twitch::before{
+ content:"\f5ee"
+}
+.bi-twitter::before{
+ content:"\f5ef"
+}
+.bi-type-bold::before{
+ content:"\f5f0"
+}
+.bi-type-h1::before{
+ content:"\f5f1"
+}
+.bi-type-h2::before{
+ content:"\f5f2"
+}
+.bi-type-h3::before{
+ content:"\f5f3"
+}
+.bi-type-italic::before{
+ content:"\f5f4"
+}
+.bi-type-strikethrough::before{
+ content:"\f5f5"
+}
+.bi-type-underline::before{
+ content:"\f5f6"
+}
+.bi-type::before{
+ content:"\f5f7"
+}
+.bi-ui-checks-grid::before{
+ content:"\f5f8"
+}
+.bi-ui-checks::before{
+ content:"\f5f9"
+}
+.bi-ui-radios-grid::before{
+ content:"\f5fa"
+}
+.bi-ui-radios::before{
+ content:"\f5fb"
+}
+.bi-umbrella-fill::before{
+ content:"\f5fc"
+}
+.bi-umbrella::before{
+ content:"\f5fd"
+}
+.bi-union::before{
+ content:"\f5fe"
+}
+.bi-unlock-fill::before{
+ content:"\f5ff"
+}
+.bi-unlock::before{
+ content:"\f600"
+}
+.bi-upc-scan::before{
+ content:"\f601"
+}
+.bi-upc::before{
+ content:"\f602"
+}
+.bi-upload::before{
+ content:"\f603"
+}
+.bi-vector-pen::before{
+ content:"\f604"
+}
+.bi-view-list::before{
+ content:"\f605"
+}
+.bi-view-stacked::before{
+ content:"\f606"
+}
+.bi-vinyl-fill::before{
+ content:"\f607"
+}
+.bi-vinyl::before{
+ content:"\f608"
+}
+.bi-voicemail::before{
+ content:"\f609"
+}
+.bi-volume-down-fill::before{
+ content:"\f60a"
+}
+.bi-volume-down::before{
+ content:"\f60b"
+}
+.bi-volume-mute-fill::before{
+ content:"\f60c"
+}
+.bi-volume-mute::before{
+ content:"\f60d"
+}
+.bi-volume-off-fill::before{
+ content:"\f60e"
+}
+.bi-volume-off::before{
+ content:"\f60f"
+}
+.bi-volume-up-fill::before{
+ content:"\f610"
+}
+.bi-volume-up::before{
+ content:"\f611"
+}
+.bi-vr::before{
+ content:"\f612"
+}
+.bi-wallet-fill::before{
+ content:"\f613"
+}
+.bi-wallet::before{
+ content:"\f614"
+}
+.bi-wallet2::before{
+ content:"\f615"
+}
+.bi-watch::before{
+ content:"\f616"
+}
+.bi-water::before{
+ content:"\f617"
+}
+.bi-whatsapp::before{
+ content:"\f618"
+}
+.bi-wifi-1::before{
+ content:"\f619"
+}
+.bi-wifi-2::before{
+ content:"\f61a"
+}
+.bi-wifi-off::before{
+ content:"\f61b"
+}
+.bi-wifi::before{
+ content:"\f61c"
+}
+.bi-wind::before{
+ content:"\f61d"
+}
+.bi-window-dock::before{
+ content:"\f61e"
+}
+.bi-window-sidebar::before{
+ content:"\f61f"
+}
+.bi-window::before{
+ content:"\f620"
+}
+.bi-wrench::before{
+ content:"\f621"
+}
+.bi-x-circle-fill::before{
+ content:"\f622"
+}
+.bi-x-circle::before{
+ content:"\f623"
+}
+.bi-x-diamond-fill::before{
+ content:"\f624"
+}
+.bi-x-diamond::before{
+ content:"\f625"
+}
+.bi-x-octagon-fill::before{
+ content:"\f626"
+}
+.bi-x-octagon::before{
+ content:"\f627"
+}
+.bi-x-square-fill::before{
+ content:"\f628"
+}
+.bi-x-square::before{
+ content:"\f629"
+}
+.bi-x::before{
+ content:"\f62a"
+}
+.bi-youtube::before{
+ content:"\f62b"
+}
+.bi-zoom-in::before{
+ content:"\f62c"
+}
+.bi-zoom-out::before{
+ content:"\f62d"
+}
+.bi-bank::before{
+ content:"\f62e"
+}
+.bi-bank2::before{
+ content:"\f62f"
+}
+.bi-bell-slash-fill::before{
+ content:"\f630"
+}
+.bi-bell-slash::before{
+ content:"\f631"
+}
+.bi-cash-coin::before{
+ content:"\f632"
+}
+.bi-check-lg::before{
+ content:"\f633"
+}
+.bi-coin::before{
+ content:"\f634"
+}
+.bi-currency-bitcoin::before{
+ content:"\f635"
+}
+.bi-currency-dollar::before{
+ content:"\f636"
+}
+.bi-currency-euro::before{
+ content:"\f637"
+}
+.bi-currency-exchange::before{
+ content:"\f638"
+}
+.bi-currency-pound::before{
+ content:"\f639"
+}
+.bi-currency-yen::before{
+ content:"\f63a"
+}
+.bi-dash-lg::before{
+ content:"\f63b"
+}
+.bi-exclamation-lg::before{
+ content:"\f63c"
+}
+.bi-file-earmark-pdf-fill::before{
+ content:"\f63d"
+}
+.bi-file-earmark-pdf::before{
+ content:"\f63e"
+}
+.bi-file-pdf-fill::before{
+ content:"\f63f"
+}
+.bi-file-pdf::before{
+ content:"\f640"
+}
+.bi-gender-ambiguous::before{
+ content:"\f641"
+}
+.bi-gender-female::before{
+ content:"\f642"
+}
+.bi-gender-male::before{
+ content:"\f643"
+}
+.bi-gender-trans::before{
+ content:"\f644"
+}
+.bi-headset-vr::before{
+ content:"\f645"
+}
+.bi-info-lg::before{
+ content:"\f646"
+}
+.bi-mastodon::before{
+ content:"\f647"
+}
+.bi-messenger::before{
+ content:"\f648"
+}
+.bi-piggy-bank-fill::before{
+ content:"\f649"
+}
+.bi-piggy-bank::before{
+ content:"\f64a"
+}
+.bi-pin-map-fill::before{
+ content:"\f64b"
+}
+.bi-pin-map::before{
+ content:"\f64c"
+}
+.bi-plus-lg::before{
+ content:"\f64d"
+}
+.bi-question-lg::before{
+ content:"\f64e"
+}
+.bi-recycle::before{
+ content:"\f64f"
+}
+.bi-reddit::before{
+ content:"\f650"
+}
+.bi-safe-fill::before{
+ content:"\f651"
+}
+.bi-safe2-fill::before{
+ content:"\f652"
+}
+.bi-safe2::before{
+ content:"\f653"
+}
+.bi-sd-card-fill::before{
+ content:"\f654"
+}
+.bi-sd-card::before{
+ content:"\f655"
+}
+.bi-skype::before{
+ content:"\f656"
+}
+.bi-slash-lg::before{
+ content:"\f657"
+}
+.bi-translate::before{
+ content:"\f658"
+}
+.bi-x-lg::before{
+ content:"\f659"
+}
+.bi-safe::before{
+ content:"\f65a"
+}
+.bi-apple::before{
+ content:"\f65b"
+}
+.bi-microsoft::before{
+ content:"\f65d"
+}
+.bi-windows::before{
+ content:"\f65e"
+}
+.bi-behance::before{
+ content:"\f65c"
+}
+.bi-dribbble::before{
+ content:"\f65f"
+}
+.bi-line::before{
+ content:"\f660"
+}
+.bi-medium::before{
+ content:"\f661"
+}
+.bi-paypal::before{
+ content:"\f662"
+}
+.bi-pinterest::before{
+ content:"\f663"
+}
+.bi-signal::before{
+ content:"\f664"
+}
+.bi-snapchat::before{
+ content:"\f665"
+}
+.bi-spotify::before{
+ content:"\f666"
+}
+.bi-stack-overflow::before{
+ content:"\f667"
+}
+.bi-strava::before{
+ content:"\f668"
+}
+.bi-wordpress::before{
+ content:"\f669"
+}
+.bi-vimeo::before{
+ content:"\f66a"
+}
+.bi-activity::before{
+ content:"\f66b"
+}
+.bi-easel2-fill::before{
+ content:"\f66c"
+}
+.bi-easel2::before{
+ content:"\f66d"
+}
+.bi-easel3-fill::before{
+ content:"\f66e"
+}
+.bi-easel3::before{
+ content:"\f66f"
+}
+.bi-fan::before{
+ content:"\f670"
+}
+.bi-fingerprint::before{
+ content:"\f671"
+}
+.bi-graph-down-arrow::before{
+ content:"\f672"
+}
+.bi-graph-up-arrow::before{
+ content:"\f673"
+}
+.bi-hypnotize::before{
+ content:"\f674"
+}
+.bi-magic::before{
+ content:"\f675"
+}
+.bi-person-rolodex::before{
+ content:"\f676"
+}
+.bi-person-video::before{
+ content:"\f677"
+}
+.bi-person-video2::before{
+ content:"\f678"
+}
+.bi-person-video3::before{
+ content:"\f679"
+}
+.bi-person-workspace::before{
+ content:"\f67a"
+}
+.bi-radioactive::before{
+ content:"\f67b"
+}
+.bi-webcam-fill::before{
+ content:"\f67c"
+}
+.bi-webcam::before{
+ content:"\f67d"
+}
+.bi-yin-yang::before{
+ content:"\f67e"
+}
+.bi-bandaid-fill::before{
+ content:"\f680"
+}
+.bi-bandaid::before{
+ content:"\f681"
+}
+.bi-bluetooth::before{
+ content:"\f682"
+}
+.bi-body-text::before{
+ content:"\f683"
+}
+.bi-boombox::before{
+ content:"\f684"
+}
+.bi-boxes::before{
+ content:"\f685"
+}
+.bi-dpad-fill::before{
+ content:"\f686"
+}
+.bi-dpad::before{
+ content:"\f687"
+}
+.bi-ear-fill::before{
+ content:"\f688"
+}
+.bi-ear::before{
+ content:"\f689"
+}
+.bi-envelope-check-fill::before{
+ content:"\f68b"
+}
+.bi-envelope-check::before{
+ content:"\f68c"
+}
+.bi-envelope-dash-fill::before{
+ content:"\f68e"
+}
+.bi-envelope-dash::before{
+ content:"\f68f"
+}
+.bi-envelope-exclamation-fill::before{
+ content:"\f691"
+}
+.bi-envelope-exclamation::before{
+ content:"\f692"
+}
+.bi-envelope-plus-fill::before{
+ content:"\f693"
+}
+.bi-envelope-plus::before{
+ content:"\f694"
+}
+.bi-envelope-slash-fill::before{
+ content:"\f696"
+}
+.bi-envelope-slash::before{
+ content:"\f697"
+}
+.bi-envelope-x-fill::before{
+ content:"\f699"
+}
+.bi-envelope-x::before{
+ content:"\f69a"
+}
+.bi-explicit-fill::before{
+ content:"\f69b"
+}
+.bi-explicit::before{
+ content:"\f69c"
+}
+.bi-git::before{
+ content:"\f69d"
+}
+.bi-infinity::before{
+ content:"\f69e"
+}
+.bi-list-columns-reverse::before{
+ content:"\f69f"
+}
+.bi-list-columns::before{
+ content:"\f6a0"
+}
+.bi-meta::before{
+ content:"\f6a1"
+}
+.bi-nintendo-switch::before{
+ content:"\f6a4"
+}
+.bi-pc-display-horizontal::before{
+ content:"\f6a5"
+}
+.bi-pc-display::before{
+ content:"\f6a6"
+}
+.bi-pc-horizontal::before{
+ content:"\f6a7"
+}
+.bi-pc::before{
+ content:"\f6a8"
+}
+.bi-playstation::before{
+ content:"\f6a9"
+}
+.bi-plus-slash-minus::before{
+ content:"\f6aa"
+}
+.bi-projector-fill::before{
+ content:"\f6ab"
+}
+.bi-projector::before{
+ content:"\f6ac"
+}
+.bi-qr-code-scan::before{
+ content:"\f6ad"
+}
+.bi-qr-code::before{
+ content:"\f6ae"
+}
+.bi-quora::before{
+ content:"\f6af"
+}
+.bi-quote::before{
+ content:"\f6b0"
+}
+.bi-robot::before{
+ content:"\f6b1"
+}
+.bi-send-check-fill::before{
+ content:"\f6b2"
+}
+.bi-send-check::before{
+ content:"\f6b3"
+}
+.bi-send-dash-fill::before{
+ content:"\f6b4"
+}
+.bi-send-dash::before{
+ content:"\f6b5"
+}
+.bi-send-exclamation-fill::before{
+ content:"\f6b7"
+}
+.bi-send-exclamation::before{
+ content:"\f6b8"
+}
+.bi-send-fill::before{
+ content:"\f6b9"
+}
+.bi-send-plus-fill::before{
+ content:"\f6ba"
+}
+.bi-send-plus::before{
+ content:"\f6bb"
+}
+.bi-send-slash-fill::before{
+ content:"\f6bc"
+}
+.bi-send-slash::before{
+ content:"\f6bd"
+}
+.bi-send-x-fill::before{
+ content:"\f6be"
+}
+.bi-send-x::before{
+ content:"\f6bf"
+}
+.bi-send::before{
+ content:"\f6c0"
+}
+.bi-steam::before{
+ content:"\f6c1"
+}
+.bi-terminal-dash::before{
+ content:"\f6c3"
+}
+.bi-terminal-plus::before{
+ content:"\f6c4"
+}
+.bi-terminal-split::before{
+ content:"\f6c5"
+}
+.bi-ticket-detailed-fill::before{
+ content:"\f6c6"
+}
+.bi-ticket-detailed::before{
+ content:"\f6c7"
+}
+.bi-ticket-fill::before{
+ content:"\f6c8"
+}
+.bi-ticket-perforated-fill::before{
+ content:"\f6c9"
+}
+.bi-ticket-perforated::before{
+ content:"\f6ca"
+}
+.bi-ticket::before{
+ content:"\f6cb"
+}
+.bi-tiktok::before{
+ content:"\f6cc"
+}
+.bi-window-dash::before{
+ content:"\f6cd"
+}
+.bi-window-desktop::before{
+ content:"\f6ce"
+}
+.bi-window-fullscreen::before{
+ content:"\f6cf"
+}
+.bi-window-plus::before{
+ content:"\f6d0"
+}
+.bi-window-split::before{
+ content:"\f6d1"
+}
+.bi-window-stack::before{
+ content:"\f6d2"
+}
+.bi-window-x::before{
+ content:"\f6d3"
+}
+.bi-xbox::before{
+ content:"\f6d4"
+}
+.bi-ethernet::before{
+ content:"\f6d5"
+}
+.bi-hdmi-fill::before{
+ content:"\f6d6"
+}
+.bi-hdmi::before{
+ content:"\f6d7"
+}
+.bi-usb-c-fill::before{
+ content:"\f6d8"
+}
+.bi-usb-c::before{
+ content:"\f6d9"
+}
+.bi-usb-fill::before{
+ content:"\f6da"
+}
+.bi-usb-plug-fill::before{
+ content:"\f6db"
+}
+.bi-usb-plug::before{
+ content:"\f6dc"
+}
+.bi-usb-symbol::before{
+ content:"\f6dd"
+}
+.bi-usb::before{
+ content:"\f6de"
+}
+.bi-boombox-fill::before{
+ content:"\f6df"
+}
+.bi-displayport::before{
+ content:"\f6e1"
+}
+.bi-gpu-card::before{
+ content:"\f6e2"
+}
+.bi-memory::before{
+ content:"\f6e3"
+}
+.bi-modem-fill::before{
+ content:"\f6e4"
+}
+.bi-modem::before{
+ content:"\f6e5"
+}
+.bi-motherboard-fill::before{
+ content:"\f6e6"
+}
+.bi-motherboard::before{
+ content:"\f6e7"
+}
+.bi-optical-audio-fill::before{
+ content:"\f6e8"
+}
+.bi-optical-audio::before{
+ content:"\f6e9"
+}
+.bi-pci-card::before{
+ content:"\f6ea"
+}
+.bi-router-fill::before{
+ content:"\f6eb"
+}
+.bi-router::before{
+ content:"\f6ec"
+}
+.bi-thunderbolt-fill::before{
+ content:"\f6ef"
+}
+.bi-thunderbolt::before{
+ content:"\f6f0"
+}
+.bi-usb-drive-fill::before{
+ content:"\f6f1"
+}
+.bi-usb-drive::before{
+ content:"\f6f2"
+}
+.bi-usb-micro-fill::before{
+ content:"\f6f3"
+}
+.bi-usb-micro::before{
+ content:"\f6f4"
+}
+.bi-usb-mini-fill::before{
+ content:"\f6f5"
+}
+.bi-usb-mini::before{
+ content:"\f6f6"
+}
+.bi-cloud-haze2::before{
+ content:"\f6f7"
+}
+.bi-device-hdd-fill::before{
+ content:"\f6f8"
+}
+.bi-device-hdd::before{
+ content:"\f6f9"
+}
+.bi-device-ssd-fill::before{
+ content:"\f6fa"
+}
+.bi-device-ssd::before{
+ content:"\f6fb"
+}
+.bi-displayport-fill::before{
+ content:"\f6fc"
+}
+.bi-mortarboard-fill::before{
+ content:"\f6fd"
+}
+.bi-mortarboard::before{
+ content:"\f6fe"
+}
+.bi-terminal-x::before{
+ content:"\f6ff"
+}
+.bi-arrow-through-heart-fill::before{
+ content:"\f700"
+}
+.bi-arrow-through-heart::before{
+ content:"\f701"
+}
+.bi-badge-sd-fill::before{
+ content:"\f702"
+}
+.bi-badge-sd::before{
+ content:"\f703"
+}
+.bi-bag-heart-fill::before{
+ content:"\f704"
+}
+.bi-bag-heart::before{
+ content:"\f705"
+}
+.bi-balloon-fill::before{
+ content:"\f706"
+}
+.bi-balloon-heart-fill::before{
+ content:"\f707"
+}
+.bi-balloon-heart::before{
+ content:"\f708"
+}
+.bi-balloon::before{
+ content:"\f709"
+}
+.bi-box2-fill::before{
+ content:"\f70a"
+}
+.bi-box2-heart-fill::before{
+ content:"\f70b"
+}
+.bi-box2-heart::before{
+ content:"\f70c"
+}
+.bi-box2::before{
+ content:"\f70d"
+}
+.bi-braces-asterisk::before{
+ content:"\f70e"
+}
+.bi-calendar-heart-fill::before{
+ content:"\f70f"
+}
+.bi-calendar-heart::before{
+ content:"\f710"
+}
+.bi-calendar2-heart-fill::before{
+ content:"\f711"
+}
+.bi-calendar2-heart::before{
+ content:"\f712"
+}
+.bi-chat-heart-fill::before{
+ content:"\f713"
+}
+.bi-chat-heart::before{
+ content:"\f714"
+}
+.bi-chat-left-heart-fill::before{
+ content:"\f715"
+}
+.bi-chat-left-heart::before{
+ content:"\f716"
+}
+.bi-chat-right-heart-fill::before{
+ content:"\f717"
+}
+.bi-chat-right-heart::before{
+ content:"\f718"
+}
+.bi-chat-square-heart-fill::before{
+ content:"\f719"
+}
+.bi-chat-square-heart::before{
+ content:"\f71a"
+}
+.bi-clipboard-check-fill::before{
+ content:"\f71b"
+}
+.bi-clipboard-data-fill::before{
+ content:"\f71c"
+}
+.bi-clipboard-fill::before{
+ content:"\f71d"
+}
+.bi-clipboard-heart-fill::before{
+ content:"\f71e"
+}
+.bi-clipboard-heart::before{
+ content:"\f71f"
+}
+.bi-clipboard-minus-fill::before{
+ content:"\f720"
+}
+.bi-clipboard-plus-fill::before{
+ content:"\f721"
+}
+.bi-clipboard-pulse::before{
+ content:"\f722"
+}
+.bi-clipboard-x-fill::before{
+ content:"\f723"
+}
+.bi-clipboard2-check-fill::before{
+ content:"\f724"
+}
+.bi-clipboard2-check::before{
+ content:"\f725"
+}
+.bi-clipboard2-data-fill::before{
+ content:"\f726"
+}
+.bi-clipboard2-data::before{
+ content:"\f727"
+}
+.bi-clipboard2-fill::before{
+ content:"\f728"
+}
+.bi-clipboard2-heart-fill::before{
+ content:"\f729"
+}
+.bi-clipboard2-heart::before{
+ content:"\f72a"
+}
+.bi-clipboard2-minus-fill::before{
+ content:"\f72b"
+}
+.bi-clipboard2-minus::before{
+ content:"\f72c"
+}
+.bi-clipboard2-plus-fill::before{
+ content:"\f72d"
+}
+.bi-clipboard2-plus::before{
+ content:"\f72e"
+}
+.bi-clipboard2-pulse-fill::before{
+ content:"\f72f"
+}
+.bi-clipboard2-pulse::before{
+ content:"\f730"
+}
+.bi-clipboard2-x-fill::before{
+ content:"\f731"
+}
+.bi-clipboard2-x::before{
+ content:"\f732"
+}
+.bi-clipboard2::before{
+ content:"\f733"
+}
+.bi-emoji-kiss-fill::before{
+ content:"\f734"
+}
+.bi-emoji-kiss::before{
+ content:"\f735"
+}
+.bi-envelope-heart-fill::before{
+ content:"\f736"
+}
+.bi-envelope-heart::before{
+ content:"\f737"
+}
+.bi-envelope-open-heart-fill::before{
+ content:"\f738"
+}
+.bi-envelope-open-heart::before{
+ content:"\f739"
+}
+.bi-envelope-paper-fill::before{
+ content:"\f73a"
+}
+.bi-envelope-paper-heart-fill::before{
+ content:"\f73b"
+}
+.bi-envelope-paper-heart::before{
+ content:"\f73c"
+}
+.bi-envelope-paper::before{
+ content:"\f73d"
+}
+.bi-filetype-aac::before{
+ content:"\f73e"
+}
+.bi-filetype-ai::before{
+ content:"\f73f"
+}
+.bi-filetype-bmp::before{
+ content:"\f740"
+}
+.bi-filetype-cs::before{
+ content:"\f741"
+}
+.bi-filetype-css::before{
+ content:"\f742"
+}
+.bi-filetype-csv::before{
+ content:"\f743"
+}
+.bi-filetype-doc::before{
+ content:"\f744"
+}
+.bi-filetype-docx::before{
+ content:"\f745"
+}
+.bi-filetype-exe::before{
+ content:"\f746"
+}
+.bi-filetype-gif::before{
+ content:"\f747"
+}
+.bi-filetype-heic::before{
+ content:"\f748"
+}
+.bi-filetype-html::before{
+ content:"\f749"
+}
+.bi-filetype-java::before{
+ content:"\f74a"
+}
+.bi-filetype-jpg::before{
+ content:"\f74b"
+}
+.bi-filetype-js::before{
+ content:"\f74c"
+}
+.bi-filetype-jsx::before{
+ content:"\f74d"
+}
+.bi-filetype-key::before{
+ content:"\f74e"
+}
+.bi-filetype-m4p::before{
+ content:"\f74f"
+}
+.bi-filetype-md::before{
+ content:"\f750"
+}
+.bi-filetype-mdx::before{
+ content:"\f751"
+}
+.bi-filetype-mov::before{
+ content:"\f752"
+}
+.bi-filetype-mp3::before{
+ content:"\f753"
+}
+.bi-filetype-mp4::before{
+ content:"\f754"
+}
+.bi-filetype-otf::before{
+ content:"\f755"
+}
+.bi-filetype-pdf::before{
+ content:"\f756"
+}
+.bi-filetype-php::before{
+ content:"\f757"
+}
+.bi-filetype-png::before{
+ content:"\f758"
+}
+.bi-filetype-ppt::before{
+ content:"\f75a"
+}
+.bi-filetype-psd::before{
+ content:"\f75b"
+}
+.bi-filetype-py::before{
+ content:"\f75c"
+}
+.bi-filetype-raw::before{
+ content:"\f75d"
+}
+.bi-filetype-rb::before{
+ content:"\f75e"
+}
+.bi-filetype-sass::before{
+ content:"\f75f"
+}
+.bi-filetype-scss::before{
+ content:"\f760"
+}
+.bi-filetype-sh::before{
+ content:"\f761"
+}
+.bi-filetype-svg::before{
+ content:"\f762"
+}
+.bi-filetype-tiff::before{
+ content:"\f763"
+}
+.bi-filetype-tsx::before{
+ content:"\f764"
+}
+.bi-filetype-ttf::before{
+ content:"\f765"
+}
+.bi-filetype-txt::before{
+ content:"\f766"
+}
+.bi-filetype-wav::before{
+ content:"\f767"
+}
+.bi-filetype-woff::before{
+ content:"\f768"
+}
+.bi-filetype-xls::before{
+ content:"\f76a"
+}
+.bi-filetype-xml::before{
+ content:"\f76b"
+}
+.bi-filetype-yml::before{
+ content:"\f76c"
+}
+.bi-heart-arrow::before{
+ content:"\f76d"
+}
+.bi-heart-pulse-fill::before{
+ content:"\f76e"
+}
+.bi-heart-pulse::before{
+ content:"\f76f"
+}
+.bi-heartbreak-fill::before{
+ content:"\f770"
+}
+.bi-heartbreak::before{
+ content:"\f771"
+}
+.bi-hearts::before{
+ content:"\f772"
+}
+.bi-hospital-fill::before{
+ content:"\f773"
+}
+.bi-hospital::before{
+ content:"\f774"
+}
+.bi-house-heart-fill::before{
+ content:"\f775"
+}
+.bi-house-heart::before{
+ content:"\f776"
+}
+.bi-incognito::before{
+ content:"\f777"
+}
+.bi-magnet-fill::before{
+ content:"\f778"
+}
+.bi-magnet::before{
+ content:"\f779"
+}
+.bi-person-heart::before{
+ content:"\f77a"
+}
+.bi-person-hearts::before{
+ content:"\f77b"
+}
+.bi-phone-flip::before{
+ content:"\f77c"
+}
+.bi-plugin::before{
+ content:"\f77d"
+}
+.bi-postage-fill::before{
+ content:"\f77e"
+}
+.bi-postage-heart-fill::before{
+ content:"\f77f"
+}
+.bi-postage-heart::before{
+ content:"\f780"
+}
+.bi-postage::before{
+ content:"\f781"
+}
+.bi-postcard-fill::before{
+ content:"\f782"
+}
+.bi-postcard-heart-fill::before{
+ content:"\f783"
+}
+.bi-postcard-heart::before{
+ content:"\f784"
+}
+.bi-postcard::before{
+ content:"\f785"
+}
+.bi-search-heart-fill::before{
+ content:"\f786"
+}
+.bi-search-heart::before{
+ content:"\f787"
+}
+.bi-sliders2-vertical::before{
+ content:"\f788"
+}
+.bi-sliders2::before{
+ content:"\f789"
+}
+.bi-trash3-fill::before{
+ content:"\f78a"
+}
+.bi-trash3::before{
+ content:"\f78b"
+}
+.bi-valentine::before{
+ content:"\f78c"
+}
+.bi-valentine2::before{
+ content:"\f78d"
+}
+.bi-wrench-adjustable-circle-fill::before{
+ content:"\f78e"
+}
+.bi-wrench-adjustable-circle::before{
+ content:"\f78f"
+}
+.bi-wrench-adjustable::before{
+ content:"\f790"
+}
+.bi-filetype-json::before{
+ content:"\f791"
+}
+.bi-filetype-pptx::before{
+ content:"\f792"
+}
+.bi-filetype-xlsx::before{
+ content:"\f793"
+}
+.bi-1-circle-fill::before{
+ content:"\f796"
+}
+.bi-1-circle::before{
+ content:"\f797"
+}
+.bi-1-square-fill::before{
+ content:"\f798"
+}
+.bi-1-square::before{
+ content:"\f799"
+}
+.bi-2-circle-fill::before{
+ content:"\f79c"
+}
+.bi-2-circle::before{
+ content:"\f79d"
+}
+.bi-2-square-fill::before{
+ content:"\f79e"
+}
+.bi-2-square::before{
+ content:"\f79f"
+}
+.bi-3-circle-fill::before{
+ content:"\f7a2"
+}
+.bi-3-circle::before{
+ content:"\f7a3"
+}
+.bi-3-square-fill::before{
+ content:"\f7a4"
+}
+.bi-3-square::before{
+ content:"\f7a5"
+}
+.bi-4-circle-fill::before{
+ content:"\f7a8"
+}
+.bi-4-circle::before{
+ content:"\f7a9"
+}
+.bi-4-square-fill::before{
+ content:"\f7aa"
+}
+.bi-4-square::before{
+ content:"\f7ab"
+}
+.bi-5-circle-fill::before{
+ content:"\f7ae"
+}
+.bi-5-circle::before{
+ content:"\f7af"
+}
+.bi-5-square-fill::before{
+ content:"\f7b0"
+}
+.bi-5-square::before{
+ content:"\f7b1"
+}
+.bi-6-circle-fill::before{
+ content:"\f7b4"
+}
+.bi-6-circle::before{
+ content:"\f7b5"
+}
+.bi-6-square-fill::before{
+ content:"\f7b6"
+}
+.bi-6-square::before{
+ content:"\f7b7"
+}
+.bi-7-circle-fill::before{
+ content:"\f7ba"
+}
+.bi-7-circle::before{
+ content:"\f7bb"
+}
+.bi-7-square-fill::before{
+ content:"\f7bc"
+}
+.bi-7-square::before{
+ content:"\f7bd"
+}
+.bi-8-circle-fill::before{
+ content:"\f7c0"
+}
+.bi-8-circle::before{
+ content:"\f7c1"
+}
+.bi-8-square-fill::before{
+ content:"\f7c2"
+}
+.bi-8-square::before{
+ content:"\f7c3"
+}
+.bi-9-circle-fill::before{
+ content:"\f7c6"
+}
+.bi-9-circle::before{
+ content:"\f7c7"
+}
+.bi-9-square-fill::before{
+ content:"\f7c8"
+}
+.bi-9-square::before{
+ content:"\f7c9"
+}
+.bi-airplane-engines-fill::before{
+ content:"\f7ca"
+}
+.bi-airplane-engines::before{
+ content:"\f7cb"
+}
+.bi-airplane-fill::before{
+ content:"\f7cc"
+}
+.bi-airplane::before{
+ content:"\f7cd"
+}
+.bi-alexa::before{
+ content:"\f7ce"
+}
+.bi-alipay::before{
+ content:"\f7cf"
+}
+.bi-android::before{
+ content:"\f7d0"
+}
+.bi-android2::before{
+ content:"\f7d1"
+}
+.bi-box-fill::before{
+ content:"\f7d2"
+}
+.bi-box-seam-fill::before{
+ content:"\f7d3"
+}
+.bi-browser-chrome::before{
+ content:"\f7d4"
+}
+.bi-browser-edge::before{
+ content:"\f7d5"
+}
+.bi-browser-firefox::before{
+ content:"\f7d6"
+}
+.bi-browser-safari::before{
+ content:"\f7d7"
+}
+.bi-c-circle-fill::before{
+ content:"\f7da"
+}
+.bi-c-circle::before{
+ content:"\f7db"
+}
+.bi-c-square-fill::before{
+ content:"\f7dc"
+}
+.bi-c-square::before{
+ content:"\f7dd"
+}
+.bi-capsule-pill::before{
+ content:"\f7de"
+}
+.bi-capsule::before{
+ content:"\f7df"
+}
+.bi-car-front-fill::before{
+ content:"\f7e0"
+}
+.bi-car-front::before{
+ content:"\f7e1"
+}
+.bi-cassette-fill::before{
+ content:"\f7e2"
+}
+.bi-cassette::before{
+ content:"\f7e3"
+}
+.bi-cc-circle-fill::before{
+ content:"\f7e6"
+}
+.bi-cc-circle::before{
+ content:"\f7e7"
+}
+.bi-cc-square-fill::before{
+ content:"\f7e8"
+}
+.bi-cc-square::before{
+ content:"\f7e9"
+}
+.bi-cup-hot-fill::before{
+ content:"\f7ea"
+}
+.bi-cup-hot::before{
+ content:"\f7eb"
+}
+.bi-currency-rupee::before{
+ content:"\f7ec"
+}
+.bi-dropbox::before{
+ content:"\f7ed"
+}
+.bi-escape::before{
+ content:"\f7ee"
+}
+.bi-fast-forward-btn-fill::before{
+ content:"\f7ef"
+}
+.bi-fast-forward-btn::before{
+ content:"\f7f0"
+}
+.bi-fast-forward-circle-fill::before{
+ content:"\f7f1"
+}
+.bi-fast-forward-circle::before{
+ content:"\f7f2"
+}
+.bi-fast-forward-fill::before{
+ content:"\f7f3"
+}
+.bi-fast-forward::before{
+ content:"\f7f4"
+}
+.bi-filetype-sql::before{
+ content:"\f7f5"
+}
+.bi-fire::before{
+ content:"\f7f6"
+}
+.bi-google-play::before{
+ content:"\f7f7"
+}
+.bi-h-circle-fill::before{
+ content:"\f7fa"
+}
+.bi-h-circle::before{
+ content:"\f7fb"
+}
+.bi-h-square-fill::before{
+ content:"\f7fc"
+}
+.bi-h-square::before{
+ content:"\f7fd"
+}
+.bi-indent::before{
+ content:"\f7fe"
+}
+.bi-lungs-fill::before{
+ content:"\f7ff"
+}
+.bi-lungs::before{
+ content:"\f800"
+}
+.bi-microsoft-teams::before{
+ content:"\f801"
+}
+.bi-p-circle-fill::before{
+ content:"\f804"
+}
+.bi-p-circle::before{
+ content:"\f805"
+}
+.bi-p-square-fill::before{
+ content:"\f806"
+}
+.bi-p-square::before{
+ content:"\f807"
+}
+.bi-pass-fill::before{
+ content:"\f808"
+}
+.bi-pass::before{
+ content:"\f809"
+}
+.bi-prescription::before{
+ content:"\f80a"
+}
+.bi-prescription2::before{
+ content:"\f80b"
+}
+.bi-r-circle-fill::before{
+ content:"\f80e"
+}
+.bi-r-circle::before{
+ content:"\f80f"
+}
+.bi-r-square-fill::before{
+ content:"\f810"
+}
+.bi-r-square::before{
+ content:"\f811"
+}
+.bi-repeat-1::before{
+ content:"\f812"
+}
+.bi-repeat::before{
+ content:"\f813"
+}
+.bi-rewind-btn-fill::before{
+ content:"\f814"
+}
+.bi-rewind-btn::before{
+ content:"\f815"
+}
+.bi-rewind-circle-fill::before{
+ content:"\f816"
+}
+.bi-rewind-circle::before{
+ content:"\f817"
+}
+.bi-rewind-fill::before{
+ content:"\f818"
+}
+.bi-rewind::before{
+ content:"\f819"
+}
+.bi-train-freight-front-fill::before{
+ content:"\f81a"
+}
+.bi-train-freight-front::before{
+ content:"\f81b"
+}
+.bi-train-front-fill::before{
+ content:"\f81c"
+}
+.bi-train-front::before{
+ content:"\f81d"
+}
+.bi-train-lightrail-front-fill::before{
+ content:"\f81e"
+}
+.bi-train-lightrail-front::before{
+ content:"\f81f"
+}
+.bi-truck-front-fill::before{
+ content:"\f820"
+}
+.bi-truck-front::before{
+ content:"\f821"
+}
+.bi-ubuntu::before{
+ content:"\f822"
+}
+.bi-unindent::before{
+ content:"\f823"
+}
+.bi-unity::before{
+ content:"\f824"
+}
+.bi-universal-access-circle::before{
+ content:"\f825"
+}
+.bi-universal-access::before{
+ content:"\f826"
+}
+.bi-virus::before{
+ content:"\f827"
+}
+.bi-virus2::before{
+ content:"\f828"
+}
+.bi-wechat::before{
+ content:"\f829"
+}
+.bi-yelp::before{
+ content:"\f82a"
+}
+.bi-sign-stop-fill::before{
+ content:"\f82b"
+}
+.bi-sign-stop-lights-fill::before{
+ content:"\f82c"
+}
+.bi-sign-stop-lights::before{
+ content:"\f82d"
+}
+.bi-sign-stop::before{
+ content:"\f82e"
+}
+.bi-sign-turn-left-fill::before{
+ content:"\f82f"
+}
+.bi-sign-turn-left::before{
+ content:"\f830"
+}
+.bi-sign-turn-right-fill::before{
+ content:"\f831"
+}
+.bi-sign-turn-right::before{
+ content:"\f832"
+}
+.bi-sign-turn-slight-left-fill::before{
+ content:"\f833"
+}
+.bi-sign-turn-slight-left::before{
+ content:"\f834"
+}
+.bi-sign-turn-slight-right-fill::before{
+ content:"\f835"
+}
+.bi-sign-turn-slight-right::before{
+ content:"\f836"
+}
+.bi-sign-yield-fill::before{
+ content:"\f837"
+}
+.bi-sign-yield::before{
+ content:"\f838"
+}
+.bi-ev-station-fill::before{
+ content:"\f839"
+}
+.bi-ev-station::before{
+ content:"\f83a"
+}
+.bi-fuel-pump-diesel-fill::before{
+ content:"\f83b"
+}
+.bi-fuel-pump-diesel::before{
+ content:"\f83c"
+}
+.bi-fuel-pump-fill::before{
+ content:"\f83d"
+}
+.bi-fuel-pump::before{
+ content:"\f83e"
+}
+.bi-0-circle-fill::before{
+ content:"\f83f"
+}
+.bi-0-circle::before{
+ content:"\f840"
+}
+.bi-0-square-fill::before{
+ content:"\f841"
+}
+.bi-0-square::before{
+ content:"\f842"
+}
+.bi-rocket-fill::before{
+ content:"\f843"
+}
+.bi-rocket-takeoff-fill::before{
+ content:"\f844"
+}
+.bi-rocket-takeoff::before{
+ content:"\f845"
+}
+.bi-rocket::before{
+ content:"\f846"
+}
+.bi-stripe::before{
+ content:"\f847"
+}
+.bi-subscript::before{
+ content:"\f848"
+}
+.bi-superscript::before{
+ content:"\f849"
+}
+.bi-trello::before{
+ content:"\f84a"
+}
+.bi-envelope-at-fill::before{
+ content:"\f84b"
+}
+.bi-envelope-at::before{
+ content:"\f84c"
+}
+.bi-regex::before{
+ content:"\f84d"
+}
+.bi-text-wrap::before{
+ content:"\f84e"
+}
+.bi-sign-dead-end-fill::before{
+ content:"\f84f"
+}
+.bi-sign-dead-end::before{
+ content:"\f850"
+}
+.bi-sign-do-not-enter-fill::before{
+ content:"\f851"
+}
+.bi-sign-do-not-enter::before{
+ content:"\f852"
+}
+.bi-sign-intersection-fill::before{
+ content:"\f853"
+}
+.bi-sign-intersection-side-fill::before{
+ content:"\f854"
+}
+.bi-sign-intersection-side::before{
+ content:"\f855"
+}
+.bi-sign-intersection-t-fill::before{
+ content:"\f856"
+}
+.bi-sign-intersection-t::before{
+ content:"\f857"
+}
+.bi-sign-intersection-y-fill::before{
+ content:"\f858"
+}
+.bi-sign-intersection-y::before{
+ content:"\f859"
+}
+.bi-sign-intersection::before{
+ content:"\f85a"
+}
+.bi-sign-merge-left-fill::before{
+ content:"\f85b"
+}
+.bi-sign-merge-left::before{
+ content:"\f85c"
+}
+.bi-sign-merge-right-fill::before{
+ content:"\f85d"
+}
+.bi-sign-merge-right::before{
+ content:"\f85e"
+}
+.bi-sign-no-left-turn-fill::before{
+ content:"\f85f"
+}
+.bi-sign-no-left-turn::before{
+ content:"\f860"
+}
+.bi-sign-no-parking-fill::before{
+ content:"\f861"
+}
+.bi-sign-no-parking::before{
+ content:"\f862"
+}
+.bi-sign-no-right-turn-fill::before{
+ content:"\f863"
+}
+.bi-sign-no-right-turn::before{
+ content:"\f864"
+}
+.bi-sign-railroad-fill::before{
+ content:"\f865"
+}
+.bi-sign-railroad::before{
+ content:"\f866"
+}
+.bi-building-add::before{
+ content:"\f867"
+}
+.bi-building-check::before{
+ content:"\f868"
+}
+.bi-building-dash::before{
+ content:"\f869"
+}
+.bi-building-down::before{
+ content:"\f86a"
+}
+.bi-building-exclamation::before{
+ content:"\f86b"
+}
+.bi-building-fill-add::before{
+ content:"\f86c"
+}
+.bi-building-fill-check::before{
+ content:"\f86d"
+}
+.bi-building-fill-dash::before{
+ content:"\f86e"
+}
+.bi-building-fill-down::before{
+ content:"\f86f"
+}
+.bi-building-fill-exclamation::before{
+ content:"\f870"
+}
+.bi-building-fill-gear::before{
+ content:"\f871"
+}
+.bi-building-fill-lock::before{
+ content:"\f872"
+}
+.bi-building-fill-slash::before{
+ content:"\f873"
+}
+.bi-building-fill-up::before{
+ content:"\f874"
+}
+.bi-building-fill-x::before{
+ content:"\f875"
+}
+.bi-building-fill::before{
+ content:"\f876"
+}
+.bi-building-gear::before{
+ content:"\f877"
+}
+.bi-building-lock::before{
+ content:"\f878"
+}
+.bi-building-slash::before{
+ content:"\f879"
+}
+.bi-building-up::before{
+ content:"\f87a"
+}
+.bi-building-x::before{
+ content:"\f87b"
+}
+.bi-buildings-fill::before{
+ content:"\f87c"
+}
+.bi-buildings::before{
+ content:"\f87d"
+}
+.bi-bus-front-fill::before{
+ content:"\f87e"
+}
+.bi-bus-front::before{
+ content:"\f87f"
+}
+.bi-ev-front-fill::before{
+ content:"\f880"
+}
+.bi-ev-front::before{
+ content:"\f881"
+}
+.bi-globe-americas::before{
+ content:"\f882"
+}
+.bi-globe-asia-australia::before{
+ content:"\f883"
+}
+.bi-globe-central-south-asia::before{
+ content:"\f884"
+}
+.bi-globe-europe-africa::before{
+ content:"\f885"
+}
+.bi-house-add-fill::before{
+ content:"\f886"
+}
+.bi-house-add::before{
+ content:"\f887"
+}
+.bi-house-check-fill::before{
+ content:"\f888"
+}
+.bi-house-check::before{
+ content:"\f889"
+}
+.bi-house-dash-fill::before{
+ content:"\f88a"
+}
+.bi-house-dash::before{
+ content:"\f88b"
+}
+.bi-house-down-fill::before{
+ content:"\f88c"
+}
+.bi-house-down::before{
+ content:"\f88d"
+}
+.bi-house-exclamation-fill::before{
+ content:"\f88e"
+}
+.bi-house-exclamation::before{
+ content:"\f88f"
+}
+.bi-house-gear-fill::before{
+ content:"\f890"
+}
+.bi-house-gear::before{
+ content:"\f891"
+}
+.bi-house-lock-fill::before{
+ content:"\f892"
+}
+.bi-house-lock::before{
+ content:"\f893"
+}
+.bi-house-slash-fill::before{
+ content:"\f894"
+}
+.bi-house-slash::before{
+ content:"\f895"
+}
+.bi-house-up-fill::before{
+ content:"\f896"
+}
+.bi-house-up::before{
+ content:"\f897"
+}
+.bi-house-x-fill::before{
+ content:"\f898"
+}
+.bi-house-x::before{
+ content:"\f899"
+}
+.bi-person-add::before{
+ content:"\f89a"
+}
+.bi-person-down::before{
+ content:"\f89b"
+}
+.bi-person-exclamation::before{
+ content:"\f89c"
+}
+.bi-person-fill-add::before{
+ content:"\f89d"
+}
+.bi-person-fill-check::before{
+ content:"\f89e"
+}
+.bi-person-fill-dash::before{
+ content:"\f89f"
+}
+.bi-person-fill-down::before{
+ content:"\f8a0"
+}
+.bi-person-fill-exclamation::before{
+ content:"\f8a1"
+}
+.bi-person-fill-gear::before{
+ content:"\f8a2"
+}
+.bi-person-fill-lock::before{
+ content:"\f8a3"
+}
+.bi-person-fill-slash::before{
+ content:"\f8a4"
+}
+.bi-person-fill-up::before{
+ content:"\f8a5"
+}
+.bi-person-fill-x::before{
+ content:"\f8a6"
+}
+.bi-person-gear::before{
+ content:"\f8a7"
+}
+.bi-person-lock::before{
+ content:"\f8a8"
+}
+.bi-person-slash::before{
+ content:"\f8a9"
+}
+.bi-person-up::before{
+ content:"\f8aa"
+}
+.bi-scooter::before{
+ content:"\f8ab"
+}
+.bi-taxi-front-fill::before{
+ content:"\f8ac"
+}
+.bi-taxi-front::before{
+ content:"\f8ad"
+}
+.bi-amd::before{
+ content:"\f8ae"
+}
+.bi-database-add::before{
+ content:"\f8af"
+}
+.bi-database-check::before{
+ content:"\f8b0"
+}
+.bi-database-dash::before{
+ content:"\f8b1"
+}
+.bi-database-down::before{
+ content:"\f8b2"
+}
+.bi-database-exclamation::before{
+ content:"\f8b3"
+}
+.bi-database-fill-add::before{
+ content:"\f8b4"
+}
+.bi-database-fill-check::before{
+ content:"\f8b5"
+}
+.bi-database-fill-dash::before{
+ content:"\f8b6"
+}
+.bi-database-fill-down::before{
+ content:"\f8b7"
+}
+.bi-database-fill-exclamation::before{
+ content:"\f8b8"
+}
+.bi-database-fill-gear::before{
+ content:"\f8b9"
+}
+.bi-database-fill-lock::before{
+ content:"\f8ba"
+}
+.bi-database-fill-slash::before{
+ content:"\f8bb"
+}
+.bi-database-fill-up::before{
+ content:"\f8bc"
+}
+.bi-database-fill-x::before{
+ content:"\f8bd"
+}
+.bi-database-fill::before{
+ content:"\f8be"
+}
+.bi-database-gear::before{
+ content:"\f8bf"
+}
+.bi-database-lock::before{
+ content:"\f8c0"
+}
+.bi-database-slash::before{
+ content:"\f8c1"
+}
+.bi-database-up::before{
+ content:"\f8c2"
+}
+.bi-database-x::before{
+ content:"\f8c3"
+}
+.bi-database::before{
+ content:"\f8c4"
+}
+.bi-houses-fill::before{
+ content:"\f8c5"
+}
+.bi-houses::before{
+ content:"\f8c6"
+}
+.bi-nvidia::before{
+ content:"\f8c7"
+}
+.bi-person-vcard-fill::before{
+ content:"\f8c8"
+}
+.bi-person-vcard::before{
+ content:"\f8c9"
+}
+.bi-sina-weibo::before{
+ content:"\f8ca"
+}
+.bi-tencent-qq::before{
+ content:"\f8cb"
+}
+.bi-wikipedia::before{
+ content:"\f8cc"
+}
+.bi-alphabet-uppercase::before{
+ content:"\f2a5"
+}
+.bi-alphabet::before{
+ content:"\f68a"
+}
+.bi-amazon::before{
+ content:"\f68d"
+}
+.bi-arrows-collapse-vertical::before{
+ content:"\f690"
+}
+.bi-arrows-expand-vertical::before{
+ content:"\f695"
+}
+.bi-arrows-vertical::before{
+ content:"\f698"
+}
+.bi-arrows::before{
+ content:"\f6a2"
+}
+.bi-ban-fill::before{
+ content:"\f6a3"
+}
+.bi-ban::before{
+ content:"\f6b6"
+}
+.bi-bing::before{
+ content:"\f6c2"
+}
+.bi-cake::before{
+ content:"\f6e0"
+}
+.bi-cake2::before{
+ content:"\f6ed"
+}
+.bi-cookie::before{
+ content:"\f6ee"
+}
+.bi-copy::before{
+ content:"\f759"
+}
+.bi-crosshair::before{
+ content:"\f769"
+}
+.bi-crosshair2::before{
+ content:"\f794"
+}
+.bi-emoji-astonished-fill::before{
+ content:"\f795"
+}
+.bi-emoji-astonished::before{
+ content:"\f79a"
+}
+.bi-emoji-grimace-fill::before{
+ content:"\f79b"
+}
+.bi-emoji-grimace::before{
+ content:"\f7a0"
+}
+.bi-emoji-grin-fill::before{
+ content:"\f7a1"
+}
+.bi-emoji-grin::before{
+ content:"\f7a6"
+}
+.bi-emoji-surprise-fill::before{
+ content:"\f7a7"
+}
+.bi-emoji-surprise::before{
+ content:"\f7ac"
+}
+.bi-emoji-tear-fill::before{
+ content:"\f7ad"
+}
+.bi-emoji-tear::before{
+ content:"\f7b2"
+}
+.bi-envelope-arrow-down-fill::before{
+ content:"\f7b3"
+}
+.bi-envelope-arrow-down::before{
+ content:"\f7b8"
+}
+.bi-envelope-arrow-up-fill::before{
+ content:"\f7b9"
+}
+.bi-envelope-arrow-up::before{
+ content:"\f7be"
+}
+.bi-feather::before{
+ content:"\f7bf"
+}
+.bi-feather2::before{
+ content:"\f7c4"
+}
+.bi-floppy-fill::before{
+ content:"\f7c5"
+}
+.bi-floppy::before{
+ content:"\f7d8"
+}
+.bi-floppy2-fill::before{
+ content:"\f7d9"
+}
+.bi-floppy2::before{
+ content:"\f7e4"
+}
+.bi-gitlab::before{
+ content:"\f7e5"
+}
+.bi-highlighter::before{
+ content:"\f7f8"
+}
+.bi-marker-tip::before{
+ content:"\f802"
+}
+.bi-nvme-fill::before{
+ content:"\f803"
+}
+.bi-nvme::before{
+ content:"\f80c"
+}
+.bi-opencollective::before{
+ content:"\f80d"
+}
+.bi-pci-card-network::before{
+ content:"\f8cd"
+}
+.bi-pci-card-sound::before{
+ content:"\f8ce"
+}
+.bi-radar::before{
+ content:"\f8cf"
+}
+.bi-send-arrow-down-fill::before{
+ content:"\f8d0"
+}
+.bi-send-arrow-down::before{
+ content:"\f8d1"
+}
+.bi-send-arrow-up-fill::before{
+ content:"\f8d2"
+}
+.bi-send-arrow-up::before{
+ content:"\f8d3"
+}
+.bi-sim-slash-fill::before{
+ content:"\f8d4"
+}
+.bi-sim-slash::before{
+ content:"\f8d5"
+}
+.bi-sourceforge::before{
+ content:"\f8d6"
+}
+.bi-substack::before{
+ content:"\f8d7"
+}
+.bi-threads-fill::before{
+ content:"\f8d8"
+}
+.bi-threads::before{
+ content:"\f8d9"
+}
+.bi-transparency::before{
+ content:"\f8da"
+}
+.bi-twitter-x::before{
+ content:"\f8db"
+}
+.bi-type-h4::before{
+ content:"\f8dc"
+}
+.bi-type-h5::before{
+ content:"\f8dd"
+}
+.bi-type-h6::before{
+ content:"\f8de"
+}
+.bi-backpack-fill::before{
+ content:"\f8df"
+}
+.bi-backpack::before{
+ content:"\f8e0"
+}
+.bi-backpack2-fill::before{
+ content:"\f8e1"
+}
+.bi-backpack2::before{
+ content:"\f8e2"
+}
+.bi-backpack3-fill::before{
+ content:"\f8e3"
+}
+.bi-backpack3::before{
+ content:"\f8e4"
+}
+.bi-backpack4-fill::before{
+ content:"\f8e5"
+}
+.bi-backpack4::before{
+ content:"\f8e6"
+}
+.bi-brilliance::before{
+ content:"\f8e7"
+}
+.bi-cake-fill::before{
+ content:"\f8e8"
+}
+.bi-cake2-fill::before{
+ content:"\f8e9"
+}
+.bi-duffle-fill::before{
+ content:"\f8ea"
+}
+.bi-duffle::before{
+ content:"\f8eb"
+}
+.bi-exposure::before{
+ content:"\f8ec"
+}
+.bi-gender-neuter::before{
+ content:"\f8ed"
+}
+.bi-highlights::before{
+ content:"\f8ee"
+}
+.bi-luggage-fill::before{
+ content:"\f8ef"
+}
+.bi-luggage::before{
+ content:"\f8f0"
+}
+.bi-mailbox-flag::before{
+ content:"\f8f1"
+}
+.bi-mailbox2-flag::before{
+ content:"\f8f2"
+}
+.bi-noise-reduction::before{
+ content:"\f8f3"
+}
+.bi-passport-fill::before{
+ content:"\f8f4"
+}
+.bi-passport::before{
+ content:"\f8f5"
+}
+.bi-person-arms-up::before{
+ content:"\f8f6"
+}
+.bi-person-raised-hand::before{
+ content:"\f8f7"
+}
+.bi-person-standing-dress::before{
+ content:"\f8f8"
+}
+.bi-person-standing::before{
+ content:"\f8f9"
+}
+.bi-person-walking::before{
+ content:"\f8fa"
+}
+.bi-person-wheelchair::before{
+ content:"\f8fb"
+}
+.bi-shadows::before{
+ content:"\f8fc"
+}
+.bi-suitcase-fill::before{
+ content:"\f8fd"
+}
+.bi-suitcase-lg-fill::before{
+ content:"\f8fe"
+}
+.bi-suitcase-lg::before{
+ content:"\f8ff"
+}
+.bi-suitcase::before{
+ content:"\f900"
+}
+.bi-suitcase2-fill::before{
+ content:"\f901"
+}
+.bi-suitcase2::before{
+ content:"\f902"
+}
+.bi-vignette::before{
+ content:"\f903"
+}
\ No newline at end of file
diff --git a/css/bootstrap-select.css b/css/bootstrap-select.css
new file mode 100644
index 0000000..a8c461a
--- /dev/null
+++ b/css/bootstrap-select.css
@@ -0,0 +1,483 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */
+
+@-webkit-keyframes bs-notify-fadeOut {
+ 0% {
+ opacity: 0.9;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@-o-keyframes bs-notify-fadeOut {
+ 0% {
+ opacity: 0.9;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes bs-notify-fadeOut {
+ 0% {
+ opacity: 0.9;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+select.bs-select-hidden,
+.bootstrap-select > select.bs-select-hidden,
+select.selectpicker {
+ display: none !important;
+}
+.bootstrap-select {
+ width: 220px;
+ vertical-align: middle;
+}
+.bootstrap-select > .dropdown-toggle {
+ position: relative;
+ width: 100%;
+ text-align: right;
+ white-space: nowrap;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+}
+.bootstrap-select > .dropdown-toggle:after {
+ margin-top: -1px;
+}
+.bootstrap-select > .dropdown-toggle.bs-placeholder,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
+ color: #999;
+}
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active,
+.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active {
+ color: rgba(255, 255, 255, 0.5);
+}
+.bootstrap-select > select {
+ position: absolute !important;
+ bottom: 0;
+ left: 50%;
+ display: block !important;
+ width: 0.5px !important;
+ height: 100% !important;
+ padding: 0 !important;
+ opacity: 0 !important;
+ border: none;
+ z-index: 0 !important;
+}
+.bootstrap-select > select.mobile-device {
+ top: 0;
+ left: 0;
+ display: block !important;
+ width: 100% !important;
+ z-index: 2 !important;
+}
+.has-error .bootstrap-select .dropdown-toggle,
+.error .bootstrap-select .dropdown-toggle,
+.bootstrap-select.is-invalid .dropdown-toggle,
+.was-validated .bootstrap-select select:invalid + .dropdown-toggle {
+ border-color: #b94a48;
+}
+.bootstrap-select.is-valid .dropdown-toggle,
+.was-validated .bootstrap-select select:valid + .dropdown-toggle {
+ border-color: #28a745;
+}
+.bootstrap-select.fit-width {
+ width: auto !important;
+}
+.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
+ width: 220px;
+}
+.bootstrap-select > select.mobile-device:focus + .dropdown-toggle,
+.bootstrap-select .dropdown-toggle:focus {
+ outline: none !important;
+}
+.bootstrap-select.form-control {
+ margin-bottom: 0;
+ padding: 0;
+ border: none;
+ height: auto;
+}
+:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) {
+ width: 100%;
+}
+.bootstrap-select.form-control.input-group-btn {
+ float: none;
+ z-index: auto;
+}
+.form-inline .bootstrap-select,
+.form-inline .bootstrap-select.form-control:not([class*="col-"]) {
+ width: auto;
+}
+.bootstrap-select:not(.input-group-btn),
+.bootstrap-select[class*="col-"] {
+ float: none;
+ display: inline-block;
+ margin-left: 0;
+}
+.bootstrap-select.dropdown-menu-right,
+.bootstrap-select[class*="col-"].dropdown-menu-right,
+.row .bootstrap-select[class*="col-"].dropdown-menu-right {
+ float: right;
+}
+.form-inline .bootstrap-select,
+.form-horizontal .bootstrap-select,
+.form-group .bootstrap-select {
+ margin-bottom: 0;
+}
+.form-group-lg .bootstrap-select.form-control,
+.form-group-sm .bootstrap-select.form-control {
+ padding: 0;
+}
+.form-group-lg .bootstrap-select.form-control .dropdown-toggle,
+.form-group-sm .bootstrap-select.form-control .dropdown-toggle {
+ height: 100%;
+ font-size: inherit;
+ line-height: inherit;
+ border-radius: inherit;
+}
+.bootstrap-select.form-control-sm .dropdown-toggle,
+.bootstrap-select.form-control-lg .dropdown-toggle {
+ font-size: inherit;
+ line-height: inherit;
+ border-radius: inherit;
+}
+.bootstrap-select.form-control-sm .dropdown-toggle {
+ padding: 0.25rem 0.5rem;
+}
+.bootstrap-select.form-control-lg .dropdown-toggle {
+ padding: 0.5rem 1rem;
+}
+.form-inline .bootstrap-select .form-control {
+ width: 100%;
+}
+.bootstrap-select.disabled,
+.bootstrap-select > .disabled {
+ cursor: not-allowed;
+}
+.bootstrap-select.disabled:focus,
+.bootstrap-select > .disabled:focus {
+ outline: none !important;
+}
+.bootstrap-select.bs-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 0 !important;
+ padding: 0 !important;
+}
+.bootstrap-select.bs-container .dropdown-menu {
+ z-index: 1060;
+}
+.bootstrap-select .dropdown-toggle .filter-option {
+ position: static;
+ top: 0;
+ left: 0;
+ float: left;
+ height: 100%;
+ width: 100%;
+ text-align: left;
+ overflow: hidden;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+}
+.bs3.bootstrap-select .dropdown-toggle .filter-option {
+ padding-right: inherit;
+}
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option {
+ position: absolute;
+ padding-top: inherit;
+ padding-bottom: inherit;
+ padding-left: inherit;
+ float: none;
+}
+.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner {
+ padding-right: inherit;
+}
+.bootstrap-select .dropdown-toggle .filter-option-inner-inner {
+ overflow: hidden;
+}
+.bootstrap-select .dropdown-toggle .filter-expand {
+ width: 0 !important;
+ float: left;
+ opacity: 0 !important;
+ overflow: hidden;
+}
+.bootstrap-select .dropdown-toggle .caret {
+ position: absolute;
+ top: 50%;
+ right: 12px;
+ margin-top: -2px;
+ vertical-align: middle;
+}
+.bootstrap-select .dropdown-toggle .bs-select-clear-selected {
+ position: relative;
+ display: block;
+ margin-right: 5px;
+ text-align: center;
+}
+.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected {
+ padding-right: inherit;
+}
+.bootstrap-select .dropdown-toggle .bs-select-clear-selected span {
+ position: relative;
+ top: -webkit-calc(((-1em / 1.5) + 1ex) / 2);
+ top: calc(((-1em / 1.5) + 1ex) / 2);
+ pointer-events: none;
+}
+.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected span {
+ top: auto;
+}
+.bootstrap-select .dropdown-toggle.bs-placeholder .bs-select-clear-selected {
+ display: none;
+}
+.input-group .bootstrap-select.form-control .dropdown-toggle {
+ border-radius: inherit;
+}
+.bootstrap-select[class*="col-"] .dropdown-toggle {
+ width: 100%;
+}
+.bootstrap-select .dropdown-menu {
+ min-width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.bootstrap-select .dropdown-menu > .inner:focus {
+ outline: none !important;
+}
+.bootstrap-select .dropdown-menu.inner {
+ position: static;
+ float: none;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.bootstrap-select .dropdown-menu li {
+ position: relative;
+}
+.bootstrap-select .dropdown-menu li.active small {
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+.bootstrap-select .dropdown-menu li.disabled a {
+ cursor: not-allowed;
+}
+.bootstrap-select .dropdown-menu li a {
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.bootstrap-select .dropdown-menu li a.opt {
+ position: relative;
+ padding-left: 2.25em;
+}
+.bootstrap-select .dropdown-menu li a span.check-mark {
+ display: none;
+}
+.bootstrap-select .dropdown-menu li a span.text {
+ display: inline-block;
+}
+.bootstrap-select .dropdown-menu li small {
+ padding-left: 0.5em;
+}
+.bootstrap-select .dropdown-menu .notify {
+ position: absolute;
+ bottom: 5px;
+ width: 96%;
+ margin: 0 2%;
+ min-height: 26px;
+ padding: 3px 5px;
+ background: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ pointer-events: none;
+ opacity: 0.9;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.bootstrap-select .dropdown-menu .notify.fadeOut {
+ -webkit-animation: 300ms linear 750ms forwards bs-notify-fadeOut;
+ -o-animation: 300ms linear 750ms forwards bs-notify-fadeOut;
+ animation: 300ms linear 750ms forwards bs-notify-fadeOut;
+}
+.bootstrap-select .no-results {
+ padding: 3px;
+ background: #f5f5f5;
+ margin: 0 5px;
+ white-space: nowrap;
+}
+.bootstrap-select.fit-width .dropdown-toggle .filter-option {
+ position: static;
+ display: inline;
+ padding: 0;
+}
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,
+.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner {
+ display: inline;
+}
+.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before {
+ content: '\00a0';
+}
+.bootstrap-select.fit-width .dropdown-toggle .caret {
+ position: static;
+ top: auto;
+ margin-top: -1px;
+}
+.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark {
+ position: absolute;
+ display: inline-block;
+ right: 15px;
+ top: 5px;
+}
+.bootstrap-select.show-tick .dropdown-menu li a span.text {
+ margin-right: 34px;
+}
+.bootstrap-select .bs-ok-default:after {
+ content: '';
+ display: block;
+ width: 0.5em;
+ height: 1em;
+ border-style: solid;
+ border-width: 0 0.26em 0.26em 0;
+ -webkit-transform-style: preserve-3d;
+ transform-style: preserve-3d;
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle {
+ z-index: 1061;
+}
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before {
+ content: '';
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid rgba(204, 204, 204, 0.2);
+ position: absolute;
+ bottom: -4px;
+ left: 9px;
+ display: none;
+}
+.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after {
+ content: '';
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ bottom: -4px;
+ left: 10px;
+ display: none;
+}
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before {
+ bottom: auto;
+ top: -4px;
+ border-top: 7px solid rgba(204, 204, 204, 0.2);
+ border-bottom: 0;
+}
+.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after {
+ bottom: auto;
+ top: -4px;
+ border-top: 6px solid white;
+ border-bottom: 0;
+}
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before {
+ right: 12px;
+ left: auto;
+}
+.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after {
+ right: 13px;
+ left: auto;
+}
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before,
+.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after,
+.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after {
+ display: block;
+}
+.bs-searchbox,
+.bs-actionsbox,
+.bs-donebutton {
+ padding: 4px 8px;
+}
+.bs-actionsbox {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.bs-actionsbox .btn-group {
+ display: block;
+}
+.bs-actionsbox .btn-group button {
+ width: 50%;
+}
+.bs-donebutton {
+ float: left;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.bs-donebutton .btn-group {
+ display: block;
+}
+.bs-donebutton .btn-group button {
+ width: 100%;
+}
+.bs-searchbox + .bs-actionsbox {
+ padding: 0 8px 4px;
+}
+.bs-searchbox .form-control {
+ margin-bottom: 0;
+ width: 100%;
+ float: none;
+}
diff --git a/css/bootstrap-select.min.css b/css/bootstrap-select.min.css
new file mode 100644
index 0000000..64048a1
--- /dev/null
+++ b/css/bootstrap-select.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */@-webkit-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@-o-keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}@keyframes bs-notify-fadeOut{0%{opacity:.9}100%{opacity:0}}.bootstrap-select>select.bs-select-hidden,select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px;vertical-align:middle}.bootstrap-select>.dropdown-toggle{position:relative;width:100%;text-align:right;white-space:nowrap;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.bootstrap-select>.dropdown-toggle:after{margin-top:-1px}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-danger:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-dark:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-info:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-primary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-secondary:hover,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:active,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder.btn-success:hover{color:rgba(255,255,255,.5)}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none;z-index:0!important}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2!important}.bootstrap-select.is-invalid .dropdown-toggle,.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle,.was-validated .bootstrap-select select:invalid+.dropdown-toggle{border-color:#b94a48}.bootstrap-select.is-valid .dropdown-toggle,.was-validated .bootstrap-select select:valid+.dropdown-toggle{border-color:#28a745}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus,.bootstrap-select>select.mobile-device:focus+.dropdown-toggle{outline:none!important;}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none;height:auto}:not(.input-group)>.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{float:none;z-index:auto}.form-inline .bootstrap-select,.form-inline .bootstrap-select.form-control:not([class*=col-]){width:auto}.bootstrap-select:not(.input-group-btn),.bootstrap-select[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.dropdown-menu-right,.bootstrap-select[class*=col-].dropdown-menu-right,.row .bootstrap-select[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select,.form-horizontal .bootstrap-select,.form-inline .bootstrap-select{margin-bottom:0}.form-group-lg .bootstrap-select.form-control,.form-group-sm .bootstrap-select.form-control{padding:0}.form-group-lg .bootstrap-select.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-lg .dropdown-toggle,.bootstrap-select.form-control-sm .dropdown-toggle{font-size:inherit;line-height:inherit;border-radius:inherit}.bootstrap-select.form-control-sm .dropdown-toggle{padding:.25rem .5rem}.bootstrap-select.form-control-lg .dropdown-toggle{padding:.5rem 1rem}.form-inline .bootstrap-select .form-control{width:100%}.bootstrap-select.disabled,.bootstrap-select>.disabled{cursor:not-allowed}.bootstrap-select.disabled:focus,.bootstrap-select>.disabled:focus{outline:0!important}.bootstrap-select.bs-container{position:absolute;top:0;left:0;height:0!important;padding:0!important}.bootstrap-select.bs-container .dropdown-menu{z-index:1060}.bootstrap-select .dropdown-toggle .filter-option{position:static;top:0;left:0;float:left;height:100%;width:100%;text-align:left;overflow:hidden;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.bs3.bootstrap-select .dropdown-toggle .filter-option{padding-right:inherit}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option{position:absolute;padding-top:inherit;padding-bottom:inherit;padding-left:inherit;float:none}.input-group .bs3-has-addon.bootstrap-select .dropdown-toggle .filter-option .filter-option-inner{padding-right:inherit}.bootstrap-select .dropdown-toggle .filter-option-inner-inner{overflow:hidden}.bootstrap-select .dropdown-toggle .filter-expand{width:0!important;float:left;opacity:0!important;overflow:hidden}.bootstrap-select .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select .dropdown-toggle .bs-select-clear-selected{position:relative;display:block;margin-right:5px;text-align:center}.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected{padding-right:inherit}.bootstrap-select .dropdown-toggle .bs-select-clear-selected span{position:relative;top:-webkit-calc(((-1em / 1.5) + 1ex)/ 2);top:calc(((-1em / 1.5) + 1ex)/ 2);pointer-events:none}.bs3.bootstrap-select .dropdown-toggle .bs-select-clear-selected span{top:auto}.bootstrap-select .dropdown-toggle.bs-placeholder .bs-select-clear-selected{display:none}.input-group .bootstrap-select.form-control .dropdown-toggle{border-radius:inherit}.bootstrap-select[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu>.inner:focus{outline:0!important}.bootstrap-select .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select .dropdown-menu li{position:relative}.bootstrap-select .dropdown-menu li.active small{color:rgba(255,255,255,.5)!important}.bootstrap-select .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select .dropdown-menu li a span.check-mark{display:none}.bootstrap-select .dropdown-menu li a span.text{display:inline-block}.bootstrap-select .dropdown-menu li small{padding-left:.5em}.bootstrap-select .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select .dropdown-menu .notify.fadeOut{-webkit-animation:.3s linear 750ms forwards bs-notify-fadeOut;-o-animation:.3s linear 750ms forwards bs-notify-fadeOut;animation:.3s linear 750ms forwards bs-notify-fadeOut}.bootstrap-select .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.fit-width .dropdown-toggle .filter-option{position:static;display:inline;padding:0}.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner{display:inline}.bootstrap-select.fit-width .dropdown-toggle .bs-caret:before{content:'\00a0'}.bootstrap-select.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark{position:absolute;display:inline-block;right:15px;top:5px}.bootstrap-select.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select .bs-ok-default:after{content:'';display:block;width:.5em;height:1em;border-style:solid;border-width:0 .26em .26em 0;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before{bottom:auto;top:-4px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after{bottom:auto;top:-4px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle .filter-option:before,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:after,.bootstrap-select.show-menu-arrow.show>.dropdown-toggle .filter-option:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group{display:block}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group{display:block}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none}
diff --git a/css/ck-content.css b/css/ck-content.css
new file mode 100644
index 0000000..db60de8
--- /dev/null
+++ b/css/ck-content.css
@@ -0,0 +1,333 @@
+/*
+ * CKEditor 5 (v24.0.0) content styles.
+ * Generated on Thu, 10 Dec 2020 08:15:26 GMT.
+ * For more information, check out https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/content-styles.html
+ */
+
+:root {
+ --ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
+ --ck-color-mention-text: hsl(341, 100%, 30%);
+ --ck-highlight-marker-blue: hsl(201, 97%, 72%);
+ --ck-highlight-marker-green: hsl(120, 93%, 68%);
+ --ck-highlight-marker-pink: hsl(345, 96%, 73%);
+ --ck-highlight-marker-yellow: hsl(60, 97%, 73%);
+ --ck-highlight-pen-green: hsl(112, 100%, 27%);
+ --ck-highlight-pen-red: hsl(0, 85%, 49%);
+ --ck-image-style-spacing: 1.5em;
+ --ck-todo-list-checkmark-size: 16px;
+}
+
+/* ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized {
+ max-width: 100%;
+ display: block;
+ box-sizing: border-box;
+}
+/* ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized img {
+ width: 100%;
+}
+/* ckeditor5-image/theme/imageresize.css */
+.ck-content .image.image_resized > figcaption {
+ display: block;
+}
+/* ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-side {
+ float: right;
+ margin-left: var(--ck-image-style-spacing);
+ max-width: 50%;
+}
+/* ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-left {
+ float: left;
+ margin-right: var(--ck-image-style-spacing);
+}
+/* ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* ckeditor5-image/theme/imagestyle.css */
+.ck-content .image-style-align-right {
+ float: right;
+ margin-left: var(--ck-image-style-spacing);
+}
+/* ckeditor5-image/theme/image.css */
+.ck-content .image {
+ display: table;
+ clear: both;
+ text-align: center;
+ margin: 1em auto;
+}
+/* ckeditor5-image/theme/image.css */
+.ck-content .image img {
+ display: block;
+ margin: 0 auto;
+ max-width: 100%;
+ min-width: 50px;
+}
+/* ckeditor5-image/theme/imagecaption.css */
+.ck-content .image > figcaption {
+ display: table-caption;
+ caption-side: bottom;
+ word-break: break-word;
+ color: hsl(0, 0%, 20%);
+ background-color: hsl(0, 0%, 97%);
+ padding: .6em;
+ font-size: .75em;
+ outline-offset: -1px;
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-yellow {
+ background-color: var(--ck-highlight-marker-yellow);
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-green {
+ background-color: var(--ck-highlight-marker-green);
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-pink {
+ background-color: var(--ck-highlight-marker-pink);
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .marker-blue {
+ background-color: var(--ck-highlight-marker-blue);
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .pen-red {
+ color: var(--ck-highlight-pen-red);
+ background-color: transparent;
+}
+/* ckeditor5-highlight/theme/highlight.css */
+.ck-content .pen-green {
+ color: var(--ck-highlight-pen-green);
+ background-color: transparent;
+}
+/* ckeditor5-font/theme/fontsize.css */
+.ck-content .text-tiny {
+ font-size: .7em;
+}
+/* ckeditor5-font/theme/fontsize.css */
+.ck-content .text-small {
+ font-size: .85em;
+}
+/* ckeditor5-font/theme/fontsize.css */
+.ck-content .text-big {
+ font-size: 1.4em;
+}
+/* ckeditor5-font/theme/fontsize.css */
+.ck-content .text-huge {
+ font-size: 1.8em;
+}
+/* ckeditor5-block-quote/theme/blockquote.css */
+.ck-content blockquote {
+ overflow: hidden;
+ padding-right: 1.5em;
+ padding-left: 1.5em;
+ margin-left: 0;
+ margin-right: 0;
+ font-style: italic;
+ border-left: solid 5px hsl(0, 0%, 80%);
+}
+/* ckeditor5-block-quote/theme/blockquote.css */
+.ck-content[dir="rtl"] blockquote {
+ border-left: 0;
+ border-right: solid 5px hsl(0, 0%, 80%);
+}
+/* ckeditor5-basic-styles/theme/code.css */
+.ck-content code {
+ background-color: hsla(0, 0%, 78%, 0.3);
+ padding: .15em;
+ border-radius: 2px;
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content .table {
+ margin: 1em auto;
+ display: table;
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content .table table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ height: 100%;
+ border: 1px double hsl(0, 0%, 70%);
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content .table table td,
+.ck-content .table table th {
+ min-width: 2em;
+ padding: .4em;
+ border: 1px solid hsl(0, 0%, 75%);
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content .table table th {
+ font-weight: bold;
+ background: hsla(0, 0%, 0%, 5%);
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content[dir="rtl"] .table th {
+ text-align: right;
+}
+/* ckeditor5-table/theme/table.css */
+.ck-content[dir="ltr"] .table th {
+ text-align: left;
+}
+/* ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break {
+ position: relative;
+ clear: both;
+ padding: 5px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+/* ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break::after {
+ content: '';
+ position: absolute;
+ border-bottom: 2px dashed hsl(0, 0%, 77%);
+ width: 100%;
+}
+/* ckeditor5-page-break/theme/pagebreak.css */
+.ck-content .page-break__label {
+ position: relative;
+ z-index: 1;
+ padding: .3em .6em;
+ display: block;
+ text-transform: uppercase;
+ border: 1px solid hsl(0, 0%, 77%);
+ border-radius: 2px;
+ font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
+ font-size: 0.75em;
+ font-weight: bold;
+ color: hsl(0, 0%, 20%);
+ background: hsl(0, 0%, 100%);
+ box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+/* ckeditor5-media-embed/theme/mediaembed.css */
+.ck-content .media {
+ clear: both;
+ margin: 1em 0;
+ display: block;
+ min-width: 15em;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list {
+ list-style: none;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list li {
+ margin-bottom: 5px;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list li .todo-list {
+ margin-top: 5px;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input {
+ -webkit-appearance: none;
+ display: inline-block;
+ position: relative;
+ width: var(--ck-todo-list-checkmark-size);
+ height: var(--ck-todo-list-checkmark-size);
+ vertical-align: middle;
+ border: 0;
+ left: -25px;
+ margin-right: -15px;
+ right: 0;
+ margin-left: 0;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input::before {
+ display: block;
+ position: absolute;
+ box-sizing: border-box;
+ content: '';
+ width: 100%;
+ height: 100%;
+ border: 1px solid hsl(0, 0%, 20%);
+ border-radius: 2px;
+ transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input::after {
+ display: block;
+ position: absolute;
+ box-sizing: content-box;
+ pointer-events: none;
+ content: '';
+ left: calc( var(--ck-todo-list-checkmark-size) / 3 );
+ top: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ width: calc( var(--ck-todo-list-checkmark-size) / 5.3 );
+ height: calc( var(--ck-todo-list-checkmark-size) / 2.6 );
+ border-style: solid;
+ border-color: transparent;
+ border-width: 0 calc( var(--ck-todo-list-checkmark-size) / 8 ) calc( var(--ck-todo-list-checkmark-size) / 8 ) 0;
+ transform: rotate(45deg);
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input[checked]::before {
+ background: hsl(126, 64%, 41%);
+ border-color: hsl(126, 64%, 41%);
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label > input[checked]::after {
+ border-color: hsl(0, 0%, 100%);
+}
+/* ckeditor5-list/theme/todolist.css */
+.ck-content .todo-list .todo-list__label .todo-list__label__description {
+ vertical-align: middle;
+}
+/* ckeditor5-html-embed/theme/htmlembed.css */
+.ck-content .raw-html-embed {
+ margin: 1em auto;
+ min-width: 15em;
+ font-style: normal;
+}
+/* ckeditor5-horizontal-line/theme/horizontalline.css */
+.ck-content hr {
+ margin: 15px 0;
+ height: 4px;
+ background: hsl(0, 0%, 87%);
+ border: 0;
+}
+/* ckeditor5-code-block/theme/codeblock.css */
+.ck-content pre {
+ padding: 1em;
+ color: hsl(0, 0%, 20.8%);
+ background: hsla(0, 0%, 78%, 0.3);
+ border: 1px solid hsl(0, 0%, 77%);
+ border-radius: 2px;
+ text-align: left;
+ direction: ltr;
+ tab-size: 4;
+ white-space: pre-wrap;
+ font-style: normal;
+ min-width: 200px;
+}
+/* ckeditor5-code-block/theme/codeblock.css */
+.ck-content pre code {
+ background: unset;
+ padding: 0;
+ border-radius: 0;
+}
+/* ckeditor5-mention/theme/mention.css */
+.ck-content .mention {
+ background: var(--ck-color-mention-background);
+ color: var(--ck-color-mention-text);
+}
+@media print {
+ /* ckeditor5-page-break/theme/pagebreak.css */
+ .ck-content .page-break {
+ padding: 0;
+ }
+ /* ckeditor5-page-break/theme/pagebreak.css */
+ .ck-content .page-break::after {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/css/dropzone.min.css b/css/dropzone.min.css
new file mode 100644
index 0000000..1ea9f14
--- /dev/null
+++ b/css/dropzone.min.css
@@ -0,0 +1 @@
+@keyframes passing-through{0%{opacity:0;transform:translateY(40px)}30%,70%{opacity:1;transform:translateY(0px)}100%{opacity:0;transform:translateY(-40px)}}@keyframes slide-in{0%{opacity:0;transform:translateY(40px)}30%{opacity:1;transform:translateY(0px)}}@keyframes pulse{0%{transform:scale(1)}10%{transform:scale(1.1)}20%{transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:1px solid rgba(0,0,0,.8);border-radius:5px;padding:20px 20px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center;margin:2em 0}.dropzone .dz-message .dz-button{background:none;color:inherit;border:none;padding:0;font:inherit;cursor:pointer;outline:inherit}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{transition:opacity .2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid transparent}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{transform:scale(1.05, 1.05);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px;background:rgba(0,0,0,.8);border-radius:50%}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px;fill:#fff}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;transition:all .2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;transition:opacity .4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:20px;top:50%;margin-top:-10px;left:15%;right:15%;border:3px solid rgba(0,0,0,.8);background:rgba(0,0,0,.8);border-radius:10px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#fff;display:block;position:relative;height:100%;width:0;transition:width 300ms ease-in-out;border-radius:17px}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;transition:opacity .3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#b10606;padding:.5em 1em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #b10606}
\ No newline at end of file
diff --git a/css/fonts/bootstrap-icons.woff b/css/fonts/bootstrap-icons.woff
new file mode 100644
index 0000000..dbeeb05
Binary files /dev/null and b/css/fonts/bootstrap-icons.woff differ
diff --git a/css/fonts/bootstrap-icons.woff2 b/css/fonts/bootstrap-icons.woff2
new file mode 100644
index 0000000..87032d1
Binary files /dev/null and b/css/fonts/bootstrap-icons.woff2 differ
diff --git a/css/searchPermitsBySubdivision.css b/css/searchPermitsBySubdivision.css
new file mode 100644
index 0000000..a40cae4
--- /dev/null
+++ b/css/searchPermitsBySubdivision.css
@@ -0,0 +1,14 @@
+
+
+.searchPermitsBySubdivision .bootstrap-autocomplete .dropdown-menu {
+ max-height: 150px;
+ overflow-y: auto;
+ overflow-x: hidden;
+
+}
+
+.searchPermitsBySubdivision .bootstrap-autocomplete a.dropdown-item {
+ font-size: .875rem;
+ padding: 0 .75rem;
+ cursor: pointer;
+}
diff --git a/css/signIn.css b/css/signIn.css
new file mode 100644
index 0000000..5974d4f
--- /dev/null
+++ b/css/signIn.css
@@ -0,0 +1,41 @@
+
+body {
+ padding-top: 40px;
+ padding-bottom: 40px;
+}
+
+.card-header {
+ margin-bottom: 0px;
+ line-height: 1;
+}
+
+.card {
+ max-width: 400px;
+ margin: 0px auto;
+ box-shadow: 5px 5px 10px 0px #888888;
+}
+
+#signIn {
+ padding: 20px;
+ padding-bottom: -150px;
+
+}
+
+#signIn .form-group {
+ margin-bottom: 10px;
+}
+
+#signIn .alert-danger {
+ font-size: 14px;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ padding-left: .5rem;
+}
+
+.btn-primary {
+ background-image: none;
+}
+
+.btn-primary:not(.disabled):hover {
+ background-image: none;
+}
\ No newline at end of file
diff --git a/css/themes/Spacelab/bootstrap.css b/css/themes/Spacelab/bootstrap.css
new file mode 100644
index 0000000..03ec938
--- /dev/null
+++ b/css/themes/Spacelab/bootstrap.css
@@ -0,0 +1,12386 @@
+@charset "UTF-8";
+/*!
+ * Bootswatch v5.3.3 (https://bootswatch.com)
+ * Theme: spacelab
+ * Copyright 2012-2024 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*/
+/*!
+ * Bootstrap v5.3.3 (https://getbootstrap.com/)
+ * Copyright 2011-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */
+
+/* lato-100 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 100;
+ src: url('../fonts/lato-v17-latin-100.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-100.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-100.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-100.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-100.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-100.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-100italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 100;
+ src: url('../fonts/lato-v17-latin-100italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-100italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-100italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-100italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-100italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-100italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-300 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 300;
+ src: url('../fonts/lato-v17-latin-300.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-300.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-300.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-300.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-300italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 300;
+ src: url('../fonts/lato-v17-latin-300italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-300italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-300italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-300italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-300italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-regular - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/lato-v17-latin-regular.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-regular.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/lato-v17-latin-italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-700 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/lato-v17-latin-700.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-700.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-700.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-700italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/lato-v17-latin-700italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-700italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-700italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-900 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 900;
+ src: url('../fonts/lato-v17-latin-900.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-900.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-900.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-900.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-900.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-900.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-900italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 900;
+ src: url('../fonts/lato-v17-latin-900italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-900italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-900italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-900italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-900italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-900italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+
+:root,
+[data-bs-theme=light] {
+ --bs-blue: #446e9b;
+ --bs-indigo: #6610f2;
+ --bs-purple: #6f42c1;
+ --bs-pink: #e83e8c;
+ --bs-red: #cd0200;
+ --bs-orange: #fd7e14;
+ --bs-yellow: #d47500;
+ --bs-green: #3cb521;
+ --bs-teal: #20c997;
+ --bs-cyan: #3399f3;
+ --bs-black: #000;
+ --bs-white: #fff;
+ --bs-gray: #777;
+ --bs-gray-dark: #333;
+ --bs-gray-100: #f8f9fa;
+ --bs-gray-200: #eee;
+ --bs-gray-300: #dee2e6;
+ --bs-gray-400: #ced4da;
+ --bs-gray-500: #999;
+ --bs-gray-600: #777;
+ --bs-gray-700: #495057;
+ --bs-gray-800: #333;
+ --bs-gray-900: #2d2d2d;
+ --bs-primary: #446e9b;
+ --bs-secondary: #999;
+ --bs-success: #3cb521;
+ --bs-info: #3399f3;
+ --bs-warning: #d47500;
+ --bs-danger: #cd0200;
+ --bs-light: #eee;
+ --bs-dark: #333;
+ --bs-primary-rgb: 68, 110, 155;
+ --bs-secondary-rgb: 153, 153, 153;
+ --bs-success-rgb: 60, 181, 33;
+ --bs-info-rgb: 51, 153, 243;
+ --bs-warning-rgb: 212, 117, 0;
+ --bs-danger-rgb: 205, 2, 0;
+ --bs-light-rgb: 238, 238, 238;
+ --bs-dark-rgb: 51, 51, 51;
+ --bs-primary-text-emphasis: #1b2c3e;
+ --bs-secondary-text-emphasis: #3d3d3d;
+ --bs-success-text-emphasis: #18480d;
+ --bs-info-text-emphasis: #143d61;
+ --bs-warning-text-emphasis: #552f00;
+ --bs-danger-text-emphasis: #520100;
+ --bs-light-text-emphasis: #495057;
+ --bs-dark-text-emphasis: #495057;
+ --bs-primary-bg-subtle: #dae2eb;
+ --bs-secondary-bg-subtle: #ebebeb;
+ --bs-success-bg-subtle: #d8f0d3;
+ --bs-info-bg-subtle: #d6ebfd;
+ --bs-warning-bg-subtle: #f6e3cc;
+ --bs-danger-bg-subtle: #f5cccc;
+ --bs-light-bg-subtle: #fcfcfd;
+ --bs-dark-bg-subtle: #ced4da;
+ --bs-primary-border-subtle: #b4c5d7;
+ --bs-secondary-border-subtle: #d6d6d6;
+ --bs-success-border-subtle: #b1e1a6;
+ --bs-info-border-subtle: #add6fa;
+ --bs-warning-border-subtle: #eec899;
+ --bs-danger-border-subtle: #eb9a99;
+ --bs-light-border-subtle: #eee;
+ --bs-dark-border-subtle: #999;
+ --bs-white-rgb: 255, 255, 255;
+ --bs-black-rgb: 0, 0, 0;
+ --bs-font-sans-serif: Lato, "Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+ --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ --bs-body-font-family: var(--bs-font-sans-serif);
+ --bs-body-font-size: 1rem;
+ --bs-body-font-weight: 400;
+ --bs-body-line-height: 1.5;
+ --bs-body-color: #777;
+ --bs-body-color-rgb: 119, 119, 119;
+ --bs-body-bg: #fff;
+ --bs-body-bg-rgb: 255, 255, 255;
+ --bs-emphasis-color: #000;
+ --bs-emphasis-color-rgb: 0, 0, 0;
+ --bs-secondary-color: rgba(119, 119, 119, 0.75);
+ --bs-secondary-color-rgb: 119, 119, 119;
+ --bs-secondary-bg: #eee;
+ --bs-secondary-bg-rgb: 238, 238, 238;
+ --bs-tertiary-color: rgba(119, 119, 119, 0.5);
+ --bs-tertiary-color-rgb: 119, 119, 119;
+ --bs-tertiary-bg: #f8f9fa;
+ --bs-tertiary-bg-rgb: 248, 249, 250;
+ --bs-heading-color: #2d2d2d;
+ --bs-link-color: #3399f3;
+ --bs-link-color-rgb: 51, 153, 243;
+ --bs-link-decoration: underline;
+ --bs-link-hover-color: #297ac2;
+ --bs-link-hover-color-rgb: 41, 122, 194;
+ --bs-code-color: #e83e8c;
+ --bs-highlight-color: #777;
+ --bs-highlight-bg: #f6e3cc;
+ --bs-border-width: 1px;
+ --bs-border-style: solid;
+ --bs-border-color: #dee2e6;
+ --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
+ --bs-border-radius: 0.375rem;
+ --bs-border-radius-sm: 0.25rem;
+ --bs-border-radius-lg: 0.5rem;
+ --bs-border-radius-xl: 1rem;
+ --bs-border-radius-xxl: 2rem;
+ --bs-border-radius-2xl: var(--bs-border-radius-xxl);
+ --bs-border-radius-pill: 50rem;
+ --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
+ --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
+ --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
+ --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
+ --bs-focus-ring-width: 0.25rem;
+ --bs-focus-ring-opacity: 0.25;
+ --bs-focus-ring-color: rgba(68, 110, 155, 0.25);
+ --bs-form-valid-color: #3cb521;
+ --bs-form-valid-border-color: #3cb521;
+ --bs-form-invalid-color: #cd0200;
+ --bs-form-invalid-border-color: #cd0200;
+}
+
+[data-bs-theme=dark] {
+ color-scheme: dark;
+ --bs-body-color: #dee2e6;
+ --bs-body-color-rgb: 222, 226, 230;
+ --bs-body-bg: #2d2d2d;
+ --bs-body-bg-rgb: 45, 45, 45;
+ --bs-emphasis-color: #fff;
+ --bs-emphasis-color-rgb: 255, 255, 255;
+ --bs-secondary-color: rgba(222, 226, 230, 0.75);
+ --bs-secondary-color-rgb: 222, 226, 230;
+ --bs-secondary-bg: #333;
+ --bs-secondary-bg-rgb: 51, 51, 51;
+ --bs-tertiary-color: rgba(222, 226, 230, 0.5);
+ --bs-tertiary-color-rgb: 222, 226, 230;
+ --bs-tertiary-bg: #303030;
+ --bs-tertiary-bg-rgb: 48, 48, 48;
+ --bs-primary-text-emphasis: #8fa8c3;
+ --bs-secondary-text-emphasis: #c2c2c2;
+ --bs-success-text-emphasis: #8ad37a;
+ --bs-info-text-emphasis: #85c2f8;
+ --bs-warning-text-emphasis: #e5ac66;
+ --bs-danger-text-emphasis: #e16766;
+ --bs-light-text-emphasis: #f8f9fa;
+ --bs-dark-text-emphasis: #dee2e6;
+ --bs-primary-bg-subtle: #0e161f;
+ --bs-secondary-bg-subtle: #1f1f1f;
+ --bs-success-bg-subtle: #0c2407;
+ --bs-info-bg-subtle: #0a1f31;
+ --bs-warning-bg-subtle: #2a1700;
+ --bs-danger-bg-subtle: #290000;
+ --bs-light-bg-subtle: #333;
+ --bs-dark-bg-subtle: #1a1a1a;
+ --bs-primary-border-subtle: #29425d;
+ --bs-secondary-border-subtle: #5c5c5c;
+ --bs-success-border-subtle: #246d14;
+ --bs-info-border-subtle: #1f5c92;
+ --bs-warning-border-subtle: #7f4600;
+ --bs-danger-border-subtle: #7b0100;
+ --bs-light-border-subtle: #495057;
+ --bs-dark-border-subtle: #333;
+ --bs-heading-color: inherit;
+ --bs-link-color: #8fa8c3;
+ --bs-link-hover-color: #a5b9cf;
+ --bs-link-color-rgb: 143, 168, 195;
+ --bs-link-hover-color-rgb: 165, 185, 207;
+ --bs-code-color: #f18bba;
+ --bs-highlight-color: #dee2e6;
+ --bs-highlight-bg: #552f00;
+ --bs-border-color: #495057;
+ --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
+ --bs-form-valid-color: #8ad37a;
+ --bs-form-valid-border-color: #8ad37a;
+ --bs-form-invalid-color: #e16766;
+ --bs-form-invalid-border-color: #e16766;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ :root {
+ scroll-behavior: smooth;
+ }
+}
+
+body {
+ margin: 0;
+ font-family: var(--bs-body-font-family);
+ font-size: var(--bs-body-font-size);
+ font-weight: var(--bs-body-font-weight);
+ line-height: var(--bs-body-line-height);
+ color: var(--bs-body-color);
+ text-align: var(--bs-body-text-align);
+ background-color: var(--bs-body-bg);
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+hr {
+ margin: 1rem 0;
+ color: inherit;
+ border: 0;
+ border-top: var(--bs-border-width) solid;
+ opacity: 0.25;
+}
+
+h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {
+ margin-top: 0;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+ line-height: 1.2;
+ color: var(--bs-heading-color);
+}
+
+h1, .h1 {
+ font-size: calc(1.375rem + 1.5vw);
+}
+@media (min-width: 1200px) {
+ h1, .h1 {
+ font-size: 2.5rem;
+ }
+}
+
+h2, .h2 {
+ font-size: calc(1.325rem + 0.9vw);
+}
+@media (min-width: 1200px) {
+ h2, .h2 {
+ font-size: 2rem;
+ }
+}
+
+h3, .h3 {
+ font-size: calc(1.3rem + 0.6vw);
+}
+@media (min-width: 1200px) {
+ h3, .h3 {
+ font-size: 1.75rem;
+ }
+}
+
+h4, .h4 {
+ font-size: calc(1.275rem + 0.3vw);
+}
+@media (min-width: 1200px) {
+ h4, .h4 {
+ font-size: 1.5rem;
+ }
+}
+
+h5, .h5 {
+ font-size: 1.25rem;
+}
+
+h6, .h6 {
+ font-size: 1rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title] {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ -webkit-text-decoration-skip-ink: none;
+ text-decoration-skip-ink: none;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul {
+ padding-left: 2rem;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: 700;
+}
+
+dd {
+ margin-bottom: 0.5rem;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small, .small {
+ font-size: 0.875em;
+}
+
+mark, .mark {
+ padding: 0.1875em;
+ color: var(--bs-highlight-color);
+ background-color: var(--bs-highlight-bg);
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 0.75em;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+a {
+ color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
+ text-decoration: underline;
+}
+a:hover {
+ --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
+}
+
+a:not([href]):not([class]), a:not([href]):not([class]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: var(--bs-font-monospace);
+ font-size: 1em;
+}
+
+pre {
+ display: block;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+ font-size: 0.875em;
+}
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal;
+}
+
+code {
+ font-size: 0.875em;
+ color: var(--bs-code-color);
+ word-wrap: break-word;
+}
+a > code {
+ color: inherit;
+}
+
+kbd {
+ padding: 0.1875rem 0.375rem;
+ font-size: 0.875em;
+ color: var(--bs-body-bg);
+ background-color: var(--bs-body-color);
+ border-radius: 0.25rem;
+}
+kbd kbd {
+ padding: 0;
+ font-size: 1em;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img,
+svg {
+ vertical-align: middle;
+}
+
+table {
+ caption-side: bottom;
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-secondary-color);
+ text-align: left;
+}
+
+th {
+ text-align: inherit;
+ text-align: -webkit-match-parent;
+}
+
+thead,
+tbody,
+tfoot,
+tr,
+td,
+th {
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+}
+
+label {
+ display: inline-block;
+}
+
+button {
+ border-radius: 0;
+}
+
+button:focus:not(:focus-visible) {
+ outline: 0;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+[role=button] {
+ cursor: pointer;
+}
+
+select {
+ word-wrap: normal;
+}
+select:disabled {
+ opacity: 1;
+}
+
+[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
+ display: none !important;
+}
+
+button,
+[type=button],
+[type=reset],
+[type=submit] {
+ -webkit-appearance: button;
+}
+button:not(:disabled),
+[type=button]:not(:disabled),
+[type=reset]:not(:disabled),
+[type=submit]:not(:disabled) {
+ cursor: pointer;
+}
+
+::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+textarea {
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ float: left;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 0.5rem;
+ font-size: calc(1.275rem + 0.3vw);
+ line-height: inherit;
+}
+@media (min-width: 1200px) {
+ legend {
+ font-size: 1.5rem;
+ }
+}
+legend + * {
+ clear: left;
+}
+
+::-webkit-datetime-edit-fields-wrapper,
+::-webkit-datetime-edit-text,
+::-webkit-datetime-edit-minute,
+::-webkit-datetime-edit-hour-field,
+::-webkit-datetime-edit-day-field,
+::-webkit-datetime-edit-month-field,
+::-webkit-datetime-edit-year-field {
+ padding: 0;
+}
+
+::-webkit-inner-spin-button {
+ height: auto;
+}
+
+[type=search] {
+ -webkit-appearance: textfield;
+ outline-offset: -2px;
+}
+
+/* rtl:raw:
+[type="tel"],
+[type="url"],
+[type="email"],
+[type="number"] {
+ direction: ltr;
+}
+*/
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-color-swatch-wrapper {
+ padding: 0;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+::file-selector-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+iframe {
+ border: 0;
+}
+
+summary {
+ display: list-item;
+ cursor: pointer;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[hidden] {
+ display: none !important;
+}
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
+}
+
+.display-1 {
+ font-size: calc(1.625rem + 4.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-1 {
+ font-size: 5rem;
+ }
+}
+
+.display-2 {
+ font-size: calc(1.575rem + 3.9vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-2 {
+ font-size: 4.5rem;
+ }
+}
+
+.display-3 {
+ font-size: calc(1.525rem + 3.3vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-3 {
+ font-size: 4rem;
+ }
+}
+
+.display-4 {
+ font-size: calc(1.475rem + 2.7vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-4 {
+ font-size: 3.5rem;
+ }
+}
+
+.display-5 {
+ font-size: calc(1.425rem + 2.1vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-5 {
+ font-size: 3rem;
+ }
+}
+
+.display-6 {
+ font-size: calc(1.375rem + 1.5vw);
+ font-weight: 300;
+ line-height: 1.2;
+}
+@media (min-width: 1200px) {
+ .display-6 {
+ font-size: 2.5rem;
+ }
+}
+
+.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: 0.5rem;
+}
+
+.initialism {
+ font-size: 0.875em;
+ text-transform: uppercase;
+}
+
+.blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+}
+.blockquote > :last-child {
+ margin-bottom: 0;
+}
+
+.blockquote-footer {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+ font-size: 0.875em;
+ color: #777;
+}
+.blockquote-footer::before {
+ content: "— ";
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.img-thumbnail {
+ padding: 0.25rem;
+ background-color: var(--bs-body-bg);
+ border: var(--bs-border-width) solid var(--bs-border-color);
+ border-radius: var(--bs-border-radius);
+ max-width: 100%;
+ height: auto;
+}
+
+.figure {
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.figure-caption {
+ font-size: 0.875em;
+ color: var(--bs-secondary-color);
+}
+
+.container,
+.container-fluid,
+.container-xxl,
+.container-xl,
+.container-lg,
+.container-md,
+.container-sm {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-right: auto;
+ margin-left: auto;
+}
+
+@media (min-width: 576px) {
+ .container-sm, .container {
+ max-width: 540px;
+ }
+}
+@media (min-width: 768px) {
+ .container-md, .container-sm, .container {
+ max-width: 720px;
+ }
+}
+@media (min-width: 992px) {
+ .container-lg, .container-md, .container-sm, .container {
+ max-width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container-xl, .container-lg, .container-md, .container-sm, .container {
+ max-width: 1140px;
+ }
+}
+@media (min-width: 1400px) {
+ .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {
+ max-width: 1320px;
+ }
+}
+:root {
+ --bs-breakpoint-xs: 0;
+ --bs-breakpoint-sm: 576px;
+ --bs-breakpoint-md: 768px;
+ --bs-breakpoint-lg: 992px;
+ --bs-breakpoint-xl: 1200px;
+ --bs-breakpoint-xxl: 1400px;
+}
+
+.row {
+ --bs-gutter-x: 1.5rem;
+ --bs-gutter-y: 0;
+ display: flex;
+ flex-wrap: wrap;
+ margin-top: calc(-1 * var(--bs-gutter-y));
+ margin-right: calc(-0.5 * var(--bs-gutter-x));
+ margin-left: calc(-0.5 * var(--bs-gutter-x));
+}
+.row > * {
+ flex-shrink: 0;
+ width: 100%;
+ max-width: 100%;
+ padding-right: calc(var(--bs-gutter-x) * 0.5);
+ padding-left: calc(var(--bs-gutter-x) * 0.5);
+ margin-top: var(--bs-gutter-y);
+}
+
+.col {
+ flex: 1 0 0%;
+}
+
+.row-cols-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.row-cols-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.row-cols-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.row-cols-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.row-cols-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.row-cols-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+}
+
+.row-cols-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.col-auto {
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.col-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+}
+
+.col-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+}
+
+.col-3 {
+ flex: 0 0 auto;
+ width: 25%;
+}
+
+.col-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+}
+
+.col-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+}
+
+.col-6 {
+ flex: 0 0 auto;
+ width: 50%;
+}
+
+.col-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+}
+
+.col-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+}
+
+.col-9 {
+ flex: 0 0 auto;
+ width: 75%;
+}
+
+.col-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+}
+
+.col-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+}
+
+.col-12 {
+ flex: 0 0 auto;
+ width: 100%;
+}
+
+.offset-1 {
+ margin-left: 8.33333333%;
+}
+
+.offset-2 {
+ margin-left: 16.66666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.33333333%;
+}
+
+.offset-5 {
+ margin-left: 41.66666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.33333333%;
+}
+
+.offset-8 {
+ margin-left: 66.66666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.33333333%;
+}
+
+.offset-11 {
+ margin-left: 91.66666667%;
+}
+
+.g-0,
+.gx-0 {
+ --bs-gutter-x: 0;
+}
+
+.g-0,
+.gy-0 {
+ --bs-gutter-y: 0;
+}
+
+.g-1,
+.gx-1 {
+ --bs-gutter-x: 0.25rem;
+}
+
+.g-1,
+.gy-1 {
+ --bs-gutter-y: 0.25rem;
+}
+
+.g-2,
+.gx-2 {
+ --bs-gutter-x: 0.5rem;
+}
+
+.g-2,
+.gy-2 {
+ --bs-gutter-y: 0.5rem;
+}
+
+.g-3,
+.gx-3 {
+ --bs-gutter-x: 1rem;
+}
+
+.g-3,
+.gy-3 {
+ --bs-gutter-y: 1rem;
+}
+
+.g-4,
+.gx-4 {
+ --bs-gutter-x: 1.5rem;
+}
+
+.g-4,
+.gy-4 {
+ --bs-gutter-y: 1.5rem;
+}
+
+.g-5,
+.gx-5 {
+ --bs-gutter-x: 3rem;
+}
+
+.g-5,
+.gy-5 {
+ --bs-gutter-y: 3rem;
+}
+
+@media (min-width: 576px) {
+ .col-sm {
+ flex: 1 0 0%;
+ }
+ .row-cols-sm-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-sm-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-sm-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-sm-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-sm-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-sm-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-sm-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-sm-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-sm-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-sm-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-sm-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-sm-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-sm-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-sm-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-sm-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-sm-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-sm-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-sm-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-sm-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-sm-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-sm-0 {
+ margin-left: 0;
+ }
+ .offset-sm-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-sm-0,
+ .gx-sm-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-sm-0,
+ .gy-sm-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-sm-1,
+ .gx-sm-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-sm-1,
+ .gy-sm-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-sm-2,
+ .gx-sm-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-sm-2,
+ .gy-sm-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-sm-3,
+ .gx-sm-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-sm-3,
+ .gy-sm-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-sm-4,
+ .gx-sm-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-sm-4,
+ .gy-sm-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-sm-5,
+ .gx-sm-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-sm-5,
+ .gy-sm-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 768px) {
+ .col-md {
+ flex: 1 0 0%;
+ }
+ .row-cols-md-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-md-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-md-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-md-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-md-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-md-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-md-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-md-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-md-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-md-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-md-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-md-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-md-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-md-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-md-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-md-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-md-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-md-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-md-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-md-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-md-0 {
+ margin-left: 0;
+ }
+ .offset-md-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-md-0,
+ .gx-md-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-md-0,
+ .gy-md-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-md-1,
+ .gx-md-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-md-1,
+ .gy-md-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-md-2,
+ .gx-md-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-md-2,
+ .gy-md-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-md-3,
+ .gx-md-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-md-3,
+ .gy-md-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-md-4,
+ .gx-md-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-md-4,
+ .gy-md-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-md-5,
+ .gx-md-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-md-5,
+ .gy-md-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 992px) {
+ .col-lg {
+ flex: 1 0 0%;
+ }
+ .row-cols-lg-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-lg-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-lg-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-lg-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-lg-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-lg-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-lg-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-lg-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-lg-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-lg-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-lg-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-lg-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-lg-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-lg-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-lg-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-lg-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-lg-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-lg-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-lg-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-lg-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-lg-0 {
+ margin-left: 0;
+ }
+ .offset-lg-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-lg-0,
+ .gx-lg-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-lg-0,
+ .gy-lg-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-lg-1,
+ .gx-lg-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-lg-1,
+ .gy-lg-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-lg-2,
+ .gx-lg-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-lg-2,
+ .gy-lg-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-lg-3,
+ .gx-lg-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-lg-3,
+ .gy-lg-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-lg-4,
+ .gx-lg-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-lg-4,
+ .gy-lg-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-lg-5,
+ .gx-lg-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-lg-5,
+ .gy-lg-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1200px) {
+ .col-xl {
+ flex: 1 0 0%;
+ }
+ .row-cols-xl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-xl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-xl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-xl-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-xl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-xl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-xl-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-xl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-xl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-xl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-xl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-xl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-xl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-xl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-xl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-xl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-xl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-xl-0 {
+ margin-left: 0;
+ }
+ .offset-xl-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-xl-0,
+ .gx-xl-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-xl-0,
+ .gy-xl-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-xl-1,
+ .gx-xl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-xl-1,
+ .gy-xl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-xl-2,
+ .gx-xl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-xl-2,
+ .gy-xl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-xl-3,
+ .gx-xl-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-xl-3,
+ .gy-xl-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-xl-4,
+ .gx-xl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-xl-4,
+ .gy-xl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-xl-5,
+ .gx-xl-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-xl-5,
+ .gy-xl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+@media (min-width: 1400px) {
+ .col-xxl {
+ flex: 1 0 0%;
+ }
+ .row-cols-xxl-auto > * {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .row-cols-xxl-1 > * {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .row-cols-xxl-2 > * {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .row-cols-xxl-3 > * {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .row-cols-xxl-4 > * {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .row-cols-xxl-5 > * {
+ flex: 0 0 auto;
+ width: 20%;
+ }
+ .row-cols-xxl-6 > * {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xxl-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xxl-1 {
+ flex: 0 0 auto;
+ width: 8.33333333%;
+ }
+ .col-xxl-2 {
+ flex: 0 0 auto;
+ width: 16.66666667%;
+ }
+ .col-xxl-3 {
+ flex: 0 0 auto;
+ width: 25%;
+ }
+ .col-xxl-4 {
+ flex: 0 0 auto;
+ width: 33.33333333%;
+ }
+ .col-xxl-5 {
+ flex: 0 0 auto;
+ width: 41.66666667%;
+ }
+ .col-xxl-6 {
+ flex: 0 0 auto;
+ width: 50%;
+ }
+ .col-xxl-7 {
+ flex: 0 0 auto;
+ width: 58.33333333%;
+ }
+ .col-xxl-8 {
+ flex: 0 0 auto;
+ width: 66.66666667%;
+ }
+ .col-xxl-9 {
+ flex: 0 0 auto;
+ width: 75%;
+ }
+ .col-xxl-10 {
+ flex: 0 0 auto;
+ width: 83.33333333%;
+ }
+ .col-xxl-11 {
+ flex: 0 0 auto;
+ width: 91.66666667%;
+ }
+ .col-xxl-12 {
+ flex: 0 0 auto;
+ width: 100%;
+ }
+ .offset-xxl-0 {
+ margin-left: 0;
+ }
+ .offset-xxl-1 {
+ margin-left: 8.33333333%;
+ }
+ .offset-xxl-2 {
+ margin-left: 16.66666667%;
+ }
+ .offset-xxl-3 {
+ margin-left: 25%;
+ }
+ .offset-xxl-4 {
+ margin-left: 33.33333333%;
+ }
+ .offset-xxl-5 {
+ margin-left: 41.66666667%;
+ }
+ .offset-xxl-6 {
+ margin-left: 50%;
+ }
+ .offset-xxl-7 {
+ margin-left: 58.33333333%;
+ }
+ .offset-xxl-8 {
+ margin-left: 66.66666667%;
+ }
+ .offset-xxl-9 {
+ margin-left: 75%;
+ }
+ .offset-xxl-10 {
+ margin-left: 83.33333333%;
+ }
+ .offset-xxl-11 {
+ margin-left: 91.66666667%;
+ }
+ .g-xxl-0,
+ .gx-xxl-0 {
+ --bs-gutter-x: 0;
+ }
+ .g-xxl-0,
+ .gy-xxl-0 {
+ --bs-gutter-y: 0;
+ }
+ .g-xxl-1,
+ .gx-xxl-1 {
+ --bs-gutter-x: 0.25rem;
+ }
+ .g-xxl-1,
+ .gy-xxl-1 {
+ --bs-gutter-y: 0.25rem;
+ }
+ .g-xxl-2,
+ .gx-xxl-2 {
+ --bs-gutter-x: 0.5rem;
+ }
+ .g-xxl-2,
+ .gy-xxl-2 {
+ --bs-gutter-y: 0.5rem;
+ }
+ .g-xxl-3,
+ .gx-xxl-3 {
+ --bs-gutter-x: 1rem;
+ }
+ .g-xxl-3,
+ .gy-xxl-3 {
+ --bs-gutter-y: 1rem;
+ }
+ .g-xxl-4,
+ .gx-xxl-4 {
+ --bs-gutter-x: 1.5rem;
+ }
+ .g-xxl-4,
+ .gy-xxl-4 {
+ --bs-gutter-y: 1.5rem;
+ }
+ .g-xxl-5,
+ .gx-xxl-5 {
+ --bs-gutter-x: 3rem;
+ }
+ .g-xxl-5,
+ .gy-xxl-5 {
+ --bs-gutter-y: 3rem;
+ }
+}
+.table {
+ --bs-table-color-type: initial;
+ --bs-table-bg-type: initial;
+ --bs-table-color-state: initial;
+ --bs-table-bg-state: initial;
+ --bs-table-color: var(--bs-emphasis-color);
+ --bs-table-bg: var(--bs-body-bg);
+ --bs-table-border-color: var(--bs-border-color);
+ --bs-table-accent-bg: transparent;
+ --bs-table-striped-color: var(--bs-emphasis-color);
+ --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);
+ --bs-table-active-color: var(--bs-emphasis-color);
+ --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);
+ --bs-table-hover-color: var(--bs-emphasis-color);
+ --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);
+ width: 100%;
+ margin-bottom: 1rem;
+ vertical-align: top;
+ border-color: var(--bs-table-border-color);
+}
+.table > :not(caption) > * > * {
+ padding: 0.5rem 0.5rem;
+ color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));
+ background-color: var(--bs-table-bg);
+ border-bottom-width: var(--bs-border-width);
+ box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));
+}
+.table > tbody {
+ vertical-align: inherit;
+}
+.table > thead {
+ vertical-align: bottom;
+}
+
+.table-group-divider {
+ border-top: calc(var(--bs-border-width) * 2) solid currentcolor;
+}
+
+.caption-top {
+ caption-side: top;
+}
+
+.table-sm > :not(caption) > * > * {
+ padding: 0.25rem 0.25rem;
+}
+
+.table-bordered > :not(caption) > * {
+ border-width: var(--bs-border-width) 0;
+}
+.table-bordered > :not(caption) > * > * {
+ border-width: 0 var(--bs-border-width);
+}
+
+.table-borderless > :not(caption) > * > * {
+ border-bottom-width: 0;
+}
+.table-borderless > :not(:first-child) {
+ border-top-width: 0;
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) > * {
+ --bs-table-color-type: var(--bs-table-striped-color);
+ --bs-table-bg-type: var(--bs-table-striped-bg);
+}
+
+.table-striped-columns > :not(caption) > tr > :nth-child(even) {
+ --bs-table-color-type: var(--bs-table-striped-color);
+ --bs-table-bg-type: var(--bs-table-striped-bg);
+}
+
+.table-active {
+ --bs-table-color-state: var(--bs-table-active-color);
+ --bs-table-bg-state: var(--bs-table-active-bg);
+}
+
+.table-hover > tbody > tr:hover > * {
+ --bs-table-color-state: var(--bs-table-hover-color);
+ --bs-table-bg-state: var(--bs-table-hover-bg);
+}
+
+.table-primary {
+ --bs-table-color: #000;
+ --bs-table-bg: #dae2eb;
+ --bs-table-border-color: #aeb5bc;
+ --bs-table-striped-bg: #cfd7df;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #c4cbd4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #cad1d9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-secondary {
+ --bs-table-color: #000;
+ --bs-table-bg: #ebebeb;
+ --bs-table-border-color: #bcbcbc;
+ --bs-table-striped-bg: #dfdfdf;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #d4d4d4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #d9d9d9;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-success {
+ --bs-table-color: #000;
+ --bs-table-bg: #d8f0d3;
+ --bs-table-border-color: #adc0a9;
+ --bs-table-striped-bg: #cde4c8;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #c2d8be;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c8dec3;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-info {
+ --bs-table-color: #000;
+ --bs-table-bg: #d6ebfd;
+ --bs-table-border-color: #abbcca;
+ --bs-table-striped-bg: #cbdff0;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #c1d4e4;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #c6d9ea;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-warning {
+ --bs-table-color: #000;
+ --bs-table-bg: #f6e3cc;
+ --bs-table-border-color: #c5b6a3;
+ --bs-table-striped-bg: #ead8c2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #ddccb8;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e4d2bd;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-danger {
+ --bs-table-color: #000;
+ --bs-table-bg: #f5cccc;
+ --bs-table-border-color: #c4a3a3;
+ --bs-table-striped-bg: #e9c2c2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #ddb8b8;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: #e3bdbd;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-light {
+ --bs-table-color: #000;
+ --bs-table-bg: #eee;
+ --bs-table-border-color: #bebebe;
+ --bs-table-striped-bg: #e2e2e2;
+ --bs-table-striped-color: #000;
+ --bs-table-active-bg: #d6d6d6;
+ --bs-table-active-color: #000;
+ --bs-table-hover-bg: gainsboro;
+ --bs-table-hover-color: #000;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-dark {
+ --bs-table-color: #fff;
+ --bs-table-bg: #333;
+ --bs-table-border-color: #5c5c5c;
+ --bs-table-striped-bg: #3d3d3d;
+ --bs-table-striped-color: #fff;
+ --bs-table-active-bg: #474747;
+ --bs-table-active-color: #fff;
+ --bs-table-hover-bg: #424242;
+ --bs-table-hover-color: #fff;
+ color: var(--bs-table-color);
+ border-color: var(--bs-table-border-color);
+}
+
+.table-responsive {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+@media (max-width: 575.98px) {
+ .table-responsive-sm {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 767.98px) {
+ .table-responsive-md {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 991.98px) {
+ .table-responsive-lg {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1199.98px) {
+ .table-responsive-xl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+@media (max-width: 1399.98px) {
+ .table-responsive-xxl {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+}
+.form-label {
+ margin-bottom: 0.5rem;
+}
+
+.col-form-label {
+ padding-top: calc(0.375rem + var(--bs-border-width));
+ padding-bottom: calc(0.375rem + var(--bs-border-width));
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5;
+}
+
+.col-form-label-lg {
+ padding-top: calc(0.5rem + var(--bs-border-width));
+ padding-bottom: calc(0.5rem + var(--bs-border-width));
+ font-size: 1.25rem;
+}
+
+.col-form-label-sm {
+ padding-top: calc(0.25rem + var(--bs-border-width));
+ padding-bottom: calc(0.25rem + var(--bs-border-width));
+ font-size: 0.875rem;
+}
+
+.form-text {
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: var(--bs-secondary-color);
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: var(--bs-body-color);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: var(--bs-body-bg);
+ background-clip: padding-box;
+ border: var(--bs-border-width) solid var(--bs-border-color);
+ border-radius: var(--bs-border-radius);
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-control {
+ transition: none;
+ }
+}
+.form-control[type=file] {
+ overflow: hidden;
+}
+.form-control[type=file]:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+.form-control:focus {
+ color: var(--bs-body-color);
+ background-color: var(--bs-body-bg);
+ border-color: #a2b7cd;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.form-control::-webkit-date-and-time-value {
+ min-width: 85px;
+ height: 1.5em;
+ margin: 0;
+}
+.form-control::-webkit-datetime-edit {
+ display: block;
+ padding: 0;
+}
+.form-control::-moz-placeholder {
+ color: var(--bs-secondary-color);
+ opacity: 1;
+}
+.form-control::placeholder {
+ color: var(--bs-secondary-color);
+ opacity: 1;
+}
+.form-control:disabled {
+ background-color: var(--bs-secondary-bg);
+ opacity: 1;
+}
+.form-control::-webkit-file-upload-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: var(--bs-body-color);
+ background-color: var(--bs-tertiary-bg);
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: var(--bs-border-width);
+ border-radius: 0;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+.form-control::file-selector-button {
+ padding: 0.375rem 0.75rem;
+ margin: -0.375rem -0.75rem;
+ -webkit-margin-end: 0.75rem;
+ margin-inline-end: 0.75rem;
+ color: var(--bs-body-color);
+ background-color: var(--bs-tertiary-bg);
+ pointer-events: none;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
+ border-inline-end-width: var(--bs-border-width);
+ border-radius: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-control::-webkit-file-upload-button {
+ -webkit-transition: none;
+ transition: none;
+ }
+ .form-control::file-selector-button {
+ transition: none;
+ }
+}
+.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
+ background-color: var(--bs-secondary-bg);
+}
+.form-control:hover:not(:disabled):not([readonly])::file-selector-button {
+ background-color: var(--bs-secondary-bg);
+}
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding: 0.375rem 0;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: var(--bs-body-color);
+ background-color: transparent;
+ border: solid transparent;
+ border-width: var(--bs-border-width) 0;
+}
+.form-control-plaintext:focus {
+ outline: 0;
+}
+.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: var(--bs-border-radius-sm);
+}
+.form-control-sm::-webkit-file-upload-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+.form-control-sm::file-selector-button {
+ padding: 0.25rem 0.5rem;
+ margin: -0.25rem -0.5rem;
+ -webkit-margin-end: 0.5rem;
+ margin-inline-end: 0.5rem;
+}
+
+.form-control-lg {
+ min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: var(--bs-border-radius-lg);
+}
+.form-control-lg::-webkit-file-upload-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+.form-control-lg::file-selector-button {
+ padding: 0.5rem 1rem;
+ margin: -0.5rem -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+textarea.form-control {
+ min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));
+}
+textarea.form-control-sm {
+ min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
+}
+textarea.form-control-lg {
+ min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
+}
+
+.form-control-color {
+ width: 3rem;
+ height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));
+ padding: 0.375rem;
+}
+.form-control-color:not(:disabled):not([readonly]) {
+ cursor: pointer;
+}
+.form-control-color::-moz-color-swatch {
+ border: 0 !important;
+ border-radius: var(--bs-border-radius);
+}
+.form-control-color::-webkit-color-swatch {
+ border: 0 !important;
+ border-radius: var(--bs-border-radius);
+}
+.form-control-color.form-control-sm {
+ height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));
+}
+.form-control-color.form-control-lg {
+ height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));
+}
+
+.form-select {
+ --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+ display: block;
+ width: 100%;
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: var(--bs-body-color);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: var(--bs-body-bg);
+ background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);
+ background-repeat: no-repeat;
+ background-position: right 0.75rem center;
+ background-size: 16px 12px;
+ border: var(--bs-border-width) solid var(--bs-border-color);
+ border-radius: var(--bs-border-radius);
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-select {
+ transition: none;
+ }
+}
+.form-select:focus {
+ border-color: #a2b7cd;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.form-select[multiple], .form-select[size]:not([size="1"]) {
+ padding-right: 0.75rem;
+ background-image: none;
+}
+.form-select:disabled {
+ background-color: var(--bs-secondary-bg);
+}
+.form-select:-moz-focusring {
+ color: transparent;
+ text-shadow: 0 0 0 var(--bs-body-color);
+}
+
+.form-select-sm {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ font-size: 0.875rem;
+ border-radius: var(--bs-border-radius-sm);
+}
+
+.form-select-lg {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem;
+ border-radius: var(--bs-border-radius-lg);
+}
+
+[data-bs-theme=dark] .form-select {
+ --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
+}
+
+.form-check {
+ display: block;
+ min-height: 1.5rem;
+ padding-left: 1.5em;
+ margin-bottom: 0.125rem;
+}
+.form-check .form-check-input {
+ float: left;
+ margin-left: -1.5em;
+}
+
+.form-check-reverse {
+ padding-right: 1.5em;
+ padding-left: 0;
+ text-align: right;
+}
+.form-check-reverse .form-check-input {
+ float: right;
+ margin-right: -1.5em;
+ margin-left: 0;
+}
+
+.form-check-input {
+ --bs-form-check-bg: var(--bs-body-bg);
+ flex-shrink: 0;
+ width: 1em;
+ height: 1em;
+ margin-top: 0.25em;
+ vertical-align: top;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: var(--bs-form-check-bg);
+ background-image: var(--bs-form-check-bg-image);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: contain;
+ border: var(--bs-border-width) solid var(--bs-border-color);
+ -webkit-print-color-adjust: exact;
+ color-adjust: exact;
+ print-color-adjust: exact;
+}
+.form-check-input[type=checkbox] {
+ border-radius: 0.25em;
+}
+.form-check-input[type=radio] {
+ border-radius: 50%;
+}
+.form-check-input:active {
+ filter: brightness(90%);
+}
+.form-check-input:focus {
+ border-color: #a2b7cd;
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.form-check-input:checked {
+ background-color: #446e9b;
+ border-color: #446e9b;
+}
+.form-check-input:checked[type=checkbox] {
+ --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
+}
+.form-check-input:checked[type=radio] {
+ --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
+}
+.form-check-input[type=checkbox]:indeterminate {
+ background-color: #446e9b;
+ border-color: #446e9b;
+ --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
+}
+.form-check-input:disabled {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.5;
+}
+.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {
+ cursor: default;
+ opacity: 0.5;
+}
+
+.form-switch {
+ padding-left: 2.5em;
+}
+.form-switch .form-check-input {
+ --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");
+ width: 2em;
+ margin-left: -2.5em;
+ background-image: var(--bs-form-switch-bg);
+ background-position: left center;
+ border-radius: 2em;
+ transition: background-position 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-switch .form-check-input {
+ transition: none;
+ }
+}
+.form-switch .form-check-input:focus {
+ --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23a2b7cd'/%3e%3c/svg%3e");
+}
+.form-switch .form-check-input:checked {
+ background-position: right center;
+ --bs-form-switch-bg: 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");
+}
+.form-switch.form-check-reverse {
+ padding-right: 2.5em;
+ padding-left: 0;
+}
+.form-switch.form-check-reverse .form-check-input {
+ margin-right: -2.5em;
+ margin-left: 0;
+}
+
+.form-check-inline {
+ display: inline-block;
+ margin-right: 1rem;
+}
+
+.btn-check {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+}
+.btn-check[disabled] + .btn, .btn-check:disabled + .btn {
+ pointer-events: none;
+ filter: none;
+ opacity: 0.65;
+}
+
+[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {
+ --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e");
+}
+
+.form-range {
+ width: 100%;
+ height: 1.5rem;
+ padding: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: transparent;
+}
+.form-range:focus {
+ outline: 0;
+}
+.form-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.form-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.form-range::-moz-focus-outer {
+ border: 0;
+}
+.form-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -0.25rem;
+ -webkit-appearance: none;
+ appearance: none;
+ background-color: #446e9b;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+.form-range::-webkit-slider-thumb:active {
+ background-color: #c7d4e1;
+}
+.form-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: var(--bs-secondary-bg);
+ border-color: transparent;
+ border-radius: 1rem;
+}
+.form-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #446e9b;
+ border: 0;
+ border-radius: 1rem;
+ -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-range::-moz-range-thumb {
+ -moz-transition: none;
+ transition: none;
+ }
+}
+.form-range::-moz-range-thumb:active {
+ background-color: #c7d4e1;
+}
+.form-range::-moz-range-track {
+ width: 100%;
+ height: 0.5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: var(--bs-secondary-bg);
+ border-color: transparent;
+ border-radius: 1rem;
+}
+.form-range:disabled {
+ pointer-events: none;
+}
+.form-range:disabled::-webkit-slider-thumb {
+ background-color: var(--bs-secondary-color);
+}
+.form-range:disabled::-moz-range-thumb {
+ background-color: var(--bs-secondary-color);
+}
+
+.form-floating {
+ position: relative;
+}
+.form-floating > .form-control,
+.form-floating > .form-control-plaintext,
+.form-floating > .form-select {
+ height: calc(3.5rem + calc(var(--bs-border-width) * 2));
+ min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));
+ line-height: 1.25;
+}
+.form-floating > label {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ height: 100%;
+ padding: 1rem 0.75rem;
+ overflow: hidden;
+ text-align: start;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ pointer-events: none;
+ border: var(--bs-border-width) solid transparent;
+ transform-origin: 0 0;
+ transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .form-floating > label {
+ transition: none;
+ }
+}
+.form-floating > .form-control,
+.form-floating > .form-control-plaintext {
+ padding: 1rem 0.75rem;
+}
+.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder {
+ color: transparent;
+}
+.form-floating > .form-control::placeholder,
+.form-floating > .form-control-plaintext::placeholder {
+ color: transparent;
+}
+.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),
+.form-floating > .form-control-plaintext:focus,
+.form-floating > .form-control-plaintext:not(:placeholder-shown) {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+.form-floating > .form-control:-webkit-autofill,
+.form-floating > .form-control-plaintext:-webkit-autofill {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+.form-floating > .form-select {
+ padding-top: 1.625rem;
+ padding-bottom: 0.625rem;
+}
+.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {
+ color: rgba(var(--bs-body-color-rgb), 0.65);
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+.form-floating > .form-control:focus ~ label,
+.form-floating > .form-control:not(:placeholder-shown) ~ label,
+.form-floating > .form-control-plaintext ~ label,
+.form-floating > .form-select ~ label {
+ color: rgba(var(--bs-body-color-rgb), 0.65);
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after {
+ position: absolute;
+ inset: 1rem 0.375rem;
+ z-index: -1;
+ height: 1.5em;
+ content: "";
+ background-color: var(--bs-body-bg);
+ border-radius: var(--bs-border-radius);
+}
+.form-floating > .form-control:focus ~ label::after,
+.form-floating > .form-control:not(:placeholder-shown) ~ label::after,
+.form-floating > .form-control-plaintext ~ label::after,
+.form-floating > .form-select ~ label::after {
+ position: absolute;
+ inset: 1rem 0.375rem;
+ z-index: -1;
+ height: 1.5em;
+ content: "";
+ background-color: var(--bs-body-bg);
+ border-radius: var(--bs-border-radius);
+}
+.form-floating > .form-control:-webkit-autofill ~ label {
+ color: rgba(var(--bs-body-color-rgb), 0.65);
+ transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);
+}
+.form-floating > .form-control-plaintext ~ label {
+ border-width: var(--bs-border-width) 0;
+}
+.form-floating > :disabled ~ label,
+.form-floating > .form-control:disabled ~ label {
+ color: #777;
+}
+.form-floating > :disabled ~ label::after,
+.form-floating > .form-control:disabled ~ label::after {
+ background-color: var(--bs-secondary-bg);
+}
+
+.input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: stretch;
+ width: 100%;
+}
+.input-group > .form-control,
+.input-group > .form-select,
+.input-group > .form-floating {
+ position: relative;
+ flex: 1 1 auto;
+ width: 1%;
+ min-width: 0;
+}
+.input-group > .form-control:focus,
+.input-group > .form-select:focus,
+.input-group > .form-floating:focus-within {
+ z-index: 5;
+}
+.input-group .btn {
+ position: relative;
+ z-index: 2;
+}
+.input-group .btn:focus {
+ z-index: 5;
+}
+
+.input-group-text {
+ display: flex;
+ align-items: center;
+ padding: 0.375rem 0.75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: var(--bs-body-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-tertiary-bg);
+ border: var(--bs-border-width) solid var(--bs-border-color);
+ border-radius: var(--bs-border-radius);
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .form-select,
+.input-group-lg > .input-group-text,
+.input-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: var(--bs-border-radius-lg);
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .form-select,
+.input-group-sm > .input-group-text,
+.input-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: var(--bs-border-radius-sm);
+}
+
+.input-group-lg > .form-select,
+.input-group-sm > .form-select {
+ padding-right: 3rem;
+}
+
+.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,
+.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),
+.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),
+.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,
+.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {
+ margin-left: calc(var(--bs-border-width) * -1);
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.input-group > .form-floating:not(:first-child) > .form-control,
+.input-group > .form-floating:not(:first-child) > .form-select {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: var(--bs-form-valid-color);
+}
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: var(--bs-success);
+ border-radius: var(--bs-border-radius);
+}
+
+.was-validated :valid ~ .valid-feedback,
+.was-validated :valid ~ .valid-tooltip,
+.is-valid ~ .valid-feedback,
+.is-valid ~ .valid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control:valid, .form-control.is-valid {
+ border-color: var(--bs-form-valid-border-color);
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233cb521' d='M2.3 6.73.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(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus {
+ border-color: var(--bs-form-valid-border-color);
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
+}
+
+.was-validated textarea.form-control:valid, textarea.form-control.is-valid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.was-validated .form-select:valid, .form-select.is-valid {
+ border-color: var(--bs-form-valid-border-color);
+}
+.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] {
+ --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233cb521' d='M2.3 6.73.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");
+ padding-right: 4.125rem;
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-select:valid:focus, .form-select.is-valid:focus {
+ border-color: var(--bs-form-valid-border-color);
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
+}
+
+.was-validated .form-control-color:valid, .form-control-color.is-valid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.was-validated .form-check-input:valid, .form-check-input.is-valid {
+ border-color: var(--bs-form-valid-border-color);
+}
+.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {
+ background-color: var(--bs-form-valid-color);
+}
+.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);
+}
+.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {
+ color: var(--bs-form-valid-color);
+}
+
+.form-check-inline .form-check-input ~ .valid-feedback {
+ margin-left: 0.5em;
+}
+
+.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,
+.was-validated .input-group > .form-select:not(:focus):valid,
+.input-group > .form-select:not(:focus).is-valid,
+.was-validated .input-group > .form-floating:not(:focus-within):valid,
+.input-group > .form-floating:not(:focus-within).is-valid {
+ z-index: 3;
+}
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: 0.25rem;
+ font-size: 0.875em;
+ color: var(--bs-form-invalid-color);
+}
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: 0.25rem 0.5rem;
+ margin-top: 0.1rem;
+ font-size: 0.875rem;
+ color: #fff;
+ background-color: var(--bs-danger);
+ border-radius: var(--bs-border-radius);
+}
+
+.was-validated :invalid ~ .invalid-feedback,
+.was-validated :invalid ~ .invalid-tooltip,
+.is-invalid ~ .invalid-feedback,
+.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-control:invalid, .form-control.is-invalid {
+ border-color: var(--bs-form-invalid-border-color);
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23cd0200'%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='%23cd0200' stroke='none'/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: right calc(0.375em + 0.1875rem) center;
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {
+ border-color: var(--bs-form-invalid-border-color);
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
+}
+
+.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + 0.75rem);
+ background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
+}
+
+.was-validated .form-select:invalid, .form-select.is-invalid {
+ border-color: var(--bs-form-invalid-border-color);
+}
+.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] {
+ --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23cd0200'%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='%23cd0200' stroke='none'/%3e%3c/svg%3e");
+ padding-right: 4.125rem;
+ background-position: right 0.75rem center, center right 2.25rem;
+ background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+}
+.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {
+ border-color: var(--bs-form-invalid-border-color);
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
+}
+
+.was-validated .form-control-color:invalid, .form-control-color.is-invalid {
+ width: calc(3rem + calc(1.5em + 0.75rem));
+}
+
+.was-validated .form-check-input:invalid, .form-check-input.is-invalid {
+ border-color: var(--bs-form-invalid-border-color);
+}
+.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {
+ background-color: var(--bs-form-invalid-color);
+}
+.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);
+}
+.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {
+ color: var(--bs-form-invalid-color);
+}
+
+.form-check-inline .form-check-input ~ .invalid-feedback {
+ margin-left: 0.5em;
+}
+
+.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,
+.was-validated .input-group > .form-select:not(:focus):invalid,
+.input-group > .form-select:not(:focus).is-invalid,
+.was-validated .input-group > .form-floating:not(:focus-within):invalid,
+.input-group > .form-floating:not(:focus-within).is-invalid {
+ z-index: 4;
+}
+
+.btn {
+ --bs-btn-padding-x: 0.75rem;
+ --bs-btn-padding-y: 0.375rem;
+ --bs-btn-font-family: ;
+ --bs-btn-font-size: 1rem;
+ --bs-btn-font-weight: 400;
+ --bs-btn-line-height: 1.5;
+ --bs-btn-color: var(--bs-body-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-width: var(--bs-border-width);
+ --bs-btn-border-color: transparent;
+ --bs-btn-border-radius: var(--bs-border-radius);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ --bs-btn-disabled-opacity: 0.65;
+ --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);
+ display: inline-block;
+ padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
+ font-family: var(--bs-btn-font-family);
+ font-size: var(--bs-btn-font-size);
+ font-weight: var(--bs-btn-font-weight);
+ line-height: var(--bs-btn-line-height);
+ color: var(--bs-btn-color);
+ text-align: center;
+ text-decoration: none;
+ vertical-align: middle;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
+ border-radius: var(--bs-btn-border-radius);
+ background-color: var(--bs-btn-bg);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .btn {
+ transition: none;
+ }
+}
+.btn:hover {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+}
+.btn-check + .btn:hover {
+ color: var(--bs-btn-color);
+ background-color: var(--bs-btn-bg);
+ border-color: var(--bs-btn-border-color);
+}
+.btn:focus-visible {
+ color: var(--bs-btn-hover-color);
+ background-color: var(--bs-btn-hover-bg);
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+.btn-check:focus-visible + .btn {
+ border-color: var(--bs-btn-hover-border-color);
+ outline: 0;
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {
+ color: var(--bs-btn-active-color);
+ background-color: var(--bs-btn-active-bg);
+ border-color: var(--bs-btn-active-border-color);
+}
+.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+.btn-check:checked:focus-visible + .btn {
+ box-shadow: var(--bs-btn-focus-box-shadow);
+}
+.btn:disabled, .btn.disabled, fieldset:disabled .btn {
+ color: var(--bs-btn-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-btn-disabled-bg);
+ border-color: var(--bs-btn-disabled-border-color);
+ opacity: var(--bs-btn-disabled-opacity);
+}
+
+.btn-primary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #446e9b;
+ --bs-btn-border-color: #446e9b;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #3a5e84;
+ --bs-btn-hover-border-color: #36587c;
+ --bs-btn-focus-shadow-rgb: 96, 132, 170;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #36587c;
+ --bs-btn-active-border-color: #335374;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #446e9b;
+ --bs-btn-disabled-border-color: #446e9b;
+}
+
+.btn-secondary {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #999;
+ --bs-btn-border-color: #999;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #828282;
+ --bs-btn-hover-border-color: #7a7a7a;
+ --bs-btn-focus-shadow-rgb: 168, 168, 168;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #7a7a7a;
+ --bs-btn-active-border-color: #737373;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #999;
+ --bs-btn-disabled-border-color: #999;
+}
+
+.btn-success {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #3cb521;
+ --bs-btn-border-color: #3cb521;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #339a1c;
+ --bs-btn-hover-border-color: #30911a;
+ --bs-btn-focus-shadow-rgb: 89, 192, 66;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #30911a;
+ --bs-btn-active-border-color: #2d8819;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #3cb521;
+ --bs-btn-disabled-border-color: #3cb521;
+}
+
+.btn-info {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #3399f3;
+ --bs-btn-border-color: #3399f3;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #2b82cf;
+ --bs-btn-hover-border-color: #297ac2;
+ --bs-btn-focus-shadow-rgb: 82, 168, 245;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #297ac2;
+ --bs-btn-active-border-color: #2673b6;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #3399f3;
+ --bs-btn-disabled-border-color: #3399f3;
+}
+
+.btn-warning {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #d47500;
+ --bs-btn-border-color: #d47500;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #b46300;
+ --bs-btn-hover-border-color: #aa5e00;
+ --bs-btn-focus-shadow-rgb: 218, 138, 38;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #aa5e00;
+ --bs-btn-active-border-color: #9f5800;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #d47500;
+ --bs-btn-disabled-border-color: #d47500;
+}
+
+.btn-danger {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #cd0200;
+ --bs-btn-border-color: #cd0200;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #ae0200;
+ --bs-btn-hover-border-color: #a40200;
+ --bs-btn-focus-shadow-rgb: 213, 40, 38;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #a40200;
+ --bs-btn-active-border-color: #9a0200;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #cd0200;
+ --bs-btn-disabled-border-color: #cd0200;
+}
+
+.btn-light {
+ --bs-btn-color: #000;
+ --bs-btn-bg: #eee;
+ --bs-btn-border-color: #eee;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #cacaca;
+ --bs-btn-hover-border-color: #bebebe;
+ --bs-btn-focus-shadow-rgb: 202, 202, 202;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #bebebe;
+ --bs-btn-active-border-color: #b3b3b3;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #000;
+ --bs-btn-disabled-bg: #eee;
+ --bs-btn-disabled-border-color: #eee;
+}
+
+.btn-dark {
+ --bs-btn-color: #fff;
+ --bs-btn-bg: #333;
+ --bs-btn-border-color: #333;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #525252;
+ --bs-btn-hover-border-color: #474747;
+ --bs-btn-focus-shadow-rgb: 82, 82, 82;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #5c5c5c;
+ --bs-btn-active-border-color: #474747;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #fff;
+ --bs-btn-disabled-bg: #333;
+ --bs-btn-disabled-border-color: #333;
+}
+
+.btn-outline-primary {
+ --bs-btn-color: #446e9b;
+ --bs-btn-border-color: #446e9b;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #446e9b;
+ --bs-btn-hover-border-color: #446e9b;
+ --bs-btn-focus-shadow-rgb: 68, 110, 155;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #446e9b;
+ --bs-btn-active-border-color: #446e9b;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #446e9b;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #446e9b;
+ --bs-gradient: none;
+}
+
+.btn-outline-secondary {
+ --bs-btn-color: #999;
+ --bs-btn-border-color: #999;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #999;
+ --bs-btn-hover-border-color: #999;
+ --bs-btn-focus-shadow-rgb: 153, 153, 153;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #999;
+ --bs-btn-active-border-color: #999;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #999;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #999;
+ --bs-gradient: none;
+}
+
+.btn-outline-success {
+ --bs-btn-color: #3cb521;
+ --bs-btn-border-color: #3cb521;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #3cb521;
+ --bs-btn-hover-border-color: #3cb521;
+ --bs-btn-focus-shadow-rgb: 60, 181, 33;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #3cb521;
+ --bs-btn-active-border-color: #3cb521;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #3cb521;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #3cb521;
+ --bs-gradient: none;
+}
+
+.btn-outline-info {
+ --bs-btn-color: #3399f3;
+ --bs-btn-border-color: #3399f3;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #3399f3;
+ --bs-btn-hover-border-color: #3399f3;
+ --bs-btn-focus-shadow-rgb: 51, 153, 243;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #3399f3;
+ --bs-btn-active-border-color: #3399f3;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #3399f3;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #3399f3;
+ --bs-gradient: none;
+}
+
+.btn-outline-warning {
+ --bs-btn-color: #d47500;
+ --bs-btn-border-color: #d47500;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #d47500;
+ --bs-btn-hover-border-color: #d47500;
+ --bs-btn-focus-shadow-rgb: 212, 117, 0;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #d47500;
+ --bs-btn-active-border-color: #d47500;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #d47500;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #d47500;
+ --bs-gradient: none;
+}
+
+.btn-outline-danger {
+ --bs-btn-color: #cd0200;
+ --bs-btn-border-color: #cd0200;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #cd0200;
+ --bs-btn-hover-border-color: #cd0200;
+ --bs-btn-focus-shadow-rgb: 205, 2, 0;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #cd0200;
+ --bs-btn-active-border-color: #cd0200;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #cd0200;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #cd0200;
+ --bs-gradient: none;
+}
+
+.btn-outline-light {
+ --bs-btn-color: #eee;
+ --bs-btn-border-color: #eee;
+ --bs-btn-hover-color: #000;
+ --bs-btn-hover-bg: #eee;
+ --bs-btn-hover-border-color: #eee;
+ --bs-btn-focus-shadow-rgb: 238, 238, 238;
+ --bs-btn-active-color: #000;
+ --bs-btn-active-bg: #eee;
+ --bs-btn-active-border-color: #eee;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #eee;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #eee;
+ --bs-gradient: none;
+}
+
+.btn-outline-dark {
+ --bs-btn-color: #333;
+ --bs-btn-border-color: #333;
+ --bs-btn-hover-color: #fff;
+ --bs-btn-hover-bg: #333;
+ --bs-btn-hover-border-color: #333;
+ --bs-btn-focus-shadow-rgb: 51, 51, 51;
+ --bs-btn-active-color: #fff;
+ --bs-btn-active-bg: #333;
+ --bs-btn-active-border-color: #333;
+ --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ --bs-btn-disabled-color: #333;
+ --bs-btn-disabled-bg: transparent;
+ --bs-btn-disabled-border-color: #333;
+ --bs-gradient: none;
+}
+
+.btn-link {
+ --bs-btn-font-weight: 400;
+ --bs-btn-color: var(--bs-link-color);
+ --bs-btn-bg: transparent;
+ --bs-btn-border-color: transparent;
+ --bs-btn-hover-color: var(--bs-link-hover-color);
+ --bs-btn-hover-border-color: transparent;
+ --bs-btn-active-color: var(--bs-link-hover-color);
+ --bs-btn-active-border-color: transparent;
+ --bs-btn-disabled-color: #777;
+ --bs-btn-disabled-border-color: transparent;
+ --bs-btn-box-shadow: 0 0 0 #000;
+ --bs-btn-focus-shadow-rgb: 82, 168, 245;
+ text-decoration: underline;
+}
+.btn-link:focus-visible {
+ color: var(--bs-btn-color);
+}
+.btn-link:hover {
+ color: var(--bs-btn-hover-color);
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ --bs-btn-padding-y: 0.5rem;
+ --bs-btn-padding-x: 1rem;
+ --bs-btn-font-size: 1.25rem;
+ --bs-btn-border-radius: var(--bs-border-radius-lg);
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ --bs-btn-padding-y: 0.25rem;
+ --bs-btn-padding-x: 0.5rem;
+ --bs-btn-font-size: 0.875rem;
+ --bs-btn-border-radius: var(--bs-border-radius-sm);
+}
+
+.fade {
+ transition: opacity 0.15s linear;
+}
+@media (prefers-reduced-motion: reduce) {
+ .fade {
+ transition: none;
+ }
+}
+.fade:not(.show) {
+ opacity: 0;
+}
+
+.collapse:not(.show) {
+ display: none;
+}
+
+.collapsing {
+ height: 0;
+ overflow: hidden;
+ transition: height 0.35s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .collapsing {
+ transition: none;
+ }
+}
+.collapsing.collapse-horizontal {
+ width: 0;
+ height: auto;
+ transition: width 0.35s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .collapsing.collapse-horizontal {
+ transition: none;
+ }
+}
+
+.dropup,
+.dropend,
+.dropdown,
+.dropstart,
+.dropup-center,
+.dropdown-center {
+ position: relative;
+}
+
+.dropdown-toggle {
+ white-space: nowrap;
+}
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0;
+ border-left: 0.3em solid transparent;
+}
+.dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropdown-menu {
+ --bs-dropdown-zindex: 1000;
+ --bs-dropdown-min-width: 10rem;
+ --bs-dropdown-padding-x: 0;
+ --bs-dropdown-padding-y: 0.5rem;
+ --bs-dropdown-spacer: 0.125rem;
+ --bs-dropdown-font-size: 1rem;
+ --bs-dropdown-color: var(--bs-body-color);
+ --bs-dropdown-bg: var(--bs-body-bg);
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-border-radius: var(--bs-border-radius);
+ --bs-dropdown-border-width: var(--bs-border-width);
+ --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-divider-margin-y: 0.5rem;
+ --bs-dropdown-box-shadow: var(--bs-box-shadow);
+ --bs-dropdown-link-color: var(--bs-body-color);
+ --bs-dropdown-link-hover-color: var(--bs-body-color);
+ --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #446e9b;
+ --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);
+ --bs-dropdown-item-padding-x: 1rem;
+ --bs-dropdown-item-padding-y: 0.25rem;
+ --bs-dropdown-header-color: #777;
+ --bs-dropdown-header-padding-x: 1rem;
+ --bs-dropdown-header-padding-y: 0.5rem;
+ position: absolute;
+ z-index: var(--bs-dropdown-zindex);
+ display: none;
+ min-width: var(--bs-dropdown-min-width);
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
+ margin: 0;
+ font-size: var(--bs-dropdown-font-size);
+ color: var(--bs-dropdown-color);
+ text-align: left;
+ list-style: none;
+ background-color: var(--bs-dropdown-bg);
+ background-clip: padding-box;
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
+ border-radius: var(--bs-dropdown-border-radius);
+}
+.dropdown-menu[data-bs-popper] {
+ top: 100%;
+ left: 0;
+ margin-top: var(--bs-dropdown-spacer);
+}
+
+.dropdown-menu-start {
+ --bs-position: start;
+}
+.dropdown-menu-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+}
+
+.dropdown-menu-end {
+ --bs-position: end;
+}
+.dropdown-menu-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+}
+
+@media (min-width: 576px) {
+ .dropdown-menu-sm-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-sm-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-sm-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-sm-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 768px) {
+ .dropdown-menu-md-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-md-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-md-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-md-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 992px) {
+ .dropdown-menu-lg-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-lg-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-lg-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-lg-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1200px) {
+ .dropdown-menu-xl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+@media (min-width: 1400px) {
+ .dropdown-menu-xxl-start {
+ --bs-position: start;
+ }
+ .dropdown-menu-xxl-start[data-bs-popper] {
+ right: auto;
+ left: 0;
+ }
+ .dropdown-menu-xxl-end {
+ --bs-position: end;
+ }
+ .dropdown-menu-xxl-end[data-bs-popper] {
+ right: 0;
+ left: auto;
+ }
+}
+.dropup .dropdown-menu[data-bs-popper] {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: var(--bs-dropdown-spacer);
+}
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0;
+ border-right: 0.3em solid transparent;
+ border-bottom: 0.3em solid;
+ border-left: 0.3em solid transparent;
+}
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+
+.dropend .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: var(--bs-dropdown-spacer);
+}
+.dropend .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+.dropend .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropend .dropdown-toggle::after {
+ vertical-align: 0;
+}
+
+.dropstart .dropdown-menu[data-bs-popper] {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: var(--bs-dropdown-spacer);
+}
+.dropstart .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+}
+.dropstart .dropdown-toggle::after {
+ display: none;
+}
+.dropstart .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: 0.255em;
+ vertical-align: 0.255em;
+ content: "";
+ border-top: 0.3em solid transparent;
+ border-right: 0.3em solid;
+ border-bottom: 0.3em solid transparent;
+}
+.dropstart .dropdown-toggle:empty::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle::before {
+ vertical-align: 0;
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: var(--bs-dropdown-divider-margin-y) 0;
+ overflow: hidden;
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
+ opacity: 1;
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ clear: both;
+ font-weight: 400;
+ color: var(--bs-dropdown-link-color);
+ text-align: inherit;
+ text-decoration: none;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0;
+ border-radius: var(--bs-dropdown-item-border-radius, 0);
+}
+.dropdown-item:hover, .dropdown-item:focus {
+ color: var(--bs-dropdown-link-hover-color);
+ background-color: var(--bs-dropdown-link-hover-bg);
+}
+.dropdown-item.active, .dropdown-item:active {
+ color: var(--bs-dropdown-link-active-color);
+ text-decoration: none;
+ background-color: var(--bs-dropdown-link-active-bg);
+}
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: var(--bs-dropdown-link-disabled-color);
+ pointer-events: none;
+ background-color: transparent;
+}
+
+.dropdown-menu.show {
+ display: block;
+}
+
+.dropdown-header {
+ display: block;
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: var(--bs-dropdown-header-color);
+ white-space: nowrap;
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
+ color: var(--bs-dropdown-link-color);
+}
+
+.dropdown-menu-dark {
+ --bs-dropdown-color: #dee2e6;
+ --bs-dropdown-bg: #333;
+ --bs-dropdown-border-color: var(--bs-border-color-translucent);
+ --bs-dropdown-box-shadow: ;
+ --bs-dropdown-link-color: #dee2e6;
+ --bs-dropdown-link-hover-color: #fff;
+ --bs-dropdown-divider-bg: var(--bs-border-color-translucent);
+ --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);
+ --bs-dropdown-link-active-color: #fff;
+ --bs-dropdown-link-active-bg: #446e9b;
+ --bs-dropdown-link-disabled-color: #999;
+ --bs-dropdown-header-color: #999;
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ flex: 1 1 auto;
+}
+.btn-group > .btn-check:checked + .btn,
+.btn-group > .btn-check:focus + .btn,
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn-check:checked + .btn,
+.btn-group-vertical > .btn-check:focus + .btn,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 1;
+}
+
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+}
+.btn-toolbar .input-group {
+ width: auto;
+}
+
+.btn-group {
+ border-radius: var(--bs-border-radius);
+}
+.btn-group > :not(.btn-check:first-child) + .btn,
+.btn-group > .btn-group:not(:first-child) {
+ margin-left: calc(var(--bs-border-width) * -1);
+}
+.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group > .btn.dropdown-toggle-split:first-child,
+.btn-group > .btn-group:not(:last-child) > .btn {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn:nth-child(n+3),
+.btn-group > :not(.btn-check) + .btn,
+.btn-group > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.dropdown-toggle-split {
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
+}
+.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {
+ margin-left: 0;
+}
+.dropstart .dropdown-toggle-split::before {
+ margin-right: 0;
+}
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
+}
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
+}
+
+.btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group {
+ width: 100%;
+}
+.btn-group-vertical > .btn:not(:first-child),
+.btn-group-vertical > .btn-group:not(:first-child) {
+ margin-top: calc(var(--bs-border-width) * -1);
+}
+.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
+.btn-group-vertical > .btn-group:not(:last-child) > .btn {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn ~ .btn,
+.btn-group-vertical > .btn-group:not(:first-child) > .btn {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.nav {
+ --bs-nav-link-padding-x: 1rem;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-font-weight: ;
+ --bs-nav-link-color: var(--bs-link-color);
+ --bs-nav-link-hover-color: var(--bs-link-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-secondary-color);
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+
+.nav-link {
+ display: block;
+ padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);
+ font-size: var(--bs-nav-link-font-size);
+ font-weight: var(--bs-nav-link-font-weight);
+ color: var(--bs-nav-link-color);
+ text-decoration: none;
+ background: none;
+ border: 0;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .nav-link {
+ transition: none;
+ }
+}
+.nav-link:hover, .nav-link:focus {
+ color: var(--bs-nav-link-hover-color);
+}
+.nav-link:focus-visible {
+ outline: 0;
+ box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+}
+.nav-link.disabled, .nav-link:disabled {
+ color: var(--bs-nav-link-disabled-color);
+ pointer-events: none;
+ cursor: default;
+}
+
+.nav-tabs {
+ --bs-nav-tabs-border-width: var(--bs-border-width);
+ --bs-nav-tabs-border-color: var(--bs-border-color);
+ --bs-nav-tabs-border-radius: var(--bs-border-radius);
+ --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);
+ --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);
+ --bs-nav-tabs-link-active-bg: var(--bs-body-bg);
+ --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);
+ border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);
+}
+.nav-tabs .nav-link {
+ margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));
+ border: var(--bs-nav-tabs-border-width) solid transparent;
+ border-top-left-radius: var(--bs-nav-tabs-border-radius);
+ border-top-right-radius: var(--bs-nav-tabs-border-radius);
+}
+.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {
+ isolation: isolate;
+ border-color: var(--bs-nav-tabs-link-hover-border-color);
+}
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: var(--bs-nav-tabs-link-active-color);
+ background-color: var(--bs-nav-tabs-link-active-bg);
+ border-color: var(--bs-nav-tabs-link-active-border-color);
+}
+.nav-tabs .dropdown-menu {
+ margin-top: calc(-1 * var(--bs-nav-tabs-border-width));
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.nav-pills {
+ --bs-nav-pills-border-radius: var(--bs-border-radius);
+ --bs-nav-pills-link-active-color: #fff;
+ --bs-nav-pills-link-active-bg: #446e9b;
+}
+.nav-pills .nav-link {
+ border-radius: var(--bs-nav-pills-border-radius);
+}
+.nav-pills .nav-link.active,
+.nav-pills .show > .nav-link {
+ color: var(--bs-nav-pills-link-active-color);
+ background-color: var(--bs-nav-pills-link-active-bg);
+}
+
+.nav-underline {
+ --bs-nav-underline-gap: 1rem;
+ --bs-nav-underline-border-width: 0.125rem;
+ --bs-nav-underline-link-active-color: var(--bs-emphasis-color);
+ gap: var(--bs-nav-underline-gap);
+}
+.nav-underline .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+ border-bottom: var(--bs-nav-underline-border-width) solid transparent;
+}
+.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {
+ border-bottom-color: currentcolor;
+}
+.nav-underline .nav-link.active,
+.nav-underline .show > .nav-link {
+ font-weight: 700;
+ color: var(--bs-nav-underline-link-active-color);
+ border-bottom-color: currentcolor;
+}
+
+.nav-fill > .nav-link,
+.nav-fill .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+}
+
+.nav-justified > .nav-link,
+.nav-justified .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+}
+
+.nav-fill .nav-item .nav-link,
+.nav-justified .nav-item .nav-link {
+ width: 100%;
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+
+.navbar {
+ --bs-navbar-padding-x: 0;
+ --bs-navbar-padding-y: 0.5rem;
+ --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);
+ --bs-navbar-hover-color: #3399f3;
+ --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);
+ --bs-navbar-active-color: #3399f3;
+ --bs-navbar-brand-padding-y: 0.3125rem;
+ --bs-navbar-brand-margin-end: 1rem;
+ --bs-navbar-brand-font-size: 1.25rem;
+ --bs-navbar-brand-color: #3399f3;
+ --bs-navbar-brand-hover-color: #3399f3;
+ --bs-navbar-nav-link-padding-x: 0.5rem;
+ --bs-navbar-toggler-padding-y: 0.25rem;
+ --bs-navbar-toggler-padding-x: 0.75rem;
+ --bs-navbar-toggler-font-size: 1.25rem;
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28119, 119, 119, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);
+ --bs-navbar-toggler-border-radius: var(--bs-border-radius);
+ --bs-navbar-toggler-focus-width: 0.25rem;
+ --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;
+ position: relative;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);
+}
+.navbar > .container,
+.navbar > .container-fluid,
+.navbar > .container-sm,
+.navbar > .container-md,
+.navbar > .container-lg,
+.navbar > .container-xl,
+.navbar > .container-xxl {
+ display: flex;
+ flex-wrap: inherit;
+ align-items: center;
+ justify-content: space-between;
+}
+.navbar-brand {
+ padding-top: var(--bs-navbar-brand-padding-y);
+ padding-bottom: var(--bs-navbar-brand-padding-y);
+ margin-right: var(--bs-navbar-brand-margin-end);
+ font-size: var(--bs-navbar-brand-font-size);
+ color: var(--bs-navbar-brand-color);
+ text-decoration: none;
+ white-space: nowrap;
+}
+.navbar-brand:hover, .navbar-brand:focus {
+ color: var(--bs-navbar-brand-hover-color);
+}
+
+.navbar-nav {
+ --bs-nav-link-padding-x: 0;
+ --bs-nav-link-padding-y: 0.5rem;
+ --bs-nav-link-font-weight: ;
+ --bs-nav-link-color: var(--bs-navbar-color);
+ --bs-nav-link-hover-color: var(--bs-navbar-hover-color);
+ --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+}
+.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {
+ color: var(--bs-navbar-active-color);
+}
+.navbar-nav .dropdown-menu {
+ position: static;
+}
+
+.navbar-text {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+ color: var(--bs-navbar-color);
+}
+.navbar-text a,
+.navbar-text a:hover,
+.navbar-text a:focus {
+ color: var(--bs-navbar-active-color);
+}
+
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ align-items: center;
+}
+
+.navbar-toggler {
+ padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);
+ font-size: var(--bs-navbar-toggler-font-size);
+ line-height: 1;
+ color: var(--bs-navbar-color);
+ background-color: transparent;
+ border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);
+ border-radius: var(--bs-navbar-toggler-border-radius);
+ transition: var(--bs-navbar-toggler-transition);
+}
+@media (prefers-reduced-motion: reduce) {
+ .navbar-toggler {
+ transition: none;
+ }
+}
+.navbar-toggler:hover {
+ text-decoration: none;
+}
+.navbar-toggler:focus {
+ text-decoration: none;
+ outline: 0;
+ box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);
+}
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ background-image: var(--bs-navbar-toggler-icon-bg);
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 100%;
+}
+
+.navbar-nav-scroll {
+ max-height: var(--bs-scroll-height, 75vh);
+ overflow-y: auto;
+}
+
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+ .navbar-expand-sm .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-sm .navbar-toggler {
+ display: none;
+ }
+ .navbar-expand-sm .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+ .navbar-expand-sm .offcanvas .offcanvas-header {
+ display: none;
+ }
+ .navbar-expand-sm .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-expand-md {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+ .navbar-expand-md .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
+ }
+ .navbar-expand-md .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+ .navbar-expand-md .offcanvas .offcanvas-header {
+ display: none;
+ }
+ .navbar-expand-md .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+@media (min-width: 992px) {
+ .navbar-expand-lg {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+ .navbar-expand-lg .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
+ }
+ .navbar-expand-lg .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+ .navbar-expand-lg .offcanvas .offcanvas-header {
+ display: none;
+ }
+ .navbar-expand-lg .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+ .navbar-expand-xl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
+ }
+ .navbar-expand-xl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+ .navbar-expand-xl .offcanvas .offcanvas-header {
+ display: none;
+ }
+ .navbar-expand-xl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+@media (min-width: 1400px) {
+ .navbar-expand-xxl {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xxl .navbar-nav {
+ flex-direction: row;
+ }
+ .navbar-expand-xxl .navbar-nav .dropdown-menu {
+ position: absolute;
+ }
+ .navbar-expand-xxl .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+ }
+ .navbar-expand-xxl .navbar-nav-scroll {
+ overflow: visible;
+ }
+ .navbar-expand-xxl .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+ }
+ .navbar-expand-xxl .navbar-toggler {
+ display: none;
+ }
+ .navbar-expand-xxl .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+ }
+ .navbar-expand-xxl .offcanvas .offcanvas-header {
+ display: none;
+ }
+ .navbar-expand-xxl .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
+}
+.navbar-expand {
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+}
+.navbar-expand .navbar-nav {
+ flex-direction: row;
+}
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute;
+}
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: var(--bs-navbar-nav-link-padding-x);
+ padding-left: var(--bs-navbar-nav-link-padding-x);
+}
+.navbar-expand .navbar-nav-scroll {
+ overflow: visible;
+}
+.navbar-expand .navbar-collapse {
+ display: flex !important;
+ flex-basis: auto;
+}
+.navbar-expand .navbar-toggler {
+ display: none;
+}
+.navbar-expand .offcanvas {
+ position: static;
+ z-index: auto;
+ flex-grow: 1;
+ width: auto !important;
+ height: auto !important;
+ visibility: visible !important;
+ background-color: transparent !important;
+ border: 0 !important;
+ transform: none !important;
+ transition: none;
+}
+.navbar-expand .offcanvas .offcanvas-header {
+ display: none;
+}
+.navbar-expand .offcanvas .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+}
+
+.navbar-dark,
+.navbar[data-bs-theme=dark] {
+ --bs-navbar-color: rgba(255, 255, 255, 0.55);
+ --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);
+ --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);
+ --bs-navbar-active-color: #fff;
+ --bs-navbar-brand-color: #fff;
+ --bs-navbar-brand-hover-color: #fff;
+ --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+[data-bs-theme=dark] .navbar-toggler-icon {
+ --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+}
+
+.card {
+ --bs-card-spacer-y: 1rem;
+ --bs-card-spacer-x: 1rem;
+ --bs-card-title-spacer-y: 0.5rem;
+ --bs-card-title-color: ;
+ --bs-card-subtitle-color: ;
+ --bs-card-border-width: var(--bs-border-width);
+ --bs-card-border-color: var(--bs-border-color-translucent);
+ --bs-card-border-radius: var(--bs-border-radius);
+ --bs-card-box-shadow: ;
+ --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));
+ --bs-card-cap-padding-y: 0.5rem;
+ --bs-card-cap-padding-x: 1rem;
+ --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);
+ --bs-card-cap-color: ;
+ --bs-card-height: ;
+ --bs-card-color: ;
+ --bs-card-bg: var(--bs-body-bg);
+ --bs-card-img-overlay-padding: 1rem;
+ --bs-card-group-margin: 0.75rem;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ height: var(--bs-card-height);
+ color: var(--bs-body-color);
+ word-wrap: break-word;
+ background-color: var(--bs-card-bg);
+ background-clip: border-box;
+ border: var(--bs-card-border-width) solid var(--bs-card-border-color);
+ border-radius: var(--bs-card-border-radius);
+}
+.card > hr {
+ margin-right: 0;
+ margin-left: 0;
+}
+.card > .list-group {
+ border-top: inherit;
+ border-bottom: inherit;
+}
+.card > .list-group:first-child {
+ border-top-width: 0;
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+.card > .list-group:last-child {
+ border-bottom-width: 0;
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+.card > .card-header + .list-group,
+.card > .list-group + .card-footer {
+ border-top: 0;
+}
+
+.card-body {
+ flex: 1 1 auto;
+ padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);
+ color: var(--bs-card-color);
+}
+
+.card-title {
+ margin-bottom: var(--bs-card-title-spacer-y);
+ color: var(--bs-card-title-color);
+}
+
+.card-subtitle {
+ margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));
+ margin-bottom: 0;
+ color: var(--bs-card-subtitle-color);
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link + .card-link {
+ margin-left: var(--bs-card-spacer-x);
+}
+
+.card-header {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ margin-bottom: 0;
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+.card-header:first-child {
+ border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;
+}
+
+.card-footer {
+ padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);
+ color: var(--bs-card-cap-color);
+ background-color: var(--bs-card-cap-bg);
+ border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);
+}
+.card-footer:last-child {
+ border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);
+}
+
+.card-header-tabs {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+ border-bottom: 0;
+}
+.card-header-tabs .nav-link.active {
+ background-color: var(--bs-card-bg);
+ border-bottom-color: var(--bs-card-bg);
+}
+
+.card-header-pills {
+ margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));
+ margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: var(--bs-card-img-overlay-padding);
+ border-radius: var(--bs-card-inner-border-radius);
+}
+
+.card-img,
+.card-img-top,
+.card-img-bottom {
+ width: 100%;
+}
+
+.card-img,
+.card-img-top {
+ border-top-left-radius: var(--bs-card-inner-border-radius);
+ border-top-right-radius: var(--bs-card-inner-border-radius);
+}
+
+.card-img,
+.card-img-bottom {
+ border-bottom-right-radius: var(--bs-card-inner-border-radius);
+ border-bottom-left-radius: var(--bs-card-inner-border-radius);
+}
+
+.card-group > .card {
+ margin-bottom: var(--bs-card-group-margin);
+}
+@media (min-width: 576px) {
+ .card-group {
+ display: flex;
+ 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;
+ }
+}
+
+.accordion {
+ --bs-accordion-color: var(--bs-body-color);
+ --bs-accordion-bg: var(--bs-body-bg);
+ --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
+ --bs-accordion-border-color: var(--bs-border-color);
+ --bs-accordion-border-width: var(--bs-border-width);
+ --bs-accordion-border-radius: var(--bs-border-radius);
+ --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));
+ --bs-accordion-btn-padding-x: 1.25rem;
+ --bs-accordion-btn-padding-y: 1rem;
+ --bs-accordion-btn-color: var(--bs-body-color);
+ --bs-accordion-btn-bg: var(--bs-accordion-bg);
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23777' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");
+ --bs-accordion-btn-icon-width: 1.25rem;
+ --bs-accordion-btn-icon-transform: rotate(-180deg);
+ --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%231b2c3e' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");
+ --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+ --bs-accordion-body-padding-x: 1.25rem;
+ --bs-accordion-body-padding-y: 1rem;
+ --bs-accordion-active-color: var(--bs-primary-text-emphasis);
+ --bs-accordion-active-bg: var(--bs-primary-bg-subtle);
+}
+
+.accordion-button {
+ position: relative;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);
+ font-size: 1rem;
+ color: var(--bs-accordion-btn-color);
+ text-align: left;
+ background-color: var(--bs-accordion-btn-bg);
+ border: 0;
+ border-radius: 0;
+ overflow-anchor: none;
+ transition: var(--bs-accordion-transition);
+}
+@media (prefers-reduced-motion: reduce) {
+ .accordion-button {
+ transition: none;
+ }
+}
+.accordion-button:not(.collapsed) {
+ color: var(--bs-accordion-active-color);
+ background-color: var(--bs-accordion-active-bg);
+ box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);
+}
+.accordion-button:not(.collapsed)::after {
+ background-image: var(--bs-accordion-btn-active-icon);
+ transform: var(--bs-accordion-btn-icon-transform);
+}
+.accordion-button::after {
+ flex-shrink: 0;
+ width: var(--bs-accordion-btn-icon-width);
+ height: var(--bs-accordion-btn-icon-width);
+ margin-left: auto;
+ content: "";
+ background-image: var(--bs-accordion-btn-icon);
+ background-repeat: no-repeat;
+ background-size: var(--bs-accordion-btn-icon-width);
+ transition: var(--bs-accordion-btn-icon-transition);
+}
+@media (prefers-reduced-motion: reduce) {
+ .accordion-button::after {
+ transition: none;
+ }
+}
+.accordion-button:hover {
+ z-index: 2;
+}
+.accordion-button:focus {
+ z-index: 3;
+ outline: 0;
+ box-shadow: var(--bs-accordion-btn-focus-box-shadow);
+}
+
+.accordion-header {
+ margin-bottom: 0;
+}
+
+.accordion-item {
+ color: var(--bs-accordion-color);
+ background-color: var(--bs-accordion-bg);
+ border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);
+}
+.accordion-item:first-of-type {
+ border-top-left-radius: var(--bs-accordion-border-radius);
+ border-top-right-radius: var(--bs-accordion-border-radius);
+}
+.accordion-item:first-of-type > .accordion-header .accordion-button {
+ border-top-left-radius: var(--bs-accordion-inner-border-radius);
+ border-top-right-radius: var(--bs-accordion-inner-border-radius);
+}
+.accordion-item:not(:first-of-type) {
+ border-top: 0;
+}
+.accordion-item:last-of-type {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {
+ border-bottom-right-radius: var(--bs-accordion-inner-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-inner-border-radius);
+}
+.accordion-item:last-of-type > .accordion-collapse {
+ border-bottom-right-radius: var(--bs-accordion-border-radius);
+ border-bottom-left-radius: var(--bs-accordion-border-radius);
+}
+
+.accordion-body {
+ padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
+}
+
+.accordion-flush > .accordion-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+.accordion-flush > .accordion-item:first-child {
+ border-top: 0;
+}
+.accordion-flush > .accordion-item:last-child {
+ border-bottom: 0;
+}
+.accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {
+ border-radius: 0;
+}
+.accordion-flush > .accordion-item > .accordion-collapse {
+ border-radius: 0;
+}
+
+[data-bs-theme=dark] .accordion-button::after {
+ --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238fa8c3'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+ --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238fa8c3'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
+}
+
+.breadcrumb {
+ --bs-breadcrumb-padding-x: 0;
+ --bs-breadcrumb-padding-y: 0;
+ --bs-breadcrumb-margin-bottom: 1rem;
+ --bs-breadcrumb-bg: ;
+ --bs-breadcrumb-border-radius: ;
+ --bs-breadcrumb-divider-color: var(--bs-secondary-color);
+ --bs-breadcrumb-item-padding-x: 0.5rem;
+ --bs-breadcrumb-item-active-color: var(--bs-secondary-color);
+ display: flex;
+ flex-wrap: wrap;
+ padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);
+ margin-bottom: var(--bs-breadcrumb-margin-bottom);
+ font-size: var(--bs-breadcrumb-font-size);
+ list-style: none;
+ background-color: var(--bs-breadcrumb-bg);
+ border-radius: var(--bs-breadcrumb-border-radius);
+}
+
+.breadcrumb-item + .breadcrumb-item {
+ padding-left: var(--bs-breadcrumb-item-padding-x);
+}
+.breadcrumb-item + .breadcrumb-item::before {
+ float: left;
+ padding-right: var(--bs-breadcrumb-item-padding-x);
+ color: var(--bs-breadcrumb-divider-color);
+ content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */;
+}
+.breadcrumb-item.active {
+ color: var(--bs-breadcrumb-item-active-color);
+}
+
+.pagination {
+ --bs-pagination-padding-x: 0.75rem;
+ --bs-pagination-padding-y: 0.375rem;
+ --bs-pagination-font-size: 1rem;
+ --bs-pagination-color: var(--bs-link-color);
+ --bs-pagination-bg: var(--bs-body-bg);
+ --bs-pagination-border-width: var(--bs-border-width);
+ --bs-pagination-border-color: var(--bs-border-color);
+ --bs-pagination-border-radius: var(--bs-border-radius);
+ --bs-pagination-hover-color: var(--bs-link-hover-color);
+ --bs-pagination-hover-bg: var(--bs-tertiary-bg);
+ --bs-pagination-hover-border-color: var(--bs-border-color);
+ --bs-pagination-focus-color: var(--bs-link-hover-color);
+ --bs-pagination-focus-bg: var(--bs-secondary-bg);
+ --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+ --bs-pagination-active-color: #fff;
+ --bs-pagination-active-bg: #446e9b;
+ --bs-pagination-active-border-color: #446e9b;
+ --bs-pagination-disabled-color: var(--bs-secondary-color);
+ --bs-pagination-disabled-bg: var(--bs-secondary-bg);
+ --bs-pagination-disabled-border-color: var(--bs-border-color);
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);
+ font-size: var(--bs-pagination-font-size);
+ color: var(--bs-pagination-color);
+ text-decoration: none;
+ background-color: var(--bs-pagination-bg);
+ border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .page-link {
+ transition: none;
+ }
+}
+.page-link:hover {
+ z-index: 2;
+ color: var(--bs-pagination-hover-color);
+ background-color: var(--bs-pagination-hover-bg);
+ border-color: var(--bs-pagination-hover-border-color);
+}
+.page-link:focus {
+ z-index: 3;
+ color: var(--bs-pagination-focus-color);
+ background-color: var(--bs-pagination-focus-bg);
+ outline: 0;
+ box-shadow: var(--bs-pagination-focus-box-shadow);
+}
+.page-link.active, .active > .page-link {
+ z-index: 3;
+ color: var(--bs-pagination-active-color);
+ background-color: var(--bs-pagination-active-bg);
+ border-color: var(--bs-pagination-active-border-color);
+}
+.page-link.disabled, .disabled > .page-link {
+ color: var(--bs-pagination-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-pagination-disabled-bg);
+ border-color: var(--bs-pagination-disabled-border-color);
+}
+
+.page-item:not(:first-child) .page-link {
+ margin-left: calc(var(--bs-border-width) * -1);
+}
+.page-item:first-child .page-link {
+ border-top-left-radius: var(--bs-pagination-border-radius);
+ border-bottom-left-radius: var(--bs-pagination-border-radius);
+}
+.page-item:last-child .page-link {
+ border-top-right-radius: var(--bs-pagination-border-radius);
+ border-bottom-right-radius: var(--bs-pagination-border-radius);
+}
+
+.pagination-lg {
+ --bs-pagination-padding-x: 1.5rem;
+ --bs-pagination-padding-y: 0.75rem;
+ --bs-pagination-font-size: 1.25rem;
+ --bs-pagination-border-radius: var(--bs-border-radius-lg);
+}
+
+.pagination-sm {
+ --bs-pagination-padding-x: 0.5rem;
+ --bs-pagination-padding-y: 0.25rem;
+ --bs-pagination-font-size: 0.875rem;
+ --bs-pagination-border-radius: var(--bs-border-radius-sm);
+}
+
+.badge {
+ --bs-badge-padding-x: 0.65em;
+ --bs-badge-padding-y: 0.35em;
+ --bs-badge-font-size: 0.75em;
+ --bs-badge-font-weight: 700;
+ --bs-badge-color: #fff;
+ --bs-badge-border-radius: var(--bs-border-radius);
+ display: inline-block;
+ padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);
+ font-size: var(--bs-badge-font-size);
+ font-weight: var(--bs-badge-font-weight);
+ line-height: 1;
+ color: var(--bs-badge-color);
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: var(--bs-badge-border-radius);
+}
+.badge:empty {
+ display: none;
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.alert {
+ --bs-alert-bg: transparent;
+ --bs-alert-padding-x: 1rem;
+ --bs-alert-padding-y: 1rem;
+ --bs-alert-margin-bottom: 1rem;
+ --bs-alert-color: inherit;
+ --bs-alert-border-color: transparent;
+ --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);
+ --bs-alert-border-radius: var(--bs-border-radius);
+ --bs-alert-link-color: inherit;
+ position: relative;
+ padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
+ margin-bottom: var(--bs-alert-margin-bottom);
+ color: var(--bs-alert-color);
+ background-color: var(--bs-alert-bg);
+ border: var(--bs-alert-border);
+ border-radius: var(--bs-alert-border-radius);
+}
+
+.alert-heading {
+ color: inherit;
+}
+
+.alert-link {
+ font-weight: 700;
+ color: var(--bs-alert-link-color);
+}
+
+.alert-dismissible {
+ padding-right: 3rem;
+}
+.alert-dismissible .btn-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ padding: 1.25rem 1rem;
+}
+
+.alert-primary {
+ --bs-alert-color: var(--bs-primary-text-emphasis);
+ --bs-alert-bg: var(--bs-primary-bg-subtle);
+ --bs-alert-border-color: var(--bs-primary-border-subtle);
+ --bs-alert-link-color: var(--bs-primary-text-emphasis);
+}
+
+.alert-secondary {
+ --bs-alert-color: var(--bs-secondary-text-emphasis);
+ --bs-alert-bg: var(--bs-secondary-bg-subtle);
+ --bs-alert-border-color: var(--bs-secondary-border-subtle);
+ --bs-alert-link-color: var(--bs-secondary-text-emphasis);
+}
+
+.alert-success {
+ --bs-alert-color: var(--bs-success-text-emphasis);
+ --bs-alert-bg: var(--bs-success-bg-subtle);
+ --bs-alert-border-color: var(--bs-success-border-subtle);
+ --bs-alert-link-color: var(--bs-success-text-emphasis);
+}
+
+.alert-info {
+ --bs-alert-color: var(--bs-info-text-emphasis);
+ --bs-alert-bg: var(--bs-info-bg-subtle);
+ --bs-alert-border-color: var(--bs-info-border-subtle);
+ --bs-alert-link-color: var(--bs-info-text-emphasis);
+}
+
+.alert-warning {
+ --bs-alert-color: var(--bs-warning-text-emphasis);
+ --bs-alert-bg: var(--bs-warning-bg-subtle);
+ --bs-alert-border-color: var(--bs-warning-border-subtle);
+ --bs-alert-link-color: var(--bs-warning-text-emphasis);
+}
+
+.alert-danger {
+ --bs-alert-color: var(--bs-danger-text-emphasis);
+ --bs-alert-bg: var(--bs-danger-bg-subtle);
+ --bs-alert-border-color: var(--bs-danger-border-subtle);
+ --bs-alert-link-color: var(--bs-danger-text-emphasis);
+}
+
+.alert-light {
+ --bs-alert-color: var(--bs-light-text-emphasis);
+ --bs-alert-bg: var(--bs-light-bg-subtle);
+ --bs-alert-border-color: var(--bs-light-border-subtle);
+ --bs-alert-link-color: var(--bs-light-text-emphasis);
+}
+
+.alert-dark {
+ --bs-alert-color: var(--bs-dark-text-emphasis);
+ --bs-alert-bg: var(--bs-dark-bg-subtle);
+ --bs-alert-border-color: var(--bs-dark-border-subtle);
+ --bs-alert-link-color: var(--bs-dark-text-emphasis);
+}
+
+@keyframes progress-bar-stripes {
+ 0% {
+ background-position-x: 1rem;
+ }
+}
+.progress,
+.progress-stacked {
+ --bs-progress-height: 1rem;
+ --bs-progress-font-size: 0.75rem;
+ --bs-progress-bg: var(--bs-secondary-bg);
+ --bs-progress-border-radius: var(--bs-border-radius);
+ --bs-progress-box-shadow: var(--bs-box-shadow-inset);
+ --bs-progress-bar-color: #fff;
+ --bs-progress-bar-bg: #446e9b;
+ --bs-progress-bar-transition: width 0.6s ease;
+ display: flex;
+ height: var(--bs-progress-height);
+ overflow: hidden;
+ font-size: var(--bs-progress-font-size);
+ background-color: var(--bs-progress-bg);
+ border-radius: var(--bs-progress-border-radius);
+}
+
+.progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ overflow: hidden;
+ color: var(--bs-progress-bar-color);
+ text-align: center;
+ white-space: nowrap;
+ background-color: var(--bs-progress-bar-bg);
+ transition: var(--bs-progress-bar-transition);
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar {
+ transition: none;
+ }
+}
+
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-size: var(--bs-progress-height) var(--bs-progress-height);
+}
+
+.progress-stacked > .progress {
+ overflow: visible;
+}
+
+.progress-stacked > .progress > .progress-bar {
+ width: 100%;
+}
+
+.progress-bar-animated {
+ animation: 1s linear infinite progress-bar-stripes;
+}
+@media (prefers-reduced-motion: reduce) {
+ .progress-bar-animated {
+ animation: none;
+ }
+}
+
+.list-group {
+ --bs-list-group-color: var(--bs-body-color);
+ --bs-list-group-bg: var(--bs-body-bg);
+ --bs-list-group-border-color: var(--bs-border-color);
+ --bs-list-group-border-width: var(--bs-border-width);
+ --bs-list-group-border-radius: var(--bs-border-radius);
+ --bs-list-group-item-padding-x: 1rem;
+ --bs-list-group-item-padding-y: 0.5rem;
+ --bs-list-group-action-color: var(--bs-secondary-color);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);
+ --bs-list-group-action-active-color: var(--bs-body-color);
+ --bs-list-group-action-active-bg: var(--bs-secondary-bg);
+ --bs-list-group-disabled-color: var(--bs-secondary-color);
+ --bs-list-group-disabled-bg: var(--bs-body-bg);
+ --bs-list-group-active-color: #fff;
+ --bs-list-group-active-bg: #446e9b;
+ --bs-list-group-active-border-color: #446e9b;
+ display: flex;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ border-radius: var(--bs-list-group-border-radius);
+}
+
+.list-group-numbered {
+ list-style-type: none;
+ counter-reset: section;
+}
+.list-group-numbered > .list-group-item::before {
+ content: counters(section, ".") ". ";
+ counter-increment: section;
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: var(--bs-list-group-action-color);
+ text-align: inherit;
+}
+.list-group-item-action:hover, .list-group-item-action:focus {
+ z-index: 1;
+ color: var(--bs-list-group-action-hover-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-action-hover-bg);
+}
+.list-group-item-action:active {
+ color: var(--bs-list-group-action-active-color);
+ background-color: var(--bs-list-group-action-active-bg);
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);
+ color: var(--bs-list-group-color);
+ text-decoration: none;
+ background-color: var(--bs-list-group-bg);
+ border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);
+}
+.list-group-item:first-child {
+ border-top-left-radius: inherit;
+ border-top-right-radius: inherit;
+}
+.list-group-item:last-child {
+ border-bottom-right-radius: inherit;
+ border-bottom-left-radius: inherit;
+}
+.list-group-item.disabled, .list-group-item:disabled {
+ color: var(--bs-list-group-disabled-color);
+ pointer-events: none;
+ background-color: var(--bs-list-group-disabled-bg);
+}
+.list-group-item.active {
+ z-index: 2;
+ color: var(--bs-list-group-active-color);
+ background-color: var(--bs-list-group-active-bg);
+ border-color: var(--bs-list-group-active-border-color);
+}
+.list-group-item + .list-group-item {
+ border-top-width: 0;
+}
+.list-group-item + .list-group-item.active {
+ margin-top: calc(-1 * var(--bs-list-group-border-width));
+ border-top-width: var(--bs-list-group-border-width);
+}
+
+.list-group-horizontal {
+ flex-direction: row;
+}
+.list-group-horizontal > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+}
+.list-group-horizontal > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ 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: var(--bs-list-group-border-width);
+ border-left-width: 0;
+}
+.list-group-horizontal > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+}
+
+@media (min-width: 576px) {
+ .list-group-horizontal-sm {
+ flex-direction: row;
+ }
+ .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ 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: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+ .list-group-horizontal-sm > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+@media (min-width: 768px) {
+ .list-group-horizontal-md {
+ flex-direction: row;
+ }
+ .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ 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: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+ .list-group-horizontal-md > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+@media (min-width: 992px) {
+ .list-group-horizontal-lg {
+ flex-direction: row;
+ }
+ .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ 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: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+ .list-group-horizontal-lg > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+@media (min-width: 1200px) {
+ .list-group-horizontal-xl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ 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: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+@media (min-width: 1400px) {
+ .list-group-horizontal-xxl {
+ flex-direction: row;
+ }
+ .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {
+ border-bottom-left-radius: var(--bs-list-group-border-radius);
+ border-top-right-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {
+ border-top-right-radius: var(--bs-list-group-border-radius);
+ border-bottom-left-radius: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item.active {
+ margin-top: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item {
+ border-top-width: var(--bs-list-group-border-width);
+ border-left-width: 0;
+ }
+ .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {
+ margin-left: calc(-1 * var(--bs-list-group-border-width));
+ border-left-width: var(--bs-list-group-border-width);
+ }
+}
+.list-group-flush {
+ border-radius: 0;
+}
+.list-group-flush > .list-group-item {
+ border-width: 0 0 var(--bs-list-group-border-width);
+}
+.list-group-flush > .list-group-item:last-child {
+ border-bottom-width: 0;
+}
+
+.list-group-item-primary {
+ --bs-list-group-color: var(--bs-primary-text-emphasis);
+ --bs-list-group-bg: var(--bs-primary-bg-subtle);
+ --bs-list-group-border-color: var(--bs-primary-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);
+ --bs-list-group-active-color: var(--bs-primary-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-primary-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);
+}
+
+.list-group-item-secondary {
+ --bs-list-group-color: var(--bs-secondary-text-emphasis);
+ --bs-list-group-bg: var(--bs-secondary-bg-subtle);
+ --bs-list-group-border-color: var(--bs-secondary-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);
+ --bs-list-group-active-color: var(--bs-secondary-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);
+}
+
+.list-group-item-success {
+ --bs-list-group-color: var(--bs-success-text-emphasis);
+ --bs-list-group-bg: var(--bs-success-bg-subtle);
+ --bs-list-group-border-color: var(--bs-success-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-success-border-subtle);
+ --bs-list-group-active-color: var(--bs-success-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-success-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-success-text-emphasis);
+}
+
+.list-group-item-info {
+ --bs-list-group-color: var(--bs-info-text-emphasis);
+ --bs-list-group-bg: var(--bs-info-bg-subtle);
+ --bs-list-group-border-color: var(--bs-info-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-info-border-subtle);
+ --bs-list-group-active-color: var(--bs-info-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-info-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-info-text-emphasis);
+}
+
+.list-group-item-warning {
+ --bs-list-group-color: var(--bs-warning-text-emphasis);
+ --bs-list-group-bg: var(--bs-warning-bg-subtle);
+ --bs-list-group-border-color: var(--bs-warning-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);
+ --bs-list-group-active-color: var(--bs-warning-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-warning-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);
+}
+
+.list-group-item-danger {
+ --bs-list-group-color: var(--bs-danger-text-emphasis);
+ --bs-list-group-bg: var(--bs-danger-bg-subtle);
+ --bs-list-group-border-color: var(--bs-danger-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);
+ --bs-list-group-active-color: var(--bs-danger-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-danger-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);
+}
+
+.list-group-item-light {
+ --bs-list-group-color: var(--bs-light-text-emphasis);
+ --bs-list-group-bg: var(--bs-light-bg-subtle);
+ --bs-list-group-border-color: var(--bs-light-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-light-border-subtle);
+ --bs-list-group-active-color: var(--bs-light-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-light-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-light-text-emphasis);
+}
+
+.list-group-item-dark {
+ --bs-list-group-color: var(--bs-dark-text-emphasis);
+ --bs-list-group-bg: var(--bs-dark-bg-subtle);
+ --bs-list-group-border-color: var(--bs-dark-border-subtle);
+ --bs-list-group-action-hover-color: var(--bs-emphasis-color);
+ --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);
+ --bs-list-group-action-active-color: var(--bs-emphasis-color);
+ --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);
+ --bs-list-group-active-color: var(--bs-dark-bg-subtle);
+ --bs-list-group-active-bg: var(--bs-dark-text-emphasis);
+ --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);
+}
+
+.btn-close {
+ --bs-btn-close-color: #000;
+ --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");
+ --bs-btn-close-opacity: 0.5;
+ --bs-btn-close-hover-opacity: 0.75;
+ --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(68, 110, 155, 0.25);
+ --bs-btn-close-focus-opacity: 1;
+ --bs-btn-close-disabled-opacity: 0.25;
+ --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);
+ box-sizing: content-box;
+ width: 1em;
+ height: 1em;
+ padding: 0.25em 0.25em;
+ color: var(--bs-btn-close-color);
+ background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;
+ border: 0;
+ border-radius: 0.375rem;
+ opacity: var(--bs-btn-close-opacity);
+}
+.btn-close:hover {
+ color: var(--bs-btn-close-color);
+ text-decoration: none;
+ opacity: var(--bs-btn-close-hover-opacity);
+}
+.btn-close:focus {
+ outline: 0;
+ box-shadow: var(--bs-btn-close-focus-shadow);
+ opacity: var(--bs-btn-close-focus-opacity);
+}
+.btn-close:disabled, .btn-close.disabled {
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ opacity: var(--bs-btn-close-disabled-opacity);
+}
+
+.btn-close-white {
+ filter: var(--bs-btn-close-white-filter);
+}
+
+[data-bs-theme=dark] .btn-close {
+ filter: var(--bs-btn-close-white-filter);
+}
+
+.toast {
+ --bs-toast-zindex: 1090;
+ --bs-toast-padding-x: 0.75rem;
+ --bs-toast-padding-y: 0.5rem;
+ --bs-toast-spacing: 1.5rem;
+ --bs-toast-max-width: 350px;
+ --bs-toast-font-size: 0.875rem;
+ --bs-toast-color: ;
+ --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);
+ --bs-toast-border-width: var(--bs-border-width);
+ --bs-toast-border-color: var(--bs-border-color-translucent);
+ --bs-toast-border-radius: var(--bs-border-radius);
+ --bs-toast-box-shadow: var(--bs-box-shadow);
+ --bs-toast-header-color: var(--bs-secondary-color);
+ --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);
+ --bs-toast-header-border-color: var(--bs-border-color-translucent);
+ width: var(--bs-toast-max-width);
+ max-width: 100%;
+ font-size: var(--bs-toast-font-size);
+ color: var(--bs-toast-color);
+ pointer-events: auto;
+ background-color: var(--bs-toast-bg);
+ background-clip: padding-box;
+ border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);
+ box-shadow: var(--bs-toast-box-shadow);
+ border-radius: var(--bs-toast-border-radius);
+}
+.toast.showing {
+ opacity: 0;
+}
+.toast:not(.show) {
+ display: none;
+}
+
+.toast-container {
+ --bs-toast-zindex: 1090;
+ position: absolute;
+ z-index: var(--bs-toast-zindex);
+ width: -webkit-max-content;
+ width: -moz-max-content;
+ width: max-content;
+ max-width: 100%;
+ pointer-events: none;
+}
+.toast-container > :not(:last-child) {
+ margin-bottom: var(--bs-toast-spacing);
+}
+
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
+ color: var(--bs-toast-header-color);
+ background-color: var(--bs-toast-header-bg);
+ background-clip: padding-box;
+ border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);
+ border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+ border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));
+}
+.toast-header .btn-close {
+ margin-right: calc(-0.5 * var(--bs-toast-padding-x));
+ margin-left: var(--bs-toast-padding-x);
+}
+
+.toast-body {
+ padding: var(--bs-toast-padding-x);
+ word-wrap: break-word;
+}
+
+.modal {
+ --bs-modal-zindex: 1055;
+ --bs-modal-width: 500px;
+ --bs-modal-padding: 1rem;
+ --bs-modal-margin: 0.5rem;
+ --bs-modal-color: ;
+ --bs-modal-bg: var(--bs-body-bg);
+ --bs-modal-border-color: var(--bs-border-color-translucent);
+ --bs-modal-border-width: var(--bs-border-width);
+ --bs-modal-border-radius: var(--bs-border-radius-lg);
+ --bs-modal-box-shadow: var(--bs-box-shadow-sm);
+ --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));
+ --bs-modal-header-padding-x: 1rem;
+ --bs-modal-header-padding-y: 1rem;
+ --bs-modal-header-padding: 1rem 1rem;
+ --bs-modal-header-border-color: var(--bs-border-color);
+ --bs-modal-header-border-width: var(--bs-border-width);
+ --bs-modal-title-line-height: 1.5;
+ --bs-modal-footer-gap: 0.5rem;
+ --bs-modal-footer-bg: ;
+ --bs-modal-footer-border-color: var(--bs-border-color);
+ --bs-modal-footer-border-width: var(--bs-border-width);
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-modal-zindex);
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ outline: 0;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: var(--bs-modal-margin);
+ pointer-events: none;
+}
+.modal.fade .modal-dialog {
+ transition: transform 0.3s ease-out;
+ transform: translate(0, -50px);
+}
+@media (prefers-reduced-motion: reduce) {
+ .modal.fade .modal-dialog {
+ transition: none;
+ }
+}
+.modal.show .modal-dialog {
+ transform: none;
+}
+.modal.modal-static .modal-dialog {
+ transform: scale(1.02);
+}
+
+.modal-dialog-scrollable {
+ height: calc(100% - var(--bs-modal-margin) * 2);
+}
+.modal-dialog-scrollable .modal-content {
+ max-height: 100%;
+ overflow: hidden;
+}
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto;
+}
+
+.modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - var(--bs-modal-margin) * 2);
+}
+
+.modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ color: var(--bs-modal-color);
+ pointer-events: auto;
+ background-color: var(--bs-modal-bg);
+ background-clip: padding-box;
+ border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);
+ border-radius: var(--bs-modal-border-radius);
+ outline: 0;
+}
+
+.modal-backdrop {
+ --bs-backdrop-zindex: 1050;
+ --bs-backdrop-bg: #000;
+ --bs-backdrop-opacity: 0.5;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: var(--bs-backdrop-zindex);
+ width: 100vw;
+ height: 100vh;
+ background-color: var(--bs-backdrop-bg);
+}
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop.show {
+ opacity: var(--bs-backdrop-opacity);
+}
+
+.modal-header {
+ display: flex;
+ flex-shrink: 0;
+ align-items: center;
+ padding: var(--bs-modal-header-padding);
+ border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);
+ border-top-left-radius: var(--bs-modal-inner-border-radius);
+ border-top-right-radius: var(--bs-modal-inner-border-radius);
+}
+.modal-header .btn-close {
+ padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: var(--bs-modal-title-line-height);
+}
+
+.modal-body {
+ position: relative;
+ flex: 1 1 auto;
+ padding: var(--bs-modal-padding);
+}
+
+.modal-footer {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: flex-end;
+ padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);
+ background-color: var(--bs-modal-footer-bg);
+ border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);
+ border-bottom-right-radius: var(--bs-modal-inner-border-radius);
+ border-bottom-left-radius: var(--bs-modal-inner-border-radius);
+}
+.modal-footer > * {
+ margin: calc(var(--bs-modal-footer-gap) * 0.5);
+}
+
+@media (min-width: 576px) {
+ .modal {
+ --bs-modal-margin: 1.75rem;
+ --bs-modal-box-shadow: var(--bs-box-shadow);
+ }
+ .modal-dialog {
+ max-width: var(--bs-modal-width);
+ margin-right: auto;
+ margin-left: auto;
+ }
+ .modal-sm {
+ --bs-modal-width: 300px;
+ }
+}
+@media (min-width: 992px) {
+ .modal-lg,
+ .modal-xl {
+ --bs-modal-width: 800px;
+ }
+}
+@media (min-width: 1200px) {
+ .modal-xl {
+ --bs-modal-width: 1140px;
+ }
+}
+.modal-fullscreen {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+}
+.modal-fullscreen .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+}
+.modal-fullscreen .modal-header,
+.modal-fullscreen .modal-footer {
+ border-radius: 0;
+}
+.modal-fullscreen .modal-body {
+ overflow-y: auto;
+}
+
+@media (max-width: 575.98px) {
+ .modal-fullscreen-sm-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-sm-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-sm-down .modal-header,
+ .modal-fullscreen-sm-down .modal-footer {
+ border-radius: 0;
+ }
+ .modal-fullscreen-sm-down .modal-body {
+ overflow-y: auto;
+ }
+}
+@media (max-width: 767.98px) {
+ .modal-fullscreen-md-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-md-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-md-down .modal-header,
+ .modal-fullscreen-md-down .modal-footer {
+ border-radius: 0;
+ }
+ .modal-fullscreen-md-down .modal-body {
+ overflow-y: auto;
+ }
+}
+@media (max-width: 991.98px) {
+ .modal-fullscreen-lg-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-lg-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-lg-down .modal-header,
+ .modal-fullscreen-lg-down .modal-footer {
+ border-radius: 0;
+ }
+ .modal-fullscreen-lg-down .modal-body {
+ overflow-y: auto;
+ }
+}
+@media (max-width: 1199.98px) {
+ .modal-fullscreen-xl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-xl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-xl-down .modal-header,
+ .modal-fullscreen-xl-down .modal-footer {
+ border-radius: 0;
+ }
+ .modal-fullscreen-xl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+@media (max-width: 1399.98px) {
+ .modal-fullscreen-xxl-down {
+ width: 100vw;
+ max-width: none;
+ height: 100%;
+ margin: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-content {
+ height: 100%;
+ border: 0;
+ border-radius: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-header,
+ .modal-fullscreen-xxl-down .modal-footer {
+ border-radius: 0;
+ }
+ .modal-fullscreen-xxl-down .modal-body {
+ overflow-y: auto;
+ }
+}
+.tooltip {
+ --bs-tooltip-zindex: 1080;
+ --bs-tooltip-max-width: 200px;
+ --bs-tooltip-padding-x: 0.5rem;
+ --bs-tooltip-padding-y: 0.25rem;
+ --bs-tooltip-margin: ;
+ --bs-tooltip-font-size: 0.875rem;
+ --bs-tooltip-color: var(--bs-body-bg);
+ --bs-tooltip-bg: var(--bs-emphasis-color);
+ --bs-tooltip-border-radius: var(--bs-border-radius);
+ --bs-tooltip-opacity: 0.9;
+ --bs-tooltip-arrow-width: 0.8rem;
+ --bs-tooltip-arrow-height: 0.4rem;
+ z-index: var(--bs-tooltip-zindex);
+ display: block;
+ margin: var(--bs-tooltip-margin);
+ font-family: var(--bs-font-sans-serif);
+ 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;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-tooltip-font-size);
+ word-wrap: break-word;
+ opacity: 0;
+}
+.tooltip.show {
+ opacity: var(--bs-tooltip-opacity);
+}
+.tooltip .tooltip-arrow {
+ display: block;
+ width: var(--bs-tooltip-arrow-width);
+ height: var(--bs-tooltip-arrow-height);
+}
+.tooltip .tooltip-arrow::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {
+ bottom: calc(-1 * var(--bs-tooltip-arrow-height));
+}
+.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {
+ top: -1px;
+ border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-top-color: var(--bs-tooltip-bg);
+}
+
+/* rtl:begin:ignore */
+.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {
+ left: calc(-1 * var(--bs-tooltip-arrow-height));
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {
+ right: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;
+ border-right-color: var(--bs-tooltip-bg);
+}
+
+/* rtl:end:ignore */
+.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {
+ top: calc(-1 * var(--bs-tooltip-arrow-height));
+}
+.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {
+ bottom: -1px;
+ border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-bottom-color: var(--bs-tooltip-bg);
+}
+
+/* rtl:begin:ignore */
+.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {
+ right: calc(-1 * var(--bs-tooltip-arrow-height));
+ width: var(--bs-tooltip-arrow-height);
+ height: var(--bs-tooltip-arrow-width);
+}
+.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {
+ left: -1px;
+ border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);
+ border-left-color: var(--bs-tooltip-bg);
+}
+
+/* rtl:end:ignore */
+.tooltip-inner {
+ max-width: var(--bs-tooltip-max-width);
+ padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);
+ color: var(--bs-tooltip-color);
+ text-align: center;
+ background-color: var(--bs-tooltip-bg);
+ border-radius: var(--bs-tooltip-border-radius);
+}
+
+.popover {
+ --bs-popover-zindex: 1070;
+ --bs-popover-max-width: 276px;
+ --bs-popover-font-size: 0.875rem;
+ --bs-popover-bg: var(--bs-body-bg);
+ --bs-popover-border-width: var(--bs-border-width);
+ --bs-popover-border-color: var(--bs-border-color-translucent);
+ --bs-popover-border-radius: var(--bs-border-radius-lg);
+ --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));
+ --bs-popover-box-shadow: var(--bs-box-shadow);
+ --bs-popover-header-padding-x: 1rem;
+ --bs-popover-header-padding-y: 0.5rem;
+ --bs-popover-header-font-size: 1rem;
+ --bs-popover-header-color: #2d2d2d;
+ --bs-popover-header-bg: var(--bs-secondary-bg);
+ --bs-popover-body-padding-x: 1rem;
+ --bs-popover-body-padding-y: 1rem;
+ --bs-popover-body-color: var(--bs-body-color);
+ --bs-popover-arrow-width: 1rem;
+ --bs-popover-arrow-height: 0.5rem;
+ --bs-popover-arrow-border: var(--bs-popover-border-color);
+ z-index: var(--bs-popover-zindex);
+ display: block;
+ max-width: var(--bs-popover-max-width);
+ font-family: var(--bs-font-sans-serif);
+ 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;
+ white-space: normal;
+ word-spacing: normal;
+ line-break: auto;
+ font-size: var(--bs-popover-font-size);
+ word-wrap: break-word;
+ background-color: var(--bs-popover-bg);
+ background-clip: padding-box;
+ border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-radius: var(--bs-popover-border-radius);
+}
+.popover .popover-arrow {
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ height: var(--bs-popover-arrow-height);
+}
+.popover .popover-arrow::before, .popover .popover-arrow::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ border-width: 0;
+}
+
+.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
+ bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
+ bottom: 0;
+ border-top-color: var(--bs-popover-arrow-border);
+}
+.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
+ bottom: var(--bs-popover-border-width);
+ border-top-color: var(--bs-popover-bg);
+}
+
+/* rtl:begin:ignore */
+.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
+ left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;
+}
+.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
+ left: 0;
+ border-right-color: var(--bs-popover-arrow-border);
+}
+.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
+ left: var(--bs-popover-border-width);
+ border-right-color: var(--bs-popover-bg);
+}
+
+/* rtl:end:ignore */
+.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
+ top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+}
+.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
+ top: 0;
+ border-bottom-color: var(--bs-popover-arrow-border);
+}
+.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
+ top: var(--bs-popover-border-width);
+ border-bottom-color: var(--bs-popover-bg);
+}
+.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: var(--bs-popover-arrow-width);
+ margin-left: calc(-0.5 * var(--bs-popover-arrow-width));
+ content: "";
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);
+}
+
+/* rtl:begin:ignore */
+.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
+ right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));
+ width: var(--bs-popover-arrow-height);
+ height: var(--bs-popover-arrow-width);
+}
+.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);
+}
+.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
+ right: 0;
+ border-left-color: var(--bs-popover-arrow-border);
+}
+.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
+ right: var(--bs-popover-border-width);
+ border-left-color: var(--bs-popover-bg);
+}
+
+/* rtl:end:ignore */
+.popover-header {
+ padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);
+ margin-bottom: 0;
+ font-size: var(--bs-popover-header-font-size);
+ color: var(--bs-popover-header-color);
+ background-color: var(--bs-popover-header-bg);
+ border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);
+ border-top-left-radius: var(--bs-popover-inner-border-radius);
+ border-top-right-radius: var(--bs-popover-inner-border-radius);
+}
+.popover-header:empty {
+ display: none;
+}
+
+.popover-body {
+ padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);
+ color: var(--bs-popover-body-color);
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel.pointer-event {
+ 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: transform 0.6s ease-in-out;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-item {
+ transition: none;
+ }
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: block;
+}
+
+.carousel-item-next:not(.carousel-item-start),
+.active.carousel-item-end {
+ transform: translateX(100%);
+}
+
+.carousel-item-prev:not(.carousel-item-end),
+.active.carousel-item-start {
+ transform: translateX(-100%);
+}
+
+.carousel-fade .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+}
+.carousel-fade .carousel-item.active,
+.carousel-fade .carousel-item-next.carousel-item-start,
+.carousel-fade .carousel-item-prev.carousel-item-end {
+ z-index: 1;
+ opacity: 1;
+}
+.carousel-fade .active.carousel-item-start,
+.carousel-fade .active.carousel-item-end {
+ z-index: 0;
+ opacity: 0;
+ transition: opacity 0s 0.6s;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-fade .active.carousel-item-start,
+ .carousel-fade .active.carousel-item-end {
+ transition: none;
+ }
+}
+
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 15%;
+ padding: 0;
+ color: #fff;
+ text-align: center;
+ background: none;
+ border: 0;
+ opacity: 0.5;
+ transition: opacity 0.15s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-control-prev,
+ .carousel-control-next {
+ transition: none;
+ }
+}
+.carousel-control-prev:hover, .carousel-control-prev:focus,
+.carousel-control-next:hover,
+.carousel-control-next:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: 0.9;
+}
+
+.carousel-control-prev {
+ left: 0;
+}
+
+.carousel-control-next {
+ right: 0;
+}
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ background-repeat: no-repeat;
+ background-position: 50%;
+ background-size: 100% 100%;
+}
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")*/;
+}
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")*/;
+}
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 2;
+ display: flex;
+ justify-content: center;
+ padding: 0;
+ margin-right: 15%;
+ margin-bottom: 1rem;
+ margin-left: 15%;
+}
+.carousel-indicators [data-bs-target] {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ padding: 0;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 0;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: 0.5;
+ transition: opacity 0.6s ease;
+}
+@media (prefers-reduced-motion: reduce) {
+ .carousel-indicators [data-bs-target] {
+ transition: none;
+ }
+}
+.carousel-indicators .active {
+ opacity: 1;
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 1.25rem;
+ left: 15%;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ color: #fff;
+ text-align: center;
+}
+
+.carousel-dark .carousel-control-prev-icon,
+.carousel-dark .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+.carousel-dark .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+.carousel-dark .carousel-caption {
+ color: #000;
+}
+
+[data-bs-theme=dark] .carousel .carousel-control-prev-icon,
+[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon,
+[data-bs-theme=dark].carousel .carousel-control-next-icon {
+ filter: invert(1) grayscale(100);
+}
+[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] {
+ background-color: #000;
+}
+[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption {
+ color: #000;
+}
+
+.spinner-grow,
+.spinner-border {
+ display: inline-block;
+ width: var(--bs-spinner-width);
+ height: var(--bs-spinner-height);
+ vertical-align: var(--bs-spinner-vertical-align);
+ border-radius: 50%;
+ animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);
+}
+
+@keyframes spinner-border {
+ to {
+ transform: rotate(360deg) /* rtl:ignore */;
+ }
+}
+.spinner-border {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-border-width: 0.25em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-border;
+ border: var(--bs-spinner-border-width) solid currentcolor;
+ border-right-color: transparent;
+}
+
+.spinner-border-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+ --bs-spinner-border-width: 0.2em;
+}
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ transform: none;
+ }
+}
+.spinner-grow {
+ --bs-spinner-width: 2rem;
+ --bs-spinner-height: 2rem;
+ --bs-spinner-vertical-align: -0.125em;
+ --bs-spinner-animation-speed: 0.75s;
+ --bs-spinner-animation-name: spinner-grow;
+ background-color: currentcolor;
+ opacity: 0;
+}
+
+.spinner-grow-sm {
+ --bs-spinner-width: 1rem;
+ --bs-spinner-height: 1rem;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .spinner-border,
+ .spinner-grow {
+ --bs-spinner-animation-speed: 1.5s;
+ }
+}
+.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {
+ --bs-offcanvas-zindex: 1045;
+ --bs-offcanvas-width: 400px;
+ --bs-offcanvas-height: 30vh;
+ --bs-offcanvas-padding-x: 1rem;
+ --bs-offcanvas-padding-y: 1rem;
+ --bs-offcanvas-color: var(--bs-body-color);
+ --bs-offcanvas-bg: var(--bs-body-bg);
+ --bs-offcanvas-border-width: var(--bs-border-width);
+ --bs-offcanvas-border-color: var(--bs-border-color-translucent);
+ --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);
+ --bs-offcanvas-transition: transform 0.3s ease-in-out;
+ --bs-offcanvas-title-line-height: 1.5;
+}
+
+@media (max-width: 575.98px) {
+ .offcanvas-sm {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+ }
+}
+@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {
+ .offcanvas-sm {
+ transition: none;
+ }
+}
+@media (max-width: 575.98px) {
+ .offcanvas-sm.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+ .offcanvas-sm.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+ .offcanvas-sm.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+ .offcanvas-sm.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+ .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {
+ transform: none;
+ }
+ .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {
+ visibility: visible;
+ }
+}
+@media (min-width: 576px) {
+ .offcanvas-sm {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+ .offcanvas-sm .offcanvas-header {
+ display: none;
+ }
+ .offcanvas-sm .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 767.98px) {
+ .offcanvas-md {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+ }
+}
+@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
+ .offcanvas-md {
+ transition: none;
+ }
+}
+@media (max-width: 767.98px) {
+ .offcanvas-md.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+ .offcanvas-md.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+ .offcanvas-md.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+ .offcanvas-md.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+ .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {
+ transform: none;
+ }
+ .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {
+ visibility: visible;
+ }
+}
+@media (min-width: 768px) {
+ .offcanvas-md {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+ .offcanvas-md .offcanvas-header {
+ display: none;
+ }
+ .offcanvas-md .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 991.98px) {
+ .offcanvas-lg {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+ }
+}
+@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {
+ .offcanvas-lg {
+ transition: none;
+ }
+}
+@media (max-width: 991.98px) {
+ .offcanvas-lg.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+ .offcanvas-lg.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+ .offcanvas-lg.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+ .offcanvas-lg.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+ .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {
+ transform: none;
+ }
+ .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {
+ visibility: visible;
+ }
+}
+@media (min-width: 992px) {
+ .offcanvas-lg {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+ .offcanvas-lg .offcanvas-header {
+ display: none;
+ }
+ .offcanvas-lg .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1199.98px) {
+ .offcanvas-xl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+ }
+}
+@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {
+ .offcanvas-xl {
+ transition: none;
+ }
+}
+@media (max-width: 1199.98px) {
+ .offcanvas-xl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+ .offcanvas-xl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+ .offcanvas-xl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+ .offcanvas-xl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+ .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {
+ transform: none;
+ }
+ .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {
+ visibility: visible;
+ }
+}
+@media (min-width: 1200px) {
+ .offcanvas-xl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+ .offcanvas-xl .offcanvas-header {
+ display: none;
+ }
+ .offcanvas-xl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+@media (max-width: 1399.98px) {
+ .offcanvas-xxl {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+ }
+}
+@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {
+ .offcanvas-xxl {
+ transition: none;
+ }
+}
+@media (max-width: 1399.98px) {
+ .offcanvas-xxl.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+ }
+ .offcanvas-xxl.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+ }
+ .offcanvas-xxl.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+ }
+ .offcanvas-xxl.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+ }
+ .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {
+ transform: none;
+ }
+ .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {
+ visibility: visible;
+ }
+}
+@media (min-width: 1400px) {
+ .offcanvas-xxl {
+ --bs-offcanvas-height: auto;
+ --bs-offcanvas-border-width: 0;
+ background-color: transparent !important;
+ }
+ .offcanvas-xxl .offcanvas-header {
+ display: none;
+ }
+ .offcanvas-xxl .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ background-color: transparent !important;
+ }
+}
+
+.offcanvas {
+ position: fixed;
+ bottom: 0;
+ z-index: var(--bs-offcanvas-zindex);
+ display: flex;
+ flex-direction: column;
+ max-width: 100%;
+ color: var(--bs-offcanvas-color);
+ visibility: hidden;
+ background-color: var(--bs-offcanvas-bg);
+ background-clip: padding-box;
+ outline: 0;
+ transition: var(--bs-offcanvas-transition);
+}
+@media (prefers-reduced-motion: reduce) {
+ .offcanvas {
+ transition: none;
+ }
+}
+.offcanvas.offcanvas-start {
+ top: 0;
+ left: 0;
+ width: var(--bs-offcanvas-width);
+ border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(-100%);
+}
+.offcanvas.offcanvas-end {
+ top: 0;
+ right: 0;
+ width: var(--bs-offcanvas-width);
+ border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateX(100%);
+}
+.offcanvas.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(-100%);
+}
+.offcanvas.offcanvas-bottom {
+ right: 0;
+ left: 0;
+ height: var(--bs-offcanvas-height);
+ max-height: 100%;
+ border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);
+ transform: translateY(100%);
+}
+.offcanvas.showing, .offcanvas.show:not(.hiding) {
+ transform: none;
+}
+.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {
+ visibility: visible;
+}
+
+.offcanvas-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000;
+}
+.offcanvas-backdrop.fade {
+ opacity: 0;
+}
+.offcanvas-backdrop.show {
+ opacity: 0.5;
+}
+
+.offcanvas-header {
+ display: flex;
+ align-items: center;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+}
+.offcanvas-header .btn-close {
+ padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);
+ margin: calc(-0.5 * var(--bs-offcanvas-padding-y)) calc(-0.5 * var(--bs-offcanvas-padding-x)) calc(-0.5 * var(--bs-offcanvas-padding-y)) auto;
+}
+
+.offcanvas-title {
+ margin-bottom: 0;
+ line-height: var(--bs-offcanvas-title-line-height);
+}
+
+.offcanvas-body {
+ flex-grow: 1;
+ padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);
+ overflow-y: auto;
+}
+
+.placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentcolor;
+ opacity: 0.5;
+}
+.placeholder.btn::before {
+ display: inline-block;
+ content: "";
+}
+
+.placeholder-xs {
+ min-height: 0.6em;
+}
+
+.placeholder-sm {
+ min-height: 0.8em;
+}
+
+.placeholder-lg {
+ min-height: 1.2em;
+}
+
+.placeholder-glow .placeholder {
+ animation: placeholder-glow 2s ease-in-out infinite;
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: 0.2;
+ }
+}
+.placeholder-wave {
+ -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);
+ -webkit-mask-size: 200% 100%;
+ mask-size: 200% 100%;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ -webkit-mask-position: -200% 0%;
+ mask-position: -200% 0%;
+ }
+}
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.text-bg-primary {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-secondary {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-success {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-info {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-warning {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-danger {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-light {
+ color: #000 !important;
+ background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.text-bg-dark {
+ color: #fff !important;
+ background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;
+}
+
+.link-primary {
+ color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-primary:hover, .link-primary:focus {
+ color: RGBA(54, 88, 124, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(54, 88, 124, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(54, 88, 124, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-secondary {
+ color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-secondary:hover, .link-secondary:focus {
+ color: RGBA(122, 122, 122, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(122, 122, 122, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(122, 122, 122, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-success {
+ color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-success:hover, .link-success:focus {
+ color: RGBA(48, 145, 26, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(48, 145, 26, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(48, 145, 26, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-info {
+ color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-info:hover, .link-info:focus {
+ color: RGBA(41, 122, 194, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(41, 122, 194, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(41, 122, 194, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-warning {
+ color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-warning:hover, .link-warning:focus {
+ color: RGBA(170, 94, 0, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(170, 94, 0, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(170, 94, 0, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-danger {
+ color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-danger:hover, .link-danger:focus {
+ color: RGBA(164, 2, 0, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(164, 2, 0, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(164, 2, 0, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-light {
+ color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-light:hover, .link-light:focus {
+ color: RGBA(241, 241, 241, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(241, 241, 241, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(241, 241, 241, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-dark {
+ color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-dark:hover, .link-dark:focus {
+ color: RGBA(41, 41, 41, var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(41, 41, 41, var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(41, 41, 41, var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-body-emphasis {
+ color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+.link-body-emphasis:hover, .link-body-emphasis:focus {
+ color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;
+ -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;
+ text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;
+}
+
+.focus-ring:focus {
+ outline: 0;
+ box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);
+}
+
+.icon-link {
+ display: inline-flex;
+ gap: 0.375rem;
+ align-items: center;
+ -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));
+ text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));
+ text-underline-offset: 0.25em;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.icon-link > .bi {
+ flex-shrink: 0;
+ width: 1em;
+ height: 1em;
+ fill: currentcolor;
+ transition: 0.2s ease-in-out transform;
+}
+@media (prefers-reduced-motion: reduce) {
+ .icon-link > .bi {
+ transition: none;
+ }
+}
+
+.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {
+ transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));
+}
+
+.ratio {
+ position: relative;
+ width: 100%;
+}
+.ratio::before {
+ display: block;
+ padding-top: var(--bs-aspect-ratio);
+ content: "";
+}
+.ratio > * {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.ratio-1x1 {
+ --bs-aspect-ratio: 100%;
+}
+
+.ratio-4x3 {
+ --bs-aspect-ratio: 75%;
+}
+
+.ratio-16x9 {
+ --bs-aspect-ratio: 56.25%;
+}
+
+.ratio-21x9 {
+ --bs-aspect-ratio: 42.8571428571%;
+}
+
+.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;
+}
+
+.sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.sticky-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+}
+
+@media (min-width: 576px) {
+ .sticky-sm-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+ .sticky-sm-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 768px) {
+ .sticky-md-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+ .sticky-md-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 992px) {
+ .sticky-lg-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+ .sticky-lg-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 1200px) {
+ .sticky-xl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+ .sticky-xl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+@media (min-width: 1400px) {
+ .sticky-xxl-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
+ .sticky-xxl-bottom {
+ position: -webkit-sticky;
+ position: sticky;
+ bottom: 0;
+ z-index: 1020;
+ }
+}
+.hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+
+.visually-hidden,
+.visually-hidden-focusable:not(:focus):not(:focus-within) {
+ width: 1px !important;
+ height: 1px !important;
+ padding: 0 !important;
+ margin: -1px !important;
+ overflow: hidden !important;
+ clip: rect(0, 0, 0, 0) !important;
+ white-space: nowrap !important;
+ border: 0 !important;
+}
+.visually-hidden:not(caption),
+.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {
+ position: absolute !important;
+}
+
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ content: "";
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.vr {
+ display: inline-block;
+ align-self: stretch;
+ width: var(--bs-border-width);
+ min-height: 1em;
+ background-color: currentcolor;
+ opacity: 0.25;
+}
+
+.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;
+}
+
+.float-start {
+ float: left !important;
+}
+
+.float-end {
+ float: right !important;
+}
+
+.float-none {
+ float: none !important;
+}
+
+.object-fit-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+}
+
+.object-fit-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+}
+
+.object-fit-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+}
+
+.object-fit-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+}
+
+.object-fit-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+}
+
+.opacity-0 {
+ opacity: 0 !important;
+}
+
+.opacity-25 {
+ opacity: 0.25 !important;
+}
+
+.opacity-50 {
+ opacity: 0.5 !important;
+}
+
+.opacity-75 {
+ opacity: 0.75 !important;
+}
+
+.opacity-100 {
+ opacity: 1 !important;
+}
+
+.overflow-auto {
+ overflow: auto !important;
+}
+
+.overflow-hidden {
+ overflow: hidden !important;
+}
+
+.overflow-visible {
+ overflow: visible !important;
+}
+
+.overflow-scroll {
+ overflow: scroll !important;
+}
+
+.overflow-x-auto {
+ overflow-x: auto !important;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden !important;
+}
+
+.overflow-x-visible {
+ overflow-x: visible !important;
+}
+
+.overflow-x-scroll {
+ overflow-x: scroll !important;
+}
+
+.overflow-y-auto {
+ overflow-y: auto !important;
+}
+
+.overflow-y-hidden {
+ overflow-y: hidden !important;
+}
+
+.overflow-y-visible {
+ overflow-y: visible !important;
+}
+
+.overflow-y-scroll {
+ overflow-y: scroll !important;
+}
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-grid {
+ display: grid !important;
+}
+
+.d-inline-grid {
+ display: inline-grid !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;
+}
+
+.d-none {
+ display: none !important;
+}
+
+.shadow {
+ box-shadow: var(--bs-box-shadow) !important;
+}
+
+.shadow-sm {
+ box-shadow: var(--bs-box-shadow-sm) !important;
+}
+
+.shadow-lg {
+ box-shadow: var(--bs-box-shadow-lg) !important;
+}
+
+.shadow-none {
+ box-shadow: none !important;
+}
+
+.focus-ring-primary {
+ --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-secondary {
+ --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-success {
+ --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-info {
+ --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-warning {
+ --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-danger {
+ --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-light {
+ --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));
+}
+
+.focus-ring-dark {
+ --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));
+}
+
+.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;
+}
+
+.top-0 {
+ top: 0 !important;
+}
+
+.top-50 {
+ top: 50% !important;
+}
+
+.top-100 {
+ top: 100% !important;
+}
+
+.bottom-0 {
+ bottom: 0 !important;
+}
+
+.bottom-50 {
+ bottom: 50% !important;
+}
+
+.bottom-100 {
+ bottom: 100% !important;
+}
+
+.start-0 {
+ left: 0 !important;
+}
+
+.start-50 {
+ left: 50% !important;
+}
+
+.start-100 {
+ left: 100% !important;
+}
+
+.end-0 {
+ right: 0 !important;
+}
+
+.end-50 {
+ right: 50% !important;
+}
+
+.end-100 {
+ right: 100% !important;
+}
+
+.translate-middle {
+ transform: translate(-50%, -50%) !important;
+}
+
+.translate-middle-x {
+ transform: translateX(-50%) !important;
+}
+
+.translate-middle-y {
+ transform: translateY(-50%) !important;
+}
+
+.border {
+ border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.border-0 {
+ border: 0 !important;
+}
+
+.border-top {
+ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.border-top-0 {
+ border-top: 0 !important;
+}
+
+.border-end {
+ border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.border-end-0 {
+ border-right: 0 !important;
+}
+
+.border-bottom {
+ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important;
+}
+
+.border-start {
+ border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
+}
+
+.border-start-0 {
+ border-left: 0 !important;
+}
+
+.border-primary {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-secondary {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-success {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-info {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-warning {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-danger {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-light {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-dark {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-black {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-white {
+ --bs-border-opacity: 1;
+ border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;
+}
+
+.border-primary-subtle {
+ border-color: var(--bs-primary-border-subtle) !important;
+}
+
+.border-secondary-subtle {
+ border-color: var(--bs-secondary-border-subtle) !important;
+}
+
+.border-success-subtle {
+ border-color: var(--bs-success-border-subtle) !important;
+}
+
+.border-info-subtle {
+ border-color: var(--bs-info-border-subtle) !important;
+}
+
+.border-warning-subtle {
+ border-color: var(--bs-warning-border-subtle) !important;
+}
+
+.border-danger-subtle {
+ border-color: var(--bs-danger-border-subtle) !important;
+}
+
+.border-light-subtle {
+ border-color: var(--bs-light-border-subtle) !important;
+}
+
+.border-dark-subtle {
+ border-color: var(--bs-dark-border-subtle) !important;
+}
+
+.border-1 {
+ border-width: 1px !important;
+}
+
+.border-2 {
+ border-width: 2px !important;
+}
+
+.border-3 {
+ border-width: 3px !important;
+}
+
+.border-4 {
+ border-width: 4px !important;
+}
+
+.border-5 {
+ border-width: 5px !important;
+}
+
+.border-opacity-10 {
+ --bs-border-opacity: 0.1;
+}
+
+.border-opacity-25 {
+ --bs-border-opacity: 0.25;
+}
+
+.border-opacity-50 {
+ --bs-border-opacity: 0.5;
+}
+
+.border-opacity-75 {
+ --bs-border-opacity: 0.75;
+}
+
+.border-opacity-100 {
+ --bs-border-opacity: 1;
+}
+
+.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;
+}
+
+.mw-100 {
+ max-width: 100% !important;
+}
+
+.vw-100 {
+ width: 100vw !important;
+}
+
+.min-vw-100 {
+ min-width: 100vw !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;
+}
+
+.mh-100 {
+ max-height: 100% !important;
+}
+
+.vh-100 {
+ height: 100vh !important;
+}
+
+.min-vh-100 {
+ min-height: 100vh !important;
+}
+
+.flex-fill {
+ flex: 1 1 auto !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-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;
+}
+
+.flex-wrap {
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !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;
+}
+
+.justify-content-evenly {
+ justify-content: space-evenly !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;
+}
+
+.order-first {
+ order: -1 !important;
+}
+
+.order-0 {
+ order: 0 !important;
+}
+
+.order-1 {
+ order: 1 !important;
+}
+
+.order-2 {
+ order: 2 !important;
+}
+
+.order-3 {
+ order: 3 !important;
+}
+
+.order-4 {
+ order: 4 !important;
+}
+
+.order-5 {
+ order: 5 !important;
+}
+
+.order-last {
+ order: 6 !important;
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.m-1 {
+ margin: 0.25rem !important;
+}
+
+.m-2 {
+ margin: 0.5rem !important;
+}
+
+.m-3 {
+ margin: 1rem !important;
+}
+
+.m-4 {
+ margin: 1.5rem !important;
+}
+
+.m-5 {
+ margin: 3rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+.mt-0 {
+ margin-top: 0 !important;
+}
+
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.mt-3 {
+ margin-top: 1rem !important;
+}
+
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.mt-5 {
+ margin-top: 3rem !important;
+}
+
+.mt-auto {
+ margin-top: auto !important;
+}
+
+.me-0 {
+ margin-right: 0 !important;
+}
+
+.me-1 {
+ margin-right: 0.25rem !important;
+}
+
+.me-2 {
+ margin-right: 0.5rem !important;
+}
+
+.me-3 {
+ margin-right: 1rem !important;
+}
+
+.me-4 {
+ margin-right: 1.5rem !important;
+}
+
+.me-5 {
+ margin-right: 3rem !important;
+}
+
+.me-auto {
+ margin-right: auto !important;
+}
+
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.mb-auto {
+ margin-bottom: auto !important;
+}
+
+.ms-0 {
+ margin-left: 0 !important;
+}
+
+.ms-1 {
+ margin-left: 0.25rem !important;
+}
+
+.ms-2 {
+ margin-left: 0.5rem !important;
+}
+
+.ms-3 {
+ margin-left: 1rem !important;
+}
+
+.ms-4 {
+ margin-left: 1.5rem !important;
+}
+
+.ms-5 {
+ margin-left: 3rem !important;
+}
+
+.ms-auto {
+ margin-left: auto !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.p-1 {
+ padding: 0.25rem !important;
+}
+
+.p-2 {
+ padding: 0.5rem !important;
+}
+
+.p-3 {
+ padding: 1rem !important;
+}
+
+.p-4 {
+ padding: 1.5rem !important;
+}
+
+.p-5 {
+ padding: 3rem !important;
+}
+
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.pt-0 {
+ padding-top: 0 !important;
+}
+
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.pt-3 {
+ padding-top: 1rem !important;
+}
+
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.pt-5 {
+ padding-top: 3rem !important;
+}
+
+.pe-0 {
+ padding-right: 0 !important;
+}
+
+.pe-1 {
+ padding-right: 0.25rem !important;
+}
+
+.pe-2 {
+ padding-right: 0.5rem !important;
+}
+
+.pe-3 {
+ padding-right: 1rem !important;
+}
+
+.pe-4 {
+ padding-right: 1.5rem !important;
+}
+
+.pe-5 {
+ padding-right: 3rem !important;
+}
+
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.ps-0 {
+ padding-left: 0 !important;
+}
+
+.ps-1 {
+ padding-left: 0.25rem !important;
+}
+
+.ps-2 {
+ padding-left: 0.5rem !important;
+}
+
+.ps-3 {
+ padding-left: 1rem !important;
+}
+
+.ps-4 {
+ padding-left: 1.5rem !important;
+}
+
+.ps-5 {
+ padding-left: 3rem !important;
+}
+
+.gap-0 {
+ gap: 0 !important;
+}
+
+.gap-1 {
+ gap: 0.25rem !important;
+}
+
+.gap-2 {
+ gap: 0.5rem !important;
+}
+
+.gap-3 {
+ gap: 1rem !important;
+}
+
+.gap-4 {
+ gap: 1.5rem !important;
+}
+
+.gap-5 {
+ gap: 3rem !important;
+}
+
+.row-gap-0 {
+ row-gap: 0 !important;
+}
+
+.row-gap-1 {
+ row-gap: 0.25rem !important;
+}
+
+.row-gap-2 {
+ row-gap: 0.5rem !important;
+}
+
+.row-gap-3 {
+ row-gap: 1rem !important;
+}
+
+.row-gap-4 {
+ row-gap: 1.5rem !important;
+}
+
+.row-gap-5 {
+ row-gap: 3rem !important;
+}
+
+.column-gap-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+}
+
+.column-gap-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+}
+
+.column-gap-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+}
+
+.column-gap-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+}
+
+.column-gap-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+}
+
+.column-gap-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+}
+
+.font-monospace {
+ font-family: var(--bs-font-monospace) !important;
+}
+
+.fs-1 {
+ font-size: calc(1.375rem + 1.5vw) !important;
+}
+
+.fs-2 {
+ font-size: calc(1.325rem + 0.9vw) !important;
+}
+
+.fs-3 {
+ font-size: calc(1.3rem + 0.6vw) !important;
+}
+
+.fs-4 {
+ font-size: calc(1.275rem + 0.3vw) !important;
+}
+
+.fs-5 {
+ font-size: 1.25rem !important;
+}
+
+.fs-6 {
+ font-size: 1rem !important;
+}
+
+.fst-italic {
+ font-style: italic !important;
+}
+
+.fst-normal {
+ font-style: normal !important;
+}
+
+.fw-lighter {
+ font-weight: lighter !important;
+}
+
+.fw-light {
+ font-weight: 300 !important;
+}
+
+.fw-normal {
+ font-weight: 400 !important;
+}
+
+.fw-medium {
+ font-weight: 500 !important;
+}
+
+.fw-semibold {
+ font-weight: 600 !important;
+}
+
+.fw-bold {
+ font-weight: 700 !important;
+}
+
+.fw-bolder {
+ font-weight: bolder !important;
+}
+
+.lh-1 {
+ line-height: 1 !important;
+}
+
+.lh-sm {
+ line-height: 1.25 !important;
+}
+
+.lh-base {
+ line-height: 1.5 !important;
+}
+
+.lh-lg {
+ line-height: 2 !important;
+}
+
+.text-start {
+ text-align: left !important;
+}
+
+.text-end {
+ text-align: right !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+.text-decoration-none {
+ text-decoration: none !important;
+}
+
+.text-decoration-underline {
+ text-decoration: underline !important;
+}
+
+.text-decoration-line-through {
+ text-decoration: line-through !important;
+}
+
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.text-wrap {
+ white-space: normal !important;
+}
+
+.text-nowrap {
+ white-space: nowrap !important;
+}
+
+/* rtl:begin:remove */
+.text-break {
+ word-wrap: break-word !important;
+ word-break: break-word !important;
+}
+
+/* rtl:end:remove */
+.text-primary {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-secondary {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-success {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-info {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-warning {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-danger {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-light {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-dark {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-black {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-white {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-body {
+ --bs-text-opacity: 1;
+ color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;
+}
+
+.text-muted {
+ --bs-text-opacity: 1;
+ color: var(--bs-secondary-color) !important;
+}
+
+.text-black-50 {
+ --bs-text-opacity: 1;
+ color: rgba(0, 0, 0, 0.5) !important;
+}
+
+.text-white-50 {
+ --bs-text-opacity: 1;
+ color: rgba(255, 255, 255, 0.5) !important;
+}
+
+.text-body-secondary {
+ --bs-text-opacity: 1;
+ color: var(--bs-secondary-color) !important;
+}
+
+.text-body-tertiary {
+ --bs-text-opacity: 1;
+ color: var(--bs-tertiary-color) !important;
+}
+
+.text-body-emphasis {
+ --bs-text-opacity: 1;
+ color: var(--bs-emphasis-color) !important;
+}
+
+.text-reset {
+ --bs-text-opacity: 1;
+ color: inherit !important;
+}
+
+.text-opacity-25 {
+ --bs-text-opacity: 0.25;
+}
+
+.text-opacity-50 {
+ --bs-text-opacity: 0.5;
+}
+
+.text-opacity-75 {
+ --bs-text-opacity: 0.75;
+}
+
+.text-opacity-100 {
+ --bs-text-opacity: 1;
+}
+
+.text-primary-emphasis {
+ color: var(--bs-primary-text-emphasis) !important;
+}
+
+.text-secondary-emphasis {
+ color: var(--bs-secondary-text-emphasis) !important;
+}
+
+.text-success-emphasis {
+ color: var(--bs-success-text-emphasis) !important;
+}
+
+.text-info-emphasis {
+ color: var(--bs-info-text-emphasis) !important;
+}
+
+.text-warning-emphasis {
+ color: var(--bs-warning-text-emphasis) !important;
+}
+
+.text-danger-emphasis {
+ color: var(--bs-danger-text-emphasis) !important;
+}
+
+.text-light-emphasis {
+ color: var(--bs-light-text-emphasis) !important;
+}
+
+.text-dark-emphasis {
+ color: var(--bs-dark-text-emphasis) !important;
+}
+
+.link-opacity-10 {
+ --bs-link-opacity: 0.1;
+}
+
+.link-opacity-10-hover:hover {
+ --bs-link-opacity: 0.1;
+}
+
+.link-opacity-25 {
+ --bs-link-opacity: 0.25;
+}
+
+.link-opacity-25-hover:hover {
+ --bs-link-opacity: 0.25;
+}
+
+.link-opacity-50 {
+ --bs-link-opacity: 0.5;
+}
+
+.link-opacity-50-hover:hover {
+ --bs-link-opacity: 0.5;
+}
+
+.link-opacity-75 {
+ --bs-link-opacity: 0.75;
+}
+
+.link-opacity-75-hover:hover {
+ --bs-link-opacity: 0.75;
+}
+
+.link-opacity-100 {
+ --bs-link-opacity: 1;
+}
+
+.link-opacity-100-hover:hover {
+ --bs-link-opacity: 1;
+}
+
+.link-offset-1 {
+ text-underline-offset: 0.125em !important;
+}
+
+.link-offset-1-hover:hover {
+ text-underline-offset: 0.125em !important;
+}
+
+.link-offset-2 {
+ text-underline-offset: 0.25em !important;
+}
+
+.link-offset-2-hover:hover {
+ text-underline-offset: 0.25em !important;
+}
+
+.link-offset-3 {
+ text-underline-offset: 0.375em !important;
+}
+
+.link-offset-3-hover:hover {
+ text-underline-offset: 0.375em !important;
+}
+
+.link-underline-primary {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-secondary {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-success {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-info {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-warning {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-danger {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-light {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline-dark {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;
+ text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;
+}
+
+.link-underline {
+ --bs-link-underline-opacity: 1;
+ -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
+ text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;
+}
+
+.link-underline-opacity-0 {
+ --bs-link-underline-opacity: 0;
+}
+
+.link-underline-opacity-0-hover:hover {
+ --bs-link-underline-opacity: 0;
+}
+
+.link-underline-opacity-10 {
+ --bs-link-underline-opacity: 0.1;
+}
+
+.link-underline-opacity-10-hover:hover {
+ --bs-link-underline-opacity: 0.1;
+}
+
+.link-underline-opacity-25 {
+ --bs-link-underline-opacity: 0.25;
+}
+
+.link-underline-opacity-25-hover:hover {
+ --bs-link-underline-opacity: 0.25;
+}
+
+.link-underline-opacity-50 {
+ --bs-link-underline-opacity: 0.5;
+}
+
+.link-underline-opacity-50-hover:hover {
+ --bs-link-underline-opacity: 0.5;
+}
+
+.link-underline-opacity-75 {
+ --bs-link-underline-opacity: 0.75;
+}
+
+.link-underline-opacity-75-hover:hover {
+ --bs-link-underline-opacity: 0.75;
+}
+
+.link-underline-opacity-100 {
+ --bs-link-underline-opacity: 1;
+}
+
+.link-underline-opacity-100-hover:hover {
+ --bs-link-underline-opacity: 1;
+}
+
+.bg-primary {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-secondary {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-success {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-info {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-warning {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-danger {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-light {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-dark {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-black {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-white {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-body {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-transparent {
+ --bs-bg-opacity: 1;
+ background-color: transparent !important;
+}
+
+.bg-body-secondary {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-body-tertiary {
+ --bs-bg-opacity: 1;
+ background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;
+}
+
+.bg-opacity-10 {
+ --bs-bg-opacity: 0.1;
+}
+
+.bg-opacity-25 {
+ --bs-bg-opacity: 0.25;
+}
+
+.bg-opacity-50 {
+ --bs-bg-opacity: 0.5;
+}
+
+.bg-opacity-75 {
+ --bs-bg-opacity: 0.75;
+}
+
+.bg-opacity-100 {
+ --bs-bg-opacity: 1;
+}
+
+.bg-primary-subtle {
+ background-color: var(--bs-primary-bg-subtle) !important;
+}
+
+.bg-secondary-subtle {
+ background-color: var(--bs-secondary-bg-subtle) !important;
+}
+
+.bg-success-subtle {
+ background-color: var(--bs-success-bg-subtle) !important;
+}
+
+.bg-info-subtle {
+ background-color: var(--bs-info-bg-subtle) !important;
+}
+
+.bg-warning-subtle {
+ background-color: var(--bs-warning-bg-subtle) !important;
+}
+
+.bg-danger-subtle {
+ background-color: var(--bs-danger-bg-subtle) !important;
+}
+
+.bg-light-subtle {
+ background-color: var(--bs-light-bg-subtle) !important;
+}
+
+.bg-dark-subtle {
+ background-color: var(--bs-dark-bg-subtle) !important;
+}
+
+.bg-gradient {
+ background-image: var(--bs-gradient) !important;
+}
+
+.user-select-all {
+ -webkit-user-select: all !important;
+ -moz-user-select: all !important;
+ user-select: all !important;
+}
+
+.user-select-auto {
+ -webkit-user-select: auto !important;
+ -moz-user-select: auto !important;
+ user-select: auto !important;
+}
+
+.user-select-none {
+ -webkit-user-select: none !important;
+ -moz-user-select: none !important;
+ user-select: none !important;
+}
+
+.pe-none {
+ pointer-events: none !important;
+}
+
+.pe-auto {
+ pointer-events: auto !important;
+}
+
+.rounded {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-0 {
+ border-radius: 0 !important;
+}
+
+.rounded-1 {
+ border-radius: var(--bs-border-radius-sm) !important;
+}
+
+.rounded-2 {
+ border-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-3 {
+ border-radius: var(--bs-border-radius-lg) !important;
+}
+
+.rounded-4 {
+ border-radius: var(--bs-border-radius-xl) !important;
+}
+
+.rounded-5 {
+ border-radius: var(--bs-border-radius-xxl) !important;
+}
+
+.rounded-circle {
+ border-radius: 50% !important;
+}
+
+.rounded-pill {
+ border-radius: var(--bs-border-radius-pill) !important;
+}
+
+.rounded-top {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-top-0 {
+ border-top-left-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+}
+
+.rounded-top-1 {
+ border-top-left-radius: var(--bs-border-radius-sm) !important;
+ border-top-right-radius: var(--bs-border-radius-sm) !important;
+}
+
+.rounded-top-2 {
+ border-top-left-radius: var(--bs-border-radius) !important;
+ border-top-right-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-top-3 {
+ border-top-left-radius: var(--bs-border-radius-lg) !important;
+ border-top-right-radius: var(--bs-border-radius-lg) !important;
+}
+
+.rounded-top-4 {
+ border-top-left-radius: var(--bs-border-radius-xl) !important;
+ border-top-right-radius: var(--bs-border-radius-xl) !important;
+}
+
+.rounded-top-5 {
+ border-top-left-radius: var(--bs-border-radius-xxl) !important;
+ border-top-right-radius: var(--bs-border-radius-xxl) !important;
+}
+
+.rounded-top-circle {
+ border-top-left-radius: 50% !important;
+ border-top-right-radius: 50% !important;
+}
+
+.rounded-top-pill {
+ border-top-left-radius: var(--bs-border-radius-pill) !important;
+ border-top-right-radius: var(--bs-border-radius-pill) !important;
+}
+
+.rounded-end {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-end-0 {
+ border-top-right-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+.rounded-end-1 {
+ border-top-right-radius: var(--bs-border-radius-sm) !important;
+ border-bottom-right-radius: var(--bs-border-radius-sm) !important;
+}
+
+.rounded-end-2 {
+ border-top-right-radius: var(--bs-border-radius) !important;
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-end-3 {
+ border-top-right-radius: var(--bs-border-radius-lg) !important;
+ border-bottom-right-radius: var(--bs-border-radius-lg) !important;
+}
+
+.rounded-end-4 {
+ border-top-right-radius: var(--bs-border-radius-xl) !important;
+ border-bottom-right-radius: var(--bs-border-radius-xl) !important;
+}
+
+.rounded-end-5 {
+ border-top-right-radius: var(--bs-border-radius-xxl) !important;
+ border-bottom-right-radius: var(--bs-border-radius-xxl) !important;
+}
+
+.rounded-end-circle {
+ border-top-right-radius: 50% !important;
+ border-bottom-right-radius: 50% !important;
+}
+
+.rounded-end-pill {
+ border-top-right-radius: var(--bs-border-radius-pill) !important;
+ border-bottom-right-radius: var(--bs-border-radius-pill) !important;
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-bottom-0 {
+ border-bottom-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+}
+
+.rounded-bottom-1 {
+ border-bottom-right-radius: var(--bs-border-radius-sm) !important;
+ border-bottom-left-radius: var(--bs-border-radius-sm) !important;
+}
+
+.rounded-bottom-2 {
+ border-bottom-right-radius: var(--bs-border-radius) !important;
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-bottom-3 {
+ border-bottom-right-radius: var(--bs-border-radius-lg) !important;
+ border-bottom-left-radius: var(--bs-border-radius-lg) !important;
+}
+
+.rounded-bottom-4 {
+ border-bottom-right-radius: var(--bs-border-radius-xl) !important;
+ border-bottom-left-radius: var(--bs-border-radius-xl) !important;
+}
+
+.rounded-bottom-5 {
+ border-bottom-right-radius: var(--bs-border-radius-xxl) !important;
+ border-bottom-left-radius: var(--bs-border-radius-xxl) !important;
+}
+
+.rounded-bottom-circle {
+ border-bottom-right-radius: 50% !important;
+ border-bottom-left-radius: 50% !important;
+}
+
+.rounded-bottom-pill {
+ border-bottom-right-radius: var(--bs-border-radius-pill) !important;
+ border-bottom-left-radius: var(--bs-border-radius-pill) !important;
+}
+
+.rounded-start {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-start-0 {
+ border-bottom-left-radius: 0 !important;
+ border-top-left-radius: 0 !important;
+}
+
+.rounded-start-1 {
+ border-bottom-left-radius: var(--bs-border-radius-sm) !important;
+ border-top-left-radius: var(--bs-border-radius-sm) !important;
+}
+
+.rounded-start-2 {
+ border-bottom-left-radius: var(--bs-border-radius) !important;
+ border-top-left-radius: var(--bs-border-radius) !important;
+}
+
+.rounded-start-3 {
+ border-bottom-left-radius: var(--bs-border-radius-lg) !important;
+ border-top-left-radius: var(--bs-border-radius-lg) !important;
+}
+
+.rounded-start-4 {
+ border-bottom-left-radius: var(--bs-border-radius-xl) !important;
+ border-top-left-radius: var(--bs-border-radius-xl) !important;
+}
+
+.rounded-start-5 {
+ border-bottom-left-radius: var(--bs-border-radius-xxl) !important;
+ border-top-left-radius: var(--bs-border-radius-xxl) !important;
+}
+
+.rounded-start-circle {
+ border-bottom-left-radius: 50% !important;
+ border-top-left-radius: 50% !important;
+}
+
+.rounded-start-pill {
+ border-bottom-left-radius: var(--bs-border-radius-pill) !important;
+ border-top-left-radius: var(--bs-border-radius-pill) !important;
+}
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
+}
+
+.z-n1 {
+ z-index: -1 !important;
+}
+
+.z-0 {
+ z-index: 0 !important;
+}
+
+.z-1 {
+ z-index: 1 !important;
+}
+
+.z-2 {
+ z-index: 2 !important;
+}
+
+.z-3 {
+ z-index: 3 !important;
+}
+
+@media (min-width: 576px) {
+ .float-sm-start {
+ float: left !important;
+ }
+ .float-sm-end {
+ float: right !important;
+ }
+ .float-sm-none {
+ float: none !important;
+ }
+ .object-fit-sm-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+ }
+ .object-fit-sm-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+ }
+ .object-fit-sm-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+ }
+ .object-fit-sm-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+ }
+ .object-fit-sm-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
+ display: block !important;
+ }
+ .d-sm-grid {
+ display: grid !important;
+ }
+ .d-sm-inline-grid {
+ display: inline-grid !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;
+ }
+ .d-sm-none {
+ display: none !important;
+ }
+ .flex-sm-fill {
+ flex: 1 1 auto !important;
+ }
+ .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-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;
+ }
+ .flex-sm-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !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;
+ }
+ .justify-content-sm-evenly {
+ justify-content: space-evenly !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;
+ }
+ .order-sm-first {
+ order: -1 !important;
+ }
+ .order-sm-0 {
+ order: 0 !important;
+ }
+ .order-sm-1 {
+ order: 1 !important;
+ }
+ .order-sm-2 {
+ order: 2 !important;
+ }
+ .order-sm-3 {
+ order: 3 !important;
+ }
+ .order-sm-4 {
+ order: 4 !important;
+ }
+ .order-sm-5 {
+ order: 5 !important;
+ }
+ .order-sm-last {
+ order: 6 !important;
+ }
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+ .me-sm-0 {
+ margin-right: 0 !important;
+ }
+ .me-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .me-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .me-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-sm-0 {
+ margin-left: 0 !important;
+ }
+ .ms-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-sm-auto {
+ margin-left: auto !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pe-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-sm-0 {
+ padding-left: 0 !important;
+ }
+ .ps-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-sm-5 {
+ padding-left: 3rem !important;
+ }
+ .gap-sm-0 {
+ gap: 0 !important;
+ }
+ .gap-sm-1 {
+ gap: 0.25rem !important;
+ }
+ .gap-sm-2 {
+ gap: 0.5rem !important;
+ }
+ .gap-sm-3 {
+ gap: 1rem !important;
+ }
+ .gap-sm-4 {
+ gap: 1.5rem !important;
+ }
+ .gap-sm-5 {
+ gap: 3rem !important;
+ }
+ .row-gap-sm-0 {
+ row-gap: 0 !important;
+ }
+ .row-gap-sm-1 {
+ row-gap: 0.25rem !important;
+ }
+ .row-gap-sm-2 {
+ row-gap: 0.5rem !important;
+ }
+ .row-gap-sm-3 {
+ row-gap: 1rem !important;
+ }
+ .row-gap-sm-4 {
+ row-gap: 1.5rem !important;
+ }
+ .row-gap-sm-5 {
+ row-gap: 3rem !important;
+ }
+ .column-gap-sm-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+ }
+ .column-gap-sm-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+ }
+ .column-gap-sm-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+ }
+ .column-gap-sm-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+ }
+ .column-gap-sm-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+ }
+ .column-gap-sm-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+ }
+ .text-sm-start {
+ text-align: left !important;
+ }
+ .text-sm-end {
+ text-align: right !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 768px) {
+ .float-md-start {
+ float: left !important;
+ }
+ .float-md-end {
+ float: right !important;
+ }
+ .float-md-none {
+ float: none !important;
+ }
+ .object-fit-md-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+ }
+ .object-fit-md-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+ }
+ .object-fit-md-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+ }
+ .object-fit-md-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+ }
+ .object-fit-md-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+ }
+ .d-md-inline {
+ display: inline !important;
+ }
+ .d-md-inline-block {
+ display: inline-block !important;
+ }
+ .d-md-block {
+ display: block !important;
+ }
+ .d-md-grid {
+ display: grid !important;
+ }
+ .d-md-inline-grid {
+ display: inline-grid !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;
+ }
+ .d-md-none {
+ display: none !important;
+ }
+ .flex-md-fill {
+ flex: 1 1 auto !important;
+ }
+ .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-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;
+ }
+ .flex-md-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !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;
+ }
+ .justify-content-md-evenly {
+ justify-content: space-evenly !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;
+ }
+ .order-md-first {
+ order: -1 !important;
+ }
+ .order-md-0 {
+ order: 0 !important;
+ }
+ .order-md-1 {
+ order: 1 !important;
+ }
+ .order-md-2 {
+ order: 2 !important;
+ }
+ .order-md-3 {
+ order: 3 !important;
+ }
+ .order-md-4 {
+ order: 4 !important;
+ }
+ .order-md-5 {
+ order: 5 !important;
+ }
+ .order-md-last {
+ order: 6 !important;
+ }
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+ .me-md-0 {
+ margin-right: 0 !important;
+ }
+ .me-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-md-3 {
+ margin-right: 1rem !important;
+ }
+ .me-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-md-5 {
+ margin-right: 3rem !important;
+ }
+ .me-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-md-0 {
+ margin-left: 0 !important;
+ }
+ .ms-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-md-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-md-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-md-auto {
+ margin-left: auto !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-md-0 {
+ padding-right: 0 !important;
+ }
+ .pe-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-md-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-md-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-md-0 {
+ padding-left: 0 !important;
+ }
+ .ps-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-md-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-md-5 {
+ padding-left: 3rem !important;
+ }
+ .gap-md-0 {
+ gap: 0 !important;
+ }
+ .gap-md-1 {
+ gap: 0.25rem !important;
+ }
+ .gap-md-2 {
+ gap: 0.5rem !important;
+ }
+ .gap-md-3 {
+ gap: 1rem !important;
+ }
+ .gap-md-4 {
+ gap: 1.5rem !important;
+ }
+ .gap-md-5 {
+ gap: 3rem !important;
+ }
+ .row-gap-md-0 {
+ row-gap: 0 !important;
+ }
+ .row-gap-md-1 {
+ row-gap: 0.25rem !important;
+ }
+ .row-gap-md-2 {
+ row-gap: 0.5rem !important;
+ }
+ .row-gap-md-3 {
+ row-gap: 1rem !important;
+ }
+ .row-gap-md-4 {
+ row-gap: 1.5rem !important;
+ }
+ .row-gap-md-5 {
+ row-gap: 3rem !important;
+ }
+ .column-gap-md-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+ }
+ .column-gap-md-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+ }
+ .column-gap-md-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+ }
+ .column-gap-md-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+ }
+ .column-gap-md-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+ }
+ .column-gap-md-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+ }
+ .text-md-start {
+ text-align: left !important;
+ }
+ .text-md-end {
+ text-align: right !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 992px) {
+ .float-lg-start {
+ float: left !important;
+ }
+ .float-lg-end {
+ float: right !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
+ .object-fit-lg-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+ }
+ .object-fit-lg-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+ }
+ .object-fit-lg-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+ }
+ .object-fit-lg-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+ }
+ .object-fit-lg-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+ }
+ .d-lg-inline {
+ display: inline !important;
+ }
+ .d-lg-inline-block {
+ display: inline-block !important;
+ }
+ .d-lg-block {
+ display: block !important;
+ }
+ .d-lg-grid {
+ display: grid !important;
+ }
+ .d-lg-inline-grid {
+ display: inline-grid !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;
+ }
+ .d-lg-none {
+ display: none !important;
+ }
+ .flex-lg-fill {
+ flex: 1 1 auto !important;
+ }
+ .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-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;
+ }
+ .flex-lg-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !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;
+ }
+ .justify-content-lg-evenly {
+ justify-content: space-evenly !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;
+ }
+ .order-lg-first {
+ order: -1 !important;
+ }
+ .order-lg-0 {
+ order: 0 !important;
+ }
+ .order-lg-1 {
+ order: 1 !important;
+ }
+ .order-lg-2 {
+ order: 2 !important;
+ }
+ .order-lg-3 {
+ order: 3 !important;
+ }
+ .order-lg-4 {
+ order: 4 !important;
+ }
+ .order-lg-5 {
+ order: 5 !important;
+ }
+ .order-lg-last {
+ order: 6 !important;
+ }
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+ .me-lg-0 {
+ margin-right: 0 !important;
+ }
+ .me-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .me-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .me-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-lg-0 {
+ margin-left: 0 !important;
+ }
+ .ms-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-lg-auto {
+ margin-left: auto !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pe-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-lg-0 {
+ padding-left: 0 !important;
+ }
+ .ps-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-lg-5 {
+ padding-left: 3rem !important;
+ }
+ .gap-lg-0 {
+ gap: 0 !important;
+ }
+ .gap-lg-1 {
+ gap: 0.25rem !important;
+ }
+ .gap-lg-2 {
+ gap: 0.5rem !important;
+ }
+ .gap-lg-3 {
+ gap: 1rem !important;
+ }
+ .gap-lg-4 {
+ gap: 1.5rem !important;
+ }
+ .gap-lg-5 {
+ gap: 3rem !important;
+ }
+ .row-gap-lg-0 {
+ row-gap: 0 !important;
+ }
+ .row-gap-lg-1 {
+ row-gap: 0.25rem !important;
+ }
+ .row-gap-lg-2 {
+ row-gap: 0.5rem !important;
+ }
+ .row-gap-lg-3 {
+ row-gap: 1rem !important;
+ }
+ .row-gap-lg-4 {
+ row-gap: 1.5rem !important;
+ }
+ .row-gap-lg-5 {
+ row-gap: 3rem !important;
+ }
+ .column-gap-lg-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+ }
+ .column-gap-lg-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+ }
+ .column-gap-lg-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+ }
+ .column-gap-lg-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+ }
+ .column-gap-lg-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+ }
+ .column-gap-lg-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+ }
+ .text-lg-start {
+ text-align: left !important;
+ }
+ .text-lg-end {
+ text-align: right !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .float-xl-start {
+ float: left !important;
+ }
+ .float-xl-end {
+ float: right !important;
+ }
+ .float-xl-none {
+ float: none !important;
+ }
+ .object-fit-xl-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+ }
+ .object-fit-xl-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+ }
+ .object-fit-xl-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+ }
+ .object-fit-xl-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+ }
+ .object-fit-xl-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+ }
+ .d-xl-inline {
+ display: inline !important;
+ }
+ .d-xl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xl-block {
+ display: block !important;
+ }
+ .d-xl-grid {
+ display: grid !important;
+ }
+ .d-xl-inline-grid {
+ display: inline-grid !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;
+ }
+ .d-xl-none {
+ display: none !important;
+ }
+ .flex-xl-fill {
+ flex: 1 1 auto !important;
+ }
+ .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-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;
+ }
+ .flex-xl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !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;
+ }
+ .justify-content-xl-evenly {
+ justify-content: space-evenly !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;
+ }
+ .order-xl-first {
+ order: -1 !important;
+ }
+ .order-xl-0 {
+ order: 0 !important;
+ }
+ .order-xl-1 {
+ order: 1 !important;
+ }
+ .order-xl-2 {
+ order: 2 !important;
+ }
+ .order-xl-3 {
+ order: 3 !important;
+ }
+ .order-xl-4 {
+ order: 4 !important;
+ }
+ .order-xl-5 {
+ order: 5 !important;
+ }
+ .order-xl-last {
+ order: 6 !important;
+ }
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+ .me-xl-0 {
+ margin-right: 0 !important;
+ }
+ .me-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .me-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .me-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-xl-0 {
+ margin-left: 0 !important;
+ }
+ .ms-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-xl-auto {
+ margin-left: auto !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.5rem !important;
+ }
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pe-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-xl-0 {
+ padding-left: 0 !important;
+ }
+ .ps-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-xl-5 {
+ padding-left: 3rem !important;
+ }
+ .gap-xl-0 {
+ gap: 0 !important;
+ }
+ .gap-xl-1 {
+ gap: 0.25rem !important;
+ }
+ .gap-xl-2 {
+ gap: 0.5rem !important;
+ }
+ .gap-xl-3 {
+ gap: 1rem !important;
+ }
+ .gap-xl-4 {
+ gap: 1.5rem !important;
+ }
+ .gap-xl-5 {
+ gap: 3rem !important;
+ }
+ .row-gap-xl-0 {
+ row-gap: 0 !important;
+ }
+ .row-gap-xl-1 {
+ row-gap: 0.25rem !important;
+ }
+ .row-gap-xl-2 {
+ row-gap: 0.5rem !important;
+ }
+ .row-gap-xl-3 {
+ row-gap: 1rem !important;
+ }
+ .row-gap-xl-4 {
+ row-gap: 1.5rem !important;
+ }
+ .row-gap-xl-5 {
+ row-gap: 3rem !important;
+ }
+ .column-gap-xl-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+ }
+ .column-gap-xl-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+ }
+ .column-gap-xl-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+ }
+ .column-gap-xl-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+ }
+ .column-gap-xl-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+ }
+ .column-gap-xl-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+ }
+ .text-xl-start {
+ text-align: left !important;
+ }
+ .text-xl-end {
+ text-align: right !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1400px) {
+ .float-xxl-start {
+ float: left !important;
+ }
+ .float-xxl-end {
+ float: right !important;
+ }
+ .float-xxl-none {
+ float: none !important;
+ }
+ .object-fit-xxl-contain {
+ -o-object-fit: contain !important;
+ object-fit: contain !important;
+ }
+ .object-fit-xxl-cover {
+ -o-object-fit: cover !important;
+ object-fit: cover !important;
+ }
+ .object-fit-xxl-fill {
+ -o-object-fit: fill !important;
+ object-fit: fill !important;
+ }
+ .object-fit-xxl-scale {
+ -o-object-fit: scale-down !important;
+ object-fit: scale-down !important;
+ }
+ .object-fit-xxl-none {
+ -o-object-fit: none !important;
+ object-fit: none !important;
+ }
+ .d-xxl-inline {
+ display: inline !important;
+ }
+ .d-xxl-inline-block {
+ display: inline-block !important;
+ }
+ .d-xxl-block {
+ display: block !important;
+ }
+ .d-xxl-grid {
+ display: grid !important;
+ }
+ .d-xxl-inline-grid {
+ display: inline-grid !important;
+ }
+ .d-xxl-table {
+ display: table !important;
+ }
+ .d-xxl-table-row {
+ display: table-row !important;
+ }
+ .d-xxl-table-cell {
+ display: table-cell !important;
+ }
+ .d-xxl-flex {
+ display: flex !important;
+ }
+ .d-xxl-inline-flex {
+ display: inline-flex !important;
+ }
+ .d-xxl-none {
+ display: none !important;
+ }
+ .flex-xxl-fill {
+ flex: 1 1 auto !important;
+ }
+ .flex-xxl-row {
+ flex-direction: row !important;
+ }
+ .flex-xxl-column {
+ flex-direction: column !important;
+ }
+ .flex-xxl-row-reverse {
+ flex-direction: row-reverse !important;
+ }
+ .flex-xxl-column-reverse {
+ flex-direction: column-reverse !important;
+ }
+ .flex-xxl-grow-0 {
+ flex-grow: 0 !important;
+ }
+ .flex-xxl-grow-1 {
+ flex-grow: 1 !important;
+ }
+ .flex-xxl-shrink-0 {
+ flex-shrink: 0 !important;
+ }
+ .flex-xxl-shrink-1 {
+ flex-shrink: 1 !important;
+ }
+ .flex-xxl-wrap {
+ flex-wrap: wrap !important;
+ }
+ .flex-xxl-nowrap {
+ flex-wrap: nowrap !important;
+ }
+ .flex-xxl-wrap-reverse {
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xxl-start {
+ justify-content: flex-start !important;
+ }
+ .justify-content-xxl-end {
+ justify-content: flex-end !important;
+ }
+ .justify-content-xxl-center {
+ justify-content: center !important;
+ }
+ .justify-content-xxl-between {
+ justify-content: space-between !important;
+ }
+ .justify-content-xxl-around {
+ justify-content: space-around !important;
+ }
+ .justify-content-xxl-evenly {
+ justify-content: space-evenly !important;
+ }
+ .align-items-xxl-start {
+ align-items: flex-start !important;
+ }
+ .align-items-xxl-end {
+ align-items: flex-end !important;
+ }
+ .align-items-xxl-center {
+ align-items: center !important;
+ }
+ .align-items-xxl-baseline {
+ align-items: baseline !important;
+ }
+ .align-items-xxl-stretch {
+ align-items: stretch !important;
+ }
+ .align-content-xxl-start {
+ align-content: flex-start !important;
+ }
+ .align-content-xxl-end {
+ align-content: flex-end !important;
+ }
+ .align-content-xxl-center {
+ align-content: center !important;
+ }
+ .align-content-xxl-between {
+ align-content: space-between !important;
+ }
+ .align-content-xxl-around {
+ align-content: space-around !important;
+ }
+ .align-content-xxl-stretch {
+ align-content: stretch !important;
+ }
+ .align-self-xxl-auto {
+ align-self: auto !important;
+ }
+ .align-self-xxl-start {
+ align-self: flex-start !important;
+ }
+ .align-self-xxl-end {
+ align-self: flex-end !important;
+ }
+ .align-self-xxl-center {
+ align-self: center !important;
+ }
+ .align-self-xxl-baseline {
+ align-self: baseline !important;
+ }
+ .align-self-xxl-stretch {
+ align-self: stretch !important;
+ }
+ .order-xxl-first {
+ order: -1 !important;
+ }
+ .order-xxl-0 {
+ order: 0 !important;
+ }
+ .order-xxl-1 {
+ order: 1 !important;
+ }
+ .order-xxl-2 {
+ order: 2 !important;
+ }
+ .order-xxl-3 {
+ order: 3 !important;
+ }
+ .order-xxl-4 {
+ order: 4 !important;
+ }
+ .order-xxl-5 {
+ order: 5 !important;
+ }
+ .order-xxl-last {
+ order: 6 !important;
+ }
+ .m-xxl-0 {
+ margin: 0 !important;
+ }
+ .m-xxl-1 {
+ margin: 0.25rem !important;
+ }
+ .m-xxl-2 {
+ margin: 0.5rem !important;
+ }
+ .m-xxl-3 {
+ margin: 1rem !important;
+ }
+ .m-xxl-4 {
+ margin: 1.5rem !important;
+ }
+ .m-xxl-5 {
+ margin: 3rem !important;
+ }
+ .m-xxl-auto {
+ margin: auto !important;
+ }
+ .mx-xxl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .mx-xxl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .mx-xxl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .mx-xxl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .mx-xxl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .mx-xxl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .mx-xxl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xxl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .my-xxl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .my-xxl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .my-xxl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .my-xxl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .my-xxl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .my-xxl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ .mt-xxl-0 {
+ margin-top: 0 !important;
+ }
+ .mt-xxl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mt-xxl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mt-xxl-3 {
+ margin-top: 1rem !important;
+ }
+ .mt-xxl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mt-xxl-5 {
+ margin-top: 3rem !important;
+ }
+ .mt-xxl-auto {
+ margin-top: auto !important;
+ }
+ .me-xxl-0 {
+ margin-right: 0 !important;
+ }
+ .me-xxl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .me-xxl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .me-xxl-3 {
+ margin-right: 1rem !important;
+ }
+ .me-xxl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .me-xxl-5 {
+ margin-right: 3rem !important;
+ }
+ .me-xxl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xxl-0 {
+ margin-bottom: 0 !important;
+ }
+ .mb-xxl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .mb-xxl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .mb-xxl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .mb-xxl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .mb-xxl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .mb-xxl-auto {
+ margin-bottom: auto !important;
+ }
+ .ms-xxl-0 {
+ margin-left: 0 !important;
+ }
+ .ms-xxl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .ms-xxl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .ms-xxl-3 {
+ margin-left: 1rem !important;
+ }
+ .ms-xxl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .ms-xxl-5 {
+ margin-left: 3rem !important;
+ }
+ .ms-xxl-auto {
+ margin-left: auto !important;
+ }
+ .p-xxl-0 {
+ padding: 0 !important;
+ }
+ .p-xxl-1 {
+ padding: 0.25rem !important;
+ }
+ .p-xxl-2 {
+ padding: 0.5rem !important;
+ }
+ .p-xxl-3 {
+ padding: 1rem !important;
+ }
+ .p-xxl-4 {
+ padding: 1.5rem !important;
+ }
+ .p-xxl-5 {
+ padding: 3rem !important;
+ }
+ .px-xxl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .px-xxl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .px-xxl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .px-xxl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .px-xxl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .px-xxl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xxl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .py-xxl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .py-xxl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .py-xxl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .py-xxl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .py-xxl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .pt-xxl-0 {
+ padding-top: 0 !important;
+ }
+ .pt-xxl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pt-xxl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pt-xxl-3 {
+ padding-top: 1rem !important;
+ }
+ .pt-xxl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pt-xxl-5 {
+ padding-top: 3rem !important;
+ }
+ .pe-xxl-0 {
+ padding-right: 0 !important;
+ }
+ .pe-xxl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pe-xxl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pe-xxl-3 {
+ padding-right: 1rem !important;
+ }
+ .pe-xxl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pe-xxl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xxl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pb-xxl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pb-xxl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pb-xxl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pb-xxl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pb-xxl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .ps-xxl-0 {
+ padding-left: 0 !important;
+ }
+ .ps-xxl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .ps-xxl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .ps-xxl-3 {
+ padding-left: 1rem !important;
+ }
+ .ps-xxl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .ps-xxl-5 {
+ padding-left: 3rem !important;
+ }
+ .gap-xxl-0 {
+ gap: 0 !important;
+ }
+ .gap-xxl-1 {
+ gap: 0.25rem !important;
+ }
+ .gap-xxl-2 {
+ gap: 0.5rem !important;
+ }
+ .gap-xxl-3 {
+ gap: 1rem !important;
+ }
+ .gap-xxl-4 {
+ gap: 1.5rem !important;
+ }
+ .gap-xxl-5 {
+ gap: 3rem !important;
+ }
+ .row-gap-xxl-0 {
+ row-gap: 0 !important;
+ }
+ .row-gap-xxl-1 {
+ row-gap: 0.25rem !important;
+ }
+ .row-gap-xxl-2 {
+ row-gap: 0.5rem !important;
+ }
+ .row-gap-xxl-3 {
+ row-gap: 1rem !important;
+ }
+ .row-gap-xxl-4 {
+ row-gap: 1.5rem !important;
+ }
+ .row-gap-xxl-5 {
+ row-gap: 3rem !important;
+ }
+ .column-gap-xxl-0 {
+ -moz-column-gap: 0 !important;
+ column-gap: 0 !important;
+ }
+ .column-gap-xxl-1 {
+ -moz-column-gap: 0.25rem !important;
+ column-gap: 0.25rem !important;
+ }
+ .column-gap-xxl-2 {
+ -moz-column-gap: 0.5rem !important;
+ column-gap: 0.5rem !important;
+ }
+ .column-gap-xxl-3 {
+ -moz-column-gap: 1rem !important;
+ column-gap: 1rem !important;
+ }
+ .column-gap-xxl-4 {
+ -moz-column-gap: 1.5rem !important;
+ column-gap: 1.5rem !important;
+ }
+ .column-gap-xxl-5 {
+ -moz-column-gap: 3rem !important;
+ column-gap: 3rem !important;
+ }
+ .text-xxl-start {
+ text-align: left !important;
+ }
+ .text-xxl-end {
+ text-align: right !important;
+ }
+ .text-xxl-center {
+ text-align: center !important;
+ }
+}
+@media (min-width: 1200px) {
+ .fs-1 {
+ font-size: 2.5rem !important;
+ }
+ .fs-2 {
+ font-size: 2rem !important;
+ }
+ .fs-3 {
+ font-size: 1.75rem !important;
+ }
+ .fs-4 {
+ font-size: 1.5rem !important;
+ }
+}
+@media print {
+ .d-print-inline {
+ display: inline !important;
+ }
+ .d-print-inline-block {
+ display: inline-block !important;
+ }
+ .d-print-block {
+ display: block !important;
+ }
+ .d-print-grid {
+ display: grid !important;
+ }
+ .d-print-inline-grid {
+ display: inline-grid !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;
+ }
+ .d-print-none {
+ display: none !important;
+ }
+}
+.navbar .nav-link,
+.navbar .navbar-brand {
+ text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.05);
+ transition: color ease-in-out 0.2s;
+}
+.navbar.bg-primary {
+ background-image: linear-gradient(#7191b3, #446e9b 50%, #3f658f);
+ filter: none;
+ border: 1px solid #36587c;
+}
+.navbar.bg-secondary {
+ background-image: linear-gradient(#b1b1b1, #999 50%, #8d8d8d);
+ filter: none;
+ border: 1px solid #7a7a7a;
+}
+.navbar.bg-success {
+ background-image: linear-gradient(#6bc756, #3cb521 50%, #37a71e);
+ filter: none;
+ border: 1px solid #30911a;
+}
+.navbar.bg-info {
+ background-image: linear-gradient(#64b1f6, #3399f3 50%, #2f8de0);
+ filter: none;
+ border: 1px solid #297ac2;
+}
+.navbar.bg-warning {
+ background-image: linear-gradient(#de963d, #d47500 50%, #c36c00);
+ filter: none;
+ border: 1px solid #aa5e00;
+}
+.navbar.bg-danger {
+ background-image: linear-gradient(#d93f3d, #cd0200 50%, #bd0200);
+ filter: none;
+ border: 1px solid #a40200;
+}
+.navbar.bg-light {
+ background-image: linear-gradient(#f2f2f2, #eee 50%, #dbdbdb);
+ filter: none;
+ border: 1px solid #bebebe;
+}
+.navbar.bg-dark {
+ background-image: linear-gradient(#646464, #333 50%, #2f2f2f);
+ filter: none;
+ border: 1px solid #292929;
+}
+.navbar.bg-light .nav-link,
+.navbar.bg-light .navbar-brand {
+ text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.1);
+}
+.navbar.bg-light .navbar-brand {
+ color: rgba(var(--bs-emphasis-color-rgb), 0.65);
+}
+.navbar.bg-light .navbar-brand:hover {
+ color: #3399f3;
+}
+
+.btn {
+ text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.1);
+}
+.btn-link {
+ text-shadow: none;
+}
+
+.btn-primary {
+ background-image: linear-gradient(#7191b3, #446e9b 50%, #3f658f);
+ filter: none;
+ border: 1px solid #36587c;
+}
+
+.btn-primary:not(.disabled):hover {
+ background-image: linear-gradient(#6d8aaa, #3f658f 50%, #3a5d84);
+ filter: none;
+ border: 1px solid #325172;
+}
+
+.btn-secondary {
+ background-image: linear-gradient(#b1b1b1, #999 50%, #8d8d8d);
+ filter: none;
+ border: 1px solid #7a7a7a;
+}
+
+.btn-secondary:not(.disabled):hover {
+ background-image: linear-gradient(#a8a8a8, #8d8d8d 50%, #828282);
+ filter: none;
+ border: 1px solid #717171;
+}
+
+.btn-success {
+ background-image: linear-gradient(#6bc756, #3cb521 50%, #37a71e);
+ filter: none;
+ border: 1px solid #30911a;
+}
+
+.btn-success:not(.disabled):hover {
+ background-image: linear-gradient(#67bc54, #37a71e 50%, #339a1c);
+ filter: none;
+ border: 1px solid #2c8618;
+}
+
+.btn-info {
+ background-image: linear-gradient(#64b1f6, #3399f3 50%, #2f8de0);
+ filter: none;
+ border: 1px solid #297ac2;
+}
+
+.btn-info:not(.disabled):hover {
+ background-image: linear-gradient(#61a8e7, #2f8de0 50%, #2b82ce);
+ filter: none;
+ border: 1px solid #2671b3;
+}
+
+.btn-warning {
+ background-image: linear-gradient(#de963d, #d47500 50%, #c36c00);
+ filter: none;
+ border: 1px solid #aa5e00;
+}
+
+.btn-warning:not(.disabled):hover {
+ background-image: linear-gradient(#d18f3d, #c36c00 50%, #b36300);
+ filter: none;
+ border: 1px solid #9c5600;
+}
+
+.btn-danger {
+ background-image: linear-gradient(#d93f3d, #cd0200 50%, #bd0200);
+ filter: none;
+ border: 1px solid #a40200;
+}
+
+.btn-danger:not(.disabled):hover {
+ background-image: linear-gradient(#cd3f3d, #bd0200 50%, #ae0200);
+ filter: none;
+ border: 1px solid #970200;
+}
+
+.btn-light {
+ background-image: linear-gradient(#f2f2f2, #eee 50%, #dbdbdb);
+ filter: none;
+ border: 1px solid #bebebe;
+}
+
+.btn-light:not(.disabled):hover {
+ background-image: linear-gradient(#e4e4e4, #dbdbdb 50%, #c9c9c9);
+ filter: none;
+ border: 1px solid #afafaf;
+}
+
+.btn-dark {
+ background-image: linear-gradient(#646464, #333 50%, #2f2f2f);
+ filter: none;
+ border: 1px solid #292929;
+}
+
+.btn-dark:not(.disabled):hover {
+ background-image: linear-gradient(#616161, #2f2f2f 50%, #2b2b2b);
+ filter: none;
+ border: 1px solid #262626;
+}
+
+[class*=btn-outline-] {
+ text-shadow: none;
+}
+
+.badge.bg-light {
+ color: #333;
+}
+
+.card h1, .card .h1,
+.card h2,
+.card .h2,
+.card h3,
+.card .h3,
+.card h4,
+.card .h4,
+.card h5,
+.card .h5,
+.card h6,
+.card .h6,
+.list-group-item h1,
+.list-group-item .h1,
+.list-group-item h2,
+.list-group-item .h2,
+.list-group-item h3,
+.list-group-item .h3,
+.list-group-item h4,
+.list-group-item .h4,
+.list-group-item h5,
+.list-group-item .h5,
+.list-group-item h6,
+.list-group-item .h6 {
+ color: inherit;
+}
\ No newline at end of file
diff --git a/css/themes/Spacelab/bootstrap.min.css b/css/themes/Spacelab/bootstrap.min.css
new file mode 100644
index 0000000..e64e5c4
--- /dev/null
+++ b/css/themes/Spacelab/bootstrap.min.css
@@ -0,0 +1,143 @@
+@charset "UTF-8";/*!
+ * Bootswatch v5.3.3 (https://bootswatch.com)
+ * Theme: spacelab
+ * Copyright 2012-2024 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*//*!
+ * Bootstrap v5.3.3 (https://getbootstrap.com/)
+ * Copyright 2011-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+
+/* lato-100 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 100;
+ src: url('../fonts/lato-v17-latin-100.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-100.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-100.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-100.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-100.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-100.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-100italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 100;
+ src: url('../fonts/lato-v17-latin-100italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-100italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-100italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-100italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-100italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-100italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-300 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 300;
+ src: url('../fonts/lato-v17-latin-300.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-300.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-300.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-300.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-300italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 300;
+ src: url('../fonts/lato-v17-latin-300italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-300italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-300italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-300italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-300italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-regular - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/lato-v17-latin-regular.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-regular.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ src: url('../fonts/lato-v17-latin-italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-700 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ src: url('../fonts/lato-v17-latin-700.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-700.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-700.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-700italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 700;
+ src: url('../fonts/lato-v17-latin-700italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-700italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-700italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-900 - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 900;
+ src: url('../fonts/lato-v17-latin-900.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-900.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-900.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-900.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-900.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-900.svg#Lato') format('svg'); /* Legacy iOS */
+}
+/* lato-900italic - latin */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 900;
+ src: url('../fonts/lato-v17-latin-900italic.eot'); /* IE9 Compat Modes */
+ src: local(''),
+ url('../fonts/lato-v17-latin-900italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/lato-v17-latin-900italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/lato-v17-latin-900italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/lato-v17-latin-900italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/lato-v17-latin-900italic.svg#Lato') format('svg'); /* Legacy iOS */
+}
+
+:root,[data-bs-theme=light]{--bs-blue:#446e9b;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#cd0200;--bs-orange:#fd7e14;--bs-yellow:#d47500;--bs-green:#3cb521;--bs-teal:#20c997;--bs-cyan:#3399f3;--bs-black:#000;--bs-white:#fff;--bs-gray:#777;--bs-gray-dark:#333;--bs-gray-100:#f8f9fa;--bs-gray-200:#eee;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#999;--bs-gray-600:#777;--bs-gray-700:#495057;--bs-gray-800:#333;--bs-gray-900:#2d2d2d;--bs-primary:#446e9b;--bs-secondary:#999;--bs-success:#3cb521;--bs-info:#3399f3;--bs-warning:#d47500;--bs-danger:#cd0200;--bs-light:#eee;--bs-dark:#333;--bs-primary-rgb:68,110,155;--bs-secondary-rgb:153,153,153;--bs-success-rgb:60,181,33;--bs-info-rgb:51,153,243;--bs-warning-rgb:212,117,0;--bs-danger-rgb:205,2,0;--bs-light-rgb:238,238,238;--bs-dark-rgb:51,51,51;--bs-primary-text-emphasis:#1b2c3e;--bs-secondary-text-emphasis:#3d3d3d;--bs-success-text-emphasis:#18480d;--bs-info-text-emphasis:#143d61;--bs-warning-text-emphasis:#552f00;--bs-danger-text-emphasis:#520100;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#dae2eb;--bs-secondary-bg-subtle:#ebebeb;--bs-success-bg-subtle:#d8f0d3;--bs-info-bg-subtle:#d6ebfd;--bs-warning-bg-subtle:#f6e3cc;--bs-danger-bg-subtle:#f5cccc;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#b4c5d7;--bs-secondary-border-subtle:#d6d6d6;--bs-success-border-subtle:#b1e1a6;--bs-info-border-subtle:#add6fa;--bs-warning-border-subtle:#eec899;--bs-danger-border-subtle:#eb9a99;--bs-light-border-subtle:#eee;--bs-dark-border-subtle:#999;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:Lato,"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#777;--bs-body-color-rgb:119,119,119;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(119, 119, 119, 0.75);--bs-secondary-color-rgb:119,119,119;--bs-secondary-bg:#eee;--bs-secondary-bg-rgb:238,238,238;--bs-tertiary-color:rgba(119, 119, 119, 0.5);--bs-tertiary-color-rgb:119,119,119;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2d2d2d;--bs-link-color:#3399f3;--bs-link-color-rgb:51,153,243;--bs-link-decoration:underline;--bs-link-hover-color:#297ac2;--bs-link-hover-color-rgb:41,122,194;--bs-code-color:#e83e8c;--bs-highlight-color:#777;--bs-highlight-bg:#f6e3cc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(68, 110, 155, 0.25);--bs-form-valid-color:#3cb521;--bs-form-valid-border-color:#3cb521;--bs-form-invalid-color:#cd0200;--bs-form-invalid-border-color:#cd0200}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#2d2d2d;--bs-body-bg-rgb:45,45,45;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#333;--bs-secondary-bg-rgb:51,51,51;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#303030;--bs-tertiary-bg-rgb:48,48,48;--bs-primary-text-emphasis:#8fa8c3;--bs-secondary-text-emphasis:#c2c2c2;--bs-success-text-emphasis:#8ad37a;--bs-info-text-emphasis:#85c2f8;--bs-warning-text-emphasis:#e5ac66;--bs-danger-text-emphasis:#e16766;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#0e161f;--bs-secondary-bg-subtle:#1f1f1f;--bs-success-bg-subtle:#0c2407;--bs-info-bg-subtle:#0a1f31;--bs-warning-bg-subtle:#2a1700;--bs-danger-bg-subtle:#290000;--bs-light-bg-subtle:#333;--bs-dark-bg-subtle:#1a1a1a;--bs-primary-border-subtle:#29425d;--bs-secondary-border-subtle:#5c5c5c;--bs-success-border-subtle:#246d14;--bs-info-border-subtle:#1f5c92;--bs-warning-border-subtle:#7f4600;--bs-danger-border-subtle:#7b0100;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#333;--bs-heading-color:inherit;--bs-link-color:#8fa8c3;--bs-link-hover-color:#a5b9cf;--bs-link-color-rgb:143,168,195;--bs-link-hover-color-rgb:165,185,207;--bs-code-color:#f18bba;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#552f00;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#8ad37a;--bs-form-valid-border-color:#8ad37a;--bs-form-invalid-color:#e16766;--bs-form-invalid-border-color:#e16766}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.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:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#777}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);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}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#dae2eb;--bs-table-border-color:#aeb5bc;--bs-table-striped-bg:#cfd7df;--bs-table-striped-color:#000;--bs-table-active-bg:#c4cbd4;--bs-table-active-color:#000;--bs-table-hover-bg:#cad1d9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#ebebeb;--bs-table-border-color:#bcbcbc;--bs-table-striped-bg:#dfdfdf;--bs-table-striped-color:#000;--bs-table-active-bg:#d4d4d4;--bs-table-active-color:#000;--bs-table-hover-bg:#d9d9d9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d8f0d3;--bs-table-border-color:#adc0a9;--bs-table-striped-bg:#cde4c8;--bs-table-striped-color:#000;--bs-table-active-bg:#c2d8be;--bs-table-active-color:#000;--bs-table-hover-bg:#c8dec3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#d6ebfd;--bs-table-border-color:#abbcca;--bs-table-striped-bg:#cbdff0;--bs-table-striped-color:#000;--bs-table-active-bg:#c1d4e4;--bs-table-active-color:#000;--bs-table-hover-bg:#c6d9ea;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#f6e3cc;--bs-table-border-color:#c5b6a3;--bs-table-striped-bg:#ead8c2;--bs-table-striped-color:#000;--bs-table-active-bg:#ddccb8;--bs-table-active-color:#000;--bs-table-hover-bg:#e4d2bd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f5cccc;--bs-table-border-color:#c4a3a3;--bs-table-striped-bg:#e9c2c2;--bs-table-striped-color:#000;--bs-table-active-bg:#ddb8b8;--bs-table-active-color:#000;--bs-table-hover-bg:#e3bdbd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#eee;--bs-table-border-color:#bebebe;--bs-table-striped-bg:#e2e2e2;--bs-table-striped-color:#000;--bs-table-active-bg:#d6d6d6;--bs-table-active-color:#000;--bs-table-hover-bg:gainsboro;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#333;--bs-table-border-color:#5c5c5c;--bs-table-striped-bg:#3d3d3d;--bs-table-striped-color:#fff;--bs-table-active-bg:#474747;--bs-table-active-color:#fff;--bs-table-hover-bg:#424242;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#a2b7cd;outline:0;box-shadow:0 0 0 .25rem rgba(68,110,155,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;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){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#a2b7cd;outline:0;box-shadow:0 0 0 .25rem rgba(68,110,155,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#a2b7cd;outline:0;box-shadow:0 0 0 .25rem rgba(68,110,155,.25)}.form-check-input:checked{background-color:#446e9b;border-color:#446e9b}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#446e9b;border-color:#446e9b;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23a2b7cd'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: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")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(68,110,155,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(68,110,155,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#446e9b;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}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c7d4e1}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#446e9b;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}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c7d4e1}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#777}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.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:var(--bs-form-valid-border-color);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='%233cb521' d='M2.3 6.73.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:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.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)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%233cb521' d='M2.3 6.73.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");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.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:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23cd0200'%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='%23cd0200' 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:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.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)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23cd0200'%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='%23cd0200' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);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:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#446e9b;--bs-btn-border-color:#446e9b;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#3a5e84;--bs-btn-hover-border-color:#36587c;--bs-btn-focus-shadow-rgb:96,132,170;--bs-btn-active-color:#fff;--bs-btn-active-bg:#36587c;--bs-btn-active-border-color:#335374;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#446e9b;--bs-btn-disabled-border-color:#446e9b}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#999;--bs-btn-border-color:#999;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#828282;--bs-btn-hover-border-color:#7a7a7a;--bs-btn-focus-shadow-rgb:168,168,168;--bs-btn-active-color:#fff;--bs-btn-active-bg:#7a7a7a;--bs-btn-active-border-color:#737373;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#999;--bs-btn-disabled-border-color:#999}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#3cb521;--bs-btn-border-color:#3cb521;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#339a1c;--bs-btn-hover-border-color:#30911a;--bs-btn-focus-shadow-rgb:89,192,66;--bs-btn-active-color:#fff;--bs-btn-active-bg:#30911a;--bs-btn-active-border-color:#2d8819;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#3cb521;--bs-btn-disabled-border-color:#3cb521}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#3399f3;--bs-btn-border-color:#3399f3;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#2b82cf;--bs-btn-hover-border-color:#297ac2;--bs-btn-focus-shadow-rgb:82,168,245;--bs-btn-active-color:#fff;--bs-btn-active-bg:#297ac2;--bs-btn-active-border-color:#2673b6;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#3399f3;--bs-btn-disabled-border-color:#3399f3}.btn-warning{--bs-btn-color:#fff;--bs-btn-bg:#d47500;--bs-btn-border-color:#d47500;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#b46300;--bs-btn-hover-border-color:#aa5e00;--bs-btn-focus-shadow-rgb:218,138,38;--bs-btn-active-color:#fff;--bs-btn-active-bg:#aa5e00;--bs-btn-active-border-color:#9f5800;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#d47500;--bs-btn-disabled-border-color:#d47500}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#cd0200;--bs-btn-border-color:#cd0200;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#ae0200;--bs-btn-hover-border-color:#a40200;--bs-btn-focus-shadow-rgb:213,40,38;--bs-btn-active-color:#fff;--bs-btn-active-bg:#a40200;--bs-btn-active-border-color:#9a0200;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#cd0200;--bs-btn-disabled-border-color:#cd0200}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#eee;--bs-btn-border-color:#eee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#cacaca;--bs-btn-hover-border-color:#bebebe;--bs-btn-focus-shadow-rgb:202,202,202;--bs-btn-active-color:#000;--bs-btn-active-bg:#bebebe;--bs-btn-active-border-color:#b3b3b3;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#eee;--bs-btn-disabled-border-color:#eee}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#333;--bs-btn-border-color:#333;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#525252;--bs-btn-hover-border-color:#474747;--bs-btn-focus-shadow-rgb:82,82,82;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5c5c5c;--bs-btn-active-border-color:#474747;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#333;--bs-btn-disabled-border-color:#333}.btn-outline-primary{--bs-btn-color:#446e9b;--bs-btn-border-color:#446e9b;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#446e9b;--bs-btn-hover-border-color:#446e9b;--bs-btn-focus-shadow-rgb:68,110,155;--bs-btn-active-color:#fff;--bs-btn-active-bg:#446e9b;--bs-btn-active-border-color:#446e9b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#446e9b;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#446e9b;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#999;--bs-btn-border-color:#999;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#999;--bs-btn-hover-border-color:#999;--bs-btn-focus-shadow-rgb:153,153,153;--bs-btn-active-color:#fff;--bs-btn-active-bg:#999;--bs-btn-active-border-color:#999;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#999;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#999;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#3cb521;--bs-btn-border-color:#3cb521;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#3cb521;--bs-btn-hover-border-color:#3cb521;--bs-btn-focus-shadow-rgb:60,181,33;--bs-btn-active-color:#fff;--bs-btn-active-bg:#3cb521;--bs-btn-active-border-color:#3cb521;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#3cb521;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#3cb521;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#3399f3;--bs-btn-border-color:#3399f3;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#3399f3;--bs-btn-hover-border-color:#3399f3;--bs-btn-focus-shadow-rgb:51,153,243;--bs-btn-active-color:#fff;--bs-btn-active-bg:#3399f3;--bs-btn-active-border-color:#3399f3;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#3399f3;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#3399f3;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#d47500;--bs-btn-border-color:#d47500;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#d47500;--bs-btn-hover-border-color:#d47500;--bs-btn-focus-shadow-rgb:212,117,0;--bs-btn-active-color:#fff;--bs-btn-active-bg:#d47500;--bs-btn-active-border-color:#d47500;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#d47500;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#d47500;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#cd0200;--bs-btn-border-color:#cd0200;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#cd0200;--bs-btn-hover-border-color:#cd0200;--bs-btn-focus-shadow-rgb:205,2,0;--bs-btn-active-color:#fff;--bs-btn-active-bg:#cd0200;--bs-btn-active-border-color:#cd0200;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#cd0200;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#cd0200;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#eee;--bs-btn-border-color:#eee;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#eee;--bs-btn-hover-border-color:#eee;--bs-btn-focus-shadow-rgb:238,238,238;--bs-btn-active-color:#000;--bs-btn-active-bg:#eee;--bs-btn-active-border-color:#eee;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#eee;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#eee;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#333;--bs-btn-border-color:#333;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#333;--bs-btn-hover-border-color:#333;--bs-btn-focus-shadow-rgb:51,51,51;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333;--bs-btn-active-border-color:#333;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#333;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#333;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#777;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:82,168,245;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{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{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#446e9b;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#777;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.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}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .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}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .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}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#333;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#446e9b;--bs-dropdown-link-disabled-color:#999;--bs-dropdown-header-color:#999}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.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:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .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{flex-direction:column;align-items:flex-start;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:calc(var(--bs-border-width) * -1)}.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~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(68,110,155,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#446e9b}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:#3399f3;--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:#3399f3;--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:#3399f3;--bs-navbar-brand-hover-color:#3399f3;--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28119, 119, 119, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;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-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}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23777' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%231b2c3e' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(68, 110, 155, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238fa8c3'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%238fa8c3'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(68, 110, 155, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#446e9b;--bs-pagination-active-border-color:#446e9b;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);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){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#446e9b;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@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:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#446e9b;--bs-list-group-active-border-color:#446e9b;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);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:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);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:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);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:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);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:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);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:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(68, 110, 155, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:#2d2d2d;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{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: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-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;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:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--bs-offcanvas-padding-y)) calc(-.5 * var(--bs-offcanvas-padding-x)) calc(-.5 * var(--bs-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#fff!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(54,88,124,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(54,88,124,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(54,88,124,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(122,122,122,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(122,122,122,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(122,122,122,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(48,145,26,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(48,145,26,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(48,145,26,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(41,122,194,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(41,122,194,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(41,122,194,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(170,94,0,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(170,94,0,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(170,94,0,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(164,2,0,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(164,2,0,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(164,2,0,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(241,241,241,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(241,241,241,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(241,241,241,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(41,41,41,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(41,41,41,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(41,41,41,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.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}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.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}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!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}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.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}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.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}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!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}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!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-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}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-evenly{justify-content:space-evenly!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}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!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}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.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-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}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-sm-evenly{justify-content:space-evenly!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}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!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}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.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-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}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-md-evenly{justify-content:space-evenly!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}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!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}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.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-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}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-lg-evenly{justify-content:space-evenly!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}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!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}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.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-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}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!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}.justify-content-xl-evenly{justify-content:space-evenly!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}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!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}.d-print-none{display:none!important}}.navbar .nav-link,.navbar .navbar-brand{text-shadow:-1px -1px 0 rgba(0,0,0,.05);transition:color ease-in-out .2s}.navbar.bg-primary{background-image:linear-gradient(#7191b3,#446e9b 50%,#3f658f);filter:none;border:1px solid #36587c}.navbar.bg-secondary{background-image:linear-gradient(#b1b1b1,#999 50%,#8d8d8d);filter:none;border:1px solid #7a7a7a}.navbar.bg-success{background-image:linear-gradient(#6bc756,#3cb521 50%,#37a71e);filter:none;border:1px solid #30911a}.navbar.bg-info{background-image:linear-gradient(#64b1f6,#3399f3 50%,#2f8de0);filter:none;border:1px solid #297ac2}.navbar.bg-warning{background-image:linear-gradient(#de963d,#d47500 50%,#c36c00);filter:none;border:1px solid #aa5e00}.navbar.bg-danger{background-image:linear-gradient(#d93f3d,#cd0200 50%,#bd0200);filter:none;border:1px solid #a40200}.navbar.bg-light{background-image:linear-gradient(#f2f2f2,#eee 50%,#dbdbdb);filter:none;border:1px solid #bebebe}.navbar.bg-dark{background-image:linear-gradient(#646464,#333 50%,#2f2f2f);filter:none;border:1px solid #292929}.navbar.bg-light .nav-link,.navbar.bg-light .navbar-brand{text-shadow:1px 1px 0 rgba(255,255,255,.1)}.navbar.bg-light .navbar-brand{color:rgba(var(--bs-emphasis-color-rgb),.65)}.navbar.bg-light .navbar-brand:hover{color:#3399f3}.btn{text-shadow:-1px -1px 0 rgba(0,0,0,.1)}.btn-link{text-shadow:none}.btn-primary{background-image:linear-gradient(#7191b3,#446e9b 50%,#3f658f);filter:none;border:1px solid #36587c}.btn-primary:not(.disabled):hover{background-image:linear-gradient(#6d8aaa,#3f658f 50%,#3a5d84);filter:none;border:1px solid #325172}.btn-secondary{background-image:linear-gradient(#b1b1b1,#999 50%,#8d8d8d);filter:none;border:1px solid #7a7a7a}.btn-secondary:not(.disabled):hover{background-image:linear-gradient(#a8a8a8,#8d8d8d 50%,#828282);filter:none;border:1px solid #717171}.btn-success{background-image:linear-gradient(#6bc756,#3cb521 50%,#37a71e);filter:none;border:1px solid #30911a}.btn-success:not(.disabled):hover{background-image:linear-gradient(#67bc54,#37a71e 50%,#339a1c);filter:none;border:1px solid #2c8618}.btn-info{background-image:linear-gradient(#64b1f6,#3399f3 50%,#2f8de0);filter:none;border:1px solid #297ac2}.btn-info:not(.disabled):hover{background-image:linear-gradient(#61a8e7,#2f8de0 50%,#2b82ce);filter:none;border:1px solid #2671b3}.btn-warning{background-image:linear-gradient(#de963d,#d47500 50%,#c36c00);filter:none;border:1px solid #aa5e00}.btn-warning:not(.disabled):hover{background-image:linear-gradient(#d18f3d,#c36c00 50%,#b36300);filter:none;border:1px solid #9c5600}.btn-danger{background-image:linear-gradient(#d93f3d,#cd0200 50%,#bd0200);filter:none;border:1px solid #a40200}.btn-danger:not(.disabled):hover{background-image:linear-gradient(#cd3f3d,#bd0200 50%,#ae0200);filter:none;border:1px solid #970200}.btn-light{background-image:linear-gradient(#f2f2f2,#eee 50%,#dbdbdb);filter:none;border:1px solid #bebebe}.btn-light:not(.disabled):hover{background-image:linear-gradient(#e4e4e4,#dbdbdb 50%,#c9c9c9);filter:none;border:1px solid #afafaf}.btn-dark{background-image:linear-gradient(#646464,#333 50%,#2f2f2f);filter:none;border:1px solid #292929}.btn-dark:not(.disabled):hover{background-image:linear-gradient(#616161,#2f2f2f 50%,#2b2b2b);filter:none;border:1px solid #262626}[class*=btn-outline-]{text-shadow:none}.badge.bg-light{color:#333}.card .h1,.card .h2,.card .h3,.card .h4,.card .h5,.card .h6,.card h1,.card h2,.card h3,.card h4,.card h5,.card h6,.list-group-item .h1,.list-group-item .h2,.list-group-item .h3,.list-group-item .h4,.list-group-item .h5,.list-group-item .h6,.list-group-item h1,.list-group-item h2,.list-group-item h3,.list-group-item h4,.list-group-item h5,.list-group-item h6{color:inherit}
\ No newline at end of file
diff --git a/css/themes/fonts/lato-v17-latin-100.eot b/css/themes/fonts/lato-v17-latin-100.eot
new file mode 100644
index 0000000..d17348f
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-100.svg b/css/themes/fonts/lato-v17-latin-100.svg
new file mode 100644
index 0000000..1e66cd8
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-100.svg
@@ -0,0 +1,429 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-100.ttf b/css/themes/fonts/lato-v17-latin-100.ttf
new file mode 100644
index 0000000..9e9f933
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-100.woff b/css/themes/fonts/lato-v17-latin-100.woff
new file mode 100644
index 0000000..71b25fa
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-100.woff2 b/css/themes/fonts/lato-v17-latin-100.woff2
new file mode 100644
index 0000000..3dbe168
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-100italic.eot b/css/themes/fonts/lato-v17-latin-100italic.eot
new file mode 100644
index 0000000..1253b94
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100italic.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-100italic.svg b/css/themes/fonts/lato-v17-latin-100italic.svg
new file mode 100644
index 0000000..d7646d3
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-100italic.svg
@@ -0,0 +1,442 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-100italic.ttf b/css/themes/fonts/lato-v17-latin-100italic.ttf
new file mode 100644
index 0000000..192d960
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100italic.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-100italic.woff b/css/themes/fonts/lato-v17-latin-100italic.woff
new file mode 100644
index 0000000..e68b79e
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100italic.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-100italic.woff2 b/css/themes/fonts/lato-v17-latin-100italic.woff2
new file mode 100644
index 0000000..7cc540a
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-100italic.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-300.eot b/css/themes/fonts/lato-v17-latin-300.eot
new file mode 100644
index 0000000..78dbe12
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-300.svg b/css/themes/fonts/lato-v17-latin-300.svg
new file mode 100644
index 0000000..11b626f
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-300.svg
@@ -0,0 +1,435 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-300.ttf b/css/themes/fonts/lato-v17-latin-300.ttf
new file mode 100644
index 0000000..45f7947
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-300.woff b/css/themes/fonts/lato-v17-latin-300.woff
new file mode 100644
index 0000000..a18ddb1
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-300.woff2 b/css/themes/fonts/lato-v17-latin-300.woff2
new file mode 100644
index 0000000..a7f756c
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-300italic.eot b/css/themes/fonts/lato-v17-latin-300italic.eot
new file mode 100644
index 0000000..a6b96fb
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300italic.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-300italic.svg b/css/themes/fonts/lato-v17-latin-300italic.svg
new file mode 100644
index 0000000..b3e4ce0
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-300italic.svg
@@ -0,0 +1,443 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-300italic.ttf b/css/themes/fonts/lato-v17-latin-300italic.ttf
new file mode 100644
index 0000000..e8d349b
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300italic.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-300italic.woff b/css/themes/fonts/lato-v17-latin-300italic.woff
new file mode 100644
index 0000000..0863aca
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300italic.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-300italic.woff2 b/css/themes/fonts/lato-v17-latin-300italic.woff2
new file mode 100644
index 0000000..2f21c6f
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-300italic.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-700.eot b/css/themes/fonts/lato-v17-latin-700.eot
new file mode 100644
index 0000000..0d9dac2
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-700.svg b/css/themes/fonts/lato-v17-latin-700.svg
new file mode 100644
index 0000000..077653d
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-700.svg
@@ -0,0 +1,438 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-700.ttf b/css/themes/fonts/lato-v17-latin-700.ttf
new file mode 100644
index 0000000..4f3d844
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-700.woff b/css/themes/fonts/lato-v17-latin-700.woff
new file mode 100644
index 0000000..abf0196
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-700.woff2 b/css/themes/fonts/lato-v17-latin-700.woff2
new file mode 100644
index 0000000..f8c37ec
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-700italic.eot b/css/themes/fonts/lato-v17-latin-700italic.eot
new file mode 100644
index 0000000..1ab37ef
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700italic.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-700italic.svg b/css/themes/fonts/lato-v17-latin-700italic.svg
new file mode 100644
index 0000000..3e9d440
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-700italic.svg
@@ -0,0 +1,451 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-700italic.ttf b/css/themes/fonts/lato-v17-latin-700italic.ttf
new file mode 100644
index 0000000..96b4f82
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700italic.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-700italic.woff b/css/themes/fonts/lato-v17-latin-700italic.woff
new file mode 100644
index 0000000..cdf0d86
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700italic.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-700italic.woff2 b/css/themes/fonts/lato-v17-latin-700italic.woff2
new file mode 100644
index 0000000..5b3f882
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-700italic.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-900.eot b/css/themes/fonts/lato-v17-latin-900.eot
new file mode 100644
index 0000000..b3d3327
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-900.svg b/css/themes/fonts/lato-v17-latin-900.svg
new file mode 100644
index 0000000..775c5ae
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-900.svg
@@ -0,0 +1,439 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-900.ttf b/css/themes/fonts/lato-v17-latin-900.ttf
new file mode 100644
index 0000000..92a5f7c
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-900.woff b/css/themes/fonts/lato-v17-latin-900.woff
new file mode 100644
index 0000000..6f201e0
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-900.woff2 b/css/themes/fonts/lato-v17-latin-900.woff2
new file mode 100644
index 0000000..2f647be
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-900italic.eot b/css/themes/fonts/lato-v17-latin-900italic.eot
new file mode 100644
index 0000000..18ac81a
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900italic.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-900italic.svg b/css/themes/fonts/lato-v17-latin-900italic.svg
new file mode 100644
index 0000000..9ed6901
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-900italic.svg
@@ -0,0 +1,447 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-900italic.ttf b/css/themes/fonts/lato-v17-latin-900italic.ttf
new file mode 100644
index 0000000..17fc055
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900italic.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-900italic.woff b/css/themes/fonts/lato-v17-latin-900italic.woff
new file mode 100644
index 0000000..b0811e9
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900italic.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-900italic.woff2 b/css/themes/fonts/lato-v17-latin-900italic.woff2
new file mode 100644
index 0000000..3878ae1
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-900italic.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-italic.eot b/css/themes/fonts/lato-v17-latin-italic.eot
new file mode 100644
index 0000000..8e32803
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-italic.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-italic.svg b/css/themes/fonts/lato-v17-latin-italic.svg
new file mode 100644
index 0000000..e288645
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-italic.svg
@@ -0,0 +1,450 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-italic.ttf b/css/themes/fonts/lato-v17-latin-italic.ttf
new file mode 100644
index 0000000..cf3da8b
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-italic.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-italic.woff b/css/themes/fonts/lato-v17-latin-italic.woff
new file mode 100644
index 0000000..95251da
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-italic.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-italic.woff2 b/css/themes/fonts/lato-v17-latin-italic.woff2
new file mode 100644
index 0000000..3246c12
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-italic.woff2 differ
diff --git a/css/themes/fonts/lato-v17-latin-regular.eot b/css/themes/fonts/lato-v17-latin-regular.eot
new file mode 100644
index 0000000..c641306
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-regular.eot differ
diff --git a/css/themes/fonts/lato-v17-latin-regular.svg b/css/themes/fonts/lato-v17-latin-regular.svg
new file mode 100644
index 0000000..55b43fb
--- /dev/null
+++ b/css/themes/fonts/lato-v17-latin-regular.svg
@@ -0,0 +1,435 @@
+
+
+
diff --git a/css/themes/fonts/lato-v17-latin-regular.ttf b/css/themes/fonts/lato-v17-latin-regular.ttf
new file mode 100644
index 0000000..3c2d417
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-regular.ttf differ
diff --git a/css/themes/fonts/lato-v17-latin-regular.woff b/css/themes/fonts/lato-v17-latin-regular.woff
new file mode 100644
index 0000000..189a0fe
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-regular.woff differ
diff --git a/css/themes/fonts/lato-v17-latin-regular.woff2 b/css/themes/fonts/lato-v17-latin-regular.woff2
new file mode 100644
index 0000000..6904b66
Binary files /dev/null and b/css/themes/fonts/lato-v17-latin-regular.woff2 differ
diff --git a/html/unsupported.html b/html/unsupported.html
new file mode 100644
index 0000000..207ac62
--- /dev/null
+++ b/html/unsupported.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+ Unsupported Browser
+
+
+
+
+
+ Unsupported Browser
+
+
+ Internet Explorer has been withdrawn and is no longer in use or supported.
+
+
+
+ Please upgrade to a modern browser such as Chrome, Firefox, Safari, Edge, etc.
+
+
+
+
+
\ No newline at end of file
diff --git a/images/dec-international-logo.png b/images/dec-international-logo.png
new file mode 100644
index 0000000..9dd5e54
Binary files /dev/null and b/images/dec-international-logo.png differ
diff --git a/images/dec-logo.svg b/images/dec-logo.svg
new file mode 100644
index 0000000..734c3fc
--- /dev/null
+++ b/images/dec-logo.svg
@@ -0,0 +1,96 @@
+
+
+
diff --git a/images/server.svg b/images/server.svg
new file mode 100644
index 0000000..bb8ca8f
--- /dev/null
+++ b/images/server.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/images/title-logo.jpg b/images/title-logo.jpg
new file mode 100644
index 0000000..c9d5138
Binary files /dev/null and b/images/title-logo.jpg differ
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..60533c0
--- /dev/null
+++ b/index.php
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/js/addCounty.js b/js/addCounty.js
new file mode 100644
index 0000000..b0d674d
--- /dev/null
+++ b/js/addCounty.js
@@ -0,0 +1,84 @@
+
+// ==========
+// Add County
+// ==========
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // --------------
+ // Select Pickers
+ // --------------
+
+ $(".search-dropdown").selectpicker({noneSelectedText: "",
+ style: "",
+ styleBase: "form-select form-select-sm",
+ iconBase: "bi",
+ virtualScroll: true,
+ size: 10,
+ selectOnTab: true,
+ containter: "body",
+ liveSearch: true});
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+ e.preventDefault();
+ $("#addCounty").submit();
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addCounty || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addCounty").submit(function (e) {
+
+ var county_name = $("#county_name"), county_area = $("#county_area");
+
+ clearInputErrors();
+
+ county_name.val(trimString(county_name.val()));
+
+ if (isBlank(county_name)) {
+ createInputError(county_name, "Name is required");
+ return false;
+ }
+
+ if (formPost({action: "Counties.countyExists", county_serial: 0, county_name: county_name.val()}) === true) {
+ createInputError(county_name, "Name already exists");
+ return false;
+ }
+
+ if ($("option:selected", county_area).val() === "") {
+ createInputError(county_area, "Area is required");
+ return false;
+ }
+
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+ .done(function () {
+ formSubmit({action: $sessionStorage.addCounty});
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addDropdown.js b/js/addDropdown.js
new file mode 100644
index 0000000..d286dd2
--- /dev/null
+++ b/js/addDropdown.js
@@ -0,0 +1,68 @@
+
+// ============
+// Add Dropdown
+// ============
+
+$(document).ready(function() {
+
+ var $application = "ATLHOUSINGREPORT",
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function(e) {
+ e.preventDefault();
+ $("#addDropdown").submit();
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function() {
+ formSubmit({ action : $sessionStorage.addDropdown });
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addDropdown").submit( function(e) {
+
+ var dropdowntype_serial = $("#dropdowntype_serial").val(),
+ dropdown_value = $("#dropdown_value");
+
+ clearInputErrors();
+
+ dropdown_value.val(trimString(dropdown_value.val()));
+
+ if (isBlank(dropdown_value)) {
+ createInputError(dropdown_value, "Value is required");
+ return false;
+ }
+
+ if (formPost({ action : "Dropdowns.dropdownExists", dropdowntype_serial : dropdowntype_serial, dropdown_serial : 0, dropdown_value : dropdown_value.val() }) === true) {
+ createInputError(dropdown_value, "Value already exists");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function() {
+
+ $sessionStorage.action = $sessionStorage.addDropdown || "";
+ $sessionStorage.toast = "Dropdown was Added";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addDropdowntype.js b/js/addDropdowntype.js
new file mode 100644
index 0000000..18dc9a7
--- /dev/null
+++ b/js/addDropdowntype.js
@@ -0,0 +1,93 @@
+
+// ================
+// Add Dropdowntype
+// ================
+
+$(document).ready(function() {
+
+ var $application = "ATLHOUSINGREPORT",
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function(e) {
+ e.preventDefault();
+ $("#addDropdowntype").submit();
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function() {
+ formSubmit({ action : $sessionStorage.addDropdowntype });
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addDropdowntype").submit( function(e) {
+
+ var dropdowntype_name = $("#dropdowntype_name"),
+ dropdowntype_title = $("#dropdowntype_title"),
+ dropdowntype_table = $("#dropdowntype_table"),
+ dropdowntype_column = $("#dropdowntype_column");
+
+ clearInputErrors();
+
+ dropdowntype_name.val(dropdowntype_name.val().replace(/\s+/g, " ").trim());
+ dropdowntype_title.val(dropdowntype_title.val().replace(/\s+/g, " ").trim());
+ dropdowntype_table.val(dropdowntype_table.val().replace(/\s+/g, " ").trim());
+ dropdowntype_column.val(dropdowntype_column.val().replace(/\s+/g, " ").trim());
+
+ if (isBlank(dropdowntype_name)) {
+ createInputError(dropdowntype_name, "Name is required");
+ return false;
+ }
+
+ if (formPost({ action : "Dropdowns.dropdowntypeExists", dropdowntype_serial : 0, dropdowntype_name : dropdowntype_name.val() }) === true) {
+ createInputError(dropdowntype_name, "Name already exists");
+ return false;
+ }
+
+ if (isBlank(dropdowntype_title)) {
+ createInputError(dropdowntype_title, "Title is required");
+ return false;
+ }
+
+ if (formPost({ action : "Dropdowns.dropdowntypetitleExists", dropdowntype_serial : 0, dropdowntype_title : dropdowntype_title.val() }) === true) {
+ createInputError(dropdowntype_title, "Title already exists");
+ return false;
+ }
+
+ if (isBlank(dropdowntype_table)) {
+ createInputError(dropdowntype_table, "Table is required");
+ return false;
+ }
+
+ if (isBlank(dropdowntype_column)) {
+ createInputError(dropdowntype_column, "Column is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function() {
+
+ $sessionStorage.action = $sessionStorage.addDropdowntype || "";
+ $sessionStorage.toast = "Dropdown Type was Added";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addNote.js b/js/addNote.js
new file mode 100644
index 0000000..7cd0dcb
--- /dev/null
+++ b/js/addNote.js
@@ -0,0 +1,68 @@
+
+// ========
+// Add Note
+// ========
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(),
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addNote").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addNote || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addNote").submit(function (e) {
+
+ var note_text = $("#note_text");
+
+ clearInputErrors();
+
+ if (isBlank(note_text)) {
+ createInputError(note_text, "Note is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.addNote || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addPopover.js b/js/addPopover.js
new file mode 100644
index 0000000..30b6542
--- /dev/null
+++ b/js/addPopover.js
@@ -0,0 +1,132 @@
+
+// ===========
+// Add Popover
+// ===========
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(),
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}"),
+ $CKEditor;
+
+ // ----------------------
+ // Initialize the Editor.
+ // ----------------------
+
+ ClassicEditor
+ .create(document.querySelector('#popover_text'), {
+ toolbar: {
+ items: [
+ 'heading',
+ '|',
+ 'bold',
+ 'italic',
+ 'underline',
+ 'link',
+ 'bulletedList',
+ 'numberedList',
+ '|',
+ 'fontColor',
+ 'fontSize',
+ 'fontFamily',
+ '|',
+ 'indent',
+ 'outdent',
+ 'alignment',
+ '|',
+ 'horizontalLine',
+ 'insertTable',
+ '|',
+ 'undo',
+ 'redo',
+ '|'
+ ]},
+ link: {
+ addTargetToExternalLinks: true,
+ defaultProtocol: "http://"
+
+ }
+ })
+ .then(editor => {
+ $CKEditor = editor;
+ })
+ .catch(error => {
+ console.error('CK-Editor error...');
+ console.error(error);
+ });
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addPopover").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addPopover || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addPopover").submit(function (e) {
+
+ var popover_name = $("#popover_name"),
+ popover_title = $("#popover_title"),
+ popover_text = $("#popover_text");
+
+ clearInputErrors();
+
+ popover_name.val(popover_name.val().replace(/\s+/g, " ").trim());
+ popover_title.val(popover_title.val().replace(/\s+/g, " ").trim());
+
+ if (isBlank(popover_name)) {
+ createInputError(popover_name, "Name is required");
+ return false;
+ }
+
+ if (formPost({action: "Popovers.popoverExists", popover_serial: 0, popover_name: popover_name.val()}) === true) {
+ createInputError(popover_name, "Name already exists");
+ return false;
+ }
+
+ if (isBlank(popover_title)) {
+ createInputError(popover_title, "Title is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $CKEditor.updateSourceElement();
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.addPopover || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addRDI.js b/js/addRDI.js
new file mode 100644
index 0000000..e172806
--- /dev/null
+++ b/js/addRDI.js
@@ -0,0 +1,141 @@
+
+// =======
+// Add RDI
+// =======
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Input Masks
+ // -----------
+
+ $(".phone-mask").inputmask("(999) 999-9999", {showMaskOnHover: false});
+ $(".zip-mask").inputmask("9{5}", {showMaskOnHover: false, removeMaskOnSubmit: true});
+
+ $(".date-mask").inputmask({alias: "datetime",
+ inputFormat: "mm/dd/yyyy",
+ placeholder: "MM/DD/YYYY",
+ showMaskOnHover: false});
+
+ // --------------
+ // Select Picker.
+ // --------------
+
+ $(".search-dropdown").selectpicker({noneSelectedText: "",
+ style: "",
+ styleBase: "form-select form-select-sm",
+ iconBase: "bi",
+ virtualScroll: true,
+ size: 10,
+ selectOnTab: true,
+ containter: "body",
+ liveSearch: true});
+
+ // ------------
+ // Date Pickers
+ // ------------
+
+ $("#rdi_entry_date").datepicker({format: "mm-dd-yyyy",
+ container: "div.rdi_entry_date",
+ keyboardNavigation: false,
+ showOnFocus: false,
+ autoclose: true,
+ endDate: "0d",
+ orientation: "left bottom",
+ todayBtn: "linked",
+ todayHighlight: true});
+
+ $("#rdi_permit_date").datepicker({format: "mm-dd-yyyy",
+ container: "div.rdi_permit_date",
+ keyboardNavigation: false,
+ showOnFocus: false,
+ autoclose: true,
+ endDate: "0d",
+ orientation: "left bottom",
+ todayBtn: "linked",
+ todayHighlight: true});
+
+ // ---------------------
+ // Show Calendar Buttons
+ // ---------------------
+
+ $(".btnEntryDateCalendar").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#rdi_entry_date").focus().datepicker("show");
+
+ });
+
+ $(".btnPermitDateCalendar").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#rdi_permit_date").focus().datepicker("show");
+
+ });
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addRDI").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addRDI || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addRDI").submit(function (e) {
+
+ var rdi_entry_date = $("#rdi_entry_date"), rdi_county = $("#rdi_county");
+
+ clearInputErrors();
+
+
+ if (isBlank(rdi_entry_date)) {
+ createInputError(rdi_entry_date, "Entry Date is required");
+ return false;
+ }
+
+ if ($("option:selected", rdi_county).val() === "") {
+ createInputError(rdi_county, "County is required");
+ return false;
+ }
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.editRDI || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addReport.js b/js/addReport.js
new file mode 100644
index 0000000..194368f
--- /dev/null
+++ b/js/addReport.js
@@ -0,0 +1,89 @@
+
+// ==========
+// Add Report
+// ==========
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(),
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addReport").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addReport || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addReport").submit(function (e) {
+
+ var report_name = $("#report_name"),
+ report_class = $("#report_class"),
+ report_type = $("#report_type"),
+ report_description = $("#report_description");
+
+ clearInputErrors();
+
+ report_name.val(report_name.val().replace(/\s+/g, " ").trim());
+
+ if (isBlank(report_name)) {
+ createInputError(report_name, "Name is required");
+ return false;
+ }
+
+ if (isBlank(report_class)) {
+ createInputError(report_class, "Class is required");
+ return false;
+ }
+
+ if (formPost({action: "Reports.reportExists", report_serial: 0, report_class: report_class.val()}) === true) {
+ createInputError(report_class, "Class already exists");
+ return false;
+ }
+
+ if (isBlank(report_description)) {
+ createInputError(report_description, "Description is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.addReport || "";
+ $sessionStorage.toast = "Report was Added";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addStatus.js b/js/addStatus.js
new file mode 100644
index 0000000..c9146eb
--- /dev/null
+++ b/js/addStatus.js
@@ -0,0 +1,75 @@
+
+// ==========
+// Add Status
+// ==========
+
+$(document).ready(function() {
+
+ var $application = "ATLHOUSINGREPORT",
+ $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function(e) {
+ e.preventDefault();
+ $("#addStatus").submit();
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function() {
+
+ $sessionStorage.action = $sessionStorage.addStatus || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addStatus").submit( function(e) {
+
+ var status_name = $("#status_name"),
+ status_classes = $("#status_classes");
+
+ clearInputErrors();
+
+ status_name.val(trimString(status_name.val()));
+ status_classes.val(trimString(status_classes.val()));
+
+ if (isBlank(status_name)) {
+ createInputError(status_name, "Name is required");
+ return false;
+ }
+
+ if (formPost({ action : "Statuses.statusExists", status_serial : 0, status_name : status_name.val() }) === true) {
+ createInputError(status_name, "Name already exists");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function() {
+
+ $sessionStorage.action = $sessionStorage.addStatus || "";
+ $sessionStorage.toast = "Status was Added";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addSubscription.js b/js/addSubscription.js
new file mode 100644
index 0000000..a8455c1
--- /dev/null
+++ b/js/addSubscription.js
@@ -0,0 +1,103 @@
+
+// ================
+// Add Subscription
+// ================
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // --------------
+ // Select Picker.
+ // --------------
+
+ $(".search-dropdown").selectpicker({noneSelectedText: "",
+ style: "",
+ styleBase: "form-select form-select-sm",
+ iconBase: "bi",
+ virtualScroll: true,
+ size: 10,
+ selectOnTab: true,
+ containter: "body",
+ liveSearch: true});
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addSubscription").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addSubscription || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addSubscription").submit(function (e) {
+
+ var subscription_title = $("#subscription_title"),
+ subscription_description = $("#subscription_description"),
+ subscription_project_type = $("#subscription_projecttype"),
+ subscription_area = $("#subscription_area");
+
+ clearInputErrors();
+
+ subscription_title.val(subscription_title.val().replace(/\s+/g, " ").trim());
+ subscription_title.val(subscription_title.val().replace(/\s+/g, " ").trim());
+
+ if (isBlank(subscription_title)) {
+ createInputError(subscription_title, "Title is required");
+ return false;
+ }
+
+ if (isBlank(subscription_description)) {
+ createInputError(subscription_description, "Description is required");
+ return false;
+ }
+
+ if ($("option:selected", subscription_project_type).val() === "") {
+ createInputError(subscription_project_type, "Project Type is required");
+ return false;
+ }
+
+ if ($("option:selected", subscription_area).val() === "") {
+ createInputError(subscription_area, "Area is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.addSubscription || "";
+ $sessionStorage.toast = "Subscription was Added";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addSubscriptionToUser.js b/js/addSubscriptionToUser.js
new file mode 100644
index 0000000..64b529b
--- /dev/null
+++ b/js/addSubscriptionToUser.js
@@ -0,0 +1,120 @@
+
+// ========================
+// Add Subscription To User
+// ========================
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // -----------
+ // Input Masks
+ // -----------
+
+ $(".date-mask").inputmask({alias: "datetime",
+ inputFormat: "mm/dd/yyyy",
+ placeholder: "MM/DD/YYYY",
+ showMaskOnHover: false});
+
+ // --------------
+ // Select Picker.
+ // --------------
+
+ $(".search-dropdown").selectpicker({noneSelectedText: "",
+ style: "",
+ styleBase: "form-select form-select-sm",
+ iconBase: "bi",
+ virtualScroll: true,
+ size: 10,
+ selectOnTab: true,
+ containter: "body",
+ liveSearch: true});
+
+ // ------------
+ // Date Pickers
+ // ------------
+
+ $("#subscription_stop_date").datepicker({format: "mm-dd-yyyy",
+ container: "div.subscription_stop_date",
+ keyboardNavigation: false,
+ showOnFocus: false,
+ autoclose: true,
+ orientation: "left bottom",
+ todayBtn: "linked",
+ todayHighlight: true});
+
+ // ---------------------
+ // Show Calendar Buttons
+ // ---------------------
+
+ $(".btnSubscriptionStopDateCalendar").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#subscription_stop_date").focus().datepicker("show");
+
+ });
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+
+ e.preventDefault();
+
+ $("#addSubscriptionToUser").submit();
+
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addSubscriptionToUser || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addSubscriptionToUser").submit(function (e) {
+
+ var subscription_title = $("#subscription_serial"), subscription_stop_date = $("#subscription_stop_date");
+
+ clearInputErrors();
+
+ if ($("option:selected", subscription_title).val() === "") {
+ createInputError(subscription_title, "Subscription is required");
+ return false;
+ }
+
+ if (isBlank(subscription_stop_date)) {
+ createInputError(subscription_stop_date, "Date is required");
+ return false;
+ }
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+
+ .done(function () {
+
+ $sessionStorage.action = $sessionStorage.addSubscriptionToUser || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/addUser.js b/js/addUser.js
new file mode 100644
index 0000000..a8b6dc4
--- /dev/null
+++ b/js/addUser.js
@@ -0,0 +1,136 @@
+
+// ========
+// Add User
+// ========
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ console.log(sessionStorage);
+
+ // --------------
+ // Select Picker.
+ // --------------
+
+ $(".search-dropdown").selectpicker({noneSelectedText: "",
+ style: "",
+ styleBase: "form-select form-select-sm",
+ iconBase: "bi",
+ virtualScroll: true,
+ size: 10,
+ selectOnTab: true,
+ containter: "body",
+ liveSearch: true});
+
+ // ------------------------
+ // Get the User Information
+ // ------------------------
+
+ $("#user_name").on("change", function () {
+
+ clearInputErrors();
+
+ let user = formPost({action: "Users.getUser_AJAX", user_name: $(this).val()});
+
+ if (user.exists === true) {
+ createInputError($(this), "User ID already exists");
+ return false;
+ }
+
+ });
+
+ // -----------
+ // Save Button
+ // -----------
+
+ $(".btnSave").on("click", function (e) {
+ e.preventDefault();
+ $("#addUser").submit();
+ });
+
+ // --------------
+ // Cancel Button.
+ // --------------
+
+ $(".btnCancel").on("click", function () {
+
+ $sessionStorage.action = $sessionStorage.addUser || "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ formSubmit($sessionStorage);
+
+ });
+ // --------------------
+ // Toggle Show Password
+ // --------------------
+
+ $("#togglePassword").click(function () {
+ var passwordField = $("#user_password");
+ var type = passwordField.attr("type") === "password" ? "text" : "password";
+ passwordField.attr("type", type);
+
+ // Toggle eye icon if using Bootstrap Icons
+ var icon = $(this).find("i");
+ icon.toggleClass("bi-eye bi-eye-slash");
+ });
+
+ // ---------------
+ // Validate Inputs
+ // ---------------
+
+ $("#addUser").submit(function (e) {
+
+ var user_name = $("#user_name"),
+ user_client_name = $("#user_client_name"),
+ user_email = $("#user_email"),
+ user_role = $("#user_role");
+
+ clearInputErrors();
+
+ user_name.val(user_name.val().replace(/\s+/g, " ").trim());
+
+ if (isBlank(user_name)) {
+ createInputError(user_name, "User ID is required");
+ return false;
+ }
+
+ let user = formPost({action: "Users.getUser_AJAX", user_name: user_name.val()});
+
+ if (user.valid === false) {
+ createInputError(user_name, "User Name is invalid");
+ return false;
+ }
+
+ if (user.exists === true) {
+ createInputError(user_name, "User Name already exists");
+ return false;
+ }
+
+ if (isBlank(user_client_name)) {
+ createInputError(user_client_name, "Client Name is required");
+ return false;
+ }
+
+ if (isBlank(user_email)) {
+ createInputError(user_email, "Email is required");
+ return false;
+ }
+
+ if ($("option:selected", user_role).val() === "") {
+ createInputError(user_role, "Role is required");
+ return false;
+ }
+
+
+ e.preventDefault();
+
+ $.post("./", $(this).serialize())
+ .done(function () {
+ formSubmit({action: $sessionStorage.addUser});
+ });
+
+ });
+
+});
\ No newline at end of file
diff --git a/js/autologout.js b/js/autologout.js
new file mode 100644
index 0000000..bd77962
--- /dev/null
+++ b/js/autologout.js
@@ -0,0 +1,33 @@
+let logoutTimer;
+
+function startLogoutTimer() {
+ // Set the timeout to 30 minutes (adjust as needed)
+ const timeoutInMinutes = 15;
+ const timeoutInMillis = timeoutInMinutes * 60 * 1000;
+
+ // Clear any existing timer to avoid duplicates
+ clearTimeout(logoutTimer);
+
+ // Set the new timer
+ logoutTimer = setTimeout(logoutUser, timeoutInMillis);
+}
+
+function resetLogoutTimer() {
+ // Restart the logout timer whenever there's user activity
+ startLogoutTimer();
+}
+
+function logoutUser() {
+
+ // Redirect to a PHP logout script
+ formPost({action: "signout"});
+
+ window.location.reload();
+}
+
+// Start the logout timer when the user logs in or performs any activity
+startLogoutTimer();
+
+// Reset the logout timer whenever there's user activity
+document.addEventListener("mousemove", resetLogoutTimer);
+document.addEventListener("keypress", resetLogoutTimer);
diff --git a/js/autosave.js b/js/autosave.js
new file mode 100644
index 0000000..de963f0
--- /dev/null
+++ b/js/autosave.js
@@ -0,0 +1,84 @@
+
+// =====================
+// Auto Save and Restore
+// =====================
+
+var $sessionStorage = JSON.parse(sessionStorage.getItem("ATLHOUSINGREPORT") || "{}");
+
+// -------------------
+// Save Changed Inputs
+// -------------------
+
+$(".autosave").on("change", function (e) {
+
+ switch (e.target.type) {
+
+ case "text" :
+ $sessionStorage[e.target.name] = $(this).val();
+ break;
+ case "radio" :
+ $sessionStorage[e.target.name] = $(this).val();
+ break;
+ case "checkbox" :
+ $sessionStorage[e.target.name] = $(this).prop("checked");
+ break;
+ case "select-one" :
+ $sessionStorage[e.target.name] = $(this).val();
+ break;
+ case "hidden" :
+ $sessionStorage[e.target.name] = $(this).val();
+ break;
+
+ default :
+ $sessionStorage[e.target.name] = $(this).val();
+ break;
+
+ }
+
+ sessionStorage.setItem("HOMESTEAD", JSON.stringify($sessionStorage));
+
+});
+
+// ----------------
+// Initalize Inputs
+// ----------------
+
+$.each($sessionStorage, function (name, value) {
+
+ var $input = $(":input").filter("[name=" + name + "]");
+
+ if ($input.length > 0) {
+
+ switch ($input.prop("type")) {
+
+ case "text" :
+ $input.val(value);
+ break;
+ case "radio" :
+ $input.filter("[value=" + value + "]").prop("checked", true);
+ break;
+ case "checkbox" :
+ $input.prop("checked", value);
+ break;
+ case "select-one" :
+ $input.val(value);
+ break;
+ case "hidden" :
+ $input.val(value);
+ break;
+
+ default :
+ $input.val(value);
+ break;
+
+ }
+
+ }
+
+});
+
+// ------------------
+// Save preset Inputs
+// ------------------
+
+$("input[type=radio]:checked").trigger("change");
\ No newline at end of file
diff --git a/js/base.js b/js/base.js
new file mode 100644
index 0000000..5410f3f
--- /dev/null
+++ b/js/base.js
@@ -0,0 +1,293 @@
+
+// ==============
+// Base Functions
+// ==============
+
+// --------------------------------
+// Clear the Error State for Inputs
+// --------------------------------
+
+function clearInputErrors() {
+
+ $(".is-invalid").removeClass("is-invalid");
+ $(".invalid-feedback").remove();
+
+}
+
+// -----------------------------------
+// Create an Error State for an Input.
+// -----------------------------------
+
+function createInputError(input, message = "", scroll = false) {
+
+ if ($(input).hasClass("search-dropdown")) { // Select Picker
+
+ $(input).closest(".bootstrap-select")
+ .find("button").first()
+ .addClass("is-invalid")
+ .after("" + message + "
")
+ .focus();
+
+ } else {
+
+ $(input).focus().addClass("is-invalid");
+
+ if ($(input).is(":last-child")) {
+ $(input).after("" + message + "
");
+ } else {
+ $(input).siblings(":last").after("" + message + "
");
+ }
+
+ }
+
+ if (scroll === true) {
+
+ var element = document.getElementById(input.attr("id"));
+ var header_offset = 130;
+ var element_position = element.getBoundingClientRect().top;
+ var offset_position = element_position + window.pageYOffset - header_offset;
+
+ window.scrollTo({
+ top: offset_position,
+ behavior: "smooth"
+ });
+
+}
+
+}
+
+// ---------------------
+// Test for Blank Value.
+// ---------------------
+
+function isBlank(object) {
+
+ if ($.trim(object.val()).length == 0) {
+ return true;
+ } else {
+ return false;
+ }
+
+}
+
+// ------------------------
+// Verify an Email Address.
+// ------------------------
+
+function isEmail(email) {
+
+ var valid = false;
+ var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,6})+$/;
+
+ return regex.test(email.val());
+
+}
+
+// ------------------------
+// Validate a URL (syntax).
+// ------------------------
+
+function isURL(object) {
+ return /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(object.val());
+}
+
+// ---------------------------------
+// AJAX Call to Get Zip Code Detail.
+// ---------------------------------
+
+function getZipCodeDetail(zipcode) {
+
+ var zipCodeDetail = null;
+
+ $.ajax({
+ url: "./",
+ type: "POST",
+ async: false,
+ data: {action: "get_zipcode_detail",
+ zip_code: zipcode},
+ dataType: "json",
+ success: function (info) {
+ zipCodeDetail = info;
+ }
+ });
+
+ return zipCodeDetail;
+
+}
+
+// -----------------------------
+// AJAX Call to Validate a Date.
+// -----------------------------
+
+function isDate(date) {
+
+ var valid = false;
+
+ $.ajax({
+ url: "./",
+ type: "POST",
+ async: false,
+ data: {action: "validateDate",
+ date: date.val()},
+ dataType: "json",
+ success: function (result) {
+ valid = result;
+ }
+ });
+
+ return valid;
+
+}
+
+// ---------------------------------------------
+// Ending Date cannot be prior to Starting Date.
+// ---------------------------------------------
+
+function checkEndingDate(startingDate, endingDate) {
+
+ var parts = startingDate.val().match(/(\d+)/g);
+ var sDate = new Date(parts[0], parts[1] - 1, parts[2]);
+
+ parts = endingDate.val().match(/(\d+)/g);
+ var eDate = new Date(parts[0], parts[1] - 1, parts[2]);
+
+ sDate.setHours(0, 0, 0, 0);
+ eDate.setHours(0, 0, 0, 0);
+
+ // The Ending Date cannot be prior to the Starting Date.
+
+ if (eDate.getTime() < sDate.getTime()) {
+ return false;
+ } else {
+ return true;
+ }
+
+}
+
+// -------------------------------------------------------
+// Convert a string to Title Case and remove extra spaces.
+// -------------------------------------------------------
+
+function titleCase(string) {
+
+ string = string.replace(/([^\W_]+[^\s-]*) */g, function (s) {
+ return s.charAt(0).toUpperCase() + s.slice(1);
+ });
+ string = string.replace(/\s+/g, " ").trim();
+
+ return string;
+
+}
+
+// ------------------------------------------
+// Trim a string and remove extra white space
+// ------------------------------------------
+
+function trimString(string) {
+
+ return string.replace(/\s+/g, " ").trim();
+
+}
+
+// -------------------
+// Post a Form (AJAX).
+// -------------------
+
+function formPost(inputs) {
+
+ var response = "";
+
+ $.ajax({
+ url: "./",
+ type: "POST",
+ async: false,
+ dataType: "json",
+ data: inputs,
+ success: function (results) {
+ response = results;
+ }, error: function (errorcode) {
+ console.log(errorcode);
+ }
+
+ });
+
+ return response;
+
+}
+
+// --------------
+// Submit a Form.
+// --------------
+
+//function formSubmit(inputs, target) {
+//
+// $('').appendTo("body");
+//
+// var form = $("#formSubmit");
+//
+// if (target === "_blank") {
+// form.prop("target", target);
+// }
+//
+// for (var name in inputs) {
+// form.append('');
+// }
+//
+// console.log($('#formSubmit').html());
+//
+//// form.submit();
+//
+//}
+
+// --------------
+// Submit a Form.
+// --------------
+
+function formSubmit(inputs, target = "") {
+
+ var form = $("#formSubmit");
+
+ if (target === "_blank") {
+ form.prop("target", target);
+ } else {
+ form.prop("target", "");
+ }
+
+ for (var name in inputs) {
+ form.append('');
+ }
+
+ form.submit();
+
+}
+
+$(document).ready(function () {
+
+ var $application = $("#APPLICATION_MNEMONIC").val(), $sessionStorage = JSON.parse(sessionStorage.getItem($application) || "{}");
+
+ // ----------------------------
+ // Enable Tooltips and Popovers
+ // ----------------------------
+
+ $("[data-bs-toggle=tooltip]").tooltip({trigger: "hover", container: "body"});
+ $("[data-bs-toggle=popover]").popover({trigger: "focus", container: "body"});
+
+ // -------------
+ // Display Toast
+ // -------------
+
+ const toast = $sessionStorage.toast || "";
+
+ if (toast !== "") {
+
+ $(".toast-body").html(toast);
+
+ $("#toast-message").toast("show");
+
+ $sessionStorage.toast = "";
+
+ sessionStorage.setItem($application, JSON.stringify($sessionStorage));
+
+ }
+
+});
diff --git a/js/bootstrap-autocomplete.js b/js/bootstrap-autocomplete.js
new file mode 100644
index 0000000..9e576cd
--- /dev/null
+++ b/js/bootstrap-autocomplete.js
@@ -0,0 +1 @@
+!function(t){var e={};function s(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,s),o.l=!0,o.exports}s.m=t,s.c=e,s.d=function(t,e,i){s.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},s.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s.t=function(t,e){if(1&e&&(t=s(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)s.d(i,o,function(e){return t[e]}.bind(null,o));return i},s.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return s.d(e,"a",e),e},s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},s.p="",s(s.s=0)}([function(t,e,s){"use strict";s.r(e),s.d(e,"AutoComplete",(function(){return a}));var i,o=(i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s])})(t,e)},function(t,e){function s(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(s.prototype=e.prototype,new s)}),n=function(t){function e(e){return t.call(this,e)||this}return o(e,t),e.prototype.getDefaults=function(){return{url:"",method:"get",queryKey:"q",extraData:{},timeout:void 0,requestThrottling:500}},e.prototype.search=function(t,e){var s=this;null!=this.jqXHR&&this.jqXHR.abort();var i={};i[this._settings.queryKey]=t,$.extend(i,this._settings.extraData),this.requestTID&&window.clearTimeout(this.requestTID),this.requestTID=window.setTimeout((function(){s.jqXHR=$.ajax(s._settings.url,{method:s._settings.method,data:i,timeout:s._settings.timeout}),s.jqXHR.done((function(t){e(t)})),s.jqXHR.fail((function(t){var e;null===(e=s._settings)||void 0===e||e.fail(t)})),s.jqXHR.always((function(){s.jqXHR=null}))}),this._settings.requestThrottling)},e}(function(){function t(t){this._settings=$.extend(!0,{},this.getDefaults(),t)}return t.prototype.getDefaults=function(){return{}},t.prototype.getResults=function(t,e,s){return this.results},t.prototype.search=function(t,e){e(this.getResults())},t}()),r=function(){function t(t,e,s,i){this.initialized=!1,this.shown=!1,this.items=[],this.ddMouseover=!1,this._$el=t,this.formatItem=e,this.autoSelect=s,this.noResultsText=i}return t.prototype.init=function(){var t=this,e=$.extend({},this._$el.position(),{height:this._$el[0].offsetHeight});this._dd=$(""),this._dd.addClass("bootstrap-autocomplete dropdown-menu"),this._dd.insertAfter(this._$el),this._dd.css({top:e.top+this._$el.outerHeight(),left:e.left,width:this._$el.outerWidth()}),this._dd.on("click","li",(function(e){var s=$(e.currentTarget).data("item");t.itemSelectedLaunchEvent(s)})),this._dd.on("keyup",(function(e){if(t.shown){switch(e.which){case 27:t.hide(),t._$el.focus()}return!1}})),this._dd.on("mouseenter",(function(e){t.ddMouseover=!0})),this._dd.on("mouseleave",(function(e){t.ddMouseover=!1})),this._dd.on("mouseenter","li",(function(e){t.haveResults&&($(e.currentTarget).closest("ul").find("li.active").removeClass("active"),$(e.currentTarget).addClass("active"),t.mouseover=!0)})),this._dd.on("mouseleave","li",(function(e){t.mouseover=!1})),this.initialized=!0},t.prototype.checkInitialized=function(){this.initialized||this.init()},Object.defineProperty(t.prototype,"isMouseOver",{get:function(){return this.mouseover},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"isDdMouseOver",{get:function(){return this.ddMouseover},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"haveResults",{get:function(){return this.items.length>0},enumerable:!1,configurable:!0}),t.prototype.focusNextItem=function(t){if(this.haveResults){var e=this._dd.find("li.active"),s=t?e.prev():e.next();0===s.length&&(s=t?this._dd.find("li").last():this._dd.find("li").first()),e.removeClass("active"),s.addClass("active")}},t.prototype.focusPreviousItem=function(){this.focusNextItem(!0)},t.prototype.selectFocusItem=function(){this._dd.find("li.active").trigger("click")},Object.defineProperty(t.prototype,"isItemFocused",{get:function(){return!!(this.isShown()&&this._dd.find("li.active").length>0)},enumerable:!1,configurable:!0}),t.prototype.show=function(){this.shown||(this._dd.dropdown().show(),this.shown=!0)},t.prototype.isShown=function(){return this.shown},t.prototype.hide=function(){this.shown&&(this._dd.dropdown().hide(),this.shown=!1)},t.prototype.updateItems=function(t,e){this.items=t,this.searchText=e,this.refreshItemList()},t.prototype.showMatchedText=function(t,e){var s=t.toLowerCase().indexOf(e.toLowerCase());if(s>-1){var i=s+e.length;return t.slice(0,s)+""+t.slice(s,i)+""+t.slice(i)}return t},t.prototype.refreshItemList=function(){var t=this;this.checkInitialized(),this._dd.empty();var e=[];if(this.items.length>0)this.items.forEach((function(s){var i,o,n=t.formatItem(s);"string"==typeof n&&(n={text:n}),i=t.showMatchedText(n.text,t.searchText),o=void 0!==n.html?n.html:i;var r=n.disabled,l=$("");l.append($("").attr("href","#!").html(o)).data("item",s),r&&l.addClass("disabled"),e.push(l)}));else{var s=$("");s.append($("").attr("href","#!").html(this.noResultsText)).addClass("disabled"),e.push(s)}this._dd.append(e)},t.prototype.itemSelectedLaunchEvent=function(t){this._$el.trigger("autocomplete.select",t)},t}(),l=function(){function t(t,e,s,i){this.initialized=!1,this.shown=!1,this.items=[],this.ddMouseover=!1,this._$el=t,this.formatItem=e,this.autoSelect=s,this.noResultsText=i}return t.prototype.getElPos=function(){return $.extend({},this._$el.position(),{height:this._$el[0].offsetHeight})},t.prototype.init=function(){var t=this,e=this.getElPos();this._dd=$(""),this._dd.addClass("bootstrap-autocomplete dropdown-menu"),this._dd.insertAfter(this._$el),this._dd.css({top:e.top+this._$el.outerHeight(),left:e.left,width:this._$el.outerWidth()}),this._dd.on("click",".dropdown-item",(function(e){var s=$(e.currentTarget).data("item");t.itemSelectedLaunchEvent(s),e.preventDefault()})),this._dd.on("keyup",(function(e){if(t.shown){switch(e.which){case 27:t.hide(),t._$el.focus()}return!1}})),this._dd.on("mouseenter",(function(e){t.ddMouseover=!0})),this._dd.on("mouseleave",(function(e){t.ddMouseover=!1})),this._dd.on("mouseenter",".dropdown-item",(function(e){t.haveResults&&($(e.currentTarget).closest("div").find(".dropdown-item.active").removeClass("active"),$(e.currentTarget).addClass("active"),t.mouseover=!0)})),this._dd.on("mouseleave",".dropdown-item",(function(e){t.mouseover=!1})),this.initialized=!0},t.prototype.checkInitialized=function(){this.initialized||this.init()},Object.defineProperty(t.prototype,"isMouseOver",{get:function(){return this.mouseover},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"isDdMouseOver",{get:function(){return this.ddMouseover},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"haveResults",{get:function(){return this.items.length>0},enumerable:!1,configurable:!0}),t.prototype.focusNextItem=function(t){if(this.haveResults){var e=this._dd.find(".dropdown-item.active"),s=t?e.prev():e.next();0===s.length&&(s=t?this._dd.find(".dropdown-item").last():this._dd.find(".dropdown-item").first()),e.removeClass("active"),s.addClass("active")}},t.prototype.focusPreviousItem=function(){this.focusNextItem(!0)},t.prototype.selectFocusItem=function(){this._dd.find(".dropdown-item.active").trigger("click")},Object.defineProperty(t.prototype,"isItemFocused",{get:function(){return!!(this._dd&&this.isShown()&&this._dd.find(".dropdown-item.active").length>0)},enumerable:!1,configurable:!0}),t.prototype.show=function(){if(!this.shown){this.getElPos();this._dd.addClass("show"),this.shown=!0,this._$el.trigger("autocomplete.dd.shown")}},t.prototype.isShown=function(){return this.shown},t.prototype.hide=function(){this.shown&&(this._dd.removeClass("show"),this.shown=!1,this._$el.trigger("autocomplete.dd.hidden"))},t.prototype.updateItems=function(t,e){this.items=t,this.searchText=e,this.refreshItemList()},t.prototype.showMatchedText=function(t,e){var s=t.toLowerCase().indexOf(e.toLowerCase());if(s>-1){var i=s+e.length;return t.slice(0,s)+""+t.slice(s,i)+""+t.slice(i)}return t},t.prototype.refreshItemList=function(){var t=this;this.checkInitialized(),this._dd.empty();var e=[];if(this.items.length>0)this.items.forEach((function(s){var i,o,n=t.formatItem(s);"string"==typeof n&&(n={text:n}),i=t.showMatchedText(n.text,t.searchText),o=void 0!==n.html?n.html:i;var r=n.disabled,l=$("");l.addClass("dropdown-item").css({overflow:"hidden","text-overflow":"ellipsis"}).html(o).data("item",s),r&&l.addClass("disabled"),e.push(l)})),this._dd.append(e),this.show();else if(""===this.noResultsText)this.hide();else{var s=$("");s.addClass("dropdown-item disabled").html(this.noResultsText),e.push(s),this._dd.append(e),this.show()}},t.prototype.itemSelectedLaunchEvent=function(t){this._$el.trigger("autocomplete.select",t)},t}(),a=function(){function t(t,e){this._selectedItem=null,this._defaultValue=null,this._defaultText=null,this._isSelectElement=!1,this._settings={resolver:"ajax",resolverSettings:{},minLength:3,valueKey:"value",formatResult:this.defaultFormatResult,autoSelect:!0,noResultsText:"No results",bootstrapVersion:"auto",preventEnter:!1,events:{typed:null,searchPre:null,search:null,searchPost:null,select:null,focus:null}},this._el=t,this._$el=$(this._el),this._$el.is("select")&&(this._isSelectElement=!0),this.manageInlineDataAttributes(),"object"==typeof e&&(this._settings=$.extend(!0,{},this.getSettings(),e)),this._isSelectElement&&this.convertSelectToText(),this.init()}return t.prototype.manageInlineDataAttributes=function(){var t=this.getSettings();this._$el.data("url")&&(t.resolverSettings.url=this._$el.data("url")),this._$el.data("default-value")&&(this._defaultValue=this._$el.data("default-value")),this._$el.data("default-text")&&(this._defaultText=this._$el.data("default-text")),void 0!==this._$el.data("noresults-text")&&(t.noResultsText=this._$el.data("noresults-text"))},t.prototype.getSettings=function(){return this._settings},t.prototype.getBootstrapVersion=function(){var t;"auto"===this._settings.bootstrapVersion?t=$.fn.button.Constructor.VERSION.split(".").map(parseInt):"4"===this._settings.bootstrapVersion?t=[4]:"3"===this._settings.bootstrapVersion?t=[3]:(console.error("INVALID value for 'bootstrapVersion' settings property: "+this._settings.bootstrapVersion+" defaulting to 4"),t=[4]);return t},t.prototype.convertSelectToText=function(){var e=$("");e.attr("type","hidden"),e.attr("name",this._$el.attr("name")),this._defaultValue&&e.val(this._defaultValue),this._selectHiddenField=e,e.insertAfter(this._$el);var s=$("");s.attr("type","search"),s.attr("name",this._$el.attr("name")+"_text"),s.attr("id",this._$el.attr("id")),s.attr("disabled",this._$el.attr("disabled")),s.attr("placeholder",this._$el.attr("placeholder")),s.attr("autocomplete","off"),s.addClass(this._$el.attr("class")),this._defaultText&&s.val(this._defaultText);var i=this._$el.attr("required");i&&s.attr("required",i),s.data(t.NAME,this),this._$el.replaceWith(s),this._$el=s,this._el=s.get(0)},t.prototype.init=function(){this.bindDefaultEventListeners(),"ajax"===this._settings.resolver&&(this.resolver=new n(this._settings.resolverSettings)),4===this.getBootstrapVersion()[0]?this._dd=new l(this._$el,this._settings.formatResult,this._settings.autoSelect,this._settings.noResultsText):this._dd=new r(this._$el,this._settings.formatResult,this._settings.autoSelect,this._settings.noResultsText)},t.prototype.bindDefaultEventListeners=function(){var t=this;this._$el.on("keydown",(function(e){switch(e.which){case 9:t._dd.isItemFocused?t._dd.selectFocusItem():t._selectedItem||""!==t._$el.val()&&t._$el.trigger("autocomplete.freevalue",t._$el.val()),t._dd.hide();break;case 13:t._dd.isItemFocused?t._dd.selectFocusItem():t._selectedItem||""!==t._$el.val()&&t._$el.trigger("autocomplete.freevalue",t._$el.val()),t._dd.hide(),t._settings.preventEnter&&e.preventDefault();break;case 40:t._dd.focusNextItem();break;case 38:t._dd.focusPreviousItem()}})),this._$el.on("keyup",(function(e){switch(e.which){case 16:case 17:case 18:case 39:case 37:case 36:case 35:break;case 13:case 27:t._dd.hide();break;case 40:case 38:break;default:t._selectedItem=null;var s=t._$el.val();t.handlerTyped(s)}})),this._$el.on("blur",(function(e){!t._dd.isMouseOver&&t._dd.isDdMouseOver&&t._dd.isShown()?(setTimeout((function(){t._$el.focus()})),t._$el.focus()):t._dd.isMouseOver||(t._isSelectElement?t._dd.isItemFocused?t._dd.selectFocusItem():null!==t._selectedItem&&""!==t._$el.val()?t._$el.trigger("autocomplete.select",t._selectedItem):""!==t._$el.val()&&null!==t._defaultValue?(t._$el.val(t._defaultText),t._selectHiddenField.val(t._defaultValue),t._selectedItem=null,t._$el.trigger("autocomplete.select",t._selectedItem)):(t._$el.val(""),t._selectHiddenField.val(""),t._selectedItem=null,t._$el.trigger("autocomplete.select",t._selectedItem)):null===t._selectedItem&&t._$el.trigger("autocomplete.freevalue",t._$el.val()),t._dd.hide())})),this._$el.on("autocomplete.select",(function(e,s){t._selectedItem=s,t.itemSelectedDefaultHandler(s)})),this._$el.on("paste",(function(e){setTimeout((function(){t._$el.trigger("keyup",e)}),0)}))},t.prototype.handlerTyped=function(t){(null===this._settings.events.typed||(t=this._settings.events.typed(t,this._$el)))&&(t.length>=this._settings.minLength?(this._searchText=t,this.handlerPreSearch()):this._dd.hide())},t.prototype.handlerPreSearch=function(){if(null!==this._settings.events.searchPre){var t=this._settings.events.searchPre(this._searchText,this._$el);if(!t)return;this._searchText=t}this.handlerDoSearch()},t.prototype.handlerDoSearch=function(){var t=this;null!==this._settings.events.search?this._settings.events.search(this._searchText,(function(e){t.postSearchCallback(e)}),this._$el):this.resolver&&this.resolver.search(this._searchText,(function(e){t.postSearchCallback(e)}))},t.prototype.postSearchCallback=function(t){this._settings.events.searchPost&&"boolean"==typeof(t=this._settings.events.searchPost(t,this._$el))&&!t||this.handlerStartShow(t)},t.prototype.handlerStartShow=function(t){this._dd.updateItems(t,this._searchText)},t.prototype.itemSelectedDefaultHandler=function(t){if(null!=t){var e=this._settings.formatResult(t);"string"==typeof e&&(e={text:e}),this._$el.val(e.text),this._isSelectElement&&this._selectHiddenField.val(e.value)}else this._$el.val(""),this._isSelectElement&&this._selectHiddenField.val("");this._selectedItem=t,this._dd.hide()},t.prototype.defaultFormatResult=function(t){return"string"==typeof t?{text:t}:t.text?t:{text:t.toString()}},t.prototype.manageAPI=function(t,e){"set"===t?this.itemSelectedDefaultHandler(e):"clear"===t?this.itemSelectedDefaultHandler(null):"show"===t?this._$el.trigger("keyup"):"updateResolver"===t&&(this.resolver=new n(e))},t.NAME="autoComplete",t}();!function(t,e,s){t.fn[a.NAME]=function(e,s){return this.each((function(){var i;(i=t(this).data(a.NAME))||(i=new a(this,e),t(this).data(a.NAME,i)),i.manageAPI(e,s)}))}}(jQuery,window,document)}]);
\ No newline at end of file
diff --git a/js/bootstrap-autocomplete.min.js b/js/bootstrap-autocomplete.min.js
new file mode 100644
index 0000000..7bdc289
--- /dev/null
+++ b/js/bootstrap-autocomplete.min.js
@@ -0,0 +1,3 @@
+!function(s){var i={};function o(t){if(i[t])return i[t].exports;var e=i[t]={i:t,l:!1,exports:{}};return s[t].call(e.exports,e,e.exports,o),e.l=!0,e.exports}o.m=s,o.c=i,o.d=function(t,e,s){o.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:s})},o.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(o.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(s,i,function(t){return e[t]}.bind(null,i));return s},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,"a",e),e},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o.p="",o(o.s=0)}([function(t,e,s){"use strict";s.r(e),s.d(e,"AutoComplete",function(){return d});var i,o,n,r=(i=function(t,e){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var s in e)e.hasOwnProperty(s)&&(t[s]=e[s])})(t,e)},function(t,e){function s(){this.constructor=t}i(t,e),t.prototype=null===e?Object.create(e):(s.prototype=e.prototype,new s)}),l=(_.prototype.getDefaults=function(){return{}},_.prototype.getResults=function(t,e,s){return this.results},_.prototype.search=function(t,e){e(this.getResults())},r(p,o=_),p.prototype.getDefaults=function(){return{url:"",method:"get",queryKey:"q",extraData:{},timeout:void 0,requestThrottling:500}},p.prototype.search=function(t,e){var s=this;null!=this.jqXHR&&this.jqXHR.abort();var i={};i[this._settings.queryKey]=t,$.extend(i,this._settings.extraData),this.requestTID&&window.clearTimeout(this.requestTID),this.requestTID=window.setTimeout(function(){s.jqXHR=$.ajax(s._settings.url,{method:s._settings.method,data:i,timeout:s._settings.timeout}),s.jqXHR.done(function(t){e(t)}),s.jqXHR.fail(function(t){var e;null===(e=s._settings)||void 0===e||e.fail(t)}),s.jqXHR.always(function(){s.jqXHR=null})},this._settings.requestThrottling)},p),a=(f.prototype.init=function(){var s=this,t=$.extend({},this._$el.position(),{height:this._$el[0].offsetHeight});this._dd=$(""),this._dd.addClass("bootstrap-autocomplete dropdown-menu"),this._dd.insertAfter(this._$el),this._dd.css({top:t.top+this._$el.outerHeight(),left:t.left,width:this._$el.outerWidth()}),this._dd.on("click","li",function(t){var e=$(t.currentTarget).data("item");s.itemSelectedLaunchEvent(e)}),this._dd.on("keyup",function(t){if(s.shown){switch(t.which){case 27:s.hide(),s._$el.focus()}return!1}}),this._dd.on("mouseenter",function(t){s.ddMouseover=!0}),this._dd.on("mouseleave",function(t){s.ddMouseover=!1}),this._dd.on("mouseenter","li",function(t){s.haveResults&&($(t.currentTarget).closest("ul").find("li.active").removeClass("active"),$(t.currentTarget).addClass("active"),s.mouseover=!0)}),this._dd.on("mouseleave","li",function(t){s.mouseover=!1}),this.initialized=!0},f.prototype.checkInitialized=function(){this.initialized||this.init()},Object.defineProperty(f.prototype,"isMouseOver",{get:function(){return this.mouseover},enumerable:!1,configurable:!0}),Object.defineProperty(f.prototype,"isDdMouseOver",{get:function(){return this.ddMouseover},enumerable:!1,configurable:!0}),Object.defineProperty(f.prototype,"haveResults",{get:function(){return 0"+t.slice(s,i)+""+t.slice(i)}return t},f.prototype.refreshItemList=function(){var r=this;this.checkInitialized(),this._dd.empty();var t,l=[];0");n.append($("").attr("href","#!").html(s)).data("item",t),o&&n.addClass("disabled"),l.push(n)}):((t=$("")).append($("").attr("href","#!").html(this.noResultsText)).addClass("disabled"),l.push(t)),this._dd.append(l)},f.prototype.itemSelectedLaunchEvent=function(t){this._$el.trigger("autocomplete.select",t)},f),h=(c.prototype.getElPos=function(){return $.extend({},this._$el.position(),{height:this._$el[0].offsetHeight})},c.prototype.init=function(){var s=this,t=this.getElPos();this._dd=$(""),this._dd.addClass("bootstrap-autocomplete dropdown-menu"),this._dd.insertAfter(this._$el),this._dd.css({top:t.top+this._$el.outerHeight(),left:t.left,width:this._$el.outerWidth()}),this._dd.on("click",".dropdown-item",function(t){var e=$(t.currentTarget).data("item");s.itemSelectedLaunchEvent(e),t.preventDefault()}),this._dd.on("keyup",function(t){if(s.shown){switch(t.which){case 27:s.hide(),s._$el.focus()}return!1}}),this._dd.on("mouseenter",function(t){s.ddMouseover=!0}),this._dd.on("mouseleave",function(t){s.ddMouseover=!1}),this._dd.on("mouseenter",".dropdown-item",function(t){s.haveResults&&($(t.currentTarget).closest("div").find(".dropdown-item.active").removeClass("active"),$(t.currentTarget).addClass("active"),s.mouseover=!0)}),this._dd.on("mouseleave",".dropdown-item",function(t){s.mouseover=!1}),this.initialized=!0},c.prototype.checkInitialized=function(){this.initialized||this.init()},Object.defineProperty(c.prototype,"isMouseOver",{get:function(){return this.mouseover},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"isDdMouseOver",{get:function(){return this.ddMouseover},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"haveResults",{get:function(){return 0"+t.slice(s,i)+""+t.slice(i)}return t},c.prototype.refreshItemList=function(){var r=this;this.checkInitialized(),this._dd.empty();var t,l=[];0");n.addClass("dropdown-item").css({overflow:"hidden","text-overflow":"ellipsis"}).html(s).data("item",t),o&&n.addClass("disabled"),l.push(n)}),this._dd.append(l),this.show()):""===this.noResultsText?this.hide():((t=$("")).addClass("dropdown-item disabled").html(this.noResultsText),l.push(t),this._dd.append(l),this.show())},c.prototype.itemSelectedLaunchEvent=function(t){this._$el.trigger("autocomplete.select",t)},c),d=(u.prototype.manageInlineDataAttributes=function(){var t=this.getSettings();this._$el.data("url")&&(t.resolverSettings.url=this._$el.data("url")),this._$el.data("default-value")&&(this._defaultValue=this._$el.data("default-value")),this._$el.data("default-text")&&(this._defaultText=this._$el.data("default-text")),void 0!==this._$el.data("noresults-text")&&(t.noResultsText=this._$el.data("noresults-text"))},u.prototype.getSettings=function(){return this._settings},u.prototype.getBootstrapVersion=function(){var t="auto"===this._settings.bootstrapVersion?$.fn.button.Constructor.VERSION.split(".").map(parseInt):"4"===this._settings.bootstrapVersion?[4]:"3"===this._settings.bootstrapVersion?[3]:(console.error("INVALID value for 'bootstrapVersion' settings property: "+this._settings.bootstrapVersion+" defaulting to 4"),[4]);return t},u.prototype.convertSelectToText=function(){var t=$("");t.attr("type","hidden"),t.attr("name",this._$el.attr("name")),this._defaultValue&&t.val(this._defaultValue),(this._selectHiddenField=t).insertAfter(this._$el);var e=$("");e.attr("type","search"),e.attr("name",this._$el.attr("name")+"_text"),e.attr("id",this._$el.attr("id")),e.attr("disabled",this._$el.attr("disabled")),e.attr("placeholder",this._$el.attr("placeholder")),e.attr("autocomplete","off"),e.addClass(this._$el.attr("class")),this._defaultText&&e.val(this._defaultText);var s=this._$el.attr("required");s&&e.attr("required",s),e.data(u.NAME,this),this._$el.replaceWith(e),this._$el=e,this._el=e.get(0)},u.prototype.init=function(){this.bindDefaultEventListeners(),"ajax"===this._settings.resolver&&(this.resolver=new l(this._settings.resolverSettings)),4===this.getBootstrapVersion()[0]?this._dd=new h(this._$el,this._settings.formatResult,this._settings.autoSelect,this._settings.noResultsText):this._dd=new a(this._$el,this._settings.formatResult,this._settings.autoSelect,this._settings.noResultsText)},u.prototype.bindDefaultEventListeners=function(){var s=this;this._$el.on("keydown",function(t){switch(t.which){case 9:s._dd.isItemFocused?s._dd.selectFocusItem():s._selectedItem||""!==s._$el.val()&&s._$el.trigger("autocomplete.freevalue",s._$el.val()),s._dd.hide();break;case 13:s._dd.isItemFocused?s._dd.selectFocusItem():s._selectedItem||""!==s._$el.val()&&s._$el.trigger("autocomplete.freevalue",s._$el.val()),s._dd.hide(),s._settings.preventEnter&&t.preventDefault();break;case 40:s._dd.focusNextItem();break;case 38:s._dd.focusPreviousItem()}}),this._$el.on("keyup",function(t){switch(t.which){case 16:case 17:case 18:case 39:case 37:case 36:case 35:break;case 13:case 27:s._dd.hide();break;case 40:case 38:break;default:s._selectedItem=null;var e=s._$el.val();s.handlerTyped(e)}}),this._$el.on("blur",function(t){!s._dd.isMouseOver&&s._dd.isDdMouseOver&&s._dd.isShown()?(setTimeout(function(){s._$el.focus()}),s._$el.focus()):s._dd.isMouseOver||(s._isSelectElement?s._dd.isItemFocused?s._dd.selectFocusItem():(null!==s._selectedItem&&""!==s._$el.val()||(""!==s._$el.val()&&null!==s._defaultValue?(s._$el.val(s._defaultText),s._selectHiddenField.val(s._defaultValue)):(s._$el.val(""),s._selectHiddenField.val("")),s._selectedItem=null),s._$el.trigger("autocomplete.select",s._selectedItem)):null===s._selectedItem&&s._$el.trigger("autocomplete.freevalue",s._$el.val()),s._dd.hide())}),this._$el.on("autocomplete.select",function(t,e){s._selectedItem=e,s.itemSelectedDefaultHandler(e)}),this._$el.on("paste",function(t){setTimeout(function(){s._$el.trigger("keyup",t)},0)})},u.prototype.handlerTyped=function(t){null!==this._settings.events.typed&&!(t=this._settings.events.typed(t,this._$el))||(t.length>=this._settings.minLength?(this._searchText=t,this.handlerPreSearch()):this._dd.hide())},u.prototype.handlerPreSearch=function(){if(null!==this._settings.events.searchPre){var t=this._settings.events.searchPre(this._searchText,this._$el);if(!t)return;this._searchText=t}this.handlerDoSearch()},u.prototype.handlerDoSearch=function(){var e=this;null!==this._settings.events.search?this._settings.events.search(this._searchText,function(t){e.postSearchCallback(t)},this._$el):this.resolver&&this.resolver.search(this._searchText,function(t){e.postSearchCallback(t)})},u.prototype.postSearchCallback=function(t){this._settings.events.searchPost&&"boolean"==typeof(t=this._settings.events.searchPost(t,this._$el))&&!t||this.handlerStartShow(t)},u.prototype.handlerStartShow=function(t){this._dd.updateItems(t,this._searchText)},u.prototype.itemSelectedDefaultHandler=function(t){var e;null!=t?("string"==typeof(e=this._settings.formatResult(t))&&(e={text:e}),this._$el.val(e.text),this._isSelectElement&&this._selectHiddenField.val(e.value)):(this._$el.val(""),this._isSelectElement&&this._selectHiddenField.val("")),this._selectedItem=t,this._dd.hide()},u.prototype.defaultFormatResult=function(t){return"string"==typeof t?{text:t}:t.text?t:{text:t.toString()}},u.prototype.manageAPI=function(t,e){"set"===t?this.itemSelectedDefaultHandler(e):"clear"===t?this.itemSelectedDefaultHandler(null):"show"===t?this._$el.trigger("keyup"):"updateResolver"===t&&(this.resolver=new l(e))},u.NAME="autoComplete",u);function u(t,e){this._selectedItem=null,this._defaultValue=null,this._defaultText=null,this._isSelectElement=!1,this._settings={resolver:"ajax",resolverSettings:{},minLength:3,valueKey:"value",formatResult:this.defaultFormatResult,autoSelect:!0,noResultsText:"No results",bootstrapVersion:"auto",preventEnter:!1,events:{typed:null,searchPre:null,search:null,searchPost:null,select:null,focus:null}},this._el=t,this._$el=$(this._el),this._$el.is("select")&&(this._isSelectElement=!0),this.manageInlineDataAttributes(),"object"==typeof e&&(this._settings=$.extend(!0,{},this.getSettings(),e)),this._isSelectElement&&this.convertSelectToText(),this.init()}function c(t,e,s,i){this.initialized=!1,this.shown=!1,this.items=[],this.ddMouseover=!1,this._$el=t,this.formatItem=e,this.autoSelect=s,this.noResultsText=i}function f(t,e,s,i){this.initialized=!1,this.shown=!1,this.items=[],this.ddMouseover=!1,this._$el=t,this.formatItem=e,this.autoSelect=s,this.noResultsText=i}function p(t){return o.call(this,t)||this}function _(t){this._settings=$.extend(!0,{},this.getDefaults(),t)}n=jQuery,window,document,n.fn[d.NAME]=function(e,s){return this.each(function(){var t;(t=n(this).data(d.NAME))||(t=new d(this,e),n(this).data(d.NAME,t)),t.manageAPI(e,s)})}}]);
+
+
diff --git a/js/bootstrap-datepicker.js b/js/bootstrap-datepicker.js
new file mode 100644
index 0000000..a94f79f
--- /dev/null
+++ b/js/bootstrap-datepicker.js
@@ -0,0 +1,2039 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+(function(factory){
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ factory(require('jquery'));
+ } else {
+ factory(jQuery);
+ }
+}(function($, undefined){
+ function UTCDate(){
+ return new Date(Date.UTC.apply(Date, arguments));
+ }
+ function UTCToday(){
+ var today = new Date();
+ return UTCDate(today.getFullYear(), today.getMonth(), today.getDate());
+ }
+ function isUTCEquals(date1, date2) {
+ return (
+ date1.getUTCFullYear() === date2.getUTCFullYear() &&
+ date1.getUTCMonth() === date2.getUTCMonth() &&
+ date1.getUTCDate() === date2.getUTCDate()
+ );
+ }
+ function alias(method, deprecationMsg){
+ return function(){
+ if (deprecationMsg !== undefined) {
+ $.fn.datepicker.deprecated(deprecationMsg);
+ }
+
+ return this[method].apply(this, arguments);
+ };
+ }
+ function isValidDate(d) {
+ return d && !isNaN(d.getTime());
+ }
+
+ var DateArray = (function(){
+ var extras = {
+ get: function(i){
+ return this.slice(i)[0];
+ },
+ contains: function(d){
+ // Array.indexOf is not cross-browser;
+ // $.inArray doesn't work with Dates
+ var val = d && d.valueOf();
+ for (var i=0, l=this.length; i < l; i++)
+ // Use date arithmetic to allow dates with different times to match
+ if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24)
+ return i;
+ return -1;
+ },
+ remove: function(i){
+ this.splice(i,1);
+ },
+ replace: function(new_array){
+ if (!new_array)
+ return;
+ if (!$.isArray(new_array))
+ new_array = [new_array];
+ this.clear();
+ this.push.apply(this, new_array);
+ },
+ clear: function(){
+ this.length = 0;
+ },
+ copy: function(){
+ var a = new DateArray();
+ a.replace(this);
+ return a;
+ }
+ };
+
+ return function(){
+ var a = [];
+ a.push.apply(a, arguments);
+ $.extend(a, extras);
+ return a;
+ };
+ })();
+
+
+ // Picker object
+
+ var Datepicker = function(element, options){
+ $.data(element, 'datepicker', this);
+
+ this._events = [];
+ this._secondaryEvents = [];
+
+ this._process_options(options);
+
+ this.dates = new DateArray();
+ this.viewDate = this.o.defaultViewDate;
+ this.focusDate = null;
+
+ this.element = $(element);
+ this.isInput = this.element.is('input');
+ this.inputField = this.isInput ? this.element : this.element.find('input');
+ this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn') : false;
+ if (this.component && this.component.length === 0)
+ this.component = false;
+ this.isInline = !this.component && this.element.is('div');
+
+ this.picker = $(DPGlobal.template);
+
+ // Checking templates and inserting
+ if (this._check_template(this.o.templates.leftArrow)) {
+ this.picker.find('.prev').html(this.o.templates.leftArrow);
+ }
+
+ if (this._check_template(this.o.templates.rightArrow)) {
+ this.picker.find('.next').html(this.o.templates.rightArrow);
+ }
+
+ this._buildEvents();
+ this._attachEvents();
+
+ if (this.isInline){
+ this.picker.addClass('datepicker-inline').appendTo(this.element);
+ }
+ else {
+ this.picker.addClass('datepicker-dropdown dropdown-menu');
+ }
+
+ if (this.o.rtl){
+ this.picker.addClass('datepicker-rtl');
+ }
+
+ if (this.o.calendarWeeks) {
+ this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear')
+ .attr('colspan', function(i, val){
+ return Number(val) + 1;
+ });
+ }
+
+ this._process_options({
+ startDate: this._o.startDate,
+ endDate: this._o.endDate,
+ daysOfWeekDisabled: this.o.daysOfWeekDisabled,
+ daysOfWeekHighlighted: this.o.daysOfWeekHighlighted,
+ datesDisabled: this.o.datesDisabled
+ });
+
+ this._allow_update = false;
+ this.setViewMode(this.o.startView);
+ this._allow_update = true;
+
+ this.fillDow();
+ this.fillMonths();
+
+ this.update();
+
+ if (this.isInline){
+ this.show();
+ }
+ };
+
+ Datepicker.prototype = {
+ constructor: Datepicker,
+
+ _resolveViewName: function(view){
+ $.each(DPGlobal.viewModes, function(i, viewMode){
+ if (view === i || $.inArray(view, viewMode.names) !== -1){
+ view = i;
+ return false;
+ }
+ });
+
+ return view;
+ },
+
+ _resolveDaysOfWeek: function(daysOfWeek){
+ if (!$.isArray(daysOfWeek))
+ daysOfWeek = daysOfWeek.split(/[,\s]*/);
+ return $.map(daysOfWeek, Number);
+ },
+
+ _check_template: function(tmp){
+ try {
+ // If empty
+ if (tmp === undefined || tmp === "") {
+ return false;
+ }
+ // If no html, everything ok
+ if ((tmp.match(/[<>]/g) || []).length <= 0) {
+ return true;
+ }
+ // Checking if html is fine
+ var jDom = $(tmp);
+ return jDom.length > 0;
+ }
+ catch (ex) {
+ return false;
+ }
+ },
+
+ _process_options: function(opts){
+ // Store raw options for reference
+ this._o = $.extend({}, this._o, opts);
+ // Processed options
+ var o = this.o = $.extend({}, this._o);
+
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ var lang = o.language;
+ if (!dates[lang]){
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ lang = defaults.language;
+ }
+ o.language = lang;
+
+ // Retrieve view index from any aliases
+ o.startView = this._resolveViewName(o.startView);
+ o.minViewMode = this._resolveViewName(o.minViewMode);
+ o.maxViewMode = this._resolveViewName(o.maxViewMode);
+
+ // Check view is between min and max
+ o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView));
+
+ // true, false, or Number > 0
+ if (o.multidate !== true){
+ o.multidate = Number(o.multidate) || false;
+ if (o.multidate !== false)
+ o.multidate = Math.max(0, o.multidate);
+ }
+ o.multidateSeparator = String(o.multidateSeparator);
+
+ o.weekStart %= 7;
+ o.weekEnd = (o.weekStart + 6) % 7;
+
+ var format = DPGlobal.parseFormat(o.format);
+ if (o.startDate !== -Infinity){
+ if (!!o.startDate){
+ if (o.startDate instanceof Date)
+ o.startDate = this._local_to_utc(this._zero_time(o.startDate));
+ else
+ o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.startDate = -Infinity;
+ }
+ }
+ if (o.endDate !== Infinity){
+ if (!!o.endDate){
+ if (o.endDate instanceof Date)
+ o.endDate = this._local_to_utc(this._zero_time(o.endDate));
+ else
+ o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear);
+ }
+ else {
+ o.endDate = Infinity;
+ }
+ }
+
+ o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]);
+ o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]);
+
+ o.datesDisabled = o.datesDisabled||[];
+ if (!$.isArray(o.datesDisabled)) {
+ o.datesDisabled = o.datesDisabled.split(',');
+ }
+ o.datesDisabled = $.map(o.datesDisabled, function(d){
+ return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear);
+ });
+
+ var plc = String(o.orientation).toLowerCase().split(/\s+/g),
+ _plc = o.orientation.toLowerCase();
+ plc = $.grep(plc, function(word){
+ return /^auto|left|right|top|bottom$/.test(word);
+ });
+ o.orientation = {x: 'auto', y: 'auto'};
+ if (!_plc || _plc === 'auto')
+ ; // no action
+ else if (plc.length === 1){
+ switch (plc[0]){
+ case 'top':
+ case 'bottom':
+ o.orientation.y = plc[0];
+ break;
+ case 'left':
+ case 'right':
+ o.orientation.x = plc[0];
+ break;
+ }
+ }
+ else {
+ _plc = $.grep(plc, function(word){
+ return /^left|right$/.test(word);
+ });
+ o.orientation.x = _plc[0] || 'auto';
+
+ _plc = $.grep(plc, function(word){
+ return /^top|bottom$/.test(word);
+ });
+ o.orientation.y = _plc[0] || 'auto';
+ }
+ if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') {
+ o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear);
+ } else if (o.defaultViewDate) {
+ var year = o.defaultViewDate.year || new Date().getFullYear();
+ var month = o.defaultViewDate.month || 0;
+ var day = o.defaultViewDate.day || 1;
+ o.defaultViewDate = UTCDate(year, month, day);
+ } else {
+ o.defaultViewDate = UTCToday();
+ }
+ },
+ _applyEvents: function(evs){
+ for (var i=0, el, ch, ev; i < evs.length; i++){
+ el = evs[i][0];
+ if (evs[i].length === 2){
+ ch = undefined;
+ ev = evs[i][1];
+ } else if (evs[i].length === 3){
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.on(ev, ch);
+ }
+ },
+ _unapplyEvents: function(evs){
+ for (var i=0, el, ev, ch; i < evs.length; i++){
+ el = evs[i][0];
+ if (evs[i].length === 2){
+ ch = undefined;
+ ev = evs[i][1];
+ } else if (evs[i].length === 3){
+ ch = evs[i][1];
+ ev = evs[i][2];
+ }
+ el.off(ev, ch);
+ }
+ },
+ _buildEvents: function(){
+ var events = {
+ keyup: $.proxy(function(e){
+ if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1)
+ this.update();
+ }, this),
+ keydown: $.proxy(this.keydown, this),
+ paste: $.proxy(this.paste, this)
+ };
+
+ if (this.o.showOnFocus === true) {
+ events.focus = $.proxy(this.show, this);
+ }
+
+ if (this.isInput) { // single input
+ this._events = [
+ [this.element, events]
+ ];
+ }
+ // component: input + button
+ else if (this.component && this.inputField.length) {
+ this._events = [
+ // For components that are not readonly, allow keyboard nav
+ [this.inputField, events],
+ [this.component, {
+ click: $.proxy(this.show, this)
+ }]
+ ];
+ }
+ else {
+ this._events = [
+ [this.element, {
+ click: $.proxy(this.show, this),
+ keydown: $.proxy(this.keydown, this)
+ }]
+ ];
+ }
+ this._events.push(
+ // Component: listen for blur on element descendants
+ [this.element, '*', {
+ blur: $.proxy(function(e){
+ this._focused_from = e.target;
+ }, this)
+ }],
+ // Input: listen for blur on element
+ [this.element, {
+ blur: $.proxy(function(e){
+ this._focused_from = e.target;
+ }, this)
+ }]
+ );
+
+ if (this.o.immediateUpdates) {
+ // Trigger input updates immediately on changed year/month
+ this._events.push([this.element, {
+ 'changeYear changeMonth': $.proxy(function(e){
+ this.update(e.date);
+ }, this)
+ }]);
+ }
+
+ this._secondaryEvents = [
+ [this.picker, {
+ click: $.proxy(this.click, this)
+ }],
+ [this.picker, '.prev, .next', {
+ click: $.proxy(this.navArrowsClick, this)
+ }],
+ [this.picker, '.day:not(.disabled)', {
+ click: $.proxy(this.dayCellClick, this)
+ }],
+ [$(window), {
+ resize: $.proxy(this.place, this)
+ }],
+ [$(document), {
+ 'mousedown touchstart': $.proxy(function(e){
+ // Clicked outside the datepicker, hide it
+ if (!(
+ this.element.is(e.target) ||
+ this.element.find(e.target).length ||
+ this.picker.is(e.target) ||
+ this.picker.find(e.target).length ||
+ this.isInline
+ )){
+ this.hide();
+ }
+ }, this)
+ }]
+ ];
+ },
+ _attachEvents: function(){
+ this._detachEvents();
+ this._applyEvents(this._events);
+ },
+ _detachEvents: function(){
+ this._unapplyEvents(this._events);
+ },
+ _attachSecondaryEvents: function(){
+ this._detachSecondaryEvents();
+ this._applyEvents(this._secondaryEvents);
+ },
+ _detachSecondaryEvents: function(){
+ this._unapplyEvents(this._secondaryEvents);
+ },
+ _trigger: function(event, altdate){
+ var date = altdate || this.dates.get(-1),
+ local_date = this._utc_to_local(date);
+
+ this.element.trigger({
+ type: event,
+ date: local_date,
+ viewMode: this.viewMode,
+ dates: $.map(this.dates, this._utc_to_local),
+ format: $.proxy(function(ix, format){
+ if (arguments.length === 0){
+ ix = this.dates.length - 1;
+ format = this.o.format;
+ } else if (typeof ix === 'string'){
+ format = ix;
+ ix = this.dates.length - 1;
+ }
+ format = format || this.o.format;
+ var date = this.dates.get(ix);
+ return DPGlobal.formatDate(date, format, this.o.language);
+ }, this)
+ });
+ },
+
+ show: function(){
+ if (this.inputField.is(':disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false))
+ return;
+ if (!this.isInline)
+ this.picker.appendTo(this.o.container);
+ this.place();
+ this.picker.show();
+ this._attachSecondaryEvents();
+ this._trigger('show');
+ if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) {
+ $(this.element).blur();
+ }
+ return this;
+ },
+
+ hide: function(){
+ if (this.isInline || !this.picker.is(':visible'))
+ return this;
+ this.focusDate = null;
+ this.picker.hide().detach();
+ this._detachSecondaryEvents();
+ this.setViewMode(this.o.startView);
+
+ if (this.o.forceParse && this.inputField.val())
+ this.setValue();
+ this._trigger('hide');
+ return this;
+ },
+
+ destroy: function(){
+ this.hide();
+ this._detachEvents();
+ this._detachSecondaryEvents();
+ this.picker.remove();
+ delete this.element.data().datepicker;
+ if (!this.isInput){
+ delete this.element.data().date;
+ }
+ return this;
+ },
+
+ paste: function(e){
+ var dateString;
+ if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types
+ && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) {
+ dateString = e.originalEvent.clipboardData.getData('text/plain');
+ } else if (window.clipboardData) {
+ dateString = window.clipboardData.getData('Text');
+ } else {
+ return;
+ }
+ this.setDate(dateString);
+ this.update();
+ e.preventDefault();
+ },
+
+ _utc_to_local: function(utc){
+ if (!utc) {
+ return utc;
+ }
+
+ var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000));
+
+ if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) {
+ local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000));
+ }
+
+ return local;
+ },
+ _local_to_utc: function(local){
+ return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000));
+ },
+ _zero_time: function(local){
+ return local && new Date(local.getFullYear(), local.getMonth(), local.getDate());
+ },
+ _zero_utc_time: function(utc){
+ return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate());
+ },
+
+ getDates: function(){
+ return $.map(this.dates, this._utc_to_local);
+ },
+
+ getUTCDates: function(){
+ return $.map(this.dates, function(d){
+ return new Date(d);
+ });
+ },
+
+ getDate: function(){
+ return this._utc_to_local(this.getUTCDate());
+ },
+
+ getUTCDate: function(){
+ var selected_date = this.dates.get(-1);
+ if (selected_date !== undefined) {
+ return new Date(selected_date);
+ } else {
+ return null;
+ }
+ },
+
+ clearDates: function(){
+ this.inputField.val('');
+ this.update();
+ this._trigger('changeDate');
+
+ if (this.o.autoclose) {
+ this.hide();
+ }
+ },
+
+ setDates: function(){
+ var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.update.apply(this, args);
+ this._trigger('changeDate');
+ this.setValue();
+ return this;
+ },
+
+ setUTCDates: function(){
+ var args = $.isArray(arguments[0]) ? arguments[0] : arguments;
+ this.setDates.apply(this, $.map(args, this._utc_to_local));
+ return this;
+ },
+
+ setDate: alias('setDates'),
+ setUTCDate: alias('setUTCDates'),
+ remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'),
+
+ setValue: function(){
+ var formatted = this.getFormattedDate();
+ this.inputField.val(formatted);
+ return this;
+ },
+
+ getFormattedDate: function(format){
+ if (format === undefined)
+ format = this.o.format;
+
+ var lang = this.o.language;
+ return $.map(this.dates, function(d){
+ return DPGlobal.formatDate(d, format, lang);
+ }).join(this.o.multidateSeparator);
+ },
+
+ getStartDate: function(){
+ return this.o.startDate;
+ },
+
+ setStartDate: function(startDate){
+ this._process_options({startDate: startDate});
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ getEndDate: function(){
+ return this.o.endDate;
+ },
+
+ setEndDate: function(endDate){
+ this._process_options({endDate: endDate});
+ this.update();
+ this.updateNavArrows();
+ return this;
+ },
+
+ setDaysOfWeekDisabled: function(daysOfWeekDisabled){
+ this._process_options({daysOfWeekDisabled: daysOfWeekDisabled});
+ this.update();
+ return this;
+ },
+
+ setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){
+ this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted});
+ this.update();
+ return this;
+ },
+
+ setDatesDisabled: function(datesDisabled){
+ this._process_options({datesDisabled: datesDisabled});
+ this.update();
+ return this;
+ },
+
+ place: function(){
+ if (this.isInline)
+ return this;
+ var calendarWidth = this.picker.outerWidth(),
+ calendarHeight = this.picker.outerHeight(),
+ visualPadding = 10,
+ container = $(this.o.container),
+ windowWidth = container.width(),
+ scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(),
+ appendOffset = container.offset();
+
+ var parentsZindex = [0];
+ this.element.parents().each(function(){
+ var itemZIndex = $(this).css('z-index');
+ if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex));
+ });
+ var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset;
+ var offset = this.component ? this.component.parent().offset() : this.element.offset();
+ var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false);
+ var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false);
+ var left = offset.left - appendOffset.left;
+ var top = offset.top - appendOffset.top;
+
+ if (this.o.container !== 'body') {
+ top += scrollTop;
+ }
+
+ this.picker.removeClass(
+ 'datepicker-orient-top datepicker-orient-bottom '+
+ 'datepicker-orient-right datepicker-orient-left'
+ );
+
+ if (this.o.orientation.x !== 'auto'){
+ this.picker.addClass('datepicker-orient-' + this.o.orientation.x);
+ if (this.o.orientation.x === 'right')
+ left -= calendarWidth - width;
+ }
+ // auto x orientation is best-placement: if it crosses a window
+ // edge, fudge it sideways
+ else {
+ if (offset.left < 0) {
+ // component is outside the window on the left side. Move it into visible range
+ this.picker.addClass('datepicker-orient-left');
+ left -= offset.left - visualPadding;
+ } else if (left + calendarWidth > windowWidth) {
+ // the calendar passes the widow right edge. Align it to component right side
+ this.picker.addClass('datepicker-orient-right');
+ left += width - calendarWidth;
+ } else {
+ if (this.o.rtl) {
+ // Default to right
+ this.picker.addClass('datepicker-orient-right');
+ } else {
+ // Default to left
+ this.picker.addClass('datepicker-orient-left');
+ }
+ }
+ }
+
+ // auto y orientation is best-situation: top or bottom, no fudging,
+ // decision based on which shows more of the calendar
+ var yorient = this.o.orientation.y,
+ top_overflow;
+ if (yorient === 'auto'){
+ top_overflow = -scrollTop + top - calendarHeight;
+ yorient = top_overflow < 0 ? 'bottom' : 'top';
+ }
+
+ this.picker.addClass('datepicker-orient-' + yorient);
+ if (yorient === 'top')
+ top -= calendarHeight + parseInt(this.picker.css('padding-top'));
+ else
+ top += height;
+
+ if (this.o.rtl) {
+ var right = windowWidth - (left + width);
+ this.picker.css({
+ top: top,
+ right: right,
+ zIndex: zIndex
+ });
+ } else {
+ this.picker.css({
+ top: top,
+ left: left,
+ zIndex: zIndex
+ });
+ }
+ return this;
+ },
+
+ _allow_update: true,
+ update: function(){
+ if (!this._allow_update)
+ return this;
+
+ var oldDates = this.dates.copy(),
+ dates = [],
+ fromArgs = false;
+ if (arguments.length){
+ $.each(arguments, $.proxy(function(i, date){
+ if (date instanceof Date)
+ date = this._local_to_utc(date);
+ dates.push(date);
+ }, this));
+ fromArgs = true;
+ } else {
+ dates = this.isInput
+ ? this.element.val()
+ : this.element.data('date') || this.inputField.val();
+ if (dates && this.o.multidate)
+ dates = dates.split(this.o.multidateSeparator);
+ else
+ dates = [dates];
+ delete this.element.data().date;
+ }
+
+ dates = $.map(dates, $.proxy(function(date){
+ return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear);
+ }, this));
+ dates = $.grep(dates, $.proxy(function(date){
+ return (
+ !this.dateWithinRange(date) ||
+ !date
+ );
+ }, this), true);
+ this.dates.replace(dates);
+
+ if (this.o.updateViewDate) {
+ if (this.dates.length)
+ this.viewDate = new Date(this.dates.get(-1));
+ else if (this.viewDate < this.o.startDate)
+ this.viewDate = new Date(this.o.startDate);
+ else if (this.viewDate > this.o.endDate)
+ this.viewDate = new Date(this.o.endDate);
+ else
+ this.viewDate = this.o.defaultViewDate;
+ }
+
+ if (fromArgs){
+ // setting date by clicking
+ this.setValue();
+ this.element.change();
+ }
+ else if (this.dates.length){
+ // setting date by typing
+ if (String(oldDates) !== String(this.dates) && fromArgs) {
+ this._trigger('changeDate');
+ this.element.change();
+ }
+ }
+ if (!this.dates.length && oldDates.length) {
+ this._trigger('clearDate');
+ this.element.change();
+ }
+
+ this.fill();
+ return this;
+ },
+
+ fillDow: function(){
+ if (this.o.showWeekDays) {
+ var dowCnt = this.o.weekStart,
+ html = '';
+ if (this.o.calendarWeeks){
+ html += '| | ';
+ }
+ while (dowCnt < this.o.weekStart + 7){
+ html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+' | ';
+ }
+ html += '
';
+ this.picker.find('.datepicker-days thead').append(html);
+ }
+ },
+
+ fillMonths: function(){
+ var localDate = this._utc_to_local(this.viewDate);
+ var html = '';
+ var focused;
+ for (var i = 0; i < 12; i++){
+ focused = localDate && localDate.getMonth() === i ? ' focused' : '';
+ html += '' + dates[this.o.language].monthsShort[i] + '';
+ }
+ this.picker.find('.datepicker-months td').html(html);
+ },
+
+ setRange: function(range){
+ if (!range || !range.length)
+ delete this.range;
+ else
+ this.range = $.map(range, function(d){
+ return d.valueOf();
+ });
+ this.fill();
+ },
+
+ getClassNames: function(date){
+ var cls = [],
+ year = this.viewDate.getUTCFullYear(),
+ month = this.viewDate.getUTCMonth(),
+ today = UTCToday();
+ if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){
+ cls.push('old');
+ } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){
+ cls.push('new');
+ }
+ if (this.focusDate && date.valueOf() === this.focusDate.valueOf())
+ cls.push('focused');
+ // Compare internal UTC date with UTC today, not local today
+ if (this.o.todayHighlight && isUTCEquals(date, today)) {
+ cls.push('today');
+ }
+ if (this.dates.contains(date) !== -1)
+ cls.push('active');
+ if (!this.dateWithinRange(date)){
+ cls.push('disabled');
+ }
+ if (this.dateIsDisabled(date)){
+ cls.push('disabled', 'disabled-date');
+ }
+ if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){
+ cls.push('highlighted');
+ }
+
+ if (this.range){
+ if (date > this.range[0] && date < this.range[this.range.length-1]){
+ cls.push('range');
+ }
+ if ($.inArray(date.valueOf(), this.range) !== -1){
+ cls.push('selected');
+ }
+ if (date.valueOf() === this.range[0]){
+ cls.push('range-start');
+ }
+ if (date.valueOf() === this.range[this.range.length-1]){
+ cls.push('range-end');
+ }
+ }
+ return cls;
+ },
+
+ _fill_yearsView: function(selector, cssClass, factor, year, startYear, endYear, beforeFn){
+ var html = '';
+ var step = factor / 10;
+ var view = this.picker.find(selector);
+ var startVal = Math.floor(year / factor) * factor;
+ var endVal = startVal + step * 9;
+ var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step;
+ var selected = $.map(this.dates, function(d){
+ return Math.floor(d.getUTCFullYear() / step) * step;
+ });
+
+ var classes, tooltip, before;
+ for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) {
+ classes = [cssClass];
+ tooltip = null;
+
+ if (currVal === startVal - step) {
+ classes.push('old');
+ } else if (currVal === endVal + step) {
+ classes.push('new');
+ }
+ if ($.inArray(currVal, selected) !== -1) {
+ classes.push('active');
+ }
+ if (currVal < startYear || currVal > endYear) {
+ classes.push('disabled');
+ }
+ if (currVal === focusedVal) {
+ classes.push('focused');
+ }
+
+ if (beforeFn !== $.noop) {
+ before = beforeFn(new Date(currVal, 0, 1));
+ if (before === undefined) {
+ before = {};
+ } else if (typeof before === 'boolean') {
+ before = {enabled: before};
+ } else if (typeof before === 'string') {
+ before = {classes: before};
+ }
+ if (before.enabled === false) {
+ classes.push('disabled');
+ }
+ if (before.classes) {
+ classes = classes.concat(before.classes.split(/\s+/));
+ }
+ if (before.tooltip) {
+ tooltip = before.tooltip;
+ }
+ }
+
+ html += '' + currVal + '';
+ }
+
+ view.find('.datepicker-switch').text(startVal + '-' + endVal);
+ view.find('td').html(html);
+ },
+
+ fill: function(){
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth(),
+ startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
+ startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
+ endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
+ endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
+ todaytxt = dates[this.o.language].today || dates['en'].today || '',
+ cleartxt = dates[this.o.language].clear || dates['en'].clear || '',
+ titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat,
+ todayDate = UTCToday(),
+ titleBtnVisible = (this.o.todayBtn === true || this.o.todayBtn === 'linked') && todayDate >= this.o.startDate && todayDate <= this.o.endDate && !this.weekOfDateIsDisabled(todayDate),
+ tooltip,
+ before;
+ if (isNaN(year) || isNaN(month))
+ return;
+ this.picker.find('.datepicker-days .datepicker-switch')
+ .text(DPGlobal.formatDate(d, titleFormat, this.o.language));
+ this.picker.find('tfoot .today')
+ .text(todaytxt)
+ .css('display', titleBtnVisible ? 'table-cell' : 'none');
+ this.picker.find('tfoot .clear')
+ .text(cleartxt)
+ .css('display', this.o.clearBtn === true ? 'table-cell' : 'none');
+ this.picker.find('thead .datepicker-title')
+ .text(this.o.title)
+ .css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none');
+ this.updateNavArrows();
+ this.fillMonths();
+ var prevMonth = UTCDate(year, month, 0),
+ day = prevMonth.getUTCDate();
+ prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7);
+ var nextMonth = new Date(prevMonth);
+ if (prevMonth.getUTCFullYear() < 100){
+ nextMonth.setUTCFullYear(prevMonth.getUTCFullYear());
+ }
+ nextMonth.setUTCDate(nextMonth.getUTCDate() + 42);
+ nextMonth = nextMonth.valueOf();
+ var html = [];
+ var weekDay, clsName;
+ while (prevMonth.valueOf() < nextMonth){
+ weekDay = prevMonth.getUTCDay();
+ if (weekDay === this.o.weekStart){
+ html.push('');
+ if (this.o.calendarWeeks){
+ // ISO 8601: First week contains first thursday.
+ // ISO also states week starts on Monday, but we can be more abstract here.
+ var
+ // Start of current week: based on weekstart/current date
+ ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5),
+ // Thursday of this week
+ th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5),
+ // First Thursday of year, year from thursday
+ yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5),
+ // Calendar week: ms between thursdays, div ms per day, div 7 days
+ calWeek = (th - yth) / 864e5 / 7 + 1;
+ html.push('| '+ calWeek +' | ');
+ }
+ }
+ clsName = this.getClassNames(prevMonth);
+ clsName.push('day');
+
+ var content = prevMonth.getUTCDate();
+
+ if (this.o.beforeShowDay !== $.noop){
+ before = this.o.beforeShowDay(this._utc_to_local(prevMonth));
+ if (before === undefined)
+ before = {};
+ else if (typeof before === 'boolean')
+ before = {enabled: before};
+ else if (typeof before === 'string')
+ before = {classes: before};
+ if (before.enabled === false)
+ clsName.push('disabled');
+ if (before.classes)
+ clsName = clsName.concat(before.classes.split(/\s+/));
+ if (before.tooltip)
+ tooltip = before.tooltip;
+ if (before.content)
+ content = before.content;
+ }
+
+ //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2)
+ //Fallback to unique function for older jquery versions
+ if ($.isFunction($.uniqueSort)) {
+ clsName = $.uniqueSort(clsName);
+ } else {
+ clsName = $.unique(clsName);
+ }
+
+ html.push('' + content + ' | ');
+ tooltip = null;
+ if (weekDay === this.o.weekEnd){
+ html.push('
');
+ }
+ prevMonth.setUTCDate(prevMonth.getUTCDate() + 1);
+ }
+ this.picker.find('.datepicker-days tbody').html(html.join(''));
+
+ var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months';
+ var months = this.picker.find('.datepicker-months')
+ .find('.datepicker-switch')
+ .text(this.o.maxViewMode < 2 ? monthsTitle : year)
+ .end()
+ .find('tbody span').removeClass('active');
+
+ $.each(this.dates, function(i, d){
+ if (d.getUTCFullYear() === year)
+ months.eq(d.getUTCMonth()).addClass('active');
+ });
+
+ if (year < startYear || year > endYear){
+ months.addClass('disabled');
+ }
+ if (year === startYear){
+ months.slice(0, startMonth).addClass('disabled');
+ }
+ if (year === endYear){
+ months.slice(endMonth+1).addClass('disabled');
+ }
+
+ if (this.o.beforeShowMonth !== $.noop){
+ var that = this;
+ $.each(months, function(i, month){
+ var moDate = new Date(year, i, 1);
+ var before = that.o.beforeShowMonth(moDate);
+ if (before === undefined)
+ before = {};
+ else if (typeof before === 'boolean')
+ before = {enabled: before};
+ else if (typeof before === 'string')
+ before = {classes: before};
+ if (before.enabled === false && !$(month).hasClass('disabled'))
+ $(month).addClass('disabled');
+ if (before.classes)
+ $(month).addClass(before.classes);
+ if (before.tooltip)
+ $(month).prop('title', before.tooltip);
+ });
+ }
+
+ // Generating decade/years picker
+ this._fill_yearsView(
+ '.datepicker-years',
+ 'year',
+ 10,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowYear
+ );
+
+ // Generating century/decades picker
+ this._fill_yearsView(
+ '.datepicker-decades',
+ 'decade',
+ 100,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowDecade
+ );
+
+ // Generating millennium/centuries picker
+ this._fill_yearsView(
+ '.datepicker-centuries',
+ 'century',
+ 1000,
+ year,
+ startYear,
+ endYear,
+ this.o.beforeShowCentury
+ );
+ },
+
+ updateNavArrows: function(){
+ if (!this._allow_update)
+ return;
+
+ var d = new Date(this.viewDate),
+ year = d.getUTCFullYear(),
+ month = d.getUTCMonth(),
+ startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity,
+ startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity,
+ endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity,
+ endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity,
+ prevIsDisabled,
+ nextIsDisabled,
+ factor = 1;
+ switch (this.viewMode){
+ case 4:
+ factor *= 10;
+ /* falls through */
+ case 3:
+ factor *= 10;
+ /* falls through */
+ case 2:
+ factor *= 10;
+ /* falls through */
+ case 1:
+ prevIsDisabled = Math.floor(year / factor) * factor <= startYear;
+ nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear;
+ break;
+ case 0:
+ prevIsDisabled = year <= startYear && month <= startMonth;
+ nextIsDisabled = year >= endYear && month >= endMonth;
+ break;
+ }
+
+ this.picker.find('.prev').toggleClass('disabled', prevIsDisabled);
+ this.picker.find('.next').toggleClass('disabled', nextIsDisabled);
+ },
+
+ click: function(e){
+ e.preventDefault();
+ e.stopPropagation();
+
+ var target, dir, day, year, month;
+ target = $(e.target);
+
+ // Clicked on the switch
+ if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){
+ this.setViewMode(this.viewMode + 1);
+ }
+
+ // Clicked on today button
+ if (target.hasClass('today') && !target.hasClass('day')){
+ this.setViewMode(0);
+ this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view');
+ }
+
+ // Clicked on clear button
+ if (target.hasClass('clear')){
+ this.clearDates();
+ }
+
+ if (!target.hasClass('disabled')){
+ // Clicked on a month, year, decade, century
+ if (target.hasClass('month')
+ || target.hasClass('year')
+ || target.hasClass('decade')
+ || target.hasClass('century')) {
+ this.viewDate.setUTCDate(1);
+
+ day = 1;
+ if (this.viewMode === 1){
+ month = target.parent().find('span').index(target);
+ year = this.viewDate.getUTCFullYear();
+ this.viewDate.setUTCMonth(month);
+ } else {
+ month = 0;
+ year = Number(target.text());
+ this.viewDate.setUTCFullYear(year);
+ }
+
+ this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate);
+
+ if (this.viewMode === this.o.minViewMode){
+ this._setDate(UTCDate(year, month, day));
+ } else {
+ this.setViewMode(this.viewMode - 1);
+ this.fill();
+ }
+ }
+ }
+
+ if (this.picker.is(':visible') && this._focused_from){
+ this._focused_from.focus();
+ }
+ delete this._focused_from;
+ },
+
+ dayCellClick: function(e){
+ var $target = $(e.currentTarget);
+ var timestamp = $target.data('date');
+ var date = new Date(timestamp);
+
+ if (this.o.updateViewDate) {
+ if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) {
+ this._trigger('changeYear', this.viewDate);
+ }
+
+ if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) {
+ this._trigger('changeMonth', this.viewDate);
+ }
+ }
+ this._setDate(date);
+ },
+
+ // Clicked on prev or next
+ navArrowsClick: function(e){
+ var $target = $(e.currentTarget);
+ var dir = $target.hasClass('prev') ? -1 : 1;
+ if (this.viewMode !== 0){
+ dir *= DPGlobal.viewModes[this.viewMode].navStep * 12;
+ }
+ this.viewDate = this.moveMonth(this.viewDate, dir);
+ this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate);
+ this.fill();
+ },
+
+ _toggle_multidate: function(date){
+ var ix = this.dates.contains(date);
+ if (!date){
+ this.dates.clear();
+ }
+
+ if (ix !== -1){
+ if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){
+ this.dates.remove(ix);
+ }
+ } else if (this.o.multidate === false) {
+ this.dates.clear();
+ this.dates.push(date);
+ }
+ else {
+ this.dates.push(date);
+ }
+
+ if (typeof this.o.multidate === 'number')
+ while (this.dates.length > this.o.multidate)
+ this.dates.remove(0);
+ },
+
+ _setDate: function(date, which){
+ if (!which || which === 'date')
+ this._toggle_multidate(date && new Date(date));
+ if ((!which && this.o.updateViewDate) || which === 'view')
+ this.viewDate = date && new Date(date);
+
+ this.fill();
+ this.setValue();
+ if (!which || which !== 'view') {
+ this._trigger('changeDate');
+ }
+ this.inputField.trigger('change');
+ if (this.o.autoclose && (!which || which === 'date')){
+ this.hide();
+ }
+ },
+
+ moveDay: function(date, dir){
+ var newDate = new Date(date);
+ newDate.setUTCDate(date.getUTCDate() + dir);
+
+ return newDate;
+ },
+
+ moveWeek: function(date, dir){
+ return this.moveDay(date, dir * 7);
+ },
+
+ moveMonth: function(date, dir){
+ if (!isValidDate(date))
+ return this.o.defaultViewDate;
+ if (!dir)
+ return date;
+ var new_date = new Date(date.valueOf()),
+ day = new_date.getUTCDate(),
+ month = new_date.getUTCMonth(),
+ mag = Math.abs(dir),
+ new_month, test;
+ dir = dir > 0 ? 1 : -1;
+ if (mag === 1){
+ test = dir === -1
+ // If going back one month, make sure month is not current month
+ // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02)
+ ? function(){
+ return new_date.getUTCMonth() === month;
+ }
+ // If going forward one month, make sure month is as expected
+ // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02)
+ : function(){
+ return new_date.getUTCMonth() !== new_month;
+ };
+ new_month = month + dir;
+ new_date.setUTCMonth(new_month);
+ // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11
+ new_month = (new_month + 12) % 12;
+ }
+ else {
+ // For magnitudes >1, move one month at a time...
+ for (var i=0; i < mag; i++)
+ // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)...
+ new_date = this.moveMonth(new_date, dir);
+ // ...then reset the day, keeping it in the new month
+ new_month = new_date.getUTCMonth();
+ new_date.setUTCDate(day);
+ test = function(){
+ return new_month !== new_date.getUTCMonth();
+ };
+ }
+ // Common date-resetting loop -- if date is beyond end of month, make it
+ // end of month
+ while (test()){
+ new_date.setUTCDate(--day);
+ new_date.setUTCMonth(new_month);
+ }
+ return new_date;
+ },
+
+ moveYear: function(date, dir){
+ return this.moveMonth(date, dir*12);
+ },
+
+ moveAvailableDate: function(date, dir, fn){
+ do {
+ date = this[fn](date, dir);
+
+ if (!this.dateWithinRange(date))
+ return false;
+
+ fn = 'moveDay';
+ }
+ while (this.dateIsDisabled(date));
+
+ return date;
+ },
+
+ weekOfDateIsDisabled: function(date){
+ return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1;
+ },
+
+ dateIsDisabled: function(date){
+ return (
+ this.weekOfDateIsDisabled(date) ||
+ $.grep(this.o.datesDisabled, function(d){
+ return isUTCEquals(date, d);
+ }).length > 0
+ );
+ },
+
+ dateWithinRange: function(date){
+ return date >= this.o.startDate && date <= this.o.endDate;
+ },
+
+ keydown: function(e){
+ if (!this.picker.is(':visible')){
+ if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker
+ this.show();
+ e.stopPropagation();
+ }
+ return;
+ }
+ var dateChanged = false,
+ dir, newViewDate,
+ focusDate = this.focusDate || this.viewDate;
+ switch (e.keyCode){
+ case 27: // escape
+ if (this.focusDate){
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ }
+ else
+ this.hide();
+ e.preventDefault();
+ e.stopPropagation();
+ break;
+ case 37: // left
+ case 38: // up
+ case 39: // right
+ case 40: // down
+ if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7)
+ break;
+ dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1;
+ if (this.viewMode === 0) {
+ if (e.ctrlKey){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+
+ if (newViewDate)
+ this._trigger('changeYear', this.viewDate);
+ } else if (e.shiftKey){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+
+ if (newViewDate)
+ this._trigger('changeMonth', this.viewDate);
+ } else if (e.keyCode === 37 || e.keyCode === 39){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay');
+ } else if (!this.weekOfDateIsDisabled(focusDate)){
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek');
+ }
+ } else if (this.viewMode === 1) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth');
+ } else if (this.viewMode === 2) {
+ if (e.keyCode === 38 || e.keyCode === 40) {
+ dir = dir * 4;
+ }
+ newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear');
+ }
+ if (newViewDate){
+ this.focusDate = this.viewDate = newViewDate;
+ this.setValue();
+ this.fill();
+ e.preventDefault();
+ }
+ break;
+ case 13: // enter
+ if (!this.o.forceParse)
+ break;
+ focusDate = this.focusDate || this.dates.get(-1) || this.viewDate;
+ if (this.o.keyboardNavigation) {
+ this._toggle_multidate(focusDate);
+ dateChanged = true;
+ }
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.setValue();
+ this.fill();
+ if (this.picker.is(':visible')){
+ e.preventDefault();
+ e.stopPropagation();
+ if (this.o.autoclose)
+ this.hide();
+ }
+ break;
+ case 9: // tab
+ this.focusDate = null;
+ this.viewDate = this.dates.get(-1) || this.viewDate;
+ this.fill();
+ this.hide();
+ break;
+ }
+ if (dateChanged){
+ if (this.dates.length)
+ this._trigger('changeDate');
+ else
+ this._trigger('clearDate');
+ this.inputField.trigger('change');
+ }
+ },
+
+ setViewMode: function(viewMode){
+ this.viewMode = viewMode;
+ this.picker
+ .children('div')
+ .hide()
+ .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName)
+ .show();
+ this.updateNavArrows();
+ this._trigger('changeViewMode', new Date(this.viewDate));
+ }
+ };
+
+ var DateRangePicker = function(element, options){
+ $.data(element, 'datepicker', this);
+ this.element = $(element);
+ this.inputs = $.map(options.inputs, function(i){
+ return i.jquery ? i[0] : i;
+ });
+ delete options.inputs;
+
+ this.keepEmptyValues = options.keepEmptyValues;
+ delete options.keepEmptyValues;
+
+ datepickerPlugin.call($(this.inputs), options)
+ .on('changeDate', $.proxy(this.dateUpdated, this));
+
+ this.pickers = $.map(this.inputs, function(i){
+ return $.data(i, 'datepicker');
+ });
+ this.updateDates();
+ };
+ DateRangePicker.prototype = {
+ updateDates: function(){
+ this.dates = $.map(this.pickers, function(i){
+ return i.getUTCDate();
+ });
+ this.updateRanges();
+ },
+ updateRanges: function(){
+ var range = $.map(this.dates, function(d){
+ return d.valueOf();
+ });
+ $.each(this.pickers, function(i, p){
+ p.setRange(range);
+ });
+ },
+ clearDates: function(){
+ $.each(this.pickers, function(i, p){
+ p.clearDates();
+ });
+ },
+ dateUpdated: function(e){
+ // `this.updating` is a workaround for preventing infinite recursion
+ // between `changeDate` triggering and `setUTCDate` calling. Until
+ // there is a better mechanism.
+ if (this.updating)
+ return;
+ this.updating = true;
+
+ var dp = $.data(e.target, 'datepicker');
+
+ if (dp === undefined) {
+ return;
+ }
+
+ var new_date = dp.getUTCDate(),
+ keep_empty_values = this.keepEmptyValues,
+ i = $.inArray(e.target, this.inputs),
+ j = i - 1,
+ k = i + 1,
+ l = this.inputs.length;
+ if (i === -1)
+ return;
+
+ $.each(this.pickers, function(i, p){
+ if (!p.getUTCDate() && (p === dp || !keep_empty_values))
+ p.setUTCDate(new_date);
+ });
+
+ if (new_date < this.dates[j]){
+ // Date being moved earlier/left
+ while (j >= 0 && new_date < this.dates[j]){
+ this.pickers[j--].setUTCDate(new_date);
+ }
+ } else if (new_date > this.dates[k]){
+ // Date being moved later/right
+ while (k < l && new_date > this.dates[k]){
+ this.pickers[k++].setUTCDate(new_date);
+ }
+ }
+ this.updateDates();
+
+ delete this.updating;
+ },
+ destroy: function(){
+ $.map(this.pickers, function(p){ p.destroy(); });
+ $(this.inputs).off('changeDate', this.dateUpdated);
+ delete this.element.data().datepicker;
+ },
+ remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead')
+ };
+
+ function opts_from_el(el, prefix){
+ // Derive options from element data-attrs
+ var data = $(el).data(),
+ out = {}, inkey,
+ replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])');
+ prefix = new RegExp('^' + prefix.toLowerCase());
+ function re_lower(_,a){
+ return a.toLowerCase();
+ }
+ for (var key in data)
+ if (prefix.test(key)){
+ inkey = key.replace(replace, re_lower);
+ out[inkey] = data[key];
+ }
+ return out;
+ }
+
+ function opts_from_locale(lang){
+ // Derive options from locale plugins
+ var out = {};
+ // Check if "de-DE" style date is available, if not language should
+ // fallback to 2 letter code eg "de"
+ if (!dates[lang]){
+ lang = lang.split('-')[0];
+ if (!dates[lang])
+ return;
+ }
+ var d = dates[lang];
+ $.each(locale_opts, function(i,k){
+ if (k in d)
+ out[k] = d[k];
+ });
+ return out;
+ }
+
+ var old = $.fn.datepicker;
+ var datepickerPlugin = function(option){
+ var args = Array.apply(null, arguments);
+ args.shift();
+ var internal_return;
+ this.each(function(){
+ var $this = $(this),
+ data = $this.data('datepicker'),
+ options = typeof option === 'object' && option;
+ if (!data){
+ var elopts = opts_from_el(this, 'date'),
+ // Preliminary otions
+ xopts = $.extend({}, defaults, elopts, options),
+ locopts = opts_from_locale(xopts.language),
+ // Options priority: js args, data-attrs, locales, defaults
+ opts = $.extend({}, defaults, locopts, elopts, options);
+ if ($this.hasClass('input-daterange') || opts.inputs){
+ $.extend(opts, {
+ inputs: opts.inputs || $this.find('input').toArray()
+ });
+ data = new DateRangePicker(this, opts);
+ }
+ else {
+ data = new Datepicker(this, opts);
+ }
+ $this.data('datepicker', data);
+ }
+ if (typeof option === 'string' && typeof data[option] === 'function'){
+ internal_return = data[option].apply(data, args);
+ }
+ });
+
+ if (
+ internal_return === undefined ||
+ internal_return instanceof Datepicker ||
+ internal_return instanceof DateRangePicker
+ )
+ return this;
+
+ if (this.length > 1)
+ throw new Error('Using only allowed for the collection of a single element (' + option + ' function)');
+ else
+ return internal_return;
+ };
+ $.fn.datepicker = datepickerPlugin;
+
+ var defaults = $.fn.datepicker.defaults = {
+ assumeNearbyYear: false,
+ autoclose: false,
+ beforeShowDay: $.noop,
+ beforeShowMonth: $.noop,
+ beforeShowYear: $.noop,
+ beforeShowDecade: $.noop,
+ beforeShowCentury: $.noop,
+ calendarWeeks: false,
+ clearBtn: false,
+ toggleActive: false,
+ daysOfWeekDisabled: [],
+ daysOfWeekHighlighted: [],
+ datesDisabled: [],
+ endDate: Infinity,
+ forceParse: true,
+ format: 'mm/dd/yyyy',
+ keepEmptyValues: false,
+ keyboardNavigation: true,
+ language: 'en',
+ minViewMode: 0,
+ maxViewMode: 4,
+ multidate: false,
+ multidateSeparator: ',',
+ orientation: "auto",
+ rtl: false,
+ startDate: -Infinity,
+ startView: 0,
+ todayBtn: false,
+ todayHighlight: false,
+ updateViewDate: true,
+ weekStart: 0,
+ disableTouchKeyboard: false,
+ enableOnReadonly: true,
+ showOnFocus: true,
+ zIndexOffset: 10,
+ container: 'body',
+ immediateUpdates: false,
+ title: '',
+ templates: {
+ leftArrow: '«',
+ rightArrow: '»'
+ },
+ showWeekDays: true
+ };
+ var locale_opts = $.fn.datepicker.locale_opts = [
+ 'format',
+ 'rtl',
+ 'weekStart'
+ ];
+ $.fn.datepicker.Constructor = Datepicker;
+ var dates = $.fn.datepicker.dates = {
+ en: {
+ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+ daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+ daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
+ months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
+ today: "Today",
+ clear: "Clear",
+ titleFormat: "MM yyyy"
+ }
+ };
+
+ var DPGlobal = {
+ viewModes: [
+ {
+ names: ['days', 'month'],
+ clsName: 'days',
+ e: 'changeMonth'
+ },
+ {
+ names: ['months', 'year'],
+ clsName: 'months',
+ e: 'changeYear',
+ navStep: 1
+ },
+ {
+ names: ['years', 'decade'],
+ clsName: 'years',
+ e: 'changeDecade',
+ navStep: 10
+ },
+ {
+ names: ['decades', 'century'],
+ clsName: 'decades',
+ e: 'changeCentury',
+ navStep: 100
+ },
+ {
+ names: ['centuries', 'millennium'],
+ clsName: 'centuries',
+ e: 'changeMillennium',
+ navStep: 1000
+ }
+ ],
+ validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
+ nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,
+ parseFormat: function(format){
+ if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
+ return format;
+ // IE treats \0 as a string end in inputs (truncating the value),
+ // so it's a bad format delimiter, anyway
+ var separators = format.replace(this.validParts, '\0').split('\0'),
+ parts = format.match(this.validParts);
+ if (!separators || !separators.length || !parts || parts.length === 0){
+ throw new Error("Invalid date format.");
+ }
+ return {separators: separators, parts: parts};
+ },
+ parseDate: function(date, format, language, assumeNearby){
+ if (!date)
+ return undefined;
+ if (date instanceof Date)
+ return date;
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toValue)
+ return format.toValue(date, format, language);
+ var fn_map = {
+ d: 'moveDay',
+ m: 'moveMonth',
+ w: 'moveWeek',
+ y: 'moveYear'
+ },
+ dateAliases = {
+ yesterday: '-1d',
+ today: '+0d',
+ tomorrow: '+1d'
+ },
+ parts, part, dir, i, fn;
+ if (date in dateAliases){
+ date = dateAliases[date];
+ }
+ if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){
+ parts = date.match(/([\-+]\d+)([dmwy])/gi);
+ date = new Date();
+ for (i=0; i < parts.length; i++){
+ part = parts[i].match(/([\-+]\d+)([dmwy])/i);
+ dir = Number(part[1]);
+ fn = fn_map[part[2].toLowerCase()];
+ date = Datepicker.prototype[fn](date, dir);
+ }
+ return Datepicker.prototype._zero_utc_time(date);
+ }
+
+ parts = date && date.match(this.nonpunctuation) || [];
+
+ function applyNearbyYear(year, threshold){
+ if (threshold === true)
+ threshold = 10;
+
+ // if year is 2 digits or less, than the user most likely is trying to get a recent century
+ if (year < 100){
+ year += 2000;
+ // if the new year is more than threshold years in advance, use last century
+ if (year > ((new Date()).getFullYear()+threshold)){
+ year -= 100;
+ }
+ }
+
+ return year;
+ }
+
+ var parsed = {},
+ setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'],
+ setters_map = {
+ yyyy: function(d,v){
+ return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v);
+ },
+ m: function(d,v){
+ if (isNaN(d))
+ return d;
+ v -= 1;
+ while (v < 0) v += 12;
+ v %= 12;
+ d.setUTCMonth(v);
+ while (d.getUTCMonth() !== v)
+ d.setUTCDate(d.getUTCDate()-1);
+ return d;
+ },
+ d: function(d,v){
+ return d.setUTCDate(v);
+ }
+ },
+ val, filtered;
+ setters_map['yy'] = setters_map['yyyy'];
+ setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m'];
+ setters_map['dd'] = setters_map['d'];
+ date = UTCToday();
+ var fparts = format.parts.slice();
+ // Remove noop parts
+ if (parts.length !== fparts.length){
+ fparts = $(fparts).filter(function(i,p){
+ return $.inArray(p, setters_order) !== -1;
+ }).toArray();
+ }
+ // Process remainder
+ function match_part(){
+ var m = this.slice(0, parts[i].length),
+ p = parts[i].slice(0, m.length);
+ return m.toLowerCase() === p.toLowerCase();
+ }
+ if (parts.length === fparts.length){
+ var cnt;
+ for (i=0, cnt = fparts.length; i < cnt; i++){
+ val = parseInt(parts[i], 10);
+ part = fparts[i];
+ if (isNaN(val)){
+ switch (part){
+ case 'MM':
+ filtered = $(dates[language].months).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].months) + 1;
+ break;
+ case 'M':
+ filtered = $(dates[language].monthsShort).filter(match_part);
+ val = $.inArray(filtered[0], dates[language].monthsShort) + 1;
+ break;
+ }
+ }
+ parsed[part] = val;
+ }
+ var _date, s;
+ for (i=0; i < setters_order.length; i++){
+ s = setters_order[i];
+ if (s in parsed && !isNaN(parsed[s])){
+ _date = new Date(date);
+ setters_map[s](_date, parsed[s]);
+ if (!isNaN(_date))
+ date = _date;
+ }
+ }
+ }
+ return date;
+ },
+ formatDate: function(date, format, language){
+ if (!date)
+ return '';
+ if (typeof format === 'string')
+ format = DPGlobal.parseFormat(format);
+ if (format.toDisplay)
+ return format.toDisplay(date, format, language);
+ var val = {
+ d: date.getUTCDate(),
+ D: dates[language].daysShort[date.getUTCDay()],
+ DD: dates[language].days[date.getUTCDay()],
+ m: date.getUTCMonth() + 1,
+ M: dates[language].monthsShort[date.getUTCMonth()],
+ MM: dates[language].months[date.getUTCMonth()],
+ yy: date.getUTCFullYear().toString().substring(2),
+ yyyy: date.getUTCFullYear()
+ };
+ val.dd = (val.d < 10 ? '0' : '') + val.d;
+ val.mm = (val.m < 10 ? '0' : '') + val.m;
+ date = [];
+ var seps = $.extend([], format.separators);
+ for (var i=0, cnt = format.parts.length; i <= cnt; i++){
+ if (seps.length)
+ date.push(seps.shift());
+ date.push(val[format.parts[i]]);
+ }
+ return date.join('');
+ },
+ headTemplate: ''+
+ ''+
+ ' | '+
+ '
'+
+ ''+
+ '| '+defaults.templates.leftArrow+' | '+
+ ' | '+
+ ''+defaults.templates.rightArrow+' | '+
+ '
'+
+ '',
+ contTemplate: ' |
',
+ footTemplate: ''+
+ ''+
+ ' | '+
+ '
'+
+ ''+
+ ' | '+
+ '
'+
+ ''
+ };
+ DPGlobal.template = ''+
+ '
'+
+ '
'+
+ DPGlobal.headTemplate+
+ ''+
+ DPGlobal.footTemplate+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '
'+
+ '
'+
+ '
'+
+ '
'+
+ DPGlobal.headTemplate+
+ DPGlobal.contTemplate+
+ DPGlobal.footTemplate+
+ '
'+
+ '
'+
+ '
';
+
+ $.fn.datepicker.DPGlobal = DPGlobal;
+
+
+ /* DATEPICKER NO CONFLICT
+ * =================== */
+
+ $.fn.datepicker.noConflict = function(){
+ $.fn.datepicker = old;
+ return this;
+ };
+
+ /* DATEPICKER VERSION
+ * =================== */
+ $.fn.datepicker.version = '1.9.0';
+
+ $.fn.datepicker.deprecated = function(msg){
+ var console = window.console;
+ if (console && console.warn) {
+ console.warn('DEPRECATED: ' + msg);
+ }
+ };
+
+
+ /* DATEPICKER DATA-API
+ * ================== */
+
+ $(document).on(
+ 'focus.datepicker.data-api click.datepicker.data-api',
+ '[data-provide="datepicker"]',
+ function(e){
+ var $this = $(this);
+ if ($this.data('datepicker'))
+ return;
+ e.preventDefault();
+ // component click requires us to explicitly show it
+ datepickerPlugin.call($this, 'show');
+ }
+ );
+ $(function(){
+ datepickerPlugin.call($('[data-provide="datepicker-inline"]'));
+ });
+
+}));
diff --git a/js/bootstrap-datepicker.min.js b/js/bootstrap-datepicker.min.js
new file mode 100644
index 0000000..8800106
--- /dev/null
+++ b/js/bootstrap-datepicker.min.js
@@ -0,0 +1,8 @@
+/*!
+ * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker)
+ *
+ * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a,b){function c(){return new Date(Date.UTC.apply(Date,arguments))}function d(){var a=new Date;return c(a.getFullYear(),a.getMonth(),a.getDate())}function e(a,b){return a.getUTCFullYear()===b.getUTCFullYear()&&a.getUTCMonth()===b.getUTCMonth()&&a.getUTCDate()===b.getUTCDate()}function f(c,d){return function(){return d!==b&&a.fn.datepicker.deprecated(d),this[c].apply(this,arguments)}}function g(a){return a&&!isNaN(a.getTime())}function h(b,c){function d(a,b){return b.toLowerCase()}var e,f=a(b).data(),g={},h=new RegExp("^"+c.toLowerCase()+"([A-Z])");c=new RegExp("^"+c.toLowerCase());for(var i in f)c.test(i)&&(e=i.replace(h,d),g[e]=f[i]);return g}function i(b){var c={};if(q[b]||(b=b.split("-")[0],q[b])){var d=q[b];return a.each(p,function(a,b){b in d&&(c[b]=d[b])}),c}}var j=function(){var b={get:function(a){return this.slice(a)[0]},contains:function(a){for(var b=a&&a.valueOf(),c=0,d=this.length;c]/g)||[]).length<=0)return!0;return a(c).length>0}catch(a){return!1}},_process_options:function(b){this._o=a.extend({},this._o,b);var e=this.o=a.extend({},this._o),f=e.language;q[f]||(f=f.split("-")[0],q[f]||(f=o.language)),e.language=f,e.startView=this._resolveViewName(e.startView),e.minViewMode=this._resolveViewName(e.minViewMode),e.maxViewMode=this._resolveViewName(e.maxViewMode),e.startView=Math.max(this.o.minViewMode,Math.min(this.o.maxViewMode,e.startView)),!0!==e.multidate&&(e.multidate=Number(e.multidate)||!1,!1!==e.multidate&&(e.multidate=Math.max(0,e.multidate))),e.multidateSeparator=String(e.multidateSeparator),e.weekStart%=7,e.weekEnd=(e.weekStart+6)%7;var g=r.parseFormat(e.format);e.startDate!==-1/0&&(e.startDate?e.startDate instanceof Date?e.startDate=this._local_to_utc(this._zero_time(e.startDate)):e.startDate=r.parseDate(e.startDate,g,e.language,e.assumeNearbyYear):e.startDate=-1/0),e.endDate!==1/0&&(e.endDate?e.endDate instanceof Date?e.endDate=this._local_to_utc(this._zero_time(e.endDate)):e.endDate=r.parseDate(e.endDate,g,e.language,e.assumeNearbyYear):e.endDate=1/0),e.daysOfWeekDisabled=this._resolveDaysOfWeek(e.daysOfWeekDisabled||[]),e.daysOfWeekHighlighted=this._resolveDaysOfWeek(e.daysOfWeekHighlighted||[]),e.datesDisabled=e.datesDisabled||[],a.isArray(e.datesDisabled)||(e.datesDisabled=e.datesDisabled.split(",")),e.datesDisabled=a.map(e.datesDisabled,function(a){return r.parseDate(a,g,e.language,e.assumeNearbyYear)});var h=String(e.orientation).toLowerCase().split(/\s+/g),i=e.orientation.toLowerCase();if(h=a.grep(h,function(a){return/^auto|left|right|top|bottom$/.test(a)}),e.orientation={x:"auto",y:"auto"},i&&"auto"!==i)if(1===h.length)switch(h[0]){case"top":case"bottom":e.orientation.y=h[0];break;case"left":case"right":e.orientation.x=h[0]}else i=a.grep(h,function(a){return/^left|right$/.test(a)}),e.orientation.x=i[0]||"auto",i=a.grep(h,function(a){return/^top|bottom$/.test(a)}),e.orientation.y=i[0]||"auto";else;if(e.defaultViewDate instanceof Date||"string"==typeof e.defaultViewDate)e.defaultViewDate=r.parseDate(e.defaultViewDate,g,e.language,e.assumeNearbyYear);else if(e.defaultViewDate){var j=e.defaultViewDate.year||(new Date).getFullYear(),k=e.defaultViewDate.month||0,l=e.defaultViewDate.day||1;e.defaultViewDate=c(j,k,l)}else e.defaultViewDate=d()},_applyEvents:function(a){for(var c,d,e,f=0;fe?(this.picker.addClass("datepicker-orient-right"),m+=l-b):this.o.rtl?this.picker.addClass("datepicker-orient-right"):this.picker.addClass("datepicker-orient-left");var o,p=this.o.orientation.y;if("auto"===p&&(o=-f+n-c,p=o<0?"bottom":"top"),this.picker.addClass("datepicker-orient-"+p),"top"===p?n-=c+parseInt(this.picker.css("padding-top")):n+=k,this.o.rtl){var q=e-(m+l);this.picker.css({top:n,right:q,zIndex:i})}else this.picker.css({top:n,left:m,zIndex:i});return this},_allow_update:!0,update:function(){if(!this._allow_update)return this;var b=this.dates.copy(),c=[],d=!1;return arguments.length?(a.each(arguments,a.proxy(function(a,b){b instanceof Date&&(b=this._local_to_utc(b)),c.push(b)},this)),d=!0):(c=this.isInput?this.element.val():this.element.data("date")||this.inputField.val(),c=c&&this.o.multidate?c.split(this.o.multidateSeparator):[c],delete this.element.data().date),c=a.map(c,a.proxy(function(a){return r.parseDate(a,this.o.format,this.o.language,this.o.assumeNearbyYear)},this)),c=a.grep(c,a.proxy(function(a){return!this.dateWithinRange(a)||!a},this),!0),this.dates.replace(c),this.o.updateViewDate&&(this.dates.length?this.viewDate=new Date(this.dates.get(-1)):this.viewDatethis.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=this.o.defaultViewDate),d?(this.setValue(),this.element.change()):this.dates.length&&String(b)!==String(this.dates)&&d&&(this._trigger("changeDate"),this.element.change()),!this.dates.length&&b.length&&(this._trigger("clearDate"),this.element.change()),this.fill(),this},fillDow:function(){if(this.o.showWeekDays){var b=this.o.weekStart,c="";for(this.o.calendarWeeks&&(c+='| | ');b'+q[this.o.language].daysMin[b++%7]+"";c+="
",this.picker.find(".datepicker-days thead").append(c)}},fillMonths:function(){for(var a,b=this._utc_to_local(this.viewDate),c="",d=0;d<12;d++)a=b&&b.getMonth()===d?" focused":"",c+=''+q[this.o.language].monthsShort[d]+"";this.picker.find(".datepicker-months td").html(c)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],f=this.viewDate.getUTCFullYear(),g=this.viewDate.getUTCMonth(),h=d();return b.getUTCFullYear()f||b.getUTCFullYear()===f&&b.getUTCMonth()>g)&&c.push("new"),this.focusDate&&b.valueOf()===this.focusDate.valueOf()&&c.push("focused"),this.o.todayHighlight&&e(b,h)&&c.push("today"),-1!==this.dates.contains(b)&&c.push("active"),this.dateWithinRange(b)||c.push("disabled"),this.dateIsDisabled(b)&&c.push("disabled","disabled-date"),-1!==a.inArray(b.getUTCDay(),this.o.daysOfWeekHighlighted)&&c.push("highlighted"),this.range&&(b>this.range[0]&&bh)&&j.push("disabled"),t===r&&j.push("focused"),i!==a.noop&&(l=i(new Date(t,0,1)),l===b?l={}:"boolean"==typeof l?l={enabled:l}:"string"==typeof l&&(l={classes:l}),!1===l.enabled&&j.push("disabled"),l.classes&&(j=j.concat(l.classes.split(/\s+/))),l.tooltip&&(k=l.tooltip)),m+='"+t+"";o.find(".datepicker-switch").text(p+"-"+q),o.find("td").html(m)},fill:function(){var e,f,g=new Date(this.viewDate),h=g.getUTCFullYear(),i=g.getUTCMonth(),j=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,k=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,l=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,m=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,n=q[this.o.language].today||q.en.today||"",o=q[this.o.language].clear||q.en.clear||"",p=q[this.o.language].titleFormat||q.en.titleFormat,s=d(),t=(!0===this.o.todayBtn||"linked"===this.o.todayBtn)&&s>=this.o.startDate&&s<=this.o.endDate&&!this.weekOfDateIsDisabled(s);if(!isNaN(h)&&!isNaN(i)){this.picker.find(".datepicker-days .datepicker-switch").text(r.formatDate(g,p,this.o.language)),this.picker.find("tfoot .today").text(n).css("display",t?"table-cell":"none"),this.picker.find("tfoot .clear").text(o).css("display",!0===this.o.clearBtn?"table-cell":"none"),this.picker.find("thead .datepicker-title").text(this.o.title).css("display","string"==typeof this.o.title&&""!==this.o.title?"table-cell":"none"),this.updateNavArrows(),this.fillMonths();var u=c(h,i,0),v=u.getUTCDate();u.setUTCDate(v-(u.getUTCDay()-this.o.weekStart+7)%7);var w=new Date(u);u.getUTCFullYear()<100&&w.setUTCFullYear(u.getUTCFullYear()),w.setUTCDate(w.getUTCDate()+42),w=w.valueOf();for(var x,y,z=[];u.valueOf()"),this.o.calendarWeeks)){var A=new Date(+u+(this.o.weekStart-x-7)%7*864e5),B=new Date(Number(A)+(11-A.getUTCDay())%7*864e5),C=new Date(Number(C=c(B.getUTCFullYear(),0,1))+(11-C.getUTCDay())%7*864e5),D=(B-C)/864e5/7+1;z.push(''+D+" | ")}y=this.getClassNames(u),y.push("day");var E=u.getUTCDate();this.o.beforeShowDay!==a.noop&&(f=this.o.beforeShowDay(this._utc_to_local(u)),f===b?f={}:"boolean"==typeof f?f={enabled:f}:"string"==typeof f&&(f={classes:f}),!1===f.enabled&&y.push("disabled"),f.classes&&(y=y.concat(f.classes.split(/\s+/))),f.tooltip&&(e=f.tooltip),f.content&&(E=f.content)),y=a.isFunction(a.uniqueSort)?a.uniqueSort(y):a.unique(y),z.push(''+E+" | "),e=null,x===this.o.weekEnd&&z.push(""),u.setUTCDate(u.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").html(z.join(""));var F=q[this.o.language].monthsTitle||q.en.monthsTitle||"Months",G=this.picker.find(".datepicker-months").find(".datepicker-switch").text(this.o.maxViewMode<2?F:h).end().find("tbody span").removeClass("active");if(a.each(this.dates,function(a,b){b.getUTCFullYear()===h&&G.eq(b.getUTCMonth()).addClass("active")}),(hl)&&G.addClass("disabled"),h===j&&G.slice(0,k).addClass("disabled"),h===l&&G.slice(m+1).addClass("disabled"),this.o.beforeShowMonth!==a.noop){var H=this;a.each(G,function(c,d){var e=new Date(h,c,1),f=H.o.beforeShowMonth(e);f===b?f={}:"boolean"==typeof f?f={enabled:f}:"string"==typeof f&&(f={classes:f}),!1!==f.enabled||a(d).hasClass("disabled")||a(d).addClass("disabled"),f.classes&&a(d).addClass(f.classes),f.tooltip&&a(d).prop("title",f.tooltip)})}this._fill_yearsView(".datepicker-years","year",10,h,j,l,this.o.beforeShowYear),this._fill_yearsView(".datepicker-decades","decade",100,h,j,l,this.o.beforeShowDecade),this._fill_yearsView(".datepicker-centuries","century",1e3,h,j,l,this.o.beforeShowCentury)}},updateNavArrows:function(){if(this._allow_update){var a,b,c=new Date(this.viewDate),d=c.getUTCFullYear(),e=c.getUTCMonth(),f=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,g=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,h=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,i=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,j=1;switch(this.viewMode){case 4:j*=10;case 3:j*=10;case 2:j*=10;case 1:a=Math.floor(d/j)*j<=f,b=Math.floor(d/j)*j+j>h;break;case 0:a=d<=f&&e<=g,b=d>=h&&e>=i}this.picker.find(".prev").toggleClass("disabled",a),this.picker.find(".next").toggleClass("disabled",b)}},click:function(b){b.preventDefault(),b.stopPropagation();var e,f,g,h;e=a(b.target),e.hasClass("datepicker-switch")&&this.viewMode!==this.o.maxViewMode&&this.setViewMode(this.viewMode+1),e.hasClass("today")&&!e.hasClass("day")&&(this.setViewMode(0),this._setDate(d(),"linked"===this.o.todayBtn?null:"view")),e.hasClass("clear")&&this.clearDates(),e.hasClass("disabled")||(e.hasClass("month")||e.hasClass("year")||e.hasClass("decade")||e.hasClass("century"))&&(this.viewDate.setUTCDate(1),f=1,1===this.viewMode?(h=e.parent().find("span").index(e),g=this.viewDate.getUTCFullYear(),this.viewDate.setUTCMonth(h)):(h=0,g=Number(e.text()),this.viewDate.setUTCFullYear(g)),this._trigger(r.viewModes[this.viewMode-1].e,this.viewDate),this.viewMode===this.o.minViewMode?this._setDate(c(g,h,f)):(this.setViewMode(this.viewMode-1),this.fill())),this.picker.is(":visible")&&this._focused_from&&this._focused_from.focus(),delete this._focused_from},dayCellClick:function(b){var c=a(b.currentTarget),d=c.data("date"),e=new Date(d);this.o.updateViewDate&&(e.getUTCFullYear()!==this.viewDate.getUTCFullYear()&&this._trigger("changeYear",this.viewDate),e.getUTCMonth()!==this.viewDate.getUTCMonth()&&this._trigger("changeMonth",this.viewDate)),this._setDate(e)},navArrowsClick:function(b){var c=a(b.currentTarget),d=c.hasClass("prev")?-1:1;0!==this.viewMode&&(d*=12*r.viewModes[this.viewMode].navStep),this.viewDate=this.moveMonth(this.viewDate,d),this._trigger(r.viewModes[this.viewMode].e,this.viewDate),this.fill()},_toggle_multidate:function(a){var b=this.dates.contains(a);if(a||this.dates.clear(),-1!==b?(!0===this.o.multidate||this.o.multidate>1||this.o.toggleActive)&&this.dates.remove(b):!1===this.o.multidate?(this.dates.clear(),this.dates.push(a)):this.dates.push(a),"number"==typeof this.o.multidate)for(;this.dates.length>this.o.multidate;)this.dates.remove(0)},_setDate:function(a,b){b&&"date"!==b||this._toggle_multidate(a&&new Date(a)),(!b&&this.o.updateViewDate||"view"===b)&&(this.viewDate=a&&new Date(a)),this.fill(),this.setValue(),b&&"view"===b||this._trigger("changeDate"),this.inputField.trigger("change"),!this.o.autoclose||b&&"date"!==b||this.hide()},moveDay:function(a,b){var c=new Date(a);return c.setUTCDate(a.getUTCDate()+b),c},moveWeek:function(a,b){return this.moveDay(a,7*b)},moveMonth:function(a,b){if(!g(a))return this.o.defaultViewDate;if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),h=e.getUTCMonth(),i=Math.abs(b);if(b=b>0?1:-1,1===i)d=-1===b?function(){return e.getUTCMonth()===h}:function(){return e.getUTCMonth()!==c},c=h+b,e.setUTCMonth(c),c=(c+12)%12;else{for(var j=0;j0},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(!this.picker.is(":visible"))return void(40!==a.keyCode&&27!==a.keyCode||(this.show(),a.stopPropagation()));var b,c,d=!1,e=this.focusDate||this.viewDate;switch(a.keyCode){case 27:this.focusDate?(this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill()):this.hide(),a.preventDefault(),a.stopPropagation();break;case 37:case 38:case 39:case 40:if(!this.o.keyboardNavigation||7===this.o.daysOfWeekDisabled.length)break;b=37===a.keyCode||38===a.keyCode?-1:1,0===this.viewMode?a.ctrlKey?(c=this.moveAvailableDate(e,b,"moveYear"))&&this._trigger("changeYear",this.viewDate):a.shiftKey?(c=this.moveAvailableDate(e,b,"moveMonth"))&&this._trigger("changeMonth",this.viewDate):37===a.keyCode||39===a.keyCode?c=this.moveAvailableDate(e,b,"moveDay"):this.weekOfDateIsDisabled(e)||(c=this.moveAvailableDate(e,b,"moveWeek")):1===this.viewMode?(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveMonth")):2===this.viewMode&&(38!==a.keyCode&&40!==a.keyCode||(b*=4),c=this.moveAvailableDate(e,b,"moveYear")),c&&(this.focusDate=this.viewDate=c,this.setValue(),this.fill(),a.preventDefault());break;case 13:if(!this.o.forceParse)break;e=this.focusDate||this.dates.get(-1)||this.viewDate,this.o.keyboardNavigation&&(this._toggle_multidate(e),d=!0),this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.setValue(),this.fill(),this.picker.is(":visible")&&(a.preventDefault(),a.stopPropagation(),this.o.autoclose&&this.hide());break;case 9:this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill(),this.hide()}d&&(this.dates.length?this._trigger("changeDate"):this._trigger("clearDate"),this.inputField.trigger("change"))},setViewMode:function(a){this.viewMode=a,this.picker.children("div").hide().filter(".datepicker-"+r.viewModes[this.viewMode].clsName).show(),this.updateNavArrows(),this._trigger("changeViewMode",new Date(this.viewDate))}};var l=function(b,c){a.data(b,"datepicker",this),this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,this.keepEmptyValues=c.keepEmptyValues,delete c.keepEmptyValues,n.call(a(this.inputs),c).on("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a.data(b,"datepicker")}),this.updateDates()};l.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.getUTCDate()}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},clearDates:function(){a.each(this.pickers,function(a,b){b.clearDates()})},dateUpdated:function(c){if(!this.updating){this.updating=!0;var d=a.data(c.target,"datepicker");if(d!==b){var e=d.getUTCDate(),f=this.keepEmptyValues,g=a.inArray(c.target,this.inputs),h=g-1,i=g+1,j=this.inputs.length;if(-1!==g){if(a.each(this.pickers,function(a,b){b.getUTCDate()||b!==d&&f||b.setUTCDate(e)}),e=0&ðis.dates[i])for(;ithis.dates[i];)this.pickers[i++].setUTCDate(e);this.updateDates(),delete this.updating}}}},destroy:function(){a.map(this.pickers,function(a){a.destroy()}),a(this.inputs).off("changeDate",this.dateUpdated),delete this.element.data().datepicker},remove:f("destroy","Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead")};var m=a.fn.datepicker,n=function(c){var d=Array.apply(null,arguments);d.shift();var e;if(this.each(function(){var b=a(this),f=b.data("datepicker"),g="object"==typeof c&&c;if(!f){var j=h(this,"date"),m=a.extend({},o,j,g),n=i(m.language),p=a.extend({},o,n,j,g);b.hasClass("input-daterange")||p.inputs?(a.extend(p,{inputs:p.inputs||b.find("input").toArray()}),f=new l(this,p)):f=new k(this,p),b.data("datepicker",f)}"string"==typeof c&&"function"==typeof f[c]&&(e=f[c].apply(f,d))}),e===b||e instanceof k||e instanceof l)return this;if(this.length>1)throw new Error("Using only allowed for the collection of a single element ("+c+" function)");return e};a.fn.datepicker=n;var o=a.fn.datepicker.defaults={assumeNearbyYear:!1,autoclose:!1,beforeShowDay:a.noop,beforeShowMonth:a.noop,beforeShowYear:a.noop,beforeShowDecade:a.noop,beforeShowCentury:a.noop,calendarWeeks:!1,clearBtn:!1,toggleActive:!1,daysOfWeekDisabled:[],daysOfWeekHighlighted:[],datesDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keepEmptyValues:!1,keyboardNavigation:!0,language:"en",minViewMode:0,maxViewMode:4,multidate:!1,multidateSeparator:",",orientation:"auto",rtl:!1,startDate:-1/0,startView:0,todayBtn:!1,todayHighlight:!1,updateViewDate:!0,weekStart:0,disableTouchKeyboard:!1,enableOnReadonly:!0,showOnFocus:!0,zIndexOffset:10,container:"body",immediateUpdates:!1,title:"",templates:{leftArrow:"«",rightArrow:"»"},showWeekDays:!0},p=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=k;var q=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear",titleFormat:"MM yyyy"}},r={viewModes:[{names:["days","month"],clsName:"days",e:"changeMonth"},{names:["months","year"],clsName:"months",e:"changeYear",navStep:1},{names:["years","decade"],clsName:"years",e:"changeDecade",navStep:10},{names:["decades","century"],clsName:"decades",e:"changeCentury",navStep:100},{names:["centuries","millennium"],clsName:"centuries",e:"changeMillennium",navStep:1e3}],validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,parseFormat:function(a){if("function"==typeof a.toValue&&"function"==typeof a.toDisplay)return a;var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,e,f,g){function h(a,b){return!0===b&&(b=10),a<100&&(a+=2e3)>(new Date).getFullYear()+b&&(a-=100),a}function i(){var a=this.slice(0,j[n].length),b=j[n].slice(0,a.length);return a.toLowerCase()===b.toLowerCase()}if(!c)return b;if(c instanceof Date)return c;if("string"==typeof e&&(e=r.parseFormat(e)),e.toValue)return e.toValue(c,e,f);var j,l,m,n,o,p={d:"moveDay",m:"moveMonth",w:"moveWeek",y:"moveYear"},s={yesterday:"-1d",today:"+0d",tomorrow:"+1d"};if(c in s&&(c=s[c]),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(c)){for(j=c.match(/([\-+]\d+)([dmwy])/gi),c=new Date,n=0;n |
|---|
| '+o.templates.leftArrow+' | | '+o.templates.rightArrow+" |
",contTemplate:' |
',footTemplate:' |
|---|
|
'};r.template=''+r.headTemplate+""+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+'
'+r.headTemplate+r.contTemplate+r.footTemplate+"
",a.fn.datepicker.DPGlobal=r,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=m,this},a.fn.datepicker.version="1.9.0",a.fn.datepicker.deprecated=function(a){var b=window.console;b&&b.warn&&b.warn("DEPRECATED: "+a)},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),n.call(c,"show"))}),a(function(){n.call(a('[data-provide="datepicker-inline"]'))})});
\ No newline at end of file
diff --git a/js/bootstrap-select.js b/js/bootstrap-select.js
new file mode 100644
index 0000000..eeedb60
--- /dev/null
+++ b/js/bootstrap-select.js
@@ -0,0 +1,3630 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */
+
+(function (root, factory) {
+ if (root === undefined && window !== undefined) root = window;
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module unless amdModuleId is set
+ define(["jquery"], function (a0) {
+ return (factory(a0));
+ });
+ } else if (typeof module === 'object' && module.exports) {
+ // Node. Does not work with strict CommonJS, but
+ // only CommonJS-like environments that support module.exports,
+ // like Node.
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(root["jQuery"]);
+ }
+}(this, function (jQuery) {
+
+(function ($) {
+ 'use strict';
+
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
+
+ var uriAttrs = [
+ 'background',
+ 'cite',
+ 'href',
+ 'itemtype',
+ 'longdesc',
+ 'poster',
+ 'src',
+ 'xlink:href'
+ ];
+
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
+
+ var DefaultWhitelist = {
+ // Global attributes allowed on any supplied element below.
+ '*': ['class', 'dir', 'id', 'lang', 'role', 'tabindex', 'style', ARIA_ATTRIBUTE_PATTERN],
+ 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: []
+ };
+
+ /**
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
+
+ /**
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
+ *
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+ */
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;
+
+ var ParseableAttributes = ['title', 'placeholder']; // attributes to use as settings, can add others in the future
+
+ function allowedAttribute (attr, allowedAttributeList) {
+ var attrName = attr.nodeName.toLowerCase();
+
+ if ($.inArray(attrName, allowedAttributeList) !== -1) {
+ if ($.inArray(attrName, uriAttrs) !== -1) {
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
+ }
+
+ return true;
+ }
+
+ var regExp = $(allowedAttributeList).filter(function (index, value) {
+ return value instanceof RegExp;
+ });
+
+ // Check if a regular expression validates the attribute.
+ for (var i = 0, l = regExp.length; i < l; i++) {
+ if (attrName.match(regExp[i])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function sanitizeHtml (unsafeElements, whiteList, sanitizeFn) {
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
+ return sanitizeFn(unsafeElements);
+ }
+
+ var whitelistKeys = Object.keys(whiteList);
+
+ for (var i = 0, len = unsafeElements.length; i < len; i++) {
+ var elements = unsafeElements[i].querySelectorAll('*');
+
+ for (var j = 0, len2 = elements.length; j < len2; j++) {
+ var el = elements[j];
+ var elName = el.nodeName.toLowerCase();
+
+ if (whitelistKeys.indexOf(elName) === -1) {
+ el.parentNode.removeChild(el);
+
+ continue;
+ }
+
+ var attributeList = [].slice.call(el.attributes);
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
+
+ for (var k = 0, len3 = attributeList.length; k < len3; k++) {
+ var attr = attributeList[k];
+
+ if (!allowedAttribute(attr, whitelistedAttributes)) {
+ el.removeAttribute(attr.nodeName);
+ }
+ }
+ }
+ }
+ }
+
+ function getAttributesObject ($select) {
+ var attributesObject = {},
+ attrVal;
+
+ ParseableAttributes.forEach(function (item) {
+ attrVal = $select.attr(item);
+ if (attrVal) attributesObject[item] = attrVal;
+ });
+
+ // for backwards compatibility
+ // (using title as placeholder is deprecated - remove in v2.0.0)
+ if (!attributesObject.placeholder && attributesObject.title) {
+ attributesObject.placeholder = attributesObject.title;
+ }
+
+ return attributesObject;
+ }
+
+ // Polyfill for browsers with no classList support
+ // Remove in v2
+ if (!('classList' in document.createElement('_'))) {
+ (function (view) {
+ if (!('Element' in view)) return;
+
+ var classListProp = 'classList',
+ protoProp = 'prototype',
+ elemCtrProto = view.Element[protoProp],
+ objCtr = Object,
+ classListGetter = function () {
+ var $elem = $(this);
+
+ return {
+ add: function (classes) {
+ classes = Array.prototype.slice.call(arguments).join(' ');
+ return $elem.addClass(classes);
+ },
+ remove: function (classes) {
+ classes = Array.prototype.slice.call(arguments).join(' ');
+ return $elem.removeClass(classes);
+ },
+ toggle: function (classes, force) {
+ return $elem.toggleClass(classes, force);
+ },
+ contains: function (classes) {
+ return $elem.hasClass(classes);
+ }
+ };
+ };
+
+ if (objCtr.defineProperty) {
+ var classListPropDesc = {
+ get: classListGetter,
+ enumerable: true,
+ configurable: true
+ };
+ try {
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ } catch (ex) { // IE 8 doesn't support enumerable:true
+ // adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36
+ // modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected
+ if (ex.number === undefined || ex.number === -0x7FF5EC54) {
+ classListPropDesc.enumerable = false;
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ }
+ }
+ } else if (objCtr[protoProp].__defineGetter__) {
+ elemCtrProto.__defineGetter__(classListProp, classListGetter);
+ }
+ }(window));
+ }
+
+ var testElement = document.createElement('_');
+
+ testElement.classList.add('c1', 'c2');
+
+ if (!testElement.classList.contains('c2')) {
+ var _add = DOMTokenList.prototype.add,
+ _remove = DOMTokenList.prototype.remove;
+
+ DOMTokenList.prototype.add = function () {
+ Array.prototype.forEach.call(arguments, _add.bind(this));
+ };
+
+ DOMTokenList.prototype.remove = function () {
+ Array.prototype.forEach.call(arguments, _remove.bind(this));
+ };
+ }
+
+ testElement.classList.toggle('c3', false);
+
+ // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
+ // support the second argument.
+ if (testElement.classList.contains('c3')) {
+ var _toggle = DOMTokenList.prototype.toggle;
+
+ DOMTokenList.prototype.toggle = function (token, force) {
+ if (1 in arguments && !this.contains(token) === !force) {
+ return force;
+ } else {
+ return _toggle.call(this, token);
+ }
+ };
+ }
+
+ testElement = null;
+
+ // Polyfill for IE (remove in v2)
+ Object.values = typeof Object.values === 'function' ? Object.values : function (obj) {
+ return Object.keys(obj).map(function (key) {
+ return obj[key];
+ });
+ };
+
+ // shallow array comparison
+ function isEqual (array1, array2) {
+ return array1.length === array2.length && array1.every(function (element, index) {
+ return element === array2[index];
+ });
+ };
+
+ //
+ if (!String.prototype.startsWith) {
+ (function () {
+ 'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
+ var toString = {}.toString;
+ var startsWith = function (search) {
+ if (this == null) {
+ throw new TypeError();
+ }
+ var string = String(this);
+ if (search && toString.call(search) == '[object RegExp]') {
+ throw new TypeError();
+ }
+ var stringLength = string.length;
+ var searchString = String(search);
+ var searchLength = searchString.length;
+ var position = arguments.length > 1 ? arguments[1] : undefined;
+ // `ToInteger`
+ var pos = position ? Number(position) : 0;
+ if (pos != pos) { // better `isNaN`
+ pos = 0;
+ }
+ var start = Math.min(Math.max(pos, 0), stringLength);
+ // Avoid the `indexOf` call if no match is possible
+ if (searchLength + start > stringLength) {
+ return false;
+ }
+ var index = -1;
+ while (++index < searchLength) {
+ if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ if (Object.defineProperty) {
+ Object.defineProperty(String.prototype, 'startsWith', {
+ 'value': startsWith,
+ 'configurable': true,
+ 'writable': true
+ });
+ } else {
+ String.prototype.startsWith = startsWith;
+ }
+ }());
+ }
+
+ function toKebabCase (str) {
+ return str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, function ($, ofs) {
+ return (ofs ? '-' : '') + $.toLowerCase();
+ });
+ }
+
+ function getSelectedOptions () {
+ var options = this.selectpicker.main.data;
+
+ if (this.options.source.data || this.options.source.search) {
+ options = Object.values(this.selectpicker.optionValuesDataMap);
+ }
+
+ var selectedOptions = options.filter(function (item) {
+ if (item.selected) {
+ if (this.options.hideDisabled && item.disabled) return false;
+ return true;
+ }
+
+ return false;
+ }, this);
+
+ // ensure only 1 option is selected if multiple are set in the data source
+ if (this.options.source.data && !this.multiple && selectedOptions.length > 1) {
+ for (var i = 0; i < selectedOptions.length - 1; i++) {
+ selectedOptions[i].selected = false;
+ }
+
+ selectedOptions = [ selectedOptions[selectedOptions.length - 1] ];
+ }
+
+ return selectedOptions;
+ }
+
+ // much faster than $.val()
+ function getSelectValues (selectedOptions) {
+ var value = [],
+ options = selectedOptions || getSelectedOptions.call(this),
+ opt;
+
+ for (var i = 0, len = options.length; i < len; i++) {
+ opt = options[i];
+
+ if (!opt.disabled) {
+ value.push(opt.value === undefined ? opt.text : opt.value);
+ }
+ }
+
+ if (!this.multiple) {
+ return !value.length ? null : value[0];
+ }
+
+ return value;
+ }
+
+ // set data-selected on select element if the value has been programmatically selected
+ // prior to initialization of bootstrap-select
+ // * consider removing or replacing an alternative method *
+ var valHooks = {
+ useDefault: false,
+ _set: $.valHooks.select.set
+ };
+
+ $.valHooks.select.set = function (elem, value) {
+ if (value && !valHooks.useDefault) $(elem).data('selected', true);
+
+ return valHooks._set.apply(this, arguments);
+ };
+
+ var changedArguments = null;
+
+ var EventIsSupported = (function () {
+ try {
+ new Event('change');
+ return true;
+ } catch (e) {
+ return false;
+ }
+ })();
+
+ $.fn.triggerNative = function (eventName) {
+ var el = this[0],
+ event;
+
+ if (el.dispatchEvent) { // for modern browsers & IE9+
+ if (EventIsSupported) {
+ // For modern browsers
+ event = new Event(eventName, {
+ bubbles: true
+ });
+ } else {
+ // For IE since it doesn't support Event constructor
+ event = document.createEvent('Event');
+ event.initEvent(eventName, true, false);
+ }
+
+ el.dispatchEvent(event);
+ }
+ };
+ //
+
+ function stringSearch (li, searchString, method, normalize) {
+ var stringTypes = [
+ 'display',
+ 'subtext',
+ 'tokens'
+ ],
+ searchSuccess = false;
+
+ for (var i = 0; i < stringTypes.length; i++) {
+ var stringType = stringTypes[i],
+ string = li[stringType];
+
+ if (string) {
+ string = string.toString();
+
+ // Strip HTML tags. This isn't perfect, but it's much faster than any other method
+ if (stringType === 'display') {
+ string = string.replace(/<[^>]+>/g, '');
+ }
+
+ if (normalize) string = normalizeToBase(string);
+ string = string.toUpperCase();
+
+ if (typeof method === 'function') {
+ searchSuccess = method(string, searchString);
+ } else if (method === 'contains') {
+ searchSuccess = string.indexOf(searchString) >= 0;
+ } else {
+ searchSuccess = string.startsWith(searchString);
+ }
+
+ if (searchSuccess) break;
+ }
+ }
+
+ return searchSuccess;
+ }
+
+ function toInteger (value) {
+ return parseInt(value, 10) || 0;
+ }
+
+ // Borrowed from Lodash (_.deburr)
+ /** Used to map Latin Unicode letters to basic Latin letters. */
+ var deburredLetters = {
+ // Latin-1 Supplement block.
+ '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
+ '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
+ '\xc7': 'C', '\xe7': 'c',
+ '\xd0': 'D', '\xf0': 'd',
+ '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
+ '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
+ '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
+ '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
+ '\xd1': 'N', '\xf1': 'n',
+ '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
+ '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
+ '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
+ '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
+ '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
+ '\xc6': 'Ae', '\xe6': 'ae',
+ '\xde': 'Th', '\xfe': 'th',
+ '\xdf': 'ss',
+ // Latin Extended-A block.
+ '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
+ '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
+ '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
+ '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
+ '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
+ '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
+ '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
+ '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
+ '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
+ '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
+ '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
+ '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
+ '\u0134': 'J', '\u0135': 'j',
+ '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
+ '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
+ '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
+ '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
+ '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
+ '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
+ '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
+ '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
+ '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
+ '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
+ '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
+ '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
+ '\u0163': 't', '\u0165': 't', '\u0167': 't',
+ '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
+ '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
+ '\u0174': 'W', '\u0175': 'w',
+ '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
+ '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
+ '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
+ '\u0132': 'IJ', '\u0133': 'ij',
+ '\u0152': 'Oe', '\u0153': 'oe',
+ '\u0149': "'n", '\u017f': 's'
+ };
+
+ /** Used to match Latin Unicode letters (excluding mathematical operators). */
+ var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+
+ /** Used to compose unicode character classes. */
+ var rsComboMarksRange = '\\u0300-\\u036f',
+ reComboHalfMarksRange = '\\ufe20-\\ufe2f',
+ rsComboSymbolsRange = '\\u20d0-\\u20ff',
+ rsComboMarksExtendedRange = '\\u1ab0-\\u1aff',
+ rsComboMarksSupplementRange = '\\u1dc0-\\u1dff',
+ rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;
+
+ /** Used to compose unicode capture groups. */
+ var rsCombo = '[' + rsComboRange + ']';
+
+ /**
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+ */
+ var reComboMark = RegExp(rsCombo, 'g');
+
+ function deburrLetter (key) {
+ return deburredLetters[key];
+ };
+
+ function normalizeToBase (string) {
+ string = string.toString();
+ return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+ }
+
+ // List of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
+ var createEscaper = function (map) {
+ var escaper = function (match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped.
+ var source = '(?:' + Object.keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function (string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ };
+
+ var htmlEscape = createEscaper(escapeMap);
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var keyCodeMap = {
+ 32: ' ',
+ 48: '0',
+ 49: '1',
+ 50: '2',
+ 51: '3',
+ 52: '4',
+ 53: '5',
+ 54: '6',
+ 55: '7',
+ 56: '8',
+ 57: '9',
+ 59: ';',
+ 65: 'A',
+ 66: 'B',
+ 67: 'C',
+ 68: 'D',
+ 69: 'E',
+ 70: 'F',
+ 71: 'G',
+ 72: 'H',
+ 73: 'I',
+ 74: 'J',
+ 75: 'K',
+ 76: 'L',
+ 77: 'M',
+ 78: 'N',
+ 79: 'O',
+ 80: 'P',
+ 81: 'Q',
+ 82: 'R',
+ 83: 'S',
+ 84: 'T',
+ 85: 'U',
+ 86: 'V',
+ 87: 'W',
+ 88: 'X',
+ 89: 'Y',
+ 90: 'Z',
+ 96: '0',
+ 97: '1',
+ 98: '2',
+ 99: '3',
+ 100: '4',
+ 101: '5',
+ 102: '6',
+ 103: '7',
+ 104: '8',
+ 105: '9'
+ };
+
+ var keyCodes = {
+ ESCAPE: 27, // KeyboardEvent.which value for Escape (Esc) key
+ ENTER: 13, // KeyboardEvent.which value for Enter key
+ SPACE: 32, // KeyboardEvent.which value for space key
+ TAB: 9, // KeyboardEvent.which value for tab key
+ ARROW_UP: 38, // KeyboardEvent.which value for up arrow key
+ ARROW_DOWN: 40 // KeyboardEvent.which value for down arrow key
+ };
+
+ // eslint-disable-next-line no-undef
+ var Dropdown = window.Dropdown || bootstrap.Dropdown;
+
+ function getVersion () {
+ var version;
+
+ try {
+ version = $.fn.dropdown.Constructor.VERSION;
+ } catch (err) {
+ version = Dropdown.VERSION;
+ }
+
+ return version;
+ }
+
+ var version = {
+ success: false,
+ major: '3'
+ };
+
+ try {
+ version.full = (getVersion() || '').split(' ')[0].split('.');
+ version.major = version.full[0];
+ version.success = true;
+ } catch (err) {
+ // do nothing
+ }
+
+ var selectId = 0;
+
+ var EVENT_KEY = '.bs.select';
+
+ var classNames = {
+ DISABLED: 'disabled',
+ DIVIDER: 'divider',
+ SHOW: 'open',
+ DROPUP: 'dropup',
+ MENU: 'dropdown-menu',
+ MENURIGHT: 'dropdown-menu-right',
+ MENULEFT: 'dropdown-menu-left',
+ // to-do: replace with more advanced template/customization options
+ BUTTONCLASS: 'btn-default',
+ POPOVERHEADER: 'popover-title',
+ ICONBASE: 'glyphicon',
+ TICKICON: 'glyphicon-ok'
+ };
+
+ var Selector = {
+ MENU: '.' + classNames.MENU,
+ DATA_TOGGLE: 'data-toggle="dropdown"'
+ };
+
+ var elementTemplates = {
+ div: document.createElement('div'),
+ span: document.createElement('span'),
+ i: document.createElement('i'),
+ subtext: document.createElement('small'),
+ a: document.createElement('a'),
+ li: document.createElement('li'),
+ whitespace: document.createTextNode('\u00A0'),
+ fragment: document.createDocumentFragment(),
+ option: document.createElement('option')
+ };
+
+ elementTemplates.selectedOption = elementTemplates.option.cloneNode(false);
+ elementTemplates.selectedOption.setAttribute('selected', true);
+
+ elementTemplates.noResults = elementTemplates.li.cloneNode(false);
+ elementTemplates.noResults.className = 'no-results';
+
+ elementTemplates.a.setAttribute('role', 'option');
+ elementTemplates.a.className = 'dropdown-item';
+
+ elementTemplates.subtext.className = 'text-muted';
+
+ elementTemplates.text = elementTemplates.span.cloneNode(false);
+ elementTemplates.text.className = 'text';
+
+ elementTemplates.checkMark = elementTemplates.span.cloneNode(false);
+
+ var REGEXP_ARROW = new RegExp(keyCodes.ARROW_UP + '|' + keyCodes.ARROW_DOWN);
+ var REGEXP_TAB_OR_ESCAPE = new RegExp('^' + keyCodes.TAB + '$|' + keyCodes.ESCAPE);
+
+ var generateOption = {
+ li: function (content, classes, optgroup) {
+ var li = elementTemplates.li.cloneNode(false);
+
+ if (content) {
+ if (content.nodeType === 1 || content.nodeType === 11) {
+ li.appendChild(content);
+ } else {
+ li.innerHTML = content;
+ }
+ }
+
+ if (typeof classes !== 'undefined' && classes !== '') li.className = classes;
+ if (typeof optgroup !== 'undefined' && optgroup !== null) li.classList.add('optgroup-' + optgroup);
+
+ return li;
+ },
+
+ a: function (text, classes, inline) {
+ var a = elementTemplates.a.cloneNode(true);
+
+ if (text) {
+ if (text.nodeType === 11) {
+ a.appendChild(text);
+ } else {
+ a.insertAdjacentHTML('beforeend', text);
+ }
+ }
+
+ if (typeof classes !== 'undefined' && classes !== '') a.classList.add.apply(a.classList, classes.split(/\s+/));
+ if (inline) a.setAttribute('style', inline);
+
+ return a;
+ },
+
+ text: function (options, useFragment) {
+ var textElement = elementTemplates.text.cloneNode(false),
+ subtextElement,
+ iconElement;
+
+ if (options.content) {
+ textElement.innerHTML = options.content;
+ } else {
+ textElement.textContent = options.text;
+
+ if (options.icon) {
+ var whitespace = elementTemplates.whitespace.cloneNode(false);
+
+ // need to use for icons in the button to prevent a breaking change
+ // note: switch to span in next major release
+ iconElement = (useFragment === true ? elementTemplates.i : elementTemplates.span).cloneNode(false);
+ iconElement.className = this.options.iconBase + ' ' + options.icon;
+
+ elementTemplates.fragment.appendChild(iconElement);
+ elementTemplates.fragment.appendChild(whitespace);
+ }
+
+ if (options.subtext) {
+ subtextElement = elementTemplates.subtext.cloneNode(false);
+ subtextElement.textContent = options.subtext;
+ textElement.appendChild(subtextElement);
+ }
+ }
+
+ if (useFragment === true) {
+ while (textElement.childNodes.length > 0) {
+ elementTemplates.fragment.appendChild(textElement.childNodes[0]);
+ }
+ } else {
+ elementTemplates.fragment.appendChild(textElement);
+ }
+
+ return elementTemplates.fragment;
+ },
+
+ label: function (options) {
+ var textElement = elementTemplates.text.cloneNode(false),
+ subtextElement,
+ iconElement;
+
+ textElement.innerHTML = options.display;
+
+ if (options.icon) {
+ var whitespace = elementTemplates.whitespace.cloneNode(false);
+
+ iconElement = elementTemplates.span.cloneNode(false);
+ iconElement.className = this.options.iconBase + ' ' + options.icon;
+
+ elementTemplates.fragment.appendChild(iconElement);
+ elementTemplates.fragment.appendChild(whitespace);
+ }
+
+ if (options.subtext) {
+ subtextElement = elementTemplates.subtext.cloneNode(false);
+ subtextElement.textContent = options.subtext;
+ textElement.appendChild(subtextElement);
+ }
+
+ elementTemplates.fragment.appendChild(textElement);
+
+ return elementTemplates.fragment;
+ }
+ };
+
+ var getOptionData = {
+ fromOption: function (option, type) {
+ var value;
+
+ switch (type) {
+ case 'divider':
+ value = option.getAttribute('data-divider') === 'true';
+ break;
+
+ case 'text':
+ value = option.textContent;
+ break;
+
+ case 'label':
+ value = option.label;
+ break;
+
+ case 'style':
+ value = option.style.cssText;
+ break;
+
+ case 'title':
+ value = option.title;
+ break;
+
+ default:
+ value = option.getAttribute('data-' + toKebabCase(type));
+ break;
+ }
+
+ return value;
+ },
+ fromDataSource: function (option, type) {
+ var value;
+
+ switch (type) {
+ case 'text':
+ case 'label':
+ value = option.text || option.value || '';
+ break;
+
+ default:
+ value = option[type];
+ break;
+ }
+
+ return value;
+ }
+ };
+
+ function showNoResults (searchMatch, searchValue) {
+ if (!searchMatch.length) {
+ elementTemplates.noResults.innerHTML = this.options.noneResultsText.replace('{0}', '"' + htmlEscape(searchValue) + '"');
+ this.$menuInner[0].firstChild.appendChild(elementTemplates.noResults);
+ }
+ }
+
+ function filterHidden (item) {
+ return !(item.hidden || this.options.hideDisabled && item.disabled);
+ }
+
+ var Selectpicker = function (element, options) {
+ var that = this;
+
+ // bootstrap-select has been initialized - revert valHooks.select.set back to its original function
+ if (!valHooks.useDefault) {
+ $.valHooks.select.set = valHooks._set;
+ valHooks.useDefault = true;
+ }
+
+ this.$element = $(element);
+ this.$newElement = null;
+ this.$button = null;
+ this.$menu = null;
+ this.options = options;
+ this.selectpicker = {
+ main: {
+ data: [],
+ optionQueue: elementTemplates.fragment.cloneNode(false),
+ hasMore: false
+ },
+ search: {
+ data: [],
+ hasMore: false
+ },
+ current: {}, // current is either equal to main or search depending on if a search is in progress
+ view: {},
+ // map of option values and their respective data (only used in conjunction with options.source)
+ optionValuesDataMap: {},
+ isSearching: false,
+ keydown: {
+ keyHistory: '',
+ resetKeyHistory: {
+ start: function () {
+ return setTimeout(function () {
+ that.selectpicker.keydown.keyHistory = '';
+ }, 800);
+ }
+ }
+ }
+ };
+
+ this.sizeInfo = {};
+
+ // Format window padding
+ var winPad = this.options.windowPadding;
+ if (typeof winPad === 'number') {
+ this.options.windowPadding = [winPad, winPad, winPad, winPad];
+ }
+
+ // Expose public methods
+ this.val = Selectpicker.prototype.val;
+ this.render = Selectpicker.prototype.render;
+ this.refresh = Selectpicker.prototype.refresh;
+ this.setStyle = Selectpicker.prototype.setStyle;
+ this.selectAll = Selectpicker.prototype.selectAll;
+ this.deselectAll = Selectpicker.prototype.deselectAll;
+ this.destroy = Selectpicker.prototype.destroy;
+ this.remove = Selectpicker.prototype.remove;
+ this.show = Selectpicker.prototype.show;
+ this.hide = Selectpicker.prototype.hide;
+
+ this.init();
+ };
+
+ Selectpicker.VERSION = '1.14.0-beta3';
+
+ // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.
+ Selectpicker.DEFAULTS = {
+ noneSelectedText: 'Nothing selected',
+ noneResultsText: 'No results matched {0}',
+ countSelectedText: function (numSelected, numTotal) {
+ return (numSelected == 1) ? '{0} item selected' : '{0} items selected';
+ },
+ maxOptionsText: function (numAll, numGroup) {
+ return [
+ (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
+ (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
+ ];
+ },
+ selectAllText: 'Select All',
+ deselectAllText: 'Deselect All',
+ source: {
+ pageSize: 40
+ },
+ chunkSize: 40,
+ doneButton: false,
+ doneButtonText: 'Close',
+ multipleSeparator: ', ',
+ styleBase: 'btn',
+ style: classNames.BUTTONCLASS,
+ size: 'auto',
+ title: null,
+ placeholder: null,
+ allowClear: false,
+ selectedTextFormat: 'values',
+ width: false,
+ container: false,
+ hideDisabled: false,
+ showSubtext: false,
+ showIcon: true,
+ showContent: true,
+ dropupAuto: true,
+ header: false,
+ liveSearch: false,
+ liveSearchPlaceholder: null,
+ liveSearchNormalize: false,
+ liveSearchStyle: 'contains',
+ actionsBox: false,
+ iconBase: classNames.ICONBASE,
+ tickIcon: classNames.TICKICON,
+ showTick: false,
+ template: {
+ caret: ''
+ },
+ maxOptions: false,
+ mobile: false,
+ selectOnTab: true,
+ dropdownAlignRight: false,
+ windowPadding: 0,
+ virtualScroll: 600,
+ display: false,
+ sanitize: true,
+ sanitizeFn: null,
+ whiteList: DefaultWhitelist
+ };
+
+ Selectpicker.prototype = {
+
+ constructor: Selectpicker,
+
+ init: function () {
+ var that = this,
+ id = this.$element.attr('id'),
+ element = this.$element[0],
+ form = element.form;
+
+ selectId++;
+ this.selectId = 'bs-select-' + selectId;
+
+ element.classList.add('bs-select-hidden');
+
+ this.multiple = this.$element.prop('multiple');
+ this.autofocus = this.$element.prop('autofocus');
+
+ if (element.classList.contains('show-tick')) {
+ this.options.showTick = true;
+ }
+
+ this.$newElement = this.createDropdown();
+
+ this.$element
+ .after(this.$newElement)
+ .prependTo(this.$newElement);
+
+ // ensure select is associated with form element if it got unlinked after moving it inside newElement
+ if (form && element.form === null) {
+ if (!form.id) form.id = 'form-' + this.selectId;
+ element.setAttribute('form', form.id);
+ }
+
+ this.$button = this.$newElement.children('button');
+ if (this.options.allowClear) this.$clearButton = this.$button.children('.bs-select-clear-selected');
+ this.$menu = this.$newElement.children(Selector.MENU);
+ this.$menuInner = this.$menu.children('.inner');
+ this.$searchbox = this.$menu.find('input');
+
+ element.classList.remove('bs-select-hidden');
+
+ this.fetchData(function () {
+ that.render(true);
+ that.buildList();
+
+ requestAnimationFrame(function () {
+ that.$element.trigger('loaded' + EVENT_KEY);
+ });
+ });
+
+ if (this.options.dropdownAlignRight === true) this.$menu[0].classList.add(classNames.MENURIGHT);
+
+ if (typeof id !== 'undefined') {
+ this.$button.attr('data-id', id);
+ }
+
+ this.checkDisabled();
+ this.clickListener();
+
+ if (version.major > 4) this.dropdown = new Dropdown(this.$button[0]);
+
+ if (this.options.liveSearch) {
+ this.liveSearchListener();
+ this.focusedParent = this.$searchbox[0];
+ } else {
+ this.focusedParent = this.$menuInner[0];
+ }
+
+ this.setStyle();
+ this.setWidth();
+ if (this.options.container) {
+ this.selectPosition();
+ } else {
+ this.$element.on('hide' + EVENT_KEY, function () {
+ if (that.isVirtual()) {
+ // empty menu on close
+ var menuInner = that.$menuInner[0],
+ emptyMenu = menuInner.firstChild.cloneNode(false);
+
+ // replace the existing UL with an empty one - this is faster than $.empty() or innerHTML = ''
+ menuInner.replaceChild(emptyMenu, menuInner.firstChild);
+ menuInner.scrollTop = 0;
+ }
+ });
+ }
+ this.$menu.data('this', this);
+ this.$newElement.data('this', this);
+ if (this.options.mobile) this.mobile();
+
+ this.$newElement.on({
+ 'hide.bs.dropdown': function (e) {
+ that.$element.trigger('hide' + EVENT_KEY, e);
+ },
+ 'hidden.bs.dropdown': function (e) {
+ that.$element.trigger('hidden' + EVENT_KEY, e);
+ },
+ 'show.bs.dropdown': function (e) {
+ that.$element.trigger('show' + EVENT_KEY, e);
+ },
+ 'shown.bs.dropdown': function (e) {
+ that.$element.trigger('shown' + EVENT_KEY, e);
+ }
+ });
+
+ if (element.hasAttribute('required')) {
+ this.$element.on('invalid' + EVENT_KEY, function () {
+ that.$button[0].classList.add('bs-invalid');
+
+ that.$element
+ .on('shown' + EVENT_KEY + '.invalid', function () {
+ that.$element
+ .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened
+ .off('shown' + EVENT_KEY + '.invalid');
+ })
+ .on('rendered' + EVENT_KEY, function () {
+ // if select is no longer invalid, remove the bs-invalid class
+ if (this.validity.valid) that.$button[0].classList.remove('bs-invalid');
+ that.$element.off('rendered' + EVENT_KEY);
+ });
+
+ that.$button.on('blur' + EVENT_KEY, function () {
+ that.$element.trigger('focus').trigger('blur');
+ that.$button.off('blur' + EVENT_KEY);
+ });
+ });
+ }
+
+ if (form) {
+ $(form).on('reset' + EVENT_KEY, function () {
+ requestAnimationFrame(function () {
+ that.render();
+ });
+ });
+ }
+ },
+
+ createDropdown: function () {
+ // Options
+ // If we are multiple or showTick option is set, then add the show-tick class
+ var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',
+ multiselectable = this.multiple ? ' aria-multiselectable="true"' : '',
+ inputGroup = '',
+ autofocus = this.autofocus ? ' autofocus' : '';
+
+ if (version.major < 4 && this.$element.parent().hasClass('input-group')) {
+ inputGroup = ' input-group-btn';
+ }
+
+ // Elements
+ var drop,
+ header = '',
+ searchbox = '',
+ actionsbox = '',
+ donebutton = '',
+ clearButton = '';
+
+ if (this.options.header) {
+ header =
+ '';
+ }
+
+ if (this.options.liveSearch) {
+ searchbox =
+ '' +
+ '' +
+ '
';
+ }
+
+ if (this.multiple && this.options.actionsBox) {
+ actionsbox =
+ '' +
+ '
' +
+ '' +
+ '' +
+ '
' +
+ '
';
+ }
+
+ if (this.multiple && this.options.doneButton) {
+ donebutton =
+ '';
+ }
+
+ if (this.options.allowClear) {
+ clearButton = '×';
+ }
+
+ drop =
+ '';
+
+ return $(drop);
+ },
+
+ setPositionData: function () {
+ this.selectpicker.view.canHighlight = [];
+ this.selectpicker.view.size = 0;
+ this.selectpicker.view.firstHighlightIndex = false;
+
+ for (var i = 0; i < this.selectpicker.current.data.length; i++) {
+ var li = this.selectpicker.current.data[i],
+ canHighlight = true;
+
+ if (li.type === 'divider') {
+ canHighlight = false;
+ li.height = this.sizeInfo.dividerHeight;
+ } else if (li.type === 'optgroup-label') {
+ canHighlight = false;
+ li.height = this.sizeInfo.dropdownHeaderHeight;
+ } else {
+ li.height = this.sizeInfo.liHeight;
+ }
+
+ if (li.disabled) canHighlight = false;
+
+ this.selectpicker.view.canHighlight.push(canHighlight);
+
+ if (canHighlight) {
+ this.selectpicker.view.size++;
+ li.posinset = this.selectpicker.view.size;
+ if (this.selectpicker.view.firstHighlightIndex === false) this.selectpicker.view.firstHighlightIndex = i;
+ }
+
+ li.position = (i === 0 ? 0 : this.selectpicker.current.data[i - 1].position) + li.height;
+ }
+ },
+
+ isVirtual: function () {
+ return (this.options.virtualScroll !== false) && (this.selectpicker.main.data.length >= this.options.virtualScroll) || this.options.virtualScroll === true;
+ },
+
+ createView: function (isSearching, setSize, refresh) {
+ var that = this,
+ scrollTop = 0;
+
+ this.selectpicker.isSearching = isSearching;
+ this.selectpicker.current = isSearching ? this.selectpicker.search : this.selectpicker.main;
+
+ this.setPositionData();
+
+ if (setSize) {
+ if (refresh) {
+ scrollTop = this.$menuInner[0].scrollTop;
+ } else if (!that.multiple) {
+ var element = that.$element[0],
+ selectedIndex = (element.options[element.selectedIndex] || {}).liIndex;
+
+ if (typeof selectedIndex === 'number' && that.options.size !== false) {
+ var selectedData = that.selectpicker.main.data[selectedIndex],
+ position = selectedData && selectedData.position;
+
+ if (position) {
+ scrollTop = position - ((that.sizeInfo.menuInnerHeight + that.sizeInfo.liHeight) / 2);
+ }
+ }
+ }
+ }
+
+ scroll(scrollTop, true);
+
+ this.$menuInner.off('scroll.createView').on('scroll.createView', function (e, updateValue) {
+ if (!that.noScroll) scroll(this.scrollTop, updateValue);
+ that.noScroll = false;
+ });
+
+ function scroll (scrollTop, init) {
+ var size = that.selectpicker.current.data.length,
+ chunks = [],
+ chunkSize,
+ chunkCount,
+ firstChunk,
+ lastChunk,
+ currentChunk,
+ prevPositions,
+ positionIsDifferent,
+ previousElements,
+ menuIsDifferent = true,
+ isVirtual = that.isVirtual();
+
+ that.selectpicker.view.scrollTop = scrollTop;
+
+ chunkSize = that.options.chunkSize; // number of options in a chunk
+ chunkCount = Math.ceil(size / chunkSize) || 1; // number of chunks
+
+ for (var i = 0; i < chunkCount; i++) {
+ var endOfChunk = (i + 1) * chunkSize;
+
+ if (i === chunkCount - 1) {
+ endOfChunk = size;
+ }
+
+ chunks[i] = [
+ (i) * chunkSize + (!i ? 0 : 1),
+ endOfChunk
+ ];
+
+ if (!size) break;
+
+ if (currentChunk === undefined && scrollTop - 1 <= that.selectpicker.current.data[endOfChunk - 1].position - that.sizeInfo.menuInnerHeight) {
+ currentChunk = i;
+ }
+ }
+
+ if (currentChunk === undefined) currentChunk = 0;
+
+ prevPositions = [that.selectpicker.view.position0, that.selectpicker.view.position1];
+
+ // always display previous, current, and next chunks
+ firstChunk = Math.max(0, currentChunk - 1);
+ lastChunk = Math.min(chunkCount - 1, currentChunk + 1);
+
+ that.selectpicker.view.position0 = isVirtual === false ? 0 : (Math.max(0, chunks[firstChunk][0]) || 0);
+ that.selectpicker.view.position1 = isVirtual === false ? size : (Math.min(size, chunks[lastChunk][1]) || 0);
+
+ positionIsDifferent = prevPositions[0] !== that.selectpicker.view.position0 || prevPositions[1] !== that.selectpicker.view.position1;
+
+ if (that.activeElement !== undefined) {
+ if (init) {
+ if (that.activeElement !== that.selectedElement) {
+ that.defocusItem(that.activeElement);
+ }
+ that.activeElement = undefined;
+ }
+
+ if (that.activeElement !== that.selectedElement) {
+ that.defocusItem(that.selectedElement);
+ }
+ }
+
+ if (that.prevActiveElement !== undefined && that.prevActiveElement !== that.activeElement && that.prevActiveElement !== that.selectedElement) {
+ that.defocusItem(that.prevActiveElement);
+ }
+
+ if (init || positionIsDifferent || that.selectpicker.current.hasMore) {
+ previousElements = that.selectpicker.view.visibleElements ? that.selectpicker.view.visibleElements.slice() : [];
+
+ if (isVirtual === false) {
+ that.selectpicker.view.visibleElements = that.selectpicker.current.elements;
+ } else {
+ that.selectpicker.view.visibleElements = that.selectpicker.current.elements.slice(that.selectpicker.view.position0, that.selectpicker.view.position1);
+ }
+
+ that.setOptionStatus();
+
+ // if searching, check to make sure the list has actually been updated before updating DOM
+ // this prevents unnecessary repaints
+ if (isSearching || (isVirtual === false && init)) menuIsDifferent = !isEqual(previousElements, that.selectpicker.view.visibleElements);
+
+ // if virtual scroll is disabled and not searching,
+ // menu should never need to be updated more than once
+ if ((init || isVirtual === true) && menuIsDifferent) {
+ var menuInner = that.$menuInner[0],
+ menuFragment = document.createDocumentFragment(),
+ emptyMenu = menuInner.firstChild.cloneNode(false),
+ marginTop,
+ marginBottom,
+ elements = that.selectpicker.view.visibleElements,
+ toSanitize = [];
+
+ // replace the existing UL with an empty one - this is faster than $.empty()
+ menuInner.replaceChild(emptyMenu, menuInner.firstChild);
+
+ for (var i = 0, visibleElementsLen = elements.length; i < visibleElementsLen; i++) {
+ var element = elements[i],
+ elText,
+ elementData;
+
+ if (that.options.sanitize) {
+ elText = element.lastChild;
+
+ if (elText) {
+ elementData = that.selectpicker.current.data[i + that.selectpicker.view.position0];
+
+ if (elementData && elementData.content && !elementData.sanitized) {
+ toSanitize.push(elText);
+ elementData.sanitized = true;
+ }
+ }
+ }
+
+ menuFragment.appendChild(element);
+ }
+
+ if (that.options.sanitize && toSanitize.length) {
+ sanitizeHtml(toSanitize, that.options.whiteList, that.options.sanitizeFn);
+ }
+
+ if (isVirtual === true) {
+ marginTop = (that.selectpicker.view.position0 === 0 ? 0 : that.selectpicker.current.data[that.selectpicker.view.position0 - 1].position);
+ marginBottom = (that.selectpicker.view.position1 > size - 1 ? 0 : that.selectpicker.current.data[size - 1].position - that.selectpicker.current.data[that.selectpicker.view.position1 - 1].position);
+
+ menuInner.firstChild.style.marginTop = marginTop + 'px';
+ menuInner.firstChild.style.marginBottom = marginBottom + 'px';
+ } else {
+ menuInner.firstChild.style.marginTop = 0;
+ menuInner.firstChild.style.marginBottom = 0;
+ }
+
+ menuInner.firstChild.appendChild(menuFragment);
+
+ // if an option is encountered that is wider than the current menu width, update the menu width accordingly
+ // switch to ResizeObserver with increased browser support
+ if (isVirtual === true && that.sizeInfo.hasScrollBar) {
+ var menuInnerInnerWidth = menuInner.firstChild.offsetWidth;
+
+ if (init && menuInnerInnerWidth < that.sizeInfo.menuInnerInnerWidth && that.sizeInfo.totalMenuWidth > that.sizeInfo.selectWidth) {
+ menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px';
+ } else if (menuInnerInnerWidth > that.sizeInfo.menuInnerInnerWidth) {
+ // set to 0 to get actual width of menu
+ that.$menu[0].style.minWidth = 0;
+
+ var actualMenuWidth = menuInner.firstChild.offsetWidth;
+
+ if (actualMenuWidth > that.sizeInfo.menuInnerInnerWidth) {
+ that.sizeInfo.menuInnerInnerWidth = actualMenuWidth;
+ menuInner.firstChild.style.minWidth = that.sizeInfo.menuInnerInnerWidth + 'px';
+ }
+
+ // reset to default CSS styling
+ that.$menu[0].style.minWidth = '';
+ }
+ }
+ }
+
+ if ((!isSearching && that.options.source.data || isSearching && that.options.source.search) && that.selectpicker.current.hasMore && currentChunk === chunkCount - 1) {
+ // Don't load the next chunk until scrolling has started
+ // This prevents unnecessary requests while the user is typing if pageSize is <= chunkSize
+ if (scrollTop > 0) {
+ // Chunks use 0-based indexing, but pages use 1-based. Add 1 to convert and add 1 again to get next page
+ var page = Math.floor((currentChunk * that.options.chunkSize) / that.options.source.pageSize) + 2;
+
+ that.fetchData(function () {
+ that.render();
+ that.buildList(size, isSearching);
+ that.setPositionData();
+ scroll(scrollTop);
+ }, isSearching ? 'search' : 'data', page, isSearching ? that.selectpicker.search.previousValue : undefined);
+ }
+ }
+ }
+
+ that.prevActiveElement = that.activeElement;
+
+ if (!that.options.liveSearch) {
+ that.$menuInner.trigger('focus');
+ } else if (isSearching && init) {
+ var index = 0,
+ newActive;
+
+ if (!that.selectpicker.view.canHighlight[index]) {
+ index = 1 + that.selectpicker.view.canHighlight.slice(1).indexOf(true);
+ }
+
+ newActive = that.selectpicker.view.visibleElements[index];
+
+ that.defocusItem(that.selectpicker.view.currentActive);
+
+ that.activeElement = (that.selectpicker.current.data[index] || {}).element;
+
+ that.focusItem(newActive);
+ }
+ }
+
+ $(window)
+ .off('resize' + EVENT_KEY + '.' + this.selectId + '.createView')
+ .on('resize' + EVENT_KEY + '.' + this.selectId + '.createView', function () {
+ var isActive = that.$newElement.hasClass(classNames.SHOW);
+
+ if (isActive) scroll(that.$menuInner[0].scrollTop);
+ });
+ },
+
+ focusItem: function (li, liData, noStyle) {
+ if (li) {
+ liData = liData || this.selectpicker.current.data[this.selectpicker.current.elements.indexOf(this.activeElement)];
+ var a = li.firstChild;
+
+ if (a) {
+ a.setAttribute('aria-setsize', this.selectpicker.view.size);
+ a.setAttribute('aria-posinset', liData.posinset);
+
+ if (noStyle !== true) {
+ this.focusedParent.setAttribute('aria-activedescendant', a.id);
+ li.classList.add('active');
+ a.classList.add('active');
+ }
+ }
+ }
+ },
+
+ defocusItem: function (li) {
+ if (li) {
+ li.classList.remove('active');
+ if (li.firstChild) li.firstChild.classList.remove('active');
+ }
+ },
+
+ setPlaceholder: function () {
+ var that = this,
+ updateIndex = false;
+
+ if ((this.options.placeholder || this.options.allowClear) && !this.multiple) {
+ if (!this.selectpicker.view.titleOption) this.selectpicker.view.titleOption = document.createElement('option');
+
+ // this option doesn't create a new element, but does add a new option at the start,
+ // so startIndex should increase to prevent having to check every option for the bs-title-option class
+ updateIndex = true;
+
+ var element = this.$element[0],
+ selectTitleOption = false,
+ titleNotAppended = !this.selectpicker.view.titleOption.parentNode,
+ selectedIndex = element.selectedIndex,
+ selectedOption = element.options[selectedIndex],
+ firstSelectable = element.querySelector('select > *:not(:disabled)'),
+ firstSelectableIndex = firstSelectable ? firstSelectable.index : 0,
+ navigation = window.performance && window.performance.getEntriesByType('navigation'),
+ // Safari doesn't support getEntriesByType('navigation') - fall back to performance.navigation
+ isNotBackForward = (navigation && navigation.length) ? navigation[0].type !== 'back_forward' : window.performance.navigation.type !== 2;
+
+ if (titleNotAppended) {
+ // Use native JS to prepend option (faster)
+ this.selectpicker.view.titleOption.className = 'bs-title-option';
+ this.selectpicker.view.titleOption.value = '';
+
+ // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.
+ // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,
+ // if so, the select will have the data-selected attribute
+ selectTitleOption = !selectedOption || (selectedIndex === firstSelectableIndex && selectedOption.defaultSelected === false && this.$element.data('selected') === undefined);
+ }
+
+ if (titleNotAppended || this.selectpicker.view.titleOption.index !== 0) {
+ element.insertBefore(this.selectpicker.view.titleOption, element.firstChild);
+ }
+
+ // Set selected *after* appending to select,
+ // otherwise the option doesn't get selected in IE
+ // set using selectedIndex, as setting the selected attr to true here doesn't work in IE11
+ if (selectTitleOption && isNotBackForward) {
+ element.selectedIndex = 0;
+ } else if (document.readyState !== 'complete') {
+ // if navigation type is back_forward, there's a chance the select will have its value set by BFCache
+ // wait for that value to be set, then run render again
+ window.addEventListener('pageshow', function () {
+ if (that.selectpicker.view.displayedValue !== element.value) that.render();
+ });
+ }
+ }
+
+ return updateIndex;
+ },
+
+ fetchData: function (callback, type, page, searchValue) {
+ page = page || 1;
+ type = type || 'data';
+
+ var that = this,
+ data = this.options.source[type],
+ builtData;
+
+ if (data) {
+ this.options.virtualScroll = true;
+
+ if (typeof data === 'function') {
+ data.call(
+ this,
+ function (data, more, totalItems) {
+ var current = that.selectpicker[type === 'search' ? 'search' : 'main'];
+ current.hasMore = more;
+ current.totalItems = totalItems;
+ builtData = that.buildData(data, type);
+ callback.call(that, builtData);
+ that.$element.trigger('fetched' + EVENT_KEY);
+ },
+ page,
+ searchValue
+ );
+ } else if (Array.isArray(data)) {
+ builtData = that.buildData(data, type);
+ callback.call(that, builtData);
+ }
+ } else {
+ builtData = this.buildData(false, type);
+ callback.call(that, builtData);
+ }
+ },
+
+ buildData: function (data, type) {
+ var that = this;
+ var dataGetter = data === false ? getOptionData.fromOption : getOptionData.fromDataSource;
+
+ var optionSelector = ':not([hidden]):not([data-hidden="true"]):not([style*="display: none"])',
+ mainData = [],
+ startLen = this.selectpicker.main.data ? this.selectpicker.main.data.length : 0,
+ optID = 0,
+ startIndex = this.setPlaceholder() && !data ? 1 : 0; // append the titleOption if necessary and skip the first option in the loop
+
+ if (type === 'search') {
+ startLen = this.selectpicker.search.data.length;
+ }
+
+ if (this.options.hideDisabled) optionSelector += ':not(:disabled)';
+
+ var selectOptions = data ? data.filter(filterHidden, this) : this.$element[0].querySelectorAll('select > *' + optionSelector);
+
+ function addDivider (config) {
+ var previousData = mainData[mainData.length - 1];
+
+ // ensure optgroup doesn't create back-to-back dividers
+ if (
+ previousData &&
+ previousData.type === 'divider' &&
+ (previousData.optID || config.optID)
+ ) {
+ return;
+ }
+
+ config = config || {};
+ config.type = 'divider';
+
+ mainData.push(config);
+ }
+
+ function addOption (item, config) {
+ config = config || {};
+
+ config.divider = dataGetter(item, 'divider');
+
+ if (config.divider === true) {
+ addDivider({
+ optID: config.optID
+ });
+ } else {
+ var liIndex = mainData.length + startLen,
+ cssText = dataGetter(item, 'style'),
+ inlineStyle = cssText ? htmlEscape(cssText) : '',
+ optionClass = (item.className || '') + (config.optgroupClass || '');
+
+ if (config.optID) optionClass = 'opt ' + optionClass;
+
+ config.optionClass = optionClass.trim();
+ config.inlineStyle = inlineStyle;
+
+ config.text = dataGetter(item, 'text');
+ config.title = dataGetter(item, 'title');
+ config.content = dataGetter(item, 'content');
+ config.tokens = dataGetter(item, 'tokens');
+ config.subtext = dataGetter(item, 'subtext');
+ config.icon = dataGetter(item, 'icon');
+
+ config.display = config.content || config.text;
+ config.value = item.value === undefined ? item.text : item.value;
+ config.type = 'option';
+ config.index = liIndex;
+
+ config.option = !item.option ? item : item.option; // reference option element if it exists
+ config.option.liIndex = liIndex;
+ config.selected = !!item.selected;
+ config.disabled = config.disabled || !!item.disabled;
+
+ if (data !== false) {
+ if (that.selectpicker.optionValuesDataMap[config.value]) {
+ config = $.extend(that.selectpicker.optionValuesDataMap[config.value], config);
+ } else {
+ that.selectpicker.optionValuesDataMap[config.value] = config;
+ }
+ }
+
+ mainData.push(config);
+ }
+ }
+
+ function addOptgroup (index, selectOptions) {
+ var optgroup = selectOptions[index],
+ // skip placeholder option
+ previous = index - 1 < startIndex ? false : selectOptions[index - 1],
+ next = selectOptions[index + 1],
+ options = data ? optgroup.children.filter(filterHidden, this) : optgroup.querySelectorAll('option' + optionSelector);
+
+ if (!options.length) return;
+
+ var config = {
+ display: htmlEscape(dataGetter(item, 'label')),
+ subtext: dataGetter(optgroup, 'subtext'),
+ icon: dataGetter(optgroup, 'icon'),
+ type: 'optgroup-label',
+ optgroupClass: ' ' + (optgroup.className || ''),
+ optgroup: optgroup
+ },
+ headerIndex,
+ lastIndex;
+
+ optID++;
+
+ if (previous) {
+ addDivider({ optID: optID });
+ }
+
+ config.optID = optID;
+
+ mainData.push(config);
+
+ for (var j = 0, len = options.length; j < len; j++) {
+ var option = options[j];
+
+ if (j === 0) {
+ headerIndex = mainData.length - 1;
+ lastIndex = headerIndex + len;
+ }
+
+ addOption(option, {
+ headerIndex: headerIndex,
+ lastIndex: lastIndex,
+ optID: config.optID,
+ optgroupClass: config.optgroupClass,
+ disabled: optgroup.disabled
+ });
+ }
+
+ if (next) {
+ addDivider({ optID: optID });
+ }
+ }
+
+ for (var len = selectOptions.length, i = startIndex; i < len; i++) {
+ var item = selectOptions[i],
+ children = item.children;
+
+ if (children && children.length) {
+ addOptgroup.call(this, i, selectOptions);
+ } else {
+ addOption.call(this, item, {});
+ }
+ }
+
+ switch (type) {
+ case 'data': {
+ if (!this.selectpicker.main.data) {
+ this.selectpicker.main.data = [];
+ }
+ Array.prototype.push.apply(this.selectpicker.main.data, mainData);
+ this.selectpicker.current.data = this.selectpicker.main.data;
+ break;
+ }
+ case 'search': {
+ Array.prototype.push.apply(this.selectpicker.search.data, mainData);
+ break;
+ }
+ }
+
+ return mainData;
+ },
+
+ buildList: function (size, searching) {
+ var that = this,
+ selectData = searching ? this.selectpicker.search.data : this.selectpicker.main.data,
+ mainElements = [],
+ widestOptionLength = 0;
+
+ if ((that.options.showTick || that.multiple) && !elementTemplates.checkMark.parentNode) {
+ elementTemplates.checkMark.className = this.options.iconBase + ' ' + that.options.tickIcon + ' check-mark';
+ elementTemplates.a.appendChild(elementTemplates.checkMark);
+ }
+
+ function buildElement (mainElements, item) {
+ var liElement,
+ combinedLength = 0;
+
+ switch (item.type) {
+ case 'divider':
+ liElement = generateOption.li(
+ false,
+ classNames.DIVIDER,
+ (item.optID ? item.optID + 'div' : undefined)
+ );
+
+ break;
+
+ case 'option':
+ liElement = generateOption.li(
+ generateOption.a(
+ generateOption.text.call(that, item),
+ item.optionClass,
+ item.inlineStyle
+ ),
+ '',
+ item.optID
+ );
+
+ if (liElement.firstChild) {
+ liElement.firstChild.id = that.selectId + '-' + item.index;
+ }
+
+ break;
+
+ case 'optgroup-label':
+ liElement = generateOption.li(
+ generateOption.label.call(that, item),
+ 'dropdown-header' + item.optgroupClass,
+ item.optID
+ );
+
+ break;
+ }
+
+ if (!item.element) {
+ item.element = liElement;
+ } else {
+ item.element.innerHTML = liElement.innerHTML;
+ }
+ mainElements.push(item.element);
+
+ // count the number of characters in the option - not perfect, but should work in most cases
+ if (item.display) combinedLength += item.display.length;
+ if (item.subtext) combinedLength += item.subtext.length;
+ // if there is an icon, ensure this option's width is checked
+ if (item.icon) combinedLength += 1;
+
+ if (combinedLength > widestOptionLength) {
+ widestOptionLength = combinedLength;
+
+ // guess which option is the widest
+ // use this when calculating menu width
+ // not perfect, but it's fast, and the width will be updating accordingly when scrolling
+ that.selectpicker.view.widestOption = mainElements[mainElements.length - 1];
+ }
+ }
+
+ var startIndex = size || 0;
+
+ for (var len = selectData.length, i = startIndex; i < len; i++) {
+ var item = selectData[i];
+
+ buildElement(mainElements, item);
+ }
+
+ if (size) {
+ if (searching) {
+ Array.prototype.push.apply(this.selectpicker.search.elements, mainElements);
+ } else {
+ Array.prototype.push.apply(this.selectpicker.main.elements, mainElements);
+ this.selectpicker.current.elements = this.selectpicker.main.elements;
+ }
+ } else {
+ if (searching) {
+ this.selectpicker.search.elements = mainElements;
+ } else {
+ this.selectpicker.main.elements = this.selectpicker.current.elements = mainElements;
+ }
+ }
+ },
+
+ findLis: function () {
+ return this.$menuInner.find('.inner > li');
+ },
+
+ render: function (init) {
+ var that = this,
+ element = this.$element[0],
+ // ensure titleOption is appended and selected (if necessary) before getting selectedOptions
+ placeholderSelected = this.setPlaceholder() && element.selectedIndex === 0,
+ selectedOptions = getSelectedOptions.call(this),
+ selectedCount = selectedOptions.length,
+ selectedValues = getSelectValues.call(this, selectedOptions),
+ button = this.$button[0],
+ buttonInner = button.querySelector('.filter-option-inner-inner'),
+ multipleSeparator = document.createTextNode(this.options.multipleSeparator),
+ titleFragment = elementTemplates.fragment.cloneNode(false),
+ showCount,
+ countMax,
+ hasContent = false;
+
+ function createSelected (item) {
+ if (item.selected) {
+ that.createOption(item, true);
+ } else if (item.children && item.children.length) {
+ item.children.map(createSelected);
+ }
+ }
+
+ // create selected option elements to ensure select value is correct
+ if (this.options.source.data && init) {
+ selectedOptions.map(createSelected);
+ element.appendChild(this.selectpicker.main.optionQueue);
+
+ if (placeholderSelected) placeholderSelected = element.selectedIndex === 0;
+ }
+
+ button.classList.toggle('bs-placeholder', that.multiple ? !selectedCount : !selectedValues && selectedValues !== 0);
+
+ if (!that.multiple && selectedOptions.length === 1) {
+ that.selectpicker.view.displayedValue = selectedValues;
+ }
+
+ if (this.options.selectedTextFormat === 'static') {
+ titleFragment = generateOption.text.call(this, { text: this.options.placeholder }, true);
+ } else {
+ showCount = this.multiple && this.options.selectedTextFormat.indexOf('count') !== -1 && selectedCount > 0;
+
+ // determine if the number of selected options will be shown (showCount === true)
+ if (showCount) {
+ countMax = this.options.selectedTextFormat.split('>');
+ showCount = (countMax.length > 1 && selectedCount > countMax[1]) || (countMax.length === 1 && selectedCount >= 2);
+ }
+
+ // only loop through all selected options if the count won't be shown
+ if (showCount === false) {
+ if (!placeholderSelected) {
+ for (var selectedIndex = 0; selectedIndex < selectedCount; selectedIndex++) {
+ if (selectedIndex < 50) {
+ var option = selectedOptions[selectedIndex],
+ titleOptions = {};
+
+ if (option) {
+ if (this.multiple && selectedIndex > 0) {
+ titleFragment.appendChild(multipleSeparator.cloneNode(false));
+ }
+
+ if (option.title) {
+ titleOptions.text = option.title;
+ } else if (option.content && that.options.showContent) {
+ titleOptions.content = option.content.toString();
+ hasContent = true;
+ } else {
+ if (that.options.showIcon) {
+ titleOptions.icon = option.icon;
+ }
+ if (that.options.showSubtext && !that.multiple && option.subtext) titleOptions.subtext = ' ' + option.subtext;
+ titleOptions.text = option.text.trim();
+ }
+
+ titleFragment.appendChild(generateOption.text.call(this, titleOptions, true));
+ }
+ } else {
+ break;
+ }
+ }
+
+ // add ellipsis
+ if (selectedCount > 49) {
+ titleFragment.appendChild(document.createTextNode('...'));
+ }
+ }
+ } else {
+ var optionSelector = ':not([hidden]):not([data-hidden="true"]):not([data-divider="true"]):not([style*="display: none"])';
+ if (this.options.hideDisabled) optionSelector += ':not(:disabled)';
+
+ // If this is a multiselect, and selectedTextFormat is count, then show 1 of 2 selected, etc.
+ var totalCount = this.$element[0].querySelectorAll('select > option' + optionSelector + ', optgroup' + optionSelector + ' option' + optionSelector).length,
+ tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedCount, totalCount) : this.options.countSelectedText;
+
+ titleFragment = generateOption.text.call(this, {
+ text: tr8nText.replace('{0}', selectedCount.toString()).replace('{1}', totalCount.toString())
+ }, true);
+ }
+ }
+
+ // If the select doesn't have a title, then use the default, or if nothing is set at all, use noneSelectedText
+ if (!titleFragment.childNodes.length) {
+ titleFragment = generateOption.text.call(this, {
+ text: this.options.placeholder ? this.options.placeholder : this.options.noneSelectedText
+ }, true);
+ }
+
+ // if the select has a title, apply it to the button, and if not, apply titleFragment text
+ // strip all HTML tags and trim the result, then unescape any escaped tags
+ button.title = titleFragment.textContent.replace(/<[^>]*>?/g, '').trim();
+
+ if (this.options.sanitize && hasContent) {
+ sanitizeHtml([titleFragment], that.options.whiteList, that.options.sanitizeFn);
+ }
+
+ buttonInner.innerHTML = '';
+ buttonInner.appendChild(titleFragment);
+
+ if (version.major < 4 && this.$newElement[0].classList.contains('bs3-has-addon')) {
+ var filterExpand = button.querySelector('.filter-expand'),
+ clone = buttonInner.cloneNode(true);
+
+ clone.className = 'filter-expand';
+
+ if (filterExpand) {
+ button.replaceChild(clone, filterExpand);
+ } else {
+ button.appendChild(clone);
+ }
+ }
+
+ this.$element.trigger('rendered' + EVENT_KEY);
+ },
+
+ /**
+ * @param [style]
+ * @param [status]
+ */
+ setStyle: function (newStyle, status) {
+ var button = this.$button[0],
+ newElement = this.$newElement[0],
+ style = this.options.style.trim(),
+ buttonClass;
+
+ if (this.$element.attr('class')) {
+ this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, ''));
+ }
+
+ if (version.major < 4) {
+ newElement.classList.add('bs3');
+
+ if (newElement.parentNode.classList && newElement.parentNode.classList.contains('input-group') &&
+ (newElement.previousElementSibling || newElement.nextElementSibling) &&
+ (newElement.previousElementSibling || newElement.nextElementSibling).classList.contains('input-group-addon')
+ ) {
+ newElement.classList.add('bs3-has-addon');
+ }
+ }
+
+ if (newStyle) {
+ buttonClass = newStyle.trim();
+ } else {
+ buttonClass = style;
+ }
+
+ if (status == 'add') {
+ if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' '));
+ } else if (status == 'remove') {
+ if (buttonClass) button.classList.remove.apply(button.classList, buttonClass.split(' '));
+ } else {
+ if (style) button.classList.remove.apply(button.classList, style.split(' '));
+ if (buttonClass) button.classList.add.apply(button.classList, buttonClass.split(' '));
+ }
+ },
+
+ liHeight: function (refresh) {
+ if (!refresh && (this.options.size === false || Object.keys(this.sizeInfo).length)) return;
+
+ var newElement = elementTemplates.div.cloneNode(false),
+ menu = elementTemplates.div.cloneNode(false),
+ menuInner = elementTemplates.div.cloneNode(false),
+ menuInnerInner = document.createElement('ul'),
+ divider = elementTemplates.li.cloneNode(false),
+ dropdownHeader = elementTemplates.li.cloneNode(false),
+ li,
+ a = elementTemplates.a.cloneNode(false),
+ text = elementTemplates.span.cloneNode(false),
+ header = this.options.header && this.$menu.find('.' + classNames.POPOVERHEADER).length > 0 ? this.$menu.find('.' + classNames.POPOVERHEADER)[0].cloneNode(true) : null,
+ search = this.options.liveSearch ? elementTemplates.div.cloneNode(false) : null,
+ actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,
+ doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null,
+ firstOption = this.$element[0].options[0];
+
+ this.sizeInfo.selectWidth = this.$newElement[0].offsetWidth;
+
+ text.className = 'text';
+ a.className = 'dropdown-item ' + (firstOption ? firstOption.className : '');
+ newElement.className = this.$menu[0].parentNode.className + ' ' + classNames.SHOW;
+ newElement.style.width = 0; // ensure button width doesn't affect natural width of menu when calculating
+ if (this.options.width === 'auto') menu.style.minWidth = 0;
+ menu.className = classNames.MENU + ' ' + classNames.SHOW;
+ menuInner.className = 'inner ' + classNames.SHOW;
+ menuInnerInner.className = classNames.MENU + ' inner ' + (version.major >= '4' ? classNames.SHOW : '');
+ divider.className = classNames.DIVIDER;
+ dropdownHeader.className = 'dropdown-header';
+
+ text.appendChild(document.createTextNode('\u200b'));
+
+ if (this.selectpicker.current.data.length) {
+ for (var i = 0; i < this.selectpicker.current.data.length; i++) {
+ var data = this.selectpicker.current.data[i];
+ if (data.type === 'option' && $(data.element.firstChild).css('display') !== 'none') {
+ li = data.element;
+ break;
+ }
+ }
+ } else {
+ li = elementTemplates.li.cloneNode(false);
+ a.appendChild(text);
+ li.appendChild(a);
+ }
+
+ dropdownHeader.appendChild(text.cloneNode(true));
+
+ if (this.selectpicker.view.widestOption) {
+ menuInnerInner.appendChild(this.selectpicker.view.widestOption.cloneNode(true));
+ }
+
+ menuInnerInner.appendChild(li);
+ menuInnerInner.appendChild(divider);
+ menuInnerInner.appendChild(dropdownHeader);
+ if (header) menu.appendChild(header);
+ if (search) {
+ var input = document.createElement('input');
+ search.className = 'bs-searchbox';
+ input.className = 'form-control';
+ search.appendChild(input);
+ menu.appendChild(search);
+ }
+ if (actions) menu.appendChild(actions);
+ menuInner.appendChild(menuInnerInner);
+ menu.appendChild(menuInner);
+ if (doneButton) menu.appendChild(doneButton);
+ newElement.appendChild(menu);
+
+ document.body.appendChild(newElement);
+
+ var liHeight = li.offsetHeight,
+ dropdownHeaderHeight = dropdownHeader ? dropdownHeader.offsetHeight : 0,
+ headerHeight = header ? header.offsetHeight : 0,
+ searchHeight = search ? search.offsetHeight : 0,
+ actionsHeight = actions ? actions.offsetHeight : 0,
+ doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,
+ dividerHeight = $(divider).outerHeight(true),
+ menuStyle = window.getComputedStyle(menu),
+ menuWidth = menu.offsetWidth,
+ menuPadding = {
+ vert: toInteger(menuStyle.paddingTop) +
+ toInteger(menuStyle.paddingBottom) +
+ toInteger(menuStyle.borderTopWidth) +
+ toInteger(menuStyle.borderBottomWidth),
+ horiz: toInteger(menuStyle.paddingLeft) +
+ toInteger(menuStyle.paddingRight) +
+ toInteger(menuStyle.borderLeftWidth) +
+ toInteger(menuStyle.borderRightWidth)
+ },
+ menuExtras = {
+ vert: menuPadding.vert +
+ toInteger(menuStyle.marginTop) +
+ toInteger(menuStyle.marginBottom) + 2,
+ horiz: menuPadding.horiz +
+ toInteger(menuStyle.marginLeft) +
+ toInteger(menuStyle.marginRight) + 2
+ },
+ scrollBarWidth;
+
+ menuInner.style.overflowY = 'scroll';
+
+ scrollBarWidth = menu.offsetWidth - menuWidth;
+
+ document.body.removeChild(newElement);
+
+ this.sizeInfo.liHeight = liHeight;
+ this.sizeInfo.dropdownHeaderHeight = dropdownHeaderHeight;
+ this.sizeInfo.headerHeight = headerHeight;
+ this.sizeInfo.searchHeight = searchHeight;
+ this.sizeInfo.actionsHeight = actionsHeight;
+ this.sizeInfo.doneButtonHeight = doneButtonHeight;
+ this.sizeInfo.dividerHeight = dividerHeight;
+ this.sizeInfo.menuPadding = menuPadding;
+ this.sizeInfo.menuExtras = menuExtras;
+ this.sizeInfo.menuWidth = menuWidth;
+ this.sizeInfo.menuInnerInnerWidth = menuWidth - menuPadding.horiz;
+ this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth;
+ this.sizeInfo.scrollBarWidth = scrollBarWidth;
+ this.sizeInfo.selectHeight = this.$newElement[0].offsetHeight;
+
+ this.setPositionData();
+ },
+
+ getSelectPosition: function () {
+ var that = this,
+ $window = $(window),
+ pos = that.$newElement.offset(),
+ $container = $(that.options.container),
+ containerPos;
+
+ if (that.options.container && $container.length && !$container.is('body')) {
+ containerPos = $container.offset();
+ containerPos.top += parseInt($container.css('borderTopWidth'));
+ containerPos.left += parseInt($container.css('borderLeftWidth'));
+ } else {
+ containerPos = { top: 0, left: 0 };
+ }
+
+ var winPad = that.options.windowPadding;
+
+ this.sizeInfo.selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();
+ this.sizeInfo.selectOffsetBot = $window.height() - this.sizeInfo.selectOffsetTop - this.sizeInfo.selectHeight - containerPos.top - winPad[2];
+ this.sizeInfo.selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();
+ this.sizeInfo.selectOffsetRight = $window.width() - this.sizeInfo.selectOffsetLeft - this.sizeInfo.selectWidth - containerPos.left - winPad[1];
+ this.sizeInfo.selectOffsetTop -= winPad[0];
+ this.sizeInfo.selectOffsetLeft -= winPad[3];
+ },
+
+ setMenuSize: function (isAuto) {
+ this.getSelectPosition();
+
+ var selectWidth = this.sizeInfo.selectWidth,
+ liHeight = this.sizeInfo.liHeight,
+ headerHeight = this.sizeInfo.headerHeight,
+ searchHeight = this.sizeInfo.searchHeight,
+ actionsHeight = this.sizeInfo.actionsHeight,
+ doneButtonHeight = this.sizeInfo.doneButtonHeight,
+ divHeight = this.sizeInfo.dividerHeight,
+ menuPadding = this.sizeInfo.menuPadding,
+ menuInnerHeight,
+ menuHeight,
+ divLength = 0,
+ minHeight,
+ _minHeight,
+ maxHeight,
+ menuInnerMinHeight,
+ estimate,
+ isDropup;
+
+ if (this.options.dropupAuto) {
+ // Get the estimated height of the menu without scrollbars.
+ // This is useful for smaller menus, where there might be plenty of room
+ // below the button without setting dropup, but we can't know
+ // the exact height of the menu until createView is called later
+ estimate = liHeight * this.selectpicker.current.data.length + menuPadding.vert;
+
+ isDropup = this.sizeInfo.selectOffsetTop - this.sizeInfo.selectOffsetBot > this.sizeInfo.menuExtras.vert && estimate + this.sizeInfo.menuExtras.vert + 50 > this.sizeInfo.selectOffsetBot;
+
+ // ensure dropup doesn't change while searching (so menu doesn't bounce back and forth)
+ if (this.selectpicker.isSearching === true) {
+ isDropup = this.selectpicker.dropup;
+ }
+
+ this.$newElement.toggleClass(classNames.DROPUP, isDropup);
+ this.selectpicker.dropup = isDropup;
+ }
+
+ if (this.options.size === 'auto') {
+ _minHeight = this.selectpicker.current.data.length > 3 ? this.sizeInfo.liHeight * 3 + this.sizeInfo.menuExtras.vert - 2 : 0;
+ menuHeight = this.sizeInfo.selectOffsetBot - this.sizeInfo.menuExtras.vert;
+ minHeight = _minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight;
+ menuInnerMinHeight = Math.max(_minHeight - menuPadding.vert, 0);
+
+ if (this.$newElement.hasClass(classNames.DROPUP)) {
+ menuHeight = this.sizeInfo.selectOffsetTop - this.sizeInfo.menuExtras.vert;
+ }
+
+ maxHeight = menuHeight;
+ menuInnerHeight = menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert;
+ } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) {
+ for (var i = 0; i < this.options.size; i++) {
+ if (this.selectpicker.current.data[i].type === 'divider') divLength++;
+ }
+
+ menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;
+ menuInnerHeight = menuHeight - menuPadding.vert;
+ maxHeight = menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight;
+ minHeight = menuInnerMinHeight = '';
+ }
+
+ this.$menu.css({
+ 'max-height': maxHeight + 'px',
+ 'overflow': 'hidden',
+ 'min-height': minHeight + 'px'
+ });
+
+ this.$menuInner.css({
+ 'max-height': menuInnerHeight + 'px',
+ 'overflow': 'hidden auto',
+ 'min-height': menuInnerMinHeight + 'px'
+ });
+
+ // ensure menuInnerHeight is always a positive number to prevent issues calculating chunkSize in createView
+ this.sizeInfo.menuInnerHeight = Math.max(menuInnerHeight, 1);
+
+ if (this.selectpicker.current.data.length && this.selectpicker.current.data[this.selectpicker.current.data.length - 1].position > this.sizeInfo.menuInnerHeight) {
+ this.sizeInfo.hasScrollBar = true;
+ this.sizeInfo.totalMenuWidth = this.sizeInfo.menuWidth + this.sizeInfo.scrollBarWidth;
+ }
+
+ if (this.options.dropdownAlignRight === 'auto') {
+ this.$menu.toggleClass(classNames.MENURIGHT, this.sizeInfo.selectOffsetLeft > this.sizeInfo.selectOffsetRight && this.sizeInfo.selectOffsetRight < (this.sizeInfo.totalMenuWidth - selectWidth));
+ }
+
+ if (this.dropdown && this.dropdown._popper) this.dropdown._popper.update();
+ },
+
+ setSize: function (refresh) {
+ this.liHeight(refresh);
+
+ if (this.options.header) this.$menu.css('padding-top', 0);
+
+ if (this.options.size !== false) {
+ var that = this,
+ $window = $(window);
+
+ this.setMenuSize();
+
+ if (this.options.liveSearch) {
+ this.$searchbox
+ .off('input.setMenuSize propertychange.setMenuSize')
+ .on('input.setMenuSize propertychange.setMenuSize', function () {
+ return that.setMenuSize();
+ });
+ }
+
+ if (this.options.size === 'auto') {
+ $window
+ .off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize')
+ .on('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize', function () {
+ return that.setMenuSize();
+ });
+ } else if (this.options.size && this.options.size != 'auto' && this.selectpicker.current.elements.length > this.options.size) {
+ $window.off('resize' + EVENT_KEY + '.' + this.selectId + '.setMenuSize' + ' scroll' + EVENT_KEY + '.' + this.selectId + '.setMenuSize');
+ }
+ }
+
+ this.createView(false, true, refresh);
+ },
+
+ setWidth: function () {
+ var that = this;
+
+ if (this.options.width === 'auto') {
+ requestAnimationFrame(function () {
+ that.$menu.css('min-width', '0');
+
+ that.$element.on('loaded' + EVENT_KEY, function () {
+ that.liHeight();
+ that.setMenuSize();
+
+ // Get correct width if element is hidden
+ var $selectClone = that.$newElement.clone().appendTo('body'),
+ btnWidth = $selectClone.css('width', 'auto').children('button').outerWidth();
+
+ $selectClone.remove();
+
+ // Set width to whatever's larger, button title or longest option
+ that.sizeInfo.selectWidth = Math.max(that.sizeInfo.totalMenuWidth, btnWidth);
+ that.$newElement.css('width', that.sizeInfo.selectWidth + 'px');
+ });
+ });
+ } else if (this.options.width === 'fit') {
+ // Remove inline min-width so width can be changed from 'auto'
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', '').addClass('fit-width');
+ } else if (this.options.width) {
+ // Remove inline min-width so width can be changed from 'auto'
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', this.options.width);
+ } else {
+ // Remove inline min-width/width so width can be changed
+ this.$menu.css('min-width', '');
+ this.$newElement.css('width', '');
+ }
+ // Remove fit-width class if width is changed programmatically
+ if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {
+ this.$newElement[0].classList.remove('fit-width');
+ }
+ },
+
+ selectPosition: function () {
+ this.$bsContainer = $('');
+
+ var that = this,
+ $container = $(this.options.container),
+ pos,
+ containerPos,
+ actualHeight,
+ getPlacement = function ($element) {
+ var containerPosition = {},
+ // fall back to dropdown's default display setting if display is not manually set
+ display = that.options.display || (
+ // Bootstrap 3 doesn't have $.fn.dropdown.Constructor.Default
+ $.fn.dropdown.Constructor.Default ? $.fn.dropdown.Constructor.Default.display
+ : false
+ );
+
+ that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass(classNames.DROPUP, $element.hasClass(classNames.DROPUP));
+ pos = $element.offset();
+
+ if (!$container.is('body')) {
+ containerPos = $container.offset();
+ containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();
+ containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();
+ } else {
+ containerPos = { top: 0, left: 0 };
+ }
+
+ actualHeight = $element.hasClass(classNames.DROPUP) ? 0 : $element[0].offsetHeight;
+
+ // Bootstrap 4+ uses Popper for menu positioning
+ if (version.major < 4 || display === 'static') {
+ containerPosition.top = pos.top - containerPos.top + actualHeight;
+ containerPosition.left = pos.left - containerPos.left;
+ }
+
+ containerPosition.width = $element[0].offsetWidth;
+
+ that.$bsContainer.css(containerPosition);
+ };
+
+ this.$button.on('click.bs.dropdown.data-api', function () {
+ if (that.isDisabled()) {
+ return;
+ }
+
+ getPlacement(that.$newElement);
+
+ that.$bsContainer
+ .appendTo(that.options.container)
+ .toggleClass(classNames.SHOW, !that.$button.hasClass(classNames.SHOW))
+ .append(that.$menu);
+ });
+
+ $(window)
+ .off('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId)
+ .on('resize' + EVENT_KEY + '.' + this.selectId + ' scroll' + EVENT_KEY + '.' + this.selectId, function () {
+ var isActive = that.$newElement.hasClass(classNames.SHOW);
+
+ if (isActive) getPlacement(that.$newElement);
+ });
+
+ this.$element.on('hide' + EVENT_KEY, function () {
+ that.$menu.data('height', that.$menu.height());
+ that.$bsContainer.detach();
+ });
+ },
+
+ createOption: function (data, init) {
+ var optionData = !data.option ? data : data.option;
+
+ if (optionData && optionData.nodeType !== 1) {
+ var option = (init ? elementTemplates.selectedOption : elementTemplates.option).cloneNode(true);
+ if (optionData.value !== undefined) option.value = optionData.value;
+ option.textContent = optionData.text;
+
+ option.selected = true;
+
+ if (optionData.liIndex !== undefined) {
+ option.liIndex = optionData.liIndex;
+ } else if (!init) {
+ option.liIndex = data.index;
+ }
+
+ data.option = option;
+
+ this.selectpicker.main.optionQueue.appendChild(option);
+ }
+ },
+
+ setOptionStatus: function (selectedOnly) {
+ var that = this;
+
+ that.noScroll = false;
+
+ if (that.selectpicker.view.visibleElements && that.selectpicker.view.visibleElements.length) {
+ for (var i = 0; i < that.selectpicker.view.visibleElements.length; i++) {
+ var liData = that.selectpicker.current.data[i + that.selectpicker.view.position0],
+ option = liData.option;
+
+ if (option) {
+ if (selectedOnly !== true) {
+ that.setDisabled(liData);
+ }
+
+ that.setSelected(liData);
+ }
+ }
+
+ // append optionQueue (documentFragment with option elements for select options)
+ if (this.options.source.data) this.$element[0].appendChild(this.selectpicker.main.optionQueue);
+ }
+ },
+
+ /**
+ * @param {Object} liData - the option object that is being changed
+ * @param {boolean} selected - true if the option is being selected, false if being deselected
+ */
+ setSelected: function (liData, selected) {
+ selected = selected === undefined ? liData.selected : selected;
+
+ var li = liData.element,
+ activeElementIsSet = this.activeElement !== undefined,
+ thisIsActive = this.activeElement === li,
+ prevActive,
+ a,
+ // if current option is already active
+ // OR
+ // if the current option is being selected, it's NOT multiple, and
+ // activeElement is undefined:
+ // - when the menu is first being opened, OR
+ // - after a search has been performed, OR
+ // - when retainActive is false when selecting a new option (i.e. index of the newly selected option is not the same as the current activeElement)
+ keepActive = thisIsActive || (selected && !this.multiple && !activeElementIsSet);
+
+ if (!li) return;
+
+ if (selected !== undefined) {
+ liData.selected = selected;
+ if (liData.option) liData.option.selected = selected;
+ }
+
+ if (selected && this.options.source.data) {
+ this.createOption(liData, false);
+ }
+
+ a = li.firstChild;
+
+ if (selected) {
+ this.selectedElement = li;
+ }
+
+ li.classList.toggle('selected', selected);
+
+ if (keepActive) {
+ this.focusItem(li, liData);
+ this.selectpicker.view.currentActive = li;
+ this.activeElement = li;
+ } else {
+ this.defocusItem(li);
+ }
+
+ if (a) {
+ a.classList.toggle('selected', selected);
+
+ if (selected) {
+ a.setAttribute('aria-selected', true);
+ } else {
+ if (this.multiple) {
+ a.setAttribute('aria-selected', false);
+ } else {
+ a.removeAttribute('aria-selected');
+ }
+ }
+ }
+
+ if (!keepActive && !activeElementIsSet && selected && this.prevActiveElement !== undefined) {
+ prevActive = this.prevActiveElement;
+
+ this.defocusItem(prevActive);
+ }
+ },
+
+ /**
+ * @param {number} index - the index of the option that is being disabled
+ * @param {boolean} disabled - true if the option is being disabled, false if being enabled
+ */
+ setDisabled: function (liData) {
+ var disabled = liData.disabled,
+ li = liData.element,
+ a;
+
+ if (!li) return;
+
+ a = li.firstChild;
+
+ li.classList.toggle(classNames.DISABLED, disabled);
+
+ if (a) {
+ if (version.major >= '4') a.classList.toggle(classNames.DISABLED, disabled);
+
+ if (disabled) {
+ a.setAttribute('aria-disabled', disabled);
+ a.setAttribute('tabindex', -1);
+ } else {
+ a.removeAttribute('aria-disabled');
+ a.setAttribute('tabindex', 0);
+ }
+ }
+ },
+
+ isDisabled: function () {
+ return this.$element[0].disabled;
+ },
+
+ checkDisabled: function () {
+ if (this.isDisabled()) {
+ this.$newElement[0].classList.add(classNames.DISABLED);
+ this.$button.addClass(classNames.DISABLED).attr('aria-disabled', true);
+ } else {
+ if (this.$button[0].classList.contains(classNames.DISABLED)) {
+ this.$newElement[0].classList.remove(classNames.DISABLED);
+ this.$button.removeClass(classNames.DISABLED).attr('aria-disabled', false);
+ }
+ }
+ },
+
+ clickListener: function () {
+ var that = this,
+ $document = $(document);
+
+ $document.data('spaceSelect', false);
+
+ this.$button.on('keyup', function (e) {
+ if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {
+ e.preventDefault();
+ $document.data('spaceSelect', false);
+ }
+ });
+
+ this.$newElement.on('show.bs.dropdown', function () {
+ if (!that.dropdown && version.major === '4') {
+ that.dropdown = that.$button.data('bs.dropdown');
+ that.dropdown._menu = that.$menu[0];
+ }
+ });
+
+ function clearSelection (e) {
+ if (that.multiple) {
+ that.deselectAll();
+ } else {
+ var element = that.$element[0],
+ prevValue = element.value,
+ prevIndex = element.selectedIndex,
+ prevOption = element.options[prevIndex],
+ prevData = prevOption ? that.selectpicker.main.data[prevOption.liIndex] : false;
+
+ if (prevData) {
+ that.setSelected(prevData, false);
+ }
+
+ element.selectedIndex = 0;
+
+ changedArguments = [prevIndex, false, prevValue];
+ that.$element.triggerNative('change');
+ }
+
+ // remove selected styling if menu is open
+ if (that.$newElement.hasClass(classNames.SHOW)) {
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ }
+
+ that.createView(false);
+ }
+ }
+
+ this.$button.on('click.bs.dropdown.data-api', function (e) {
+ if (that.options.allowClear) {
+ var target = e.target,
+ clearButton = that.$clearButton[0];
+
+ // IE doesn't support event listeners on child elements of buttons
+ if (/MSIE|Trident/.test(window.navigator.userAgent)) {
+ target = document.elementFromPoint(e.clientX, e.clientY);
+ }
+
+ if (target === clearButton || target.parentElement === clearButton) {
+ e.stopImmediatePropagation();
+ clearSelection(e);
+ }
+ }
+
+ if (!that.$newElement.hasClass(classNames.SHOW)) {
+ that.setSize();
+ }
+ });
+
+ function setFocus () {
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ } else {
+ that.$menuInner.trigger('focus');
+ }
+ }
+
+ function checkPopperExists () {
+ if (that.dropdown && that.dropdown._popper && that.dropdown._popper.state) {
+ setFocus();
+ } else {
+ requestAnimationFrame(checkPopperExists);
+ }
+ }
+
+ this.$element.on('shown' + EVENT_KEY, function () {
+ if (that.$menuInner[0].scrollTop !== that.selectpicker.view.scrollTop) {
+ that.$menuInner[0].scrollTop = that.selectpicker.view.scrollTop;
+ }
+
+ if (version.major > 3) {
+ requestAnimationFrame(checkPopperExists);
+ } else {
+ setFocus();
+ }
+ });
+
+ // ensure posinset and setsize are correct before selecting an option via a click
+ this.$menuInner.on('mouseenter', 'li a', function (e) {
+ var hoverLi = this.parentElement,
+ position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0,
+ index = Array.prototype.indexOf.call(hoverLi.parentElement.children, hoverLi),
+ hoverData = that.selectpicker.current.data[index + position0];
+
+ that.focusItem(hoverLi, hoverData, true);
+ });
+
+ this.$menuInner.on('click', 'li a', function (e, retainActive) {
+ var $this = $(this),
+ element = that.$element[0],
+ position0 = that.isVirtual() ? that.selectpicker.view.position0 : 0,
+ clickedData = that.selectpicker.current.data[$this.parent().index() + position0],
+ clickedElement = clickedData.element,
+ prevValue = getSelectValues.call(that),
+ prevIndex = element.selectedIndex,
+ prevOption = element.options[prevIndex],
+ prevData = prevOption ? that.selectpicker.main.data[prevOption.liIndex] : false,
+ triggerChange = true;
+
+ // Don't close on multi choice menu
+ if (that.multiple && that.options.maxOptions !== 1) {
+ e.stopPropagation();
+ }
+
+ e.preventDefault();
+
+ // Don't run if the select is disabled
+ if (!that.isDisabled() && !$this.parent().hasClass(classNames.DISABLED)) {
+ var option = clickedData.option,
+ $option = $(option),
+ state = option.selected,
+ optgroupData = that.selectpicker.current.data.find(function (datum) {
+ return datum.optID === clickedData.optID && datum.type === 'optgroup-label';
+ }),
+ optgroup = optgroupData ? optgroupData.optgroup : undefined,
+ dataGetter = optgroup instanceof Element ? getOptionData.fromOption : getOptionData.fromDataSource,
+ optgroupOptions = optgroup && optgroup.children,
+ maxOptions = parseInt(that.options.maxOptions),
+ maxOptionsGrp = optgroup && parseInt(dataGetter(optgroup, 'maxOptions')) || false;
+
+ if (clickedElement === that.activeElement) retainActive = true;
+
+ if (!retainActive) {
+ that.prevActiveElement = that.activeElement;
+ that.activeElement = undefined;
+ }
+
+ if (!that.multiple || maxOptions === 1) { // Deselect previous option if not multi select
+ if (prevData) that.setSelected(prevData, false);
+ that.setSelected(clickedData, true);
+ } else { // Toggle the clicked option if multi select.
+ that.setSelected(clickedData, !state);
+ that.focusedParent.focus();
+
+ if (maxOptions !== false || maxOptionsGrp !== false) {
+ var maxReached = maxOptions < getSelectedOptions.call(that).length,
+ selectedGroupOptions = 0;
+
+ if (optgroup && optgroup.children) {
+ for (var i = 0; i < optgroup.children.length; i++) {
+ if (optgroup.children[i].selected) selectedGroupOptions++;
+ }
+ }
+
+ var maxReachedGrp = maxOptionsGrp < selectedGroupOptions;
+
+ if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {
+ if (maxOptions && maxOptions === 1) {
+ element.selectedIndex = -1;
+ that.setOptionStatus(true);
+ } else if (maxOptionsGrp && maxOptionsGrp === 1) {
+ for (var i = 0; i < optgroupOptions.length; i++) {
+ var _option = optgroupOptions[i];
+ that.setSelected(that.selectpicker.current.data[_option.liIndex], false);
+ }
+
+ that.setSelected(clickedData, true);
+ } else {
+ var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,
+ maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,
+ maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),
+ maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),
+ $notify = $('');
+ // If {var} is set in array, replace it
+ /** @deprecated */
+ if (maxOptionsArr[2]) {
+ maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);
+ maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);
+ }
+
+ that.$menu.append($notify);
+
+ if (maxOptions && maxReached) {
+ $notify.append($('' + maxTxt + '
'));
+ triggerChange = false;
+ that.$element.trigger('maxReached' + EVENT_KEY);
+ }
+
+ if (maxOptionsGrp && maxReachedGrp) {
+ $notify.append($('' + maxTxtGrp + '
'));
+ triggerChange = false;
+ that.$element.trigger('maxReachedGrp' + EVENT_KEY);
+ }
+
+ setTimeout(function () {
+ that.setSelected(clickedData, false);
+ }, 10);
+
+ $notify[0].classList.add('fadeOut');
+
+ setTimeout(function () {
+ $notify.remove();
+ }, 1050);
+ }
+ }
+ }
+ }
+
+ if (that.options.source.data) that.$element[0].appendChild(that.selectpicker.main.optionQueue);
+
+ if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {
+ that.$button.trigger('focus');
+ } else if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ }
+
+ // Trigger select 'change'
+ if (triggerChange) {
+ if (that.multiple || prevIndex !== element.selectedIndex) {
+ // $option.prop('selected') is current option state (selected/unselected). prevValue is the value of the select prior to being changed.
+ changedArguments = [option.index, $option.prop('selected'), prevValue];
+ that.$element
+ .triggerNative('change');
+ }
+ }
+ }
+ });
+
+ this.$menu.on('click', 'li.' + classNames.DISABLED + ' a, .' + classNames.POPOVERHEADER + ', .' + classNames.POPOVERHEADER + ' :not(.close)', function (e) {
+ if (e.currentTarget == this) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (that.options.liveSearch && !$(e.target).hasClass('close')) {
+ that.$searchbox.trigger('focus');
+ } else {
+ that.$button.trigger('focus');
+ }
+ }
+ });
+
+ this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ } else {
+ that.$button.trigger('focus');
+ }
+ });
+
+ this.$menu.on('click', '.' + classNames.POPOVERHEADER + ' .close', function () {
+ that.$button.trigger('click');
+ });
+
+ this.$searchbox.on('click', function (e) {
+ e.stopPropagation();
+ });
+
+ this.$menu.on('click', '.actions-btn', function (e) {
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ } else {
+ that.$button.trigger('focus');
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ if ($(this).hasClass('bs-select-all')) {
+ that.selectAll();
+ } else {
+ that.deselectAll();
+ }
+ });
+
+ this.$button
+ .on('focus' + EVENT_KEY, function (e) {
+ var tabindex = that.$element[0].getAttribute('tabindex');
+
+ // only change when button is actually focused
+ if (tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) {
+ // apply select element's tabindex to ensure correct order is followed when tabbing to the next element
+ this.setAttribute('tabindex', tabindex);
+ // set element's tabindex to -1 to allow for reverse tabbing
+ that.$element[0].setAttribute('tabindex', -1);
+ that.selectpicker.view.tabindex = tabindex;
+ }
+ })
+ .on('blur' + EVENT_KEY, function (e) {
+ // revert everything to original tabindex
+ if (that.selectpicker.view.tabindex !== undefined && e.originalEvent && e.originalEvent.isTrusted) {
+ that.$element[0].setAttribute('tabindex', that.selectpicker.view.tabindex);
+ this.setAttribute('tabindex', -1);
+ that.selectpicker.view.tabindex = undefined;
+ }
+ });
+
+ this.$element
+ .on('change' + EVENT_KEY, function () {
+ that.render();
+ that.$element.trigger('changed' + EVENT_KEY, changedArguments);
+ changedArguments = null;
+ })
+ .on('focus' + EVENT_KEY, function () {
+ if (!that.options.mobile) that.$button[0].focus();
+ });
+ },
+
+ liveSearchListener: function () {
+ var that = this;
+
+ this.$button.on('click.bs.dropdown.data-api', function () {
+ if (!!that.$searchbox.val()) {
+ that.$searchbox.val('');
+ that.selectpicker.search.previousValue = undefined;
+ }
+ });
+
+ this.$searchbox.on('click.bs.dropdown.data-api focus.bs.dropdown.data-api touchend.bs.dropdown.data-api', function (e) {
+ e.stopPropagation();
+ });
+
+ this.$searchbox.on('input propertychange', function () {
+ var searchValue = that.$searchbox[0].value;
+
+ that.selectpicker.search.elements = [];
+ that.selectpicker.search.data = [];
+
+ if (searchValue) {
+ that.selectpicker.search.previousValue = searchValue;
+
+ if (that.options.source.search) {
+ that.fetchData(function (builtData) {
+ that.render();
+ that.buildList(undefined, true);
+ that.noScroll = true;
+ that.$menuInner.scrollTop(0);
+ that.createView(true);
+ showNoResults.call(that, builtData, searchValue);
+ }, 'search', 0, searchValue);
+ } else {
+ var i,
+ searchMatch = [],
+ q = searchValue.toUpperCase(),
+ cache = {},
+ cacheArr = [],
+ searchStyle = that._searchStyle(),
+ normalizeSearch = that.options.liveSearchNormalize;
+
+ if (normalizeSearch) q = normalizeToBase(q);
+
+ for (var i = 0; i < that.selectpicker.main.data.length; i++) {
+ var li = that.selectpicker.main.data[i];
+
+ if (!cache[i]) {
+ cache[i] = stringSearch(li, q, searchStyle, normalizeSearch);
+ }
+
+ if (cache[i] && li.headerIndex !== undefined && cacheArr.indexOf(li.headerIndex) === -1) {
+ if (li.headerIndex > 0) {
+ cache[li.headerIndex - 1] = true;
+ cacheArr.push(li.headerIndex - 1);
+ }
+
+ cache[li.headerIndex] = true;
+ cacheArr.push(li.headerIndex);
+
+ cache[li.lastIndex + 1] = true;
+ }
+
+ if (cache[i] && li.type !== 'optgroup-label') cacheArr.push(i);
+ }
+
+ for (var i = 0, cacheLen = cacheArr.length; i < cacheLen; i++) {
+ var index = cacheArr[i],
+ prevIndex = cacheArr[i - 1],
+ li = that.selectpicker.main.data[index],
+ liPrev = that.selectpicker.main.data[prevIndex];
+
+ if (li.type !== 'divider' || (li.type === 'divider' && liPrev && liPrev.type !== 'divider' && cacheLen - 1 !== i)) {
+ that.selectpicker.search.data.push(li);
+ searchMatch.push(that.selectpicker.main.elements[index]);
+ }
+ }
+
+ that.activeElement = undefined;
+ that.noScroll = true;
+ that.$menuInner.scrollTop(0);
+ that.selectpicker.search.elements = searchMatch;
+ that.createView(true);
+ showNoResults.call(that, searchMatch, searchValue);
+ }
+ } else if (that.selectpicker.search.previousValue) { // for IE11 (#2402)
+ that.$menuInner.scrollTop(0);
+ that.createView(false);
+ }
+ });
+ },
+
+ _searchStyle: function () {
+ return this.options.liveSearchStyle || 'contains';
+ },
+
+ val: function (value) {
+ var element = this.$element[0];
+
+ if (typeof value !== 'undefined') {
+ var selectedOptions = getSelectedOptions.call(this),
+ prevValue = getSelectValues.call(this, selectedOptions);
+
+ changedArguments = [null, null, prevValue];
+
+ if (!Array.isArray(value)) value = [ value ];
+
+ value.map(String);
+
+ for (var i = 0; i < selectedOptions.length; i++) {
+ var item = selectedOptions[i];
+
+ if (item && value.indexOf(String(item.value)) === -1) {
+ this.setSelected(item, false);
+ }
+ }
+
+ // only update selected value if it matches an existing option
+ this.selectpicker.main.data.filter(function (item) {
+ if (value.indexOf(String(item.value)) !== -1) {
+ this.setSelected(item, true);
+ return true;
+ }
+
+ return false;
+ }, this);
+
+ if (this.options.source.data) element.appendChild(this.selectpicker.main.optionQueue);
+
+ this.$element.trigger('changed' + EVENT_KEY, changedArguments);
+
+ if (this.$newElement.hasClass(classNames.SHOW)) {
+ if (this.multiple) {
+ this.setOptionStatus(true);
+ } else {
+ var liSelectedIndex = (element.options[element.selectedIndex] || {}).liIndex;
+
+ if (typeof liSelectedIndex === 'number') {
+ this.setSelected(this.selectpicker.current.data[liSelectedIndex], true);
+ }
+ }
+ }
+
+ this.render();
+
+ changedArguments = null;
+
+ return this.$element;
+ } else {
+ return this.$element.val();
+ }
+ },
+
+ changeAll: function (status) {
+ if (!this.multiple) return;
+ if (typeof status === 'undefined') status = true;
+
+ var element = this.$element[0],
+ previousSelected = 0,
+ currentSelected = 0,
+ prevValue = getSelectValues.call(this);
+
+ element.classList.add('bs-select-hidden');
+
+ for (var i = 0, data = this.selectpicker.current.data, len = data.length; i < len; i++) {
+ var liData = data[i],
+ option = liData.option;
+
+ if (option && !liData.disabled && liData.type !== 'divider') {
+ if (liData.selected) previousSelected++;
+ option.selected = status;
+ liData.selected = status;
+ if (status === true) currentSelected++;
+ }
+ }
+
+ element.classList.remove('bs-select-hidden');
+
+ if (previousSelected === currentSelected) return;
+
+ this.setOptionStatus();
+
+ changedArguments = [null, null, prevValue];
+
+ this.$element
+ .triggerNative('change');
+ },
+
+ selectAll: function () {
+ return this.changeAll(true);
+ },
+
+ deselectAll: function () {
+ return this.changeAll(false);
+ },
+
+ toggle: function (e, state) {
+ var isActive,
+ triggerClick = state === undefined;
+
+ e = e || window.event;
+
+ if (e) e.stopPropagation();
+
+ if (triggerClick === false) {
+ isActive = this.$newElement[0].classList.contains(classNames.SHOW);
+ triggerClick = state === true && isActive === false || state === false && isActive === true;
+ }
+
+ if (triggerClick) this.$button.trigger('click.bs.dropdown.data-api');
+ },
+
+ open: function (e) {
+ this.toggle(e, true);
+ },
+
+ close: function (e) {
+ this.toggle(e, false);
+ },
+
+ keydown: function (e) {
+ var $this = $(this),
+ isToggle = $this.hasClass('dropdown-toggle'),
+ $parent = isToggle ? $this.closest('.dropdown') : $this.closest(Selector.MENU),
+ that = $parent.data('this'),
+ $items = that.findLis(),
+ index,
+ isActive,
+ liActive,
+ activeLi,
+ offset,
+ updateScroll = false,
+ downOnTab = e.which === keyCodes.TAB && !isToggle && !that.options.selectOnTab,
+ isArrowKey = REGEXP_ARROW.test(e.which) || downOnTab,
+ scrollTop = that.$menuInner[0].scrollTop,
+ isVirtual = that.isVirtual(),
+ position0 = isVirtual === true ? that.selectpicker.view.position0 : 0;
+
+ // do nothing if a function key is pressed
+ if (e.which >= 112 && e.which <= 123) return;
+
+ isActive = that.$menu.hasClass(classNames.SHOW);
+
+ if (
+ !isActive &&
+ (
+ isArrowKey ||
+ (e.which >= 48 && e.which <= 57) ||
+ (e.which >= 96 && e.which <= 105) ||
+ (e.which >= 65 && e.which <= 90)
+ )
+ ) {
+ that.$button.trigger('click.bs.dropdown.data-api');
+
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ return;
+ }
+ }
+
+ if (e.which === keyCodes.ESCAPE && isActive) {
+ e.preventDefault();
+ that.$button.trigger('click.bs.dropdown.data-api').trigger('focus');
+ }
+
+ if (isArrowKey) { // if up or down
+ if (!$items.length) return;
+
+ liActive = that.activeElement;
+ index = liActive ? Array.prototype.indexOf.call(liActive.parentElement.children, liActive) : -1;
+
+ if (index !== -1) {
+ that.defocusItem(liActive);
+ }
+
+ if (e.which === keyCodes.ARROW_UP) { // up
+ if (index !== -1) index--;
+ if (index + position0 < 0) index += $items.length;
+
+ if (!that.selectpicker.view.canHighlight[index + position0]) {
+ index = that.selectpicker.view.canHighlight.slice(0, index + position0).lastIndexOf(true) - position0;
+ if (index === -1) index = $items.length - 1;
+ }
+ } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down
+ index++;
+ if (index + position0 >= that.selectpicker.view.canHighlight.length) index = that.selectpicker.view.firstHighlightIndex;
+
+ if (!that.selectpicker.view.canHighlight[index + position0]) {
+ index = index + 1 + that.selectpicker.view.canHighlight.slice(index + position0 + 1).indexOf(true);
+ }
+ }
+
+ e.preventDefault();
+
+ var liActiveIndex = position0 + index;
+
+ if (e.which === keyCodes.ARROW_UP) { // up
+ // scroll to bottom and highlight last option
+ if (position0 === 0 && index === $items.length - 1) {
+ that.$menuInner[0].scrollTop = that.$menuInner[0].scrollHeight;
+
+ liActiveIndex = that.selectpicker.current.elements.length - 1;
+ } else {
+ activeLi = that.selectpicker.current.data[liActiveIndex];
+
+ // could be undefined if no results exist
+ if (activeLi) {
+ offset = activeLi.position - activeLi.height;
+
+ updateScroll = offset < scrollTop;
+ }
+ }
+ } else if (e.which === keyCodes.ARROW_DOWN || downOnTab) { // down
+ // scroll to top and highlight first option
+ if (index === that.selectpicker.view.firstHighlightIndex) {
+ that.$menuInner[0].scrollTop = 0;
+
+ liActiveIndex = that.selectpicker.view.firstHighlightIndex;
+ } else {
+ activeLi = that.selectpicker.current.data[liActiveIndex];
+
+ // could be undefined if no results exist
+ if (activeLi) {
+ offset = activeLi.position - that.sizeInfo.menuInnerHeight;
+
+ updateScroll = offset > scrollTop;
+ }
+ }
+ }
+
+ liActive = that.selectpicker.current.elements[liActiveIndex];
+
+ that.activeElement = (that.selectpicker.current.data[liActiveIndex] || {}).element;
+
+ that.focusItem(liActive);
+
+ that.selectpicker.view.currentActive = liActive;
+
+ if (updateScroll) that.$menuInner[0].scrollTop = offset;
+
+ if (that.options.liveSearch) {
+ that.$searchbox.trigger('focus');
+ } else {
+ $this.trigger('focus');
+ }
+ } else if (
+ (!$this.is('input') && !REGEXP_TAB_OR_ESCAPE.test(e.which)) ||
+ (e.which === keyCodes.SPACE && that.selectpicker.keydown.keyHistory)
+ ) {
+ var searchMatch,
+ matches = [],
+ keyHistory;
+
+ e.preventDefault();
+
+ that.selectpicker.keydown.keyHistory += keyCodeMap[e.which];
+
+ if (that.selectpicker.keydown.resetKeyHistory.cancel) clearTimeout(that.selectpicker.keydown.resetKeyHistory.cancel);
+ that.selectpicker.keydown.resetKeyHistory.cancel = that.selectpicker.keydown.resetKeyHistory.start();
+
+ keyHistory = that.selectpicker.keydown.keyHistory;
+
+ // if all letters are the same, set keyHistory to just the first character when searching
+ if (/^(.)\1+$/.test(keyHistory)) {
+ keyHistory = keyHistory.charAt(0);
+ }
+
+ // find matches
+ for (var i = 0; i < that.selectpicker.current.data.length; i++) {
+ var li = that.selectpicker.current.data[i],
+ hasMatch;
+
+ hasMatch = stringSearch(li, keyHistory, 'startsWith', true);
+
+ if (hasMatch && that.selectpicker.view.canHighlight[i]) {
+ matches.push(li.element);
+ }
+ }
+
+ if (matches.length) {
+ var matchIndex = 0;
+
+ $items.removeClass('active').find('a').removeClass('active');
+
+ // either only one key has been pressed or they are all the same key
+ if (keyHistory.length === 1) {
+ matchIndex = matches.indexOf(that.activeElement);
+
+ if (matchIndex === -1 || matchIndex === matches.length - 1) {
+ matchIndex = 0;
+ } else {
+ matchIndex++;
+ }
+ }
+
+ searchMatch = matches[matchIndex];
+
+ activeLi = that.selectpicker.main.data[searchMatch];
+
+ if (scrollTop - activeLi.position > 0) {
+ offset = activeLi.position - activeLi.height;
+ updateScroll = true;
+ } else {
+ offset = activeLi.position - that.sizeInfo.menuInnerHeight;
+ // if the option is already visible at the current scroll position, just keep it the same
+ updateScroll = activeLi.position > scrollTop + that.sizeInfo.menuInnerHeight;
+ }
+
+ liActive = that.selectpicker.main.elements[searchMatch];
+
+ that.activeElement = liActive;
+
+ that.focusItem(liActive);
+
+ if (liActive) liActive.firstChild.focus();
+
+ if (updateScroll) that.$menuInner[0].scrollTop = offset;
+
+ $this.trigger('focus');
+ }
+ }
+
+ // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu.
+ if (
+ isActive &&
+ (
+ (e.which === keyCodes.SPACE && !that.selectpicker.keydown.keyHistory) ||
+ e.which === keyCodes.ENTER ||
+ (e.which === keyCodes.TAB && that.options.selectOnTab)
+ )
+ ) {
+ if (e.which !== keyCodes.SPACE) e.preventDefault();
+
+ if (!that.options.liveSearch || e.which !== keyCodes.SPACE) {
+ that.$menuInner.find('.active a').trigger('click', true); // retain active class
+ $this.trigger('focus');
+
+ if (!that.options.liveSearch) {
+ // Prevent screen from scrolling if the user hits the spacebar
+ e.preventDefault();
+ // Fixes spacebar selection of dropdown items in FF & IE
+ $(document).data('spaceSelect', true);
+ }
+ }
+ }
+ },
+
+ mobile: function () {
+ // ensure mobile is set to true if mobile function is called after init
+ this.options.mobile = true;
+ this.$element[0].classList.add('mobile-device');
+ },
+
+ refresh: function () {
+ var that = this;
+ // update options if data attributes have been changed
+ var config = $.extend({}, this.options, getAttributesObject(this.$element), this.$element.data()); // in this order on refresh, as user may change attributes on select, and options object is not passed on refresh
+ this.options = config;
+
+ if (this.options.source.data) {
+ this.render();
+ this.buildList();
+ } else {
+ this.fetchData(function () {
+ that.render();
+ that.buildList();
+ });
+ }
+
+ this.checkDisabled();
+ this.setStyle();
+ this.setWidth();
+
+ this.setSize(true);
+
+ this.$element.trigger('refreshed' + EVENT_KEY);
+ },
+
+ hide: function () {
+ this.$newElement.hide();
+ },
+
+ show: function () {
+ this.$newElement.show();
+ },
+
+ remove: function () {
+ this.$newElement.remove();
+ this.$element.remove();
+ },
+
+ destroy: function () {
+ this.$newElement.before(this.$element).remove();
+
+ if (this.$bsContainer) {
+ this.$bsContainer.remove();
+ } else {
+ this.$menu.remove();
+ }
+
+ if (this.selectpicker.view.titleOption && this.selectpicker.view.titleOption.parentNode) {
+ this.selectpicker.view.titleOption.parentNode.removeChild(this.selectpicker.view.titleOption);
+ }
+
+ this.$element
+ .off(EVENT_KEY)
+ .removeData('selectpicker')
+ .removeClass('bs-select-hidden selectpicker mobile-device');
+
+ $(window).off(EVENT_KEY + '.' + this.selectId);
+ }
+ };
+
+ // SELECTPICKER PLUGIN DEFINITION
+ // ==============================
+ function Plugin (option) {
+ // get the args of the outer function..
+ var args = arguments;
+ // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them
+ // to get lost/corrupted in android 2.3 and IE9 #715 #775
+ var _option = option;
+
+ [].shift.apply(args);
+
+ // if the version was not set successfully
+ if (!version.success) {
+ // try to retreive it again
+ try {
+ version.full = (getVersion() || '').split(' ')[0].split('.');
+ } catch (err) {
+ // fall back to use BootstrapVersion if set
+ if (Selectpicker.BootstrapVersion) {
+ version.full = Selectpicker.BootstrapVersion.split(' ')[0].split('.');
+ } else {
+ version.full = [version.major, '0', '0'];
+
+ console.warn(
+ 'There was an issue retrieving Bootstrap\'s version. ' +
+ 'Ensure Bootstrap is being loaded before bootstrap-select and there is no namespace collision. ' +
+ 'If loading Bootstrap asynchronously, the version may need to be manually specified via $.fn.selectpicker.Constructor.BootstrapVersion.',
+ err
+ );
+ }
+ }
+
+ version.major = version.full[0];
+ version.success = true;
+ }
+
+ if (version.major >= '4') {
+ // some defaults need to be changed if using Bootstrap 4
+ // check to see if they have already been manually changed before forcing them to update
+ var toUpdate = [];
+
+ if (Selectpicker.DEFAULTS.style === classNames.BUTTONCLASS) toUpdate.push({ name: 'style', className: 'BUTTONCLASS' });
+ if (Selectpicker.DEFAULTS.iconBase === classNames.ICONBASE) toUpdate.push({ name: 'iconBase', className: 'ICONBASE' });
+ if (Selectpicker.DEFAULTS.tickIcon === classNames.TICKICON) toUpdate.push({ name: 'tickIcon', className: 'TICKICON' });
+
+ classNames.DIVIDER = 'dropdown-divider';
+ classNames.SHOW = 'show';
+ classNames.BUTTONCLASS = 'btn-light';
+ classNames.POPOVERHEADER = 'popover-header';
+ classNames.ICONBASE = '';
+ classNames.TICKICON = 'bs-ok-default';
+
+ for (var i = 0; i < toUpdate.length; i++) {
+ var option = toUpdate[i];
+ Selectpicker.DEFAULTS[option.name] = classNames[option.className];
+ }
+ }
+
+ if (version.major > '4') {
+ Selector.DATA_TOGGLE = 'data-bs-toggle="dropdown"';
+ }
+
+ var value;
+ var chain = this.each(function () {
+ var $this = $(this);
+ if ($this.is('select')) {
+ var data = $this.data('selectpicker'),
+ options = typeof _option == 'object' && _option;
+
+ // for backwards compatibility
+ // (using title as placeholder is deprecated - remove in v2.0.0)
+ if (options.title) options.placeholder = options.title;
+
+ if (!data) {
+ var dataAttributes = $this.data();
+
+ for (var dataAttr in dataAttributes) {
+ if (Object.prototype.hasOwnProperty.call(dataAttributes, dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
+ delete dataAttributes[dataAttr];
+ }
+ }
+
+ var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, getAttributesObject($this), dataAttributes, options); // this is correct order on initial render
+ config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), dataAttributes.template, options.template);
+ config.source = $.extend({}, Selectpicker.DEFAULTS.source, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.source : {}), options.source);
+ $this.data('selectpicker', (data = new Selectpicker(this, config)));
+ } else if (options) {
+ for (var i in options) {
+ if (Object.prototype.hasOwnProperty.call(options, i)) {
+ data.options[i] = options[i];
+ }
+ }
+ }
+
+ if (typeof _option == 'string') {
+ if (data[_option] instanceof Function) {
+ value = data[_option].apply(data, args);
+ } else {
+ value = data.options[_option];
+ }
+ }
+ }
+ });
+
+ if (typeof value !== 'undefined') {
+ // noinspection JSUnusedAssignment
+ return value;
+ } else {
+ return chain;
+ }
+ }
+
+ var old = $.fn.selectpicker;
+ $.fn.selectpicker = Plugin;
+ $.fn.selectpicker.Constructor = Selectpicker;
+
+ // SELECTPICKER NO CONFLICT
+ // ========================
+ $.fn.selectpicker.noConflict = function () {
+ $.fn.selectpicker = old;
+ return this;
+ };
+
+ // get Bootstrap's keydown event handler for either Bootstrap 4 or Bootstrap 3
+ function keydownHandler () {
+ if (version.major < 5) {
+ if ($.fn.dropdown) {
+ // wait to define until function is called in case Bootstrap isn't loaded yet
+ var bootstrapKeydown = $.fn.dropdown.Constructor._dataApiKeydownHandler || $.fn.dropdown.Constructor.prototype.keydown;
+ return bootstrapKeydown.apply(this, arguments);
+ }
+ } else {
+ return Dropdown.dataApiKeydownHandler;
+ }
+ }
+
+ $(document)
+ .off('keydown.bs.dropdown.data-api')
+ .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > [' + Selector.DATA_TOGGLE + ']', keydownHandler)
+ .on('keydown.bs.dropdown.data-api', ':not(.bootstrap-select) > .dropdown-menu', keydownHandler)
+ .on('keydown' + EVENT_KEY, '.bootstrap-select [' + Selector.DATA_TOGGLE + '], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input', Selectpicker.prototype.keydown)
+ .on('focusin.modal', '.bootstrap-select [' + Selector.DATA_TOGGLE + '], .bootstrap-select [role="listbox"], .bootstrap-select .bs-searchbox input', function (e) {
+ e.stopPropagation();
+ });
+
+ // SELECTPICKER DATA-API
+ // =====================
+ document.addEventListener('DOMContentLoaded', function () {
+ $('.selectpicker').each(function () {
+ var $selectpicker = $(this);
+ Plugin.call($selectpicker, $selectpicker.data());
+ });
+ });
+})(jQuery);
+
+
+}));
\ No newline at end of file
diff --git a/js/bootstrap-select.min.js b/js/bootstrap-select.min.js
new file mode 100644
index 0000000..633872a
--- /dev/null
+++ b/js/bootstrap-select.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap-select v1.14.0-beta3 (https://developer.snapappointments.com/bootstrap-select)
+ *
+ * Copyright 2012-2022 SnapAppointments, LLC
+ * Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
+ */
+!function(e,t){void 0===e&&void 0!==window&&(e=window),"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(e.jQuery)}(this,function(e){!function($){"use strict";var M=["sanitize","whiteList","sanitizeFn"],W=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],P={"*":["class","dir","id","lang","role","tabindex","style",/^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:[]},B=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,R=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i,U=["title","placeholder"];function S(e,t,i){if(i&&"function"==typeof i)return i(e);for(var s=Object.keys(t),n=0,o=e.length;n]+>/g,"")),a=(a=s?u(a):a).toUpperCase(),o="function"==typeof i?i(a,t):"contains"===i?0<=a.indexOf(t):a.startsWith(t)))break}return o}function v(e){return parseInt(e,10)||0}$.fn.triggerNative=function(e){var t,i=this[0];i.dispatchEvent&&(V?t=new Event(e,{bubbles:!0}):(t=document.createEvent("Event")).initEvent(e,!0,!1),i.dispatchEvent(t))};var j={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"},_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,F=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\u1ab0-\\u1aff\\u1dc0-\\u1dff]","g");function G(e){return j[e]}function u(e){return(e=e.toString())&&e.replace(_,G).replace(F,"")}f={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},s="(?:"+Object.keys(f).join("|")+")",q=RegExp(s),K=RegExp(s,"g");var f,q,K,k=function(e){return q.test(e=null==e?"":""+e)?e.replace(K,Q):e};function Q(e){return f[e]}var Y={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"},Z=27,J=13,w=32,I=9,C=38,O=40,m=window.Dropdown||bootstrap.Dropdown;function X(){var t;try{t=$.fn.dropdown.Constructor.VERSION}catch(e){t=m.VERSION}return t}var g={success:!1,major:"3"};try{g.full=(X()||"").split(" ")[0].split("."),g.major=g.full[0],g.success=!0}catch(e){}var ee=0,A=".bs.select",T={DISABLED:"disabled",DIVIDER:"divider",SHOW:"open",DROPUP:"dropup",MENU:"dropdown-menu",MENURIGHT:"dropdown-menu-right",MENULEFT:"dropdown-menu-left",BUTTONCLASS:"btn-default",POPOVERHEADER:"popover-title",ICONBASE:"glyphicon",TICKICON:"glyphicon-ok"},z={MENU:"."+T.MENU,DATA_TOGGLE:'data-toggle="dropdown"'},D={div:document.createElement("div"),span:document.createElement("span"),i:document.createElement("i"),subtext:document.createElement("small"),a:document.createElement("a"),li:document.createElement("li"),whitespace:document.createTextNode("\xa0"),fragment:document.createDocumentFragment(),option:document.createElement("option")},te=(D.selectedOption=D.option.cloneNode(!1),D.selectedOption.setAttribute("selected",!0),D.noResults=D.li.cloneNode(!1),D.noResults.className="no-results",D.a.setAttribute("role","option"),D.a.className="dropdown-item",D.subtext.className="text-muted",D.text=D.span.cloneNode(!1),D.text.className="text",D.checkMark=D.span.cloneNode(!1),new RegExp(C+"|"+O)),ie=new RegExp("^"+I+"$|"+Z),L={li:function(e,t,i){var s=D.li.cloneNode(!1);return e&&(1===e.nodeType||11===e.nodeType?s.appendChild(e):s.innerHTML=e),void 0!==t&&""!==t&&(s.className=t),null!=i&&s.classList.add("optgroup-"+i),s},a:function(e,t,i){var s=D.a.cloneNode(!0);return e&&(11===e.nodeType?s.appendChild(e):s.insertAdjacentHTML("beforeend",e)),void 0!==t&&""!==t&&s.classList.add.apply(s.classList,t.split(/\s+/)),i&&s.setAttribute("style",i),s},text:function(e,t){var i,s,n=D.text.cloneNode(!1);if(e.content?n.innerHTML=e.content:(n.textContent=e.text,e.icon&&(i=D.whitespace.cloneNode(!1),(s=(!0===t?D.i:D.span).cloneNode(!1)).className=this.options.iconBase+" "+e.icon,D.fragment.appendChild(s),D.fragment.appendChild(i)),e.subtext&&((s=D.subtext.cloneNode(!1)).textContent=e.subtext,n.appendChild(s))),!0===t)for(;0'},maxOptions:!1,mobile:!1,selectOnTab:!0,dropdownAlignRight:!1,windowPadding:0,virtualScroll:600,display:!1,sanitize:!0,sanitizeFn:null,whiteList:P},H.prototype={constructor:H,init:function(){var i=this,e=this.$element.attr("id"),t=this.$element[0],s=t.form;ee++,this.selectId="bs-select-"+ee,t.classList.add("bs-select-hidden"),this.multiple=this.$element.prop("multiple"),this.autofocus=this.$element.prop("autofocus"),t.classList.contains("show-tick")&&(this.options.showTick=!0),this.$newElement=this.createDropdown(),this.$element.after(this.$newElement).prependTo(this.$newElement),s&&null===t.form&&(s.id||(s.id="form-"+this.selectId),t.setAttribute("form",s.id)),this.$button=this.$newElement.children("button"),this.options.allowClear&&(this.$clearButton=this.$button.children(".bs-select-clear-selected")),this.$menu=this.$newElement.children(z.MENU),this.$menuInner=this.$menu.children(".inner"),this.$searchbox=this.$menu.find("input"),t.classList.remove("bs-select-hidden"),this.fetchData(function(){i.render(!0),i.buildList(),requestAnimationFrame(function(){i.$element.trigger("loaded"+A)})}),!0===this.options.dropdownAlignRight&&this.$menu[0].classList.add(T.MENURIGHT),void 0!==e&&this.$button.attr("data-id",e),this.checkDisabled(),this.clickListener(),4