diff --git a/.gitignore b/.gitignore
index f7154ae4..6d797f07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# Exclude environment variables
.env
+.env.**
# Exclude .cmw-version, it's a generated file.
.cmw-version
diff --git a/.htaccess b/.htaccess
index 3c699150..93022ed8 100644
--- a/.htaccess
+++ b/.htaccess
@@ -41,6 +41,13 @@
Require all denied
+# Deny access to all .json files
+
+ Order allow,deny
+ Deny from all
+ satisfy all
+
+
# Deny access to cmw file
Require all denied
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 00000000..5660f81a
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+registry=https://registry.npmjs.org/
\ No newline at end of file
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Css/fa-all.min.css b/Admin/Resources/Vendors/Fontawesome-free/Css/fa-all.min.css
index aaa03a5a..ebfdf6c5 100644
--- a/Admin/Resources/Vendors/Fontawesome-free/Css/fa-all.min.css
+++ b/Admin/Resources/Vendors/Fontawesome-free/Css/fa-all.min.css
@@ -1,6 +1,9 @@
/*!
- * Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com
+ * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- * Copyright 2022 Fonticons, Inc.
+ * Copyright 2024 Fonticons, Inc.
*/
-.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-v4compatibility.woff2) format("woff2"),url(../Webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
+.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}
+
+.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"}
+.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-solid-900.woff2) format("woff2"),url(../Webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-brands-400.woff2) format("woff2"),url(../Webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-regular-400.woff2) format("woff2"),url(../Webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../Webfonts/fa-v4compatibility.woff2) format("woff2"),url(../Webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
\ No newline at end of file
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.ttf b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.ttf
index cf6a98f4..0f82a836 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.ttf and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.ttf differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.woff2 b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.woff2
index c740267c..3c5cf97e 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.woff2 and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-brands-400.woff2 differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.ttf b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.ttf
index 9ef8a372..9ee1919d 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.ttf and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.ttf differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.woff2 b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.woff2
index a865b2f5..57d91796 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.woff2 and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-regular-400.woff2 differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.ttf b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.ttf
index 2b964362..1c10972e 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.ttf and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.ttf differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.woff2 b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.woff2
index 021d33fb..16721020 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.woff2 and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-solid-900.woff2 differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.ttf b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.ttf
index f07e670d..3bcb67ff 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.ttf and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.ttf differ
diff --git a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.woff2 b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.woff2
index 6f96a112..fbafb222 100644
Binary files a/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.woff2 and b/Admin/Resources/Vendors/Fontawesome-free/Webfonts/fa-v4compatibility.woff2 differ
diff --git a/Admin/Resources/Vendors/Fontawesome-picker/main.js b/Admin/Resources/Vendors/Fontawesome-picker/main.js
index 61359af1..a436c40c 100644
--- a/Admin/Resources/Vendors/Fontawesome-picker/main.js
+++ b/Admin/Resources/Vendors/Fontawesome-picker/main.js
@@ -1,588 +1,318 @@
const icons = [
- 'fa-solid fa-address-book',
- 'fa-solid fa-address-card',
- 'fa-solid fa-align-center',
- 'fa-solid fa-align-justify',
- 'fa-solid fa-align-left',
- 'fa-solid fa-align-right',
- 'fa-solid fa-anchor',
- 'fa-solid fa-angle-double-down',
- 'fa-solid fa-angle-double-left',
- 'fa-solid fa-angle-double-right',
- 'fa-solid fa-angle-double-up',
- 'fa-solid fa-angle-down',
- 'fa-solid fa-angle-left',
- 'fa-solid fa-angle-right',
- 'fa-solid fa-angle-up',
- 'fa-solid fa-archive',
- 'fa-solid fa-arrow-circle-down',
- 'fa-solid fa-arrow-circle-left',
- 'fa-solid fa-arrow-circle-right',
- 'fa-solid fa-arrow-circle-up',
- 'fa-solid fa-arrow-down',
- 'fa-solid fa-arrow-left',
- 'fa-solid fa-arrow-right',
- 'fa-solid fa-arrow-up',
- 'fa-solid fa-arrows-alt',
- 'fa-solid fa-arrows-alt-h',
- 'fa-solid fa-arrows-alt-v',
- 'fa-solid fa-assistive-listening-systems',
- 'fa-solid fa-asterisk',
- 'fa-solid fa-at',
- 'fa-solid fa-backward',
- 'fa-solid fa-balance-scale',
- 'fa-solid fa-ban',
- 'fa-solid fa-barcode',
- 'fa-solid fa-bars',
- 'fa-solid fa-bath',
- 'fa-solid fa-battery-empty',
- 'fa-solid fa-battery-full',
- 'fa-solid fa-battery-half',
- 'fa-solid fa-battery-quarter',
- 'fa-solid fa-battery-three-quarters',
- 'fa-solid fa-bed',
- 'fa-solid fa-beer',
- 'fa-solid fa-bell',
- 'fa-solid fa-bell-slash',
- 'fa-solid fa-bicycle',
- 'fa-solid fa-binoculars',
- 'fa-solid fa-birthday-cake',
- 'fa-solid fa-blind',
- 'fa-solid fa-bold',
- 'fa-solid fa-bolt',
- 'fa-solid fa-bomb',
- 'fa-solid fa-book',
- 'fa-solid fa-bookmark',
- 'fa-solid fa-braille',
- 'fa-solid fa-briefcase',
- 'fa-solid fa-bug',
- 'fa-solid fa-building',
- 'fa-solid fa-bullhorn',
- 'fa-solid fa-bullseye',
- 'fa-solid fa-bus',
- 'fa-solid fa-calculator',
- 'fa-solid fa-calendar',
- 'fa-solid fa-calendar-alt',
- 'fa-solid fa-calendar-check',
- 'fa-solid fa-calendar-minus',
- 'fa-solid fa-calendar-plus',
- 'fa-solid fa-calendar-times',
- 'fa-solid fa-camera',
- 'fa-solid fa-camera-retro',
- 'fa-solid fa-car',
- 'fa-solid fa-caret-down',
- 'fa-solid fa-caret-left',
- 'fa-solid fa-caret-right',
- 'fa-solid fa-caret-square-down',
- 'fa-solid fa-caret-square-left',
- 'fa-solid fa-caret-square-right',
- 'fa-solid fa-caret-square-up',
- 'fa-solid fa-caret-up',
- 'fa-solid fa-cart-arrow-down',
- 'fa-solid fa-cart-plus',
- 'fa-solid fa-chalkboard',
- 'fa-solid fa-chalkboard-teacher',
- 'fa-solid fa-chart-area',
- 'fa-solid fa-chart-bar',
- 'fa-solid fa-chart-line',
- 'fa-solid fa-chart-pie',
- 'fa-solid fa-check',
- 'fa-solid fa-check-circle',
- 'fa-solid fa-check-square',
- 'fa-solid fa-chess',
- 'fa-solid fa-chess-bishop',
- 'fa-solid fa-chess-board',
- 'fa-solid fa-chess-king',
- 'fa-solid fa-chess-knight',
- 'fa-solid fa-chess-pawn',
- 'fa-solid fa-chess-queen',
- 'fa-solid fa-chess-rook',
- 'fa-solid fa-chevron-circle-down',
- 'fa-solid fa-chevron-circle-left',
- 'fa-solid fa-chevron-circle-right',
- 'fa-solid fa-chevron-circle-up',
- 'fa-solid fa-chevron-down',
- 'fa-solid fa-chevron-left',
- 'fa-solid fa-chevron-right',
- 'fa-solid fa-chevron-up',
- 'fa-solid fa-child',
- 'fa-solid fa-church',
- 'fa-solid fa-circle',
- 'fa-solid fa-circle-notch',
- 'fa-solid fa-clipboard',
- 'fa-solid fa-clipboard-check',
- 'fa-solid fa-clipboard-list',
- 'fa-solid fa-clock',
- 'fa-solid fa-clone',
- 'fa-solid fa-closed-captioning',
- 'fa-solid fa-cloud',
- 'fa-solid fa-cloud-download-alt',
- 'fa-solid fa-cloud-upload-alt',
- 'fa-solid fa-code',
- 'fa-solid fa-code-branch',
- 'fa-solid fa-coffee',
- 'fa-solid fa-cog',
- 'fa-solid fa-cogs',
- 'fa-solid fa-columns',
- 'fa-solid fa-comment',
- 'fa-solid fa-comment-alt',
- 'fa-solid fa-comment-dots',
- 'fa-solid fa-comment-slash',
- 'fa-solid fa-comments',
- 'fa-solid fa-compass',
- 'fa-solid fa-compress',
- 'fa-solid fa-copy',
- 'fa-solid fa-copyright',
- 'fa-solid fa-couch',
- 'fa-solid fa-credit-card',
- 'fa-solid fa-crop',
- 'fa-solid fa-crosshairs',
- 'fa-solid fa-cube',
- 'fa-solid fa-cubes',
- 'fa-solid fa-cut',
- 'fa-solid fa-database',
- 'fa-solid fa-deaf',
- 'fa-solid fa-desktop',
- 'fa-solid fa-diagnoses',
- 'fa-solid fa-dna',
- 'fa-solid fa-dollar-sign',
- 'fa-solid fa-dolly',
- 'fa-solid fa-dolly-flatbed',
- 'fa-solid fa-donate',
- 'fa-solid fa-dot-circle',
- 'fa-solid fa-dove',
- 'fa-solid fa-download',
- 'fa-solid fa-dumbbell',
- 'fa-solid fa-edit',
- 'fa-solid fa-eject',
- 'fa-solid fa-ellipsis-h',
- 'fa-solid fa-ellipsis-v',
- 'fa-solid fa-envelope',
- 'fa-solid fa-envelope-open',
- 'fa-solid fa-envelope-square',
- 'fa-solid fa-eraser',
- 'fa-solid fa-euro-sign',
- 'fa-solid fa-exchange-alt',
- 'fa-solid fa-exclamation',
- 'fa-solid fa-exclamation-circle',
- 'fa-solid fa-exclamation-triangle',
- 'fa-solid fa-expand',
- 'fa-solid fa-expand-arrows-alt',
- 'fa-solid fa-external-link-alt',
- 'fa-solid fa-external-link-square-alt',
- 'fa-solid fa-eye',
- 'fa-solid fa-eye-dropper',
- 'fa-solid fa-eye-slash',
- 'fa-solid fa-fast-backward',
- 'fa-solid fa-fast-forward',
- 'fa-solid fa-fax',
- 'fa-solid fa-female',
- 'fa-solid fa-fighter-jet',
- 'fa-solid fa-file',
- 'fa-solid fa-file-alt',
- 'fa-solid fa-file-archive',
- 'fa-solid fa-file-audio',
- 'fa-solid fa-file-code',
- 'fa-solid fa-file-excel',
- 'fa-solid fa-file-image',
- 'fa-solid fa-file-medical',
- 'fa-solid fa-file-medical-alt',
- 'fa-solid fa-file-pdf',
- 'fa-solid fa-file-powerpoint',
- 'fa-solid fa-file-video',
- 'fa-solid fa-file-word',
- 'fa-solid fa-film',
- 'fa-solid fa-filter',
- 'fa-solid fa-fire',
- 'fa-solid fa-fire-extinguisher',
- 'fa-solid fa-first-aid',
- 'fa-solid fa-flag',
- 'fa-solid fa-flag-checkered',
- 'fa-solid fa-flask',
- 'fa-solid fa-folder',
- 'fa-solid fa-folder-open',
- 'fa-solid fa-font',
- 'fa-solid fa-football-ball',
- 'fa-solid fa-forward',
- 'fa-solid fa-frog',
- 'fa-solid fa-frown',
- 'fa-solid fa-futbol',
- 'fa-solid fa-gamepad',
- 'fa-solid fa-gavel',
- 'fa-solid fa-gem',
- 'fa-solid fa-genderless',
- 'fa-solid fa-gift',
- 'fa-solid fa-glass-martini',
- 'fa-solid fa-globe',
- 'fa-solid fa-golf-ball',
- 'fa-solid fa-graduation-cap',
- 'fa-solid fa-h-square',
- 'fa-solid fa-hashtag',
- 'fa-solid fa-hdd',
- 'fa-solid fa-heading',
- 'fa-solid fa-headphones',
- 'fa-solid fa-heart',
- 'fa-solid fa-heartbeat',
- 'fa-solid fa-history',
- 'fa-solid fa-hockey-puck',
- 'fa-solid fa-home',
- 'fa-solid fa-hospital',
- 'fa-solid fa-hospital-alt',
- 'fa-solid fa-hospital-symbol',
- 'fa-solid fa-hourglass',
- 'fa-solid fa-hourglass-end',
- 'fa-solid fa-hourglass-half',
- 'fa-solid fa-hourglass-start',
- 'fa-solid fa-i-cursor',
- 'fa-solid fa-id-badge',
- 'fa-solid fa-id-card',
- 'fa-solid fa-id-card-alt',
- 'fa-solid fa-image',
- 'fa-solid fa-images',
- 'fa-solid fa-inbox',
- 'fa-solid fa-indent',
- 'fa-solid fa-industry',
- 'fa-solid fa-infinity',
- 'fa-solid fa-info',
- 'fa-solid fa-info-circle',
- 'fa-solid fa-italic',
- 'fa-solid fa-key',
- 'fa-solid fa-keyboard',
- 'fa-solid fa-language',
- 'fa-solid fa-laptop',
- 'fa-solid fa-leaf',
- 'fa-solid fa-lemon',
- 'fa-solid fa-level-down-alt',
- 'fa-solid fa-level-up-alt',
- 'fa-solid fa-life-ring',
- 'fa-solid fa-lightbulb',
- 'fa-solid fa-link',
- 'fa-solid fa-lira-sign',
- 'fa-solid fa-list',
- 'fa-solid fa-list-alt',
- 'fa-solid fa-list-ol',
- 'fa-solid fa-list-ul',
- 'fa-solid fa-location-arrow',
- 'fa-solid fa-lock',
- 'fa-solid fa-lock-open',
- 'fa-solid fa-long-arrow-alt-down',
- 'fa-solid fa-long-arrow-alt-left',
- 'fa-solid fa-long-arrow-alt-right',
- 'fa-solid fa-long-arrow-alt-up',
- 'fa-solid fa-low-vision',
- 'fa-solid fa-magic',
- 'fa-solid fa-magnet',
- 'fa-solid fa-male',
- 'fa-solid fa-map',
- 'fa-solid fa-map-marker',
- 'fa-solid fa-map-marker-alt',
- 'fa-solid fa-map-pin',
- 'fa-solid fa-map-signs',
- 'fa-solid fa-mars',
- 'fa-solid fa-mars-double',
- 'fa-solid fa-mars-stroke',
- 'fa-solid fa-mars-stroke-h',
- 'fa-solid fa-mars-stroke-v',
- 'fa-solid fa-medkit',
- 'fa-solid fa-meh',
- 'fa-solid fa-mercury',
- 'fa-solid fa-microchip',
- 'fa-solid fa-microphone',
- 'fa-solid fa-microphone-alt',
- 'fa-solid fa-microphone-alt-slash',
- 'fa-solid fa-microphone-slash',
- 'fa-solid fa-minus',
- 'fa-solid fa-minus-circle',
- 'fa-solid fa-minus-square',
- 'fa-solid fa-mobile',
- 'fa-solid fa-mobile-alt',
- 'fa-solid fa-money-bill',
- 'fa-solid fa-money-bill-alt',
- 'fa-solid fa-moon',
- 'fa-solid fa-motorcycle',
- 'fa-solid fa-mouse-pointer',
- 'fa-solid fa-music',
- 'fa-solid fa-neuter',
- 'fa-solid fa-newspaper',
- 'fa-solid fa-notes-medical',
- 'fa-solid fa-object-group',
- 'fa-solid fa-object-ungroup',
- 'fa-solid fa-outdent',
- 'fa-solid fa-paint-brush',
- 'fa-solid fa-pallet',
- 'fa-solid fa-paper-plane',
- 'fa-solid fa-paperclip',
- 'fa-solid fa-parachute-box',
- 'fa-solid fa-paragraph',
- 'fa-solid fa-paste',
- 'fa-solid fa-pause',
- 'fa-solid fa-pause-circle',
- 'fa-solid fa-paw',
- 'fa-solid fa-pen-square',
- 'fa-solid fa-pencil-alt',
- 'fa-solid fa-people-carry',
- 'fa-solid fa-percent',
- 'fa-solid fa-percentage',
- 'fa-solid fa-phone',
- 'fa-solid fa-phone-slash',
- 'fa-solid fa-phone-square',
- 'fa-solid fa-phone-volume',
- 'fa-solid fa-piggy-bank',
- 'fa-solid fa-pills',
- 'fa-solid fa-plane',
- 'fa-solid fa-play',
- 'fa-solid fa-play-circle',
- 'fa-solid fa-plug',
- 'fa-solid fa-plus',
- 'fa-solid fa-plus-circle',
- 'fa-solid fa-plus-square',
- 'fa-solid fa-podcast',
- 'fa-solid fa-poo',
- 'fa-solid fa-portrait',
- 'fa-solid fa-pound-sign',
- 'fa-solid fa-power-off',
- 'fa-solid fa-prescription-bottle',
- 'fa-solid fa-prescription-bottle-alt',
- 'fa-solid fa-print',
- 'fa-solid fa-procedures',
- 'fa-solid fa-puzzle-piece',
- 'fa-solid fa-qrcode',
- 'fa-solid fa-question',
- 'fa-solid fa-question-circle',
- 'fa-solid fa-quidditch',
- 'fa-solid fa-quote-left',
- 'fa-solid fa-quote-right',
- 'fa-solid fa-random',
- 'fa-solid fa-recycle',
- 'fa-solid fa-redo',
- 'fa-solid fa-redo-alt',
- 'fa-solid fa-registered',
- 'fa-solid fa-reply',
- 'fa-solid fa-reply-all',
- 'fa-solid fa-retweet',
- 'fa-solid fa-ribbon',
- 'fa-solid fa-road',
- 'fa-solid fa-robot',
- 'fa-solid fa-rocket',
- 'fa-solid fa-rss',
- 'fa-solid fa-rss-square',
- 'fa-solid fa-ruble-sign',
- 'fa-solid fa-ruler',
- 'fa-solid fa-ruler-combined',
- 'fa-solid fa-ruler-horizontal',
- 'fa-solid fa-ruler-vertical',
- 'fa-solid fa-rupee-sign',
- 'fa-solid fa-save',
- 'fa-solid fa-school',
- 'fa-solid fa-screwdriver',
- 'fa-solid fa-search',
- 'fa-solid fa-search-dollar',
- 'fa-solid fa-search-location',
- 'fa-solid fa-search-minus',
- 'fa-solid fa-search-plus',
- 'fa-solid fa-seedling',
- 'fa-solid fa-server',
- 'fa-solid fa-share',
- 'fa-solid fa-share-alt',
- 'fa-solid fa-share-alt-square',
- 'fa-solid fa-share-square',
- 'fa-solid fa-shekel-sign',
- 'fa-solid fa-shield-alt',
- 'fa-solid fa-ship',
- 'fa-solid fa-shipping-fast',
- 'fa-solid fa-shoe-prints',
- 'fa-solid fa-shopping-bag',
- 'fa-solid fa-shopping-basket',
- 'fa-solid fa-shopping-cart',
- 'fa-solid fa-shower',
- 'fa-solid fa-sign',
- 'fa-solid fa-sign-in-alt',
- 'fa-solid fa-sign-language',
- 'fa-solid fa-sign-out-alt',
- 'fa-solid fa-signal',
- 'fa-solid fa-sitemap',
- 'fa-solid fa-skull',
- 'fa-solid fa-sliders-h',
- 'fa-solid fa-smile',
- 'fa-solid fa-smoking',
- 'fa-solid fa-snowflake',
- 'fa-solid fa-sort',
- 'fa-solid fa-sort-alpha-down',
- 'fa-solid fa-sort-alpha-up',
- 'fa-solid fa-sort-amount-down',
- 'fa-solid fa-sort-amount-up',
- 'fa-solid fa-sort-down',
- 'fa-solid fa-sort-numeric-down',
- 'fa-solid fa-sort-numeric-up',
- 'fa-solid fa-sort-up',
- 'fa-solid fa-space-shuttle',
- 'fa-solid fa-spinner',
- 'fa-solid fa-square',
- 'fa-solid fa-square-full',
- 'fa-solid fa-star',
- 'fa-solid fa-star-half',
- 'fa-solid fa-step-backward',
- 'fa-solid fa-step-forward',
- 'fa-solid fa-stethoscope',
- 'fa-solid fa-sticky-note',
- 'fa-solid fa-stop',
- 'fa-solid fa-stop-circle',
- 'fa-solid fa-stopwatch',
- 'fa-solid fa-store',
- 'fa-solid fa-store-alt',
- 'fa-solid fa-stream',
- 'fa-solid fa-street-view',
- 'fa-solid fa-strikethrough',
- 'fa-solid fa-stroopwafel',
- 'fa-solid fa-subscript',
- 'fa-solid fa-subway',
- 'fa-solid fa-suitcase',
- 'fa-solid fa-sun',
- 'fa-solid fa-superscript',
- 'fa-solid fa-sync',
- 'fa-solid fa-sync-alt',
- 'fa-solid fa-syringe',
- 'fa-solid fa-table',
- 'fa-solid fa-table-tennis',
- 'fa-solid fa-tablet',
- 'fa-solid fa-tablet-alt',
- 'fa-solid fa-tablets',
- 'fa-solid fa-tachometer-alt',
- 'fa-solid fa-tag',
- 'fa-solid fa-tags',
- 'fa-solid fa-tape',
- 'fa-solid fa-tasks',
- 'fa-solid fa-taxi',
- 'fa-solid fa-terminal',
- 'fa-solid fa-text-height',
- 'fa-solid fa-text-width',
- 'fa-solid fa-th',
- 'fa-solid fa-th-large',
- 'fa-solid fa-th-list',
- 'fa-solid fa-thermometer',
- 'fa-solid fa-thermometer-empty',
- 'fa-solid fa-thermometer-full',
- 'fa-solid fa-thermometer-half',
- 'fa-solid fa-thermometer-quarter',
- 'fa-solid fa-thermometer-three-quarters',
- 'fa-solid fa-thumbs-down',
- 'fa-solid fa-thumbs-up',
- 'fa-solid fa-thumbtack',
- 'fa-solid fa-ticket-alt',
- 'fa-solid fa-times',
- 'fa-solid fa-times-circle',
- 'fa-solid fa-tint',
- 'fa-solid fa-toggle-off',
- 'fa-solid fa-toggle-on',
- 'fa-solid fa-trademark',
- 'fa-solid fa-train',
- 'fa-solid fa-transgender',
- 'fa-solid fa-transgender-alt',
- 'fa-solid fa-trash',
- 'fa-solid fa-trash-alt',
- 'fa-solid fa-tree',
- 'fa-solid fa-trophy',
- 'fa-solid fa-truck',
- 'fa-solid fa-truck-loading',
- 'fa-solid fa-truck-moving',
- 'fa-solid fa-tty',
- 'fa-solid fa-tv',
- 'fa-solid fa-umbrella',
- 'fa-solid fa-underline',
- 'fa-solid fa-undo',
- 'fa-solid fa-undo-alt',
- 'fa-solid fa-universal-access',
- 'fa-solid fa-university',
- 'fa-solid fa-unlink',
- 'fa-solid fa-unlock',
- 'fa-solid fa-unlock-alt',
- 'fa-solid fa-upload',
- 'fa-solid fa-user',
- 'fa-solid fa-user-circle',
- 'fa-solid fa-user-md',
- 'fa-solid fa-user-plus',
- 'fa-solid fa-user-secret',
- 'fa-solid fa-user-times',
- 'fa-solid fa-users',
- 'fa-solid fa-utensil-spoon',
- 'fa-solid fa-utensils',
- 'fa-solid fa-venus',
- 'fa-solid fa-venus-double',
- 'fa-solid fa-venus-mars',
- 'fa-solid fa-vial',
- 'fa-solid fa-vials',
- 'fa-solid fa-video',
- 'fa-solid fa-video-slash',
- 'fa-solid fa-volleyball-ball',
- 'fa-solid fa-volume-down',
- 'fa-solid fa-volume-off',
- 'fa-solid fa-volume-up',
- 'fa-solid fa-warehouse',
- 'fa-solid fa-weight',
- 'fa-solid fa-weight-hanging',
- 'fa-solid fa-wheelchair',
- 'fa-solid fa-wifi',
- 'fa-solid fa-window-close',
- 'fa-solid fa-window-maximize',
- 'fa-solid fa-window-minimize',
- 'fa-solid fa-window-restore',
- 'fa-solid fa-wine-glass',
- 'fa-solid fa-won-sign',
- 'fa-solid fa-wrench',
- 'fa-solid fa-x-ray',
- 'fa-solid fa-yen-sign',
+ 'fa-solid fa-0',
+ 'fa-solid fa-1',
+ 'fa-solid fa-2',
+ 'fa-solid fa-3',
+ 'fa-solid fa-4',
+ 'fa-solid fa-5',
+ 'fa-solid fa-6',
+ 'fa-solid fa-7',
+ 'fa-solid fa-8',
+ 'fa-solid fa-9',
+ 'fa-brands fa-42-group',
'fa-brands fa-500px',
+ 'fa-solid fa-a',
'fa-brands fa-accessible-icon',
'fa-brands fa-accusoft',
- 'fa-brands fa-acquisitions-incorporated',
+ 'fa-solid fa-address-book',
+ 'fa-regular fa-address-book',
+ 'fa-solid fa-address-card',
+ 'fa-regular fa-address-card',
'fa-brands fa-adn',
- 'fa-brands fa-adobe',
'fa-brands fa-adversal',
'fa-brands fa-affiliatetheme',
'fa-brands fa-airbnb',
'fa-brands fa-algolia',
+ 'fa-solid fa-align-center',
+ 'fa-solid fa-align-justify',
+ 'fa-solid fa-align-left',
+ 'fa-solid fa-align-right',
'fa-brands fa-alipay',
'fa-brands fa-amazon',
'fa-brands fa-amazon-pay',
'fa-brands fa-amilia',
+ 'fa-solid fa-anchor',
+ 'fa-solid fa-anchor-circle-check',
+ 'fa-solid fa-anchor-circle-exclamation',
+ 'fa-solid fa-anchor-circle-xmark',
+ 'fa-solid fa-anchor-lock',
'fa-brands fa-android',
'fa-brands fa-angellist',
+ 'fa-solid fa-angle-down',
+ 'fa-solid fa-angle-left',
+ 'fa-solid fa-angle-right',
+ 'fa-solid fa-angle-up',
+ 'fa-solid fa-angles-down',
+ 'fa-solid fa-angles-left',
+ 'fa-solid fa-angles-right',
+ 'fa-solid fa-angles-up',
'fa-brands fa-angrycreative',
'fa-brands fa-angular',
+ 'fa-solid fa-ankh',
'fa-brands fa-app-store',
'fa-brands fa-app-store-ios',
'fa-brands fa-apper',
'fa-brands fa-apple',
'fa-brands fa-apple-pay',
+ 'fa-solid fa-apple-whole',
+ 'fa-solid fa-archway',
+ 'fa-solid fa-arrow-down',
+ 'fa-solid fa-arrow-down-1-9',
+ 'fa-solid fa-arrow-down-9-1',
+ 'fa-solid fa-arrow-down-a-z',
+ 'fa-solid fa-arrow-down-long',
+ 'fa-solid fa-arrow-down-short-wide',
+ 'fa-solid fa-arrow-down-up-across-line',
+ 'fa-solid fa-arrow-down-up-lock',
+ 'fa-solid fa-arrow-down-wide-short',
+ 'fa-solid fa-arrow-down-z-a',
+ 'fa-solid fa-arrow-left',
+ 'fa-solid fa-arrow-left-long',
+ 'fa-solid fa-arrow-pointer',
+ 'fa-solid fa-arrow-right',
+ 'fa-solid fa-arrow-right-arrow-left',
+ 'fa-solid fa-arrow-right-from-bracket',
+ 'fa-solid fa-arrow-right-long',
+ 'fa-solid fa-arrow-right-to-bracket',
+ 'fa-solid fa-arrow-right-to-city',
+ 'fa-solid fa-arrow-rotate-left',
+ 'fa-solid fa-arrow-rotate-right',
+ 'fa-solid fa-arrow-trend-down',
+ 'fa-solid fa-arrow-trend-up',
+ 'fa-solid fa-arrow-turn-down',
+ 'fa-solid fa-arrow-turn-up',
+ 'fa-solid fa-arrow-up',
+ 'fa-solid fa-arrow-up-1-9',
+ 'fa-solid fa-arrow-up-9-1',
+ 'fa-solid fa-arrow-up-a-z',
+ 'fa-solid fa-arrow-up-from-bracket',
+ 'fa-solid fa-arrow-up-from-ground-water',
+ 'fa-solid fa-arrow-up-from-water-pump',
+ 'fa-solid fa-arrow-up-long',
+ 'fa-solid fa-arrow-up-right-dots',
+ 'fa-solid fa-arrow-up-right-from-square',
+ 'fa-solid fa-arrow-up-short-wide',
+ 'fa-solid fa-arrow-up-wide-short',
+ 'fa-solid fa-arrow-up-z-a',
+ 'fa-solid fa-arrows-down-to-line',
+ 'fa-solid fa-arrows-down-to-people',
+ 'fa-solid fa-arrows-left-right',
+ 'fa-solid fa-arrows-left-right-to-line',
+ 'fa-solid fa-arrows-rotate',
+ 'fa-solid fa-arrows-spin',
+ 'fa-solid fa-arrows-split-up-and-left',
+ 'fa-solid fa-arrows-to-circle',
+ 'fa-solid fa-arrows-to-dot',
+ 'fa-solid fa-arrows-to-eye',
+ 'fa-solid fa-arrows-turn-right',
+ 'fa-solid fa-arrows-turn-to-dots',
+ 'fa-solid fa-arrows-up-down',
+ 'fa-solid fa-arrows-up-down-left-right',
+ 'fa-solid fa-arrows-up-to-line',
'fa-brands fa-artstation',
+ 'fa-solid fa-asterisk',
'fa-brands fa-asymmetrik',
+ 'fa-solid fa-at',
'fa-brands fa-atlassian',
+ 'fa-solid fa-atom',
'fa-brands fa-audible',
+ 'fa-solid fa-audio-description',
+ 'fa-solid fa-austral-sign',
'fa-brands fa-autoprefixer',
'fa-brands fa-avianex',
'fa-brands fa-aviato',
+ 'fa-solid fa-award',
'fa-brands fa-aws',
+ 'fa-solid fa-b',
+ 'fa-solid fa-baby',
+ 'fa-solid fa-baby-carriage',
+ 'fa-solid fa-backward',
+ 'fa-solid fa-backward-fast',
+ 'fa-solid fa-backward-step',
+ 'fa-solid fa-bacon',
+ 'fa-solid fa-bacteria',
+ 'fa-solid fa-bacterium',
+ 'fa-solid fa-bag-shopping',
+ 'fa-solid fa-bahai',
+ 'fa-solid fa-baht-sign',
+ 'fa-solid fa-ban',
+ 'fa-solid fa-ban-smoking',
+ 'fa-solid fa-bandage',
'fa-brands fa-bandcamp',
+ 'fa-solid fa-bangladeshi-taka-sign',
+ 'fa-solid fa-barcode',
+ 'fa-solid fa-bars',
+ 'fa-solid fa-bars-progress',
+ 'fa-solid fa-bars-staggered',
+ 'fa-solid fa-baseball',
+ 'fa-solid fa-baseball-bat-ball',
+ 'fa-solid fa-basket-shopping',
+ 'fa-solid fa-basketball',
+ 'fa-solid fa-bath',
+ 'fa-solid fa-battery-empty',
+ 'fa-solid fa-battery-full',
+ 'fa-solid fa-battery-half',
+ 'fa-solid fa-battery-quarter',
+ 'fa-solid fa-battery-three-quarters',
'fa-brands fa-battle-net',
+ 'fa-solid fa-bed',
+ 'fa-solid fa-bed-pulse',
+ 'fa-solid fa-beer-mug-empty',
'fa-brands fa-behance',
- 'fa-brands fa-behance-square',
+ 'fa-solid fa-bell',
+ 'fa-regular fa-bell',
+ 'fa-solid fa-bell-concierge',
+ 'fa-solid fa-bell-slash',
+ 'fa-regular fa-bell-slash',
+ 'fa-solid fa-bezier-curve',
+ 'fa-solid fa-bicycle',
+ 'fa-brands fa-bilibili',
'fa-brands fa-bimobject',
+ 'fa-solid fa-binoculars',
+ 'fa-solid fa-biohazard',
'fa-brands fa-bitbucket',
'fa-brands fa-bitcoin',
+ 'fa-solid fa-bitcoin-sign',
'fa-brands fa-bity',
'fa-brands fa-black-tie',
'fa-brands fa-blackberry',
+ 'fa-solid fa-blender',
+ 'fa-solid fa-blender-phone',
+ 'fa-solid fa-blog',
'fa-brands fa-blogger',
'fa-brands fa-blogger-b',
+ 'fa-brands fa-bluesky',
'fa-brands fa-bluetooth',
'fa-brands fa-bluetooth-b',
+ 'fa-solid fa-bold',
+ 'fa-solid fa-bolt',
+ 'fa-solid fa-bolt-lightning',
+ 'fa-solid fa-bomb',
+ 'fa-solid fa-bone',
+ 'fa-solid fa-bong',
+ 'fa-solid fa-book',
+ 'fa-solid fa-book-atlas',
+ 'fa-solid fa-book-bible',
+ 'fa-solid fa-book-bookmark',
+ 'fa-solid fa-book-journal-whills',
+ 'fa-solid fa-book-medical',
+ 'fa-solid fa-book-open',
+ 'fa-solid fa-book-open-reader',
+ 'fa-solid fa-book-quran',
+ 'fa-solid fa-book-skull',
+ 'fa-solid fa-book-tanakh',
+ 'fa-solid fa-bookmark',
+ 'fa-regular fa-bookmark',
'fa-brands fa-bootstrap',
+ 'fa-solid fa-border-all',
+ 'fa-solid fa-border-none',
+ 'fa-solid fa-border-top-left',
+ 'fa-solid fa-bore-hole',
+ 'fa-brands fa-bots',
+ 'fa-solid fa-bottle-droplet',
+ 'fa-solid fa-bottle-water',
+ 'fa-solid fa-bowl-food',
+ 'fa-solid fa-bowl-rice',
+ 'fa-solid fa-bowling-ball',
+ 'fa-solid fa-box',
+ 'fa-solid fa-box-archive',
+ 'fa-solid fa-box-open',
+ 'fa-solid fa-box-tissue',
+ 'fa-solid fa-boxes-packing',
+ 'fa-solid fa-boxes-stacked',
+ 'fa-solid fa-braille',
+ 'fa-solid fa-brain',
+ 'fa-brands fa-brave',
+ 'fa-brands fa-brave-reverse',
+ 'fa-solid fa-brazilian-real-sign',
+ 'fa-solid fa-bread-slice',
+ 'fa-solid fa-bridge',
+ 'fa-solid fa-bridge-circle-check',
+ 'fa-solid fa-bridge-circle-exclamation',
+ 'fa-solid fa-bridge-circle-xmark',
+ 'fa-solid fa-bridge-lock',
+ 'fa-solid fa-bridge-water',
+ 'fa-solid fa-briefcase',
+ 'fa-solid fa-briefcase-medical',
+ 'fa-solid fa-broom',
+ 'fa-solid fa-broom-ball',
+ 'fa-solid fa-brush',
'fa-brands fa-btc',
+ 'fa-solid fa-bucket',
'fa-brands fa-buffer',
+ 'fa-solid fa-bug',
+ 'fa-solid fa-bug-slash',
+ 'fa-solid fa-bugs',
+ 'fa-solid fa-building',
+ 'fa-regular fa-building',
+ 'fa-solid fa-building-circle-arrow-right',
+ 'fa-solid fa-building-circle-check',
+ 'fa-solid fa-building-circle-exclamation',
+ 'fa-solid fa-building-circle-xmark',
+ 'fa-solid fa-building-columns',
+ 'fa-solid fa-building-flag',
+ 'fa-solid fa-building-lock',
+ 'fa-solid fa-building-ngo',
+ 'fa-solid fa-building-shield',
+ 'fa-solid fa-building-un',
+ 'fa-solid fa-building-user',
+ 'fa-solid fa-building-wheat',
+ 'fa-solid fa-bullhorn',
+ 'fa-solid fa-bullseye',
+ 'fa-solid fa-burger',
'fa-brands fa-buromobelexperte',
+ 'fa-solid fa-burst',
+ 'fa-solid fa-bus',
+ 'fa-solid fa-bus-simple',
+ 'fa-solid fa-business-time',
'fa-brands fa-buy-n-large',
'fa-brands fa-buysellads',
+ 'fa-solid fa-c',
+ 'fa-solid fa-cable-car',
+ 'fa-solid fa-cake-candles',
+ 'fa-solid fa-calculator',
+ 'fa-solid fa-calendar',
+ 'fa-regular fa-calendar',
+ 'fa-solid fa-calendar-check',
+ 'fa-regular fa-calendar-check',
+ 'fa-solid fa-calendar-day',
+ 'fa-solid fa-calendar-days',
+ 'fa-regular fa-calendar-days',
+ 'fa-solid fa-calendar-minus',
+ 'fa-regular fa-calendar-minus',
+ 'fa-solid fa-calendar-plus',
+ 'fa-regular fa-calendar-plus',
+ 'fa-solid fa-calendar-week',
+ 'fa-solid fa-calendar-xmark',
+ 'fa-regular fa-calendar-xmark',
+ 'fa-solid fa-camera',
+ 'fa-solid fa-camera-retro',
+ 'fa-solid fa-camera-rotate',
+ 'fa-solid fa-campground',
'fa-brands fa-canadian-maple-leaf',
+ 'fa-solid fa-candy-cane',
+ 'fa-solid fa-cannabis',
+ 'fa-solid fa-capsules',
+ 'fa-solid fa-car',
+ 'fa-solid fa-car-battery',
+ 'fa-solid fa-car-burst',
+ 'fa-solid fa-car-on',
+ 'fa-solid fa-car-rear',
+ 'fa-solid fa-car-side',
+ 'fa-solid fa-car-tunnel',
+ 'fa-solid fa-caravan',
+ 'fa-solid fa-caret-down',
+ 'fa-solid fa-caret-left',
+ 'fa-solid fa-caret-right',
+ 'fa-solid fa-caret-up',
+ 'fa-solid fa-carrot',
+ 'fa-solid fa-cart-arrow-down',
+ 'fa-solid fa-cart-flatbed',
+ 'fa-solid fa-cart-flatbed-suitcase',
+ 'fa-solid fa-cart-plus',
+ 'fa-solid fa-cart-shopping',
+ 'fa-solid fa-cash-register',
+ 'fa-solid fa-cat',
'fa-brands fa-cc-amazon-pay',
'fa-brands fa-cc-amex',
'fa-brands fa-cc-apple-pay',
@@ -593,19 +323,174 @@ const icons = [
'fa-brands fa-cc-paypal',
'fa-brands fa-cc-stripe',
'fa-brands fa-cc-visa',
+ 'fa-solid fa-cedi-sign',
+ 'fa-solid fa-cent-sign',
'fa-brands fa-centercode',
'fa-brands fa-centos',
+ 'fa-solid fa-certificate',
+ 'fa-solid fa-chair',
+ 'fa-solid fa-chalkboard',
+ 'fa-solid fa-chalkboard-user',
+ 'fa-solid fa-champagne-glasses',
+ 'fa-solid fa-charging-station',
+ 'fa-solid fa-chart-area',
+ 'fa-solid fa-chart-bar',
+ 'fa-regular fa-chart-bar',
+ 'fa-solid fa-chart-column',
+ 'fa-solid fa-chart-diagram',
+ 'fa-solid fa-chart-gantt',
+ 'fa-solid fa-chart-line',
+ 'fa-solid fa-chart-pie',
+ 'fa-solid fa-chart-simple',
+ 'fa-solid fa-check',
+ 'fa-solid fa-check-double',
+ 'fa-solid fa-check-to-slot',
+ 'fa-solid fa-cheese',
+ 'fa-solid fa-chess',
+ 'fa-solid fa-chess-bishop',
+ 'fa-regular fa-chess-bishop',
+ 'fa-solid fa-chess-board',
+ 'fa-solid fa-chess-king',
+ 'fa-regular fa-chess-king',
+ 'fa-solid fa-chess-knight',
+ 'fa-regular fa-chess-knight',
+ 'fa-solid fa-chess-pawn',
+ 'fa-regular fa-chess-pawn',
+ 'fa-solid fa-chess-queen',
+ 'fa-regular fa-chess-queen',
+ 'fa-solid fa-chess-rook',
+ 'fa-regular fa-chess-rook',
+ 'fa-solid fa-chevron-down',
+ 'fa-solid fa-chevron-left',
+ 'fa-solid fa-chevron-right',
+ 'fa-solid fa-chevron-up',
+ 'fa-solid fa-child',
+ 'fa-solid fa-child-combatant',
+ 'fa-solid fa-child-dress',
+ 'fa-solid fa-child-reaching',
+ 'fa-solid fa-children',
'fa-brands fa-chrome',
'fa-brands fa-chromecast',
+ 'fa-solid fa-church',
+ 'fa-solid fa-circle',
+ 'fa-regular fa-circle',
+ 'fa-solid fa-circle-arrow-down',
+ 'fa-solid fa-circle-arrow-left',
+ 'fa-solid fa-circle-arrow-right',
+ 'fa-solid fa-circle-arrow-up',
+ 'fa-solid fa-circle-check',
+ 'fa-regular fa-circle-check',
+ 'fa-solid fa-circle-chevron-down',
+ 'fa-solid fa-circle-chevron-left',
+ 'fa-solid fa-circle-chevron-right',
+ 'fa-solid fa-circle-chevron-up',
+ 'fa-solid fa-circle-dollar-to-slot',
+ 'fa-solid fa-circle-dot',
+ 'fa-regular fa-circle-dot',
+ 'fa-solid fa-circle-down',
+ 'fa-regular fa-circle-down',
+ 'fa-solid fa-circle-exclamation',
+ 'fa-solid fa-circle-h',
+ 'fa-solid fa-circle-half-stroke',
+ 'fa-solid fa-circle-info',
+ 'fa-solid fa-circle-left',
+ 'fa-regular fa-circle-left',
+ 'fa-solid fa-circle-minus',
+ 'fa-solid fa-circle-nodes',
+ 'fa-solid fa-circle-notch',
+ 'fa-solid fa-circle-pause',
+ 'fa-regular fa-circle-pause',
+ 'fa-solid fa-circle-play',
+ 'fa-regular fa-circle-play',
+ 'fa-solid fa-circle-plus',
+ 'fa-solid fa-circle-question',
+ 'fa-regular fa-circle-question',
+ 'fa-solid fa-circle-radiation',
+ 'fa-solid fa-circle-right',
+ 'fa-regular fa-circle-right',
+ 'fa-solid fa-circle-stop',
+ 'fa-regular fa-circle-stop',
+ 'fa-solid fa-circle-up',
+ 'fa-regular fa-circle-up',
+ 'fa-solid fa-circle-user',
+ 'fa-regular fa-circle-user',
+ 'fa-solid fa-circle-xmark',
+ 'fa-regular fa-circle-xmark',
+ 'fa-solid fa-city',
+ 'fa-solid fa-clapperboard',
+ 'fa-solid fa-clipboard',
+ 'fa-regular fa-clipboard',
+ 'fa-solid fa-clipboard-check',
+ 'fa-solid fa-clipboard-list',
+ 'fa-solid fa-clipboard-question',
+ 'fa-solid fa-clipboard-user',
+ 'fa-solid fa-clock',
+ 'fa-regular fa-clock',
+ 'fa-solid fa-clock-rotate-left',
+ 'fa-solid fa-clone',
+ 'fa-regular fa-clone',
+ 'fa-solid fa-closed-captioning',
+ 'fa-regular fa-closed-captioning',
+ 'fa-solid fa-cloud',
+ 'fa-solid fa-cloud-arrow-down',
+ 'fa-solid fa-cloud-arrow-up',
+ 'fa-solid fa-cloud-bolt',
+ 'fa-solid fa-cloud-meatball',
+ 'fa-solid fa-cloud-moon',
+ 'fa-solid fa-cloud-moon-rain',
+ 'fa-solid fa-cloud-rain',
+ 'fa-solid fa-cloud-showers-heavy',
+ 'fa-solid fa-cloud-showers-water',
+ 'fa-solid fa-cloud-sun',
+ 'fa-solid fa-cloud-sun-rain',
+ 'fa-brands fa-cloudflare',
'fa-brands fa-cloudscale',
'fa-brands fa-cloudsmith',
'fa-brands fa-cloudversify',
+ 'fa-solid fa-clover',
+ 'fa-brands fa-cmplid',
+ 'fa-solid fa-code',
+ 'fa-solid fa-code-branch',
+ 'fa-solid fa-code-commit',
+ 'fa-solid fa-code-compare',
+ 'fa-solid fa-code-fork',
+ 'fa-solid fa-code-merge',
+ 'fa-solid fa-code-pull-request',
'fa-brands fa-codepen',
'fa-brands fa-codiepie',
+ 'fa-solid fa-coins',
+ 'fa-solid fa-colon-sign',
+ 'fa-solid fa-comment',
+ 'fa-regular fa-comment',
+ 'fa-solid fa-comment-dollar',
+ 'fa-solid fa-comment-dots',
+ 'fa-regular fa-comment-dots',
+ 'fa-solid fa-comment-medical',
+ 'fa-solid fa-comment-nodes',
+ 'fa-solid fa-comment-slash',
+ 'fa-solid fa-comment-sms',
+ 'fa-solid fa-comments',
+ 'fa-regular fa-comments',
+ 'fa-solid fa-comments-dollar',
+ 'fa-solid fa-compact-disc',
+ 'fa-solid fa-compass',
+ 'fa-regular fa-compass',
+ 'fa-solid fa-compass-drafting',
+ 'fa-solid fa-compress',
+ 'fa-solid fa-computer',
+ 'fa-solid fa-computer-mouse',
'fa-brands fa-confluence',
'fa-brands fa-connectdevelop',
'fa-brands fa-contao',
+ 'fa-solid fa-cookie',
+ 'fa-solid fa-cookie-bite',
+ 'fa-solid fa-copy',
+ 'fa-regular fa-copy',
+ 'fa-solid fa-copyright',
+ 'fa-regular fa-copyright',
'fa-brands fa-cotton-bureau',
+ 'fa-solid fa-couch',
+ 'fa-solid fa-cow',
'fa-brands fa-cpanel',
'fa-brands fa-creative-commons',
'fa-brands fa-creative-commons-by',
@@ -621,357 +506,1546 @@ const icons = [
'fa-brands fa-creative-commons-sampling-plus',
'fa-brands fa-creative-commons-share',
'fa-brands fa-creative-commons-zero',
+ 'fa-solid fa-credit-card',
+ 'fa-regular fa-credit-card',
'fa-brands fa-critical-role',
+ 'fa-solid fa-crop',
+ 'fa-solid fa-crop-simple',
+ 'fa-solid fa-cross',
+ 'fa-solid fa-crosshairs',
+ 'fa-solid fa-crow',
+ 'fa-solid fa-crown',
+ 'fa-solid fa-crutch',
+ 'fa-solid fa-cruzeiro-sign',
+ 'fa-brands fa-css',
'fa-brands fa-css3',
'fa-brands fa-css3-alt',
+ 'fa-solid fa-cube',
+ 'fa-solid fa-cubes',
+ 'fa-solid fa-cubes-stacked',
'fa-brands fa-cuttlefish',
+ 'fa-solid fa-d',
'fa-brands fa-d-and-d',
'fa-brands fa-d-and-d-beyond',
+ 'fa-brands fa-dailymotion',
+ 'fa-brands fa-dart-lang',
'fa-brands fa-dashcube',
+ 'fa-solid fa-database',
+ 'fa-brands fa-debian',
+ 'fa-brands fa-deezer',
+ 'fa-solid fa-delete-left',
'fa-brands fa-delicious',
+ 'fa-solid fa-democrat',
'fa-brands fa-deploydog',
'fa-brands fa-deskpro',
+ 'fa-solid fa-desktop',
'fa-brands fa-dev',
'fa-brands fa-deviantart',
+ 'fa-solid fa-dharmachakra',
'fa-brands fa-dhl',
+ 'fa-solid fa-diagram-next',
+ 'fa-solid fa-diagram-predecessor',
+ 'fa-solid fa-diagram-project',
+ 'fa-solid fa-diagram-successor',
+ 'fa-solid fa-diamond',
+ 'fa-solid fa-diamond-turn-right',
'fa-brands fa-diaspora',
+ 'fa-solid fa-dice',
+ 'fa-solid fa-dice-d20',
+ 'fa-solid fa-dice-d6',
+ 'fa-solid fa-dice-five',
+ 'fa-solid fa-dice-four',
+ 'fa-solid fa-dice-one',
+ 'fa-solid fa-dice-six',
+ 'fa-solid fa-dice-three',
+ 'fa-solid fa-dice-two',
'fa-brands fa-digg',
'fa-brands fa-digital-ocean',
'fa-brands fa-discord',
'fa-brands fa-discourse',
+ 'fa-solid fa-disease',
+ 'fa-solid fa-display',
+ 'fa-solid fa-divide',
+ 'fa-solid fa-dna',
'fa-brands fa-dochub',
'fa-brands fa-docker',
+ 'fa-solid fa-dog',
+ 'fa-solid fa-dollar-sign',
+ 'fa-solid fa-dolly',
+ 'fa-solid fa-dong-sign',
+ 'fa-solid fa-door-closed',
+ 'fa-solid fa-door-open',
+ 'fa-solid fa-dove',
+ 'fa-solid fa-down-left-and-up-right-to-center',
+ 'fa-solid fa-down-long',
+ 'fa-solid fa-download',
'fa-brands fa-draft2digital',
+ 'fa-solid fa-dragon',
+ 'fa-solid fa-draw-polygon',
'fa-brands fa-dribbble',
- 'fa-brands fa-dribbble-square',
'fa-brands fa-dropbox',
+ 'fa-solid fa-droplet',
+ 'fa-solid fa-droplet-slash',
+ 'fa-solid fa-drum',
+ 'fa-solid fa-drum-steelpan',
+ 'fa-solid fa-drumstick-bite',
'fa-brands fa-drupal',
+ 'fa-solid fa-dumbbell',
+ 'fa-solid fa-dumpster',
+ 'fa-solid fa-dumpster-fire',
+ 'fa-solid fa-dungeon',
'fa-brands fa-dyalog',
+ 'fa-solid fa-e',
+ 'fa-solid fa-ear-deaf',
+ 'fa-solid fa-ear-listen',
'fa-brands fa-earlybirds',
+ 'fa-solid fa-earth-africa',
+ 'fa-solid fa-earth-americas',
+ 'fa-solid fa-earth-asia',
+ 'fa-solid fa-earth-europe',
+ 'fa-solid fa-earth-oceania',
'fa-brands fa-ebay',
'fa-brands fa-edge',
'fa-brands fa-edge-legacy',
+ 'fa-solid fa-egg',
+ 'fa-solid fa-eject',
'fa-brands fa-elementor',
+ 'fa-solid fa-elevator',
+ 'fa-solid fa-ellipsis',
+ 'fa-solid fa-ellipsis-vertical',
'fa-brands fa-ello',
'fa-brands fa-ember',
'fa-brands fa-empire',
+ 'fa-solid fa-envelope',
+ 'fa-regular fa-envelope',
+ 'fa-solid fa-envelope-circle-check',
+ 'fa-solid fa-envelope-open',
+ 'fa-regular fa-envelope-open',
+ 'fa-solid fa-envelope-open-text',
+ 'fa-solid fa-envelopes-bulk',
'fa-brands fa-envira',
+ 'fa-solid fa-equals',
+ 'fa-solid fa-eraser',
'fa-brands fa-erlang',
'fa-brands fa-ethereum',
+ 'fa-solid fa-ethernet',
'fa-brands fa-etsy',
+ 'fa-solid fa-euro-sign',
'fa-brands fa-evernote',
+ 'fa-solid fa-exclamation',
+ 'fa-solid fa-expand',
'fa-brands fa-expeditedssl',
+ 'fa-solid fa-explosion',
+ 'fa-solid fa-eye',
+ 'fa-regular fa-eye',
+ 'fa-solid fa-eye-dropper',
+ 'fa-solid fa-eye-low-vision',
+ 'fa-solid fa-eye-slash',
+ 'fa-regular fa-eye-slash',
+ 'fa-solid fa-f',
+ 'fa-solid fa-face-angry',
+ 'fa-regular fa-face-angry',
+ 'fa-solid fa-face-dizzy',
+ 'fa-regular fa-face-dizzy',
+ 'fa-solid fa-face-flushed',
+ 'fa-regular fa-face-flushed',
+ 'fa-solid fa-face-frown',
+ 'fa-regular fa-face-frown',
+ 'fa-solid fa-face-frown-open',
+ 'fa-regular fa-face-frown-open',
+ 'fa-solid fa-face-grimace',
+ 'fa-regular fa-face-grimace',
+ 'fa-solid fa-face-grin',
+ 'fa-regular fa-face-grin',
+ 'fa-solid fa-face-grin-beam',
+ 'fa-regular fa-face-grin-beam',
+ 'fa-solid fa-face-grin-beam-sweat',
+ 'fa-regular fa-face-grin-beam-sweat',
+ 'fa-solid fa-face-grin-hearts',
+ 'fa-regular fa-face-grin-hearts',
+ 'fa-solid fa-face-grin-squint',
+ 'fa-regular fa-face-grin-squint',
+ 'fa-solid fa-face-grin-squint-tears',
+ 'fa-regular fa-face-grin-squint-tears',
+ 'fa-solid fa-face-grin-stars',
+ 'fa-regular fa-face-grin-stars',
+ 'fa-solid fa-face-grin-tears',
+ 'fa-regular fa-face-grin-tears',
+ 'fa-solid fa-face-grin-tongue',
+ 'fa-regular fa-face-grin-tongue',
+ 'fa-solid fa-face-grin-tongue-squint',
+ 'fa-regular fa-face-grin-tongue-squint',
+ 'fa-solid fa-face-grin-tongue-wink',
+ 'fa-regular fa-face-grin-tongue-wink',
+ 'fa-solid fa-face-grin-wide',
+ 'fa-regular fa-face-grin-wide',
+ 'fa-solid fa-face-grin-wink',
+ 'fa-regular fa-face-grin-wink',
+ 'fa-solid fa-face-kiss',
+ 'fa-regular fa-face-kiss',
+ 'fa-solid fa-face-kiss-beam',
+ 'fa-regular fa-face-kiss-beam',
+ 'fa-solid fa-face-kiss-wink-heart',
+ 'fa-regular fa-face-kiss-wink-heart',
+ 'fa-solid fa-face-laugh',
+ 'fa-regular fa-face-laugh',
+ 'fa-solid fa-face-laugh-beam',
+ 'fa-regular fa-face-laugh-beam',
+ 'fa-solid fa-face-laugh-squint',
+ 'fa-regular fa-face-laugh-squint',
+ 'fa-solid fa-face-laugh-wink',
+ 'fa-regular fa-face-laugh-wink',
+ 'fa-solid fa-face-meh',
+ 'fa-regular fa-face-meh',
+ 'fa-solid fa-face-meh-blank',
+ 'fa-regular fa-face-meh-blank',
+ 'fa-solid fa-face-rolling-eyes',
+ 'fa-regular fa-face-rolling-eyes',
+ 'fa-solid fa-face-sad-cry',
+ 'fa-regular fa-face-sad-cry',
+ 'fa-solid fa-face-sad-tear',
+ 'fa-regular fa-face-sad-tear',
+ 'fa-solid fa-face-smile',
+ 'fa-regular fa-face-smile',
+ 'fa-solid fa-face-smile-beam',
+ 'fa-regular fa-face-smile-beam',
+ 'fa-solid fa-face-smile-wink',
+ 'fa-regular fa-face-smile-wink',
+ 'fa-solid fa-face-surprise',
+ 'fa-regular fa-face-surprise',
+ 'fa-solid fa-face-tired',
+ 'fa-regular fa-face-tired',
'fa-brands fa-facebook',
'fa-brands fa-facebook-f',
'fa-brands fa-facebook-messenger',
- 'fa-brands fa-facebook-square',
+ 'fa-solid fa-fan',
'fa-brands fa-fantasy-flight-games',
+ 'fa-solid fa-faucet',
+ 'fa-solid fa-faucet-drip',
+ 'fa-solid fa-fax',
+ 'fa-solid fa-feather',
+ 'fa-solid fa-feather-pointed',
'fa-brands fa-fedex',
'fa-brands fa-fedora',
+ 'fa-solid fa-ferry',
'fa-brands fa-figma',
+ 'fa-solid fa-file',
+ 'fa-regular fa-file',
+ 'fa-solid fa-file-arrow-down',
+ 'fa-solid fa-file-arrow-up',
+ 'fa-solid fa-file-audio',
+ 'fa-regular fa-file-audio',
+ 'fa-solid fa-file-circle-check',
+ 'fa-solid fa-file-circle-exclamation',
+ 'fa-solid fa-file-circle-minus',
+ 'fa-solid fa-file-circle-plus',
+ 'fa-solid fa-file-circle-question',
+ 'fa-solid fa-file-circle-xmark',
+ 'fa-solid fa-file-code',
+ 'fa-regular fa-file-code',
+ 'fa-solid fa-file-contract',
+ 'fa-solid fa-file-csv',
+ 'fa-solid fa-file-excel',
+ 'fa-regular fa-file-excel',
+ 'fa-solid fa-file-export',
+ 'fa-solid fa-file-fragment',
+ 'fa-solid fa-file-half-dashed',
+ 'fa-solid fa-file-image',
+ 'fa-regular fa-file-image',
+ 'fa-solid fa-file-import',
+ 'fa-solid fa-file-invoice',
+ 'fa-solid fa-file-invoice-dollar',
+ 'fa-solid fa-file-lines',
+ 'fa-regular fa-file-lines',
+ 'fa-solid fa-file-medical',
+ 'fa-solid fa-file-pdf',
+ 'fa-regular fa-file-pdf',
+ 'fa-solid fa-file-pen',
+ 'fa-solid fa-file-powerpoint',
+ 'fa-regular fa-file-powerpoint',
+ 'fa-solid fa-file-prescription',
+ 'fa-solid fa-file-shield',
+ 'fa-solid fa-file-signature',
+ 'fa-solid fa-file-video',
+ 'fa-regular fa-file-video',
+ 'fa-solid fa-file-waveform',
+ 'fa-solid fa-file-word',
+ 'fa-regular fa-file-word',
+ 'fa-solid fa-file-zipper',
+ 'fa-regular fa-file-zipper',
+ 'fa-brands fa-files-pinwheel',
+ 'fa-solid fa-fill',
+ 'fa-solid fa-fill-drip',
+ 'fa-solid fa-film',
+ 'fa-solid fa-filter',
+ 'fa-solid fa-filter-circle-dollar',
+ 'fa-solid fa-filter-circle-xmark',
+ 'fa-solid fa-fingerprint',
+ 'fa-solid fa-fire',
+ 'fa-solid fa-fire-burner',
+ 'fa-solid fa-fire-extinguisher',
+ 'fa-solid fa-fire-flame-curved',
+ 'fa-solid fa-fire-flame-simple',
'fa-brands fa-firefox',
'fa-brands fa-firefox-browser',
'fa-brands fa-first-order',
'fa-brands fa-first-order-alt',
'fa-brands fa-firstdraft',
+ 'fa-solid fa-fish',
+ 'fa-solid fa-fish-fins',
+ 'fa-solid fa-flag',
+ 'fa-regular fa-flag',
+ 'fa-solid fa-flag-checkered',
+ 'fa-solid fa-flag-usa',
+ 'fa-solid fa-flask',
+ 'fa-solid fa-flask-vial',
'fa-brands fa-flickr',
'fa-brands fa-flipboard',
+ 'fa-solid fa-floppy-disk',
+ 'fa-regular fa-floppy-disk',
+ 'fa-solid fa-florin-sign',
+ 'fa-brands fa-flutter',
'fa-brands fa-fly',
+ 'fa-solid fa-folder',
+ 'fa-regular fa-folder',
+ 'fa-solid fa-folder-closed',
+ 'fa-regular fa-folder-closed',
+ 'fa-solid fa-folder-minus',
+ 'fa-solid fa-folder-open',
+ 'fa-regular fa-folder-open',
+ 'fa-solid fa-folder-plus',
+ 'fa-solid fa-folder-tree',
+ 'fa-solid fa-font',
+ 'fa-solid fa-font-awesome',
+ 'fa-regular fa-font-awesome',
'fa-brands fa-font-awesome',
- 'fa-brands fa-font-awesome-alt',
- 'fa-brands fa-font-awesome-flag',
'fa-brands fa-fonticons',
'fa-brands fa-fonticons-fi',
+ 'fa-solid fa-football',
'fa-brands fa-fort-awesome',
'fa-brands fa-fort-awesome-alt',
'fa-brands fa-forumbee',
+ 'fa-solid fa-forward',
+ 'fa-solid fa-forward-fast',
+ 'fa-solid fa-forward-step',
'fa-brands fa-foursquare',
+ 'fa-solid fa-franc-sign',
'fa-brands fa-free-code-camp',
'fa-brands fa-freebsd',
+ 'fa-solid fa-frog',
'fa-brands fa-fulcrum',
+ 'fa-solid fa-futbol',
+ 'fa-regular fa-futbol',
+ 'fa-solid fa-g',
'fa-brands fa-galactic-republic',
'fa-brands fa-galactic-senate',
+ 'fa-solid fa-gamepad',
+ 'fa-solid fa-gas-pump',
+ 'fa-solid fa-gauge',
+ 'fa-solid fa-gauge-high',
+ 'fa-solid fa-gauge-simple',
+ 'fa-solid fa-gauge-simple-high',
+ 'fa-solid fa-gavel',
+ 'fa-solid fa-gear',
+ 'fa-solid fa-gears',
+ 'fa-solid fa-gem',
+ 'fa-regular fa-gem',
+ 'fa-solid fa-genderless',
'fa-brands fa-get-pocket',
'fa-brands fa-gg',
'fa-brands fa-gg-circle',
+ 'fa-solid fa-ghost',
+ 'fa-solid fa-gift',
+ 'fa-solid fa-gifts',
'fa-brands fa-git',
'fa-brands fa-git-alt',
- 'fa-brands fa-git-square',
'fa-brands fa-github',
'fa-brands fa-github-alt',
- 'fa-brands fa-github-square',
'fa-brands fa-gitkraken',
'fa-brands fa-gitlab',
'fa-brands fa-gitter',
+ 'fa-solid fa-glass-water',
+ 'fa-solid fa-glass-water-droplet',
+ 'fa-solid fa-glasses',
'fa-brands fa-glide',
'fa-brands fa-glide-g',
+ 'fa-solid fa-globe',
'fa-brands fa-gofore',
+ 'fa-brands fa-golang',
+ 'fa-solid fa-golf-ball-tee',
'fa-brands fa-goodreads',
'fa-brands fa-goodreads-g',
'fa-brands fa-google',
'fa-brands fa-google-drive',
+ 'fa-brands fa-google-pay',
'fa-brands fa-google-play',
'fa-brands fa-google-plus',
'fa-brands fa-google-plus-g',
- 'fa-brands fa-google-plus-square',
+ 'fa-brands fa-google-scholar',
'fa-brands fa-google-wallet',
+ 'fa-solid fa-gopuram',
+ 'fa-solid fa-graduation-cap',
'fa-brands fa-gratipay',
'fa-brands fa-grav',
+ 'fa-solid fa-greater-than',
+ 'fa-solid fa-greater-than-equal',
+ 'fa-solid fa-grip',
+ 'fa-solid fa-grip-lines',
+ 'fa-solid fa-grip-lines-vertical',
+ 'fa-solid fa-grip-vertical',
'fa-brands fa-gripfire',
+ 'fa-solid fa-group-arrows-rotate',
'fa-brands fa-grunt',
+ 'fa-solid fa-guarani-sign',
'fa-brands fa-guilded',
+ 'fa-solid fa-guitar',
'fa-brands fa-gulp',
+ 'fa-solid fa-gun',
+ 'fa-solid fa-h',
'fa-brands fa-hacker-news',
- 'fa-brands fa-hacker-news-square',
'fa-brands fa-hackerrank',
+ 'fa-solid fa-hammer',
+ 'fa-solid fa-hamsa',
+ 'fa-solid fa-hand',
+ 'fa-regular fa-hand',
+ 'fa-solid fa-hand-back-fist',
+ 'fa-regular fa-hand-back-fist',
+ 'fa-solid fa-hand-dots',
+ 'fa-solid fa-hand-fist',
+ 'fa-solid fa-hand-holding',
+ 'fa-solid fa-hand-holding-dollar',
+ 'fa-solid fa-hand-holding-droplet',
+ 'fa-solid fa-hand-holding-hand',
+ 'fa-solid fa-hand-holding-heart',
+ 'fa-solid fa-hand-holding-medical',
+ 'fa-solid fa-hand-lizard',
+ 'fa-regular fa-hand-lizard',
+ 'fa-solid fa-hand-middle-finger',
+ 'fa-solid fa-hand-peace',
+ 'fa-regular fa-hand-peace',
+ 'fa-solid fa-hand-point-down',
+ 'fa-regular fa-hand-point-down',
+ 'fa-solid fa-hand-point-left',
+ 'fa-regular fa-hand-point-left',
+ 'fa-solid fa-hand-point-right',
+ 'fa-regular fa-hand-point-right',
+ 'fa-solid fa-hand-point-up',
+ 'fa-regular fa-hand-point-up',
+ 'fa-solid fa-hand-pointer',
+ 'fa-regular fa-hand-pointer',
+ 'fa-solid fa-hand-scissors',
+ 'fa-regular fa-hand-scissors',
+ 'fa-solid fa-hand-sparkles',
+ 'fa-solid fa-hand-spock',
+ 'fa-regular fa-hand-spock',
+ 'fa-solid fa-handcuffs',
+ 'fa-solid fa-hands',
+ 'fa-solid fa-hands-asl-interpreting',
+ 'fa-solid fa-hands-bound',
+ 'fa-solid fa-hands-bubbles',
+ 'fa-solid fa-hands-clapping',
+ 'fa-solid fa-hands-holding',
+ 'fa-solid fa-hands-holding-child',
+ 'fa-solid fa-hands-holding-circle',
+ 'fa-solid fa-hands-praying',
+ 'fa-solid fa-handshake',
+ 'fa-regular fa-handshake',
+ 'fa-solid fa-handshake-angle',
+ 'fa-solid fa-handshake-simple',
+ 'fa-solid fa-handshake-simple-slash',
+ 'fa-solid fa-handshake-slash',
+ 'fa-solid fa-hanukiah',
+ 'fa-solid fa-hard-drive',
+ 'fa-regular fa-hard-drive',
+ 'fa-brands fa-hashnode',
+ 'fa-solid fa-hashtag',
+ 'fa-solid fa-hat-cowboy',
+ 'fa-solid fa-hat-cowboy-side',
+ 'fa-solid fa-hat-wizard',
+ 'fa-solid fa-head-side-cough',
+ 'fa-solid fa-head-side-cough-slash',
+ 'fa-solid fa-head-side-mask',
+ 'fa-solid fa-head-side-virus',
+ 'fa-solid fa-heading',
+ 'fa-solid fa-headphones',
+ 'fa-solid fa-headphones-simple',
+ 'fa-solid fa-headset',
+ 'fa-solid fa-heart',
+ 'fa-regular fa-heart',
+ 'fa-solid fa-heart-circle-bolt',
+ 'fa-solid fa-heart-circle-check',
+ 'fa-solid fa-heart-circle-exclamation',
+ 'fa-solid fa-heart-circle-minus',
+ 'fa-solid fa-heart-circle-plus',
+ 'fa-solid fa-heart-circle-xmark',
+ 'fa-solid fa-heart-crack',
+ 'fa-solid fa-heart-pulse',
+ 'fa-solid fa-helicopter',
+ 'fa-solid fa-helicopter-symbol',
+ 'fa-solid fa-helmet-safety',
+ 'fa-solid fa-helmet-un',
+ 'fa-solid fa-hexagon-nodes',
+ 'fa-solid fa-hexagon-nodes-bolt',
+ 'fa-solid fa-highlighter',
+ 'fa-solid fa-hill-avalanche',
+ 'fa-solid fa-hill-rockslide',
+ 'fa-solid fa-hippo',
'fa-brands fa-hips',
'fa-brands fa-hire-a-helper',
'fa-brands fa-hive',
+ 'fa-solid fa-hockey-puck',
+ 'fa-solid fa-holly-berry',
'fa-brands fa-hooli',
'fa-brands fa-hornbill',
+ 'fa-solid fa-horse',
+ 'fa-solid fa-horse-head',
+ 'fa-solid fa-hospital',
+ 'fa-regular fa-hospital',
+ 'fa-solid fa-hospital-user',
+ 'fa-solid fa-hot-tub-person',
+ 'fa-solid fa-hotdog',
+ 'fa-solid fa-hotel',
'fa-brands fa-hotjar',
+ 'fa-solid fa-hourglass',
+ 'fa-regular fa-hourglass',
+ 'fa-solid fa-hourglass-end',
+ 'fa-solid fa-hourglass-half',
+ 'fa-regular fa-hourglass-half',
+ 'fa-solid fa-hourglass-start',
+ 'fa-solid fa-house',
+ 'fa-solid fa-house-chimney',
+ 'fa-solid fa-house-chimney-crack',
+ 'fa-solid fa-house-chimney-medical',
+ 'fa-solid fa-house-chimney-user',
+ 'fa-solid fa-house-chimney-window',
+ 'fa-solid fa-house-circle-check',
+ 'fa-solid fa-house-circle-exclamation',
+ 'fa-solid fa-house-circle-xmark',
+ 'fa-solid fa-house-crack',
+ 'fa-solid fa-house-fire',
+ 'fa-solid fa-house-flag',
+ 'fa-solid fa-house-flood-water',
+ 'fa-solid fa-house-flood-water-circle-arrow-right',
+ 'fa-solid fa-house-laptop',
+ 'fa-solid fa-house-lock',
+ 'fa-solid fa-house-medical',
+ 'fa-solid fa-house-medical-circle-check',
+ 'fa-solid fa-house-medical-circle-exclamation',
+ 'fa-solid fa-house-medical-circle-xmark',
+ 'fa-solid fa-house-medical-flag',
+ 'fa-solid fa-house-signal',
+ 'fa-solid fa-house-tsunami',
+ 'fa-solid fa-house-user',
'fa-brands fa-houzz',
+ 'fa-solid fa-hryvnia-sign',
'fa-brands fa-html5',
'fa-brands fa-hubspot',
+ 'fa-solid fa-hurricane',
+ 'fa-solid fa-i',
+ 'fa-solid fa-i-cursor',
+ 'fa-solid fa-ice-cream',
+ 'fa-solid fa-icicles',
+ 'fa-solid fa-icons',
+ 'fa-solid fa-id-badge',
+ 'fa-regular fa-id-badge',
+ 'fa-solid fa-id-card',
+ 'fa-regular fa-id-card',
+ 'fa-solid fa-id-card-clip',
'fa-brands fa-ideal',
+ 'fa-solid fa-igloo',
+ 'fa-solid fa-image',
+ 'fa-regular fa-image',
+ 'fa-solid fa-image-portrait',
+ 'fa-solid fa-images',
+ 'fa-regular fa-images',
'fa-brands fa-imdb',
- 'fa-brands fa-innosoft',
+ 'fa-solid fa-inbox',
+ 'fa-solid fa-indent',
+ 'fa-solid fa-indian-rupee-sign',
+ 'fa-solid fa-industry',
+ 'fa-solid fa-infinity',
+ 'fa-solid fa-info',
'fa-brands fa-instagram',
'fa-brands fa-instalod',
'fa-brands fa-intercom',
'fa-brands fa-internet-explorer',
'fa-brands fa-invision',
'fa-brands fa-ioxhost',
+ 'fa-solid fa-italic',
'fa-brands fa-itch-io',
'fa-brands fa-itunes',
'fa-brands fa-itunes-note',
+ 'fa-solid fa-j',
+ 'fa-solid fa-jar',
+ 'fa-solid fa-jar-wheat',
'fa-brands fa-java',
+ 'fa-solid fa-jedi',
'fa-brands fa-jedi-order',
'fa-brands fa-jenkins',
+ 'fa-solid fa-jet-fighter',
+ 'fa-solid fa-jet-fighter-up',
'fa-brands fa-jira',
'fa-brands fa-joget',
+ 'fa-solid fa-joint',
'fa-brands fa-joomla',
'fa-brands fa-js',
- 'fa-brands fa-js-square',
'fa-brands fa-jsfiddle',
+ 'fa-solid fa-jug-detergent',
+ 'fa-brands fa-jxl',
+ 'fa-solid fa-k',
+ 'fa-solid fa-kaaba',
'fa-brands fa-kaggle',
+ 'fa-solid fa-key',
'fa-brands fa-keybase',
+ 'fa-solid fa-keyboard',
+ 'fa-regular fa-keyboard',
'fa-brands fa-keycdn',
+ 'fa-solid fa-khanda',
'fa-brands fa-kickstarter',
'fa-brands fa-kickstarter-k',
+ 'fa-solid fa-kip-sign',
+ 'fa-solid fa-kit-medical',
+ 'fa-solid fa-kitchen-set',
+ 'fa-solid fa-kiwi-bird',
'fa-brands fa-korvue',
+ 'fa-solid fa-l',
+ 'fa-solid fa-land-mine-on',
+ 'fa-solid fa-landmark',
+ 'fa-solid fa-landmark-dome',
+ 'fa-solid fa-landmark-flag',
+ 'fa-solid fa-language',
+ 'fa-solid fa-laptop',
+ 'fa-solid fa-laptop-code',
+ 'fa-solid fa-laptop-file',
+ 'fa-solid fa-laptop-medical',
'fa-brands fa-laravel',
+ 'fa-solid fa-lari-sign',
'fa-brands fa-lastfm',
- 'fa-brands fa-lastfm-square',
+ 'fa-solid fa-layer-group',
+ 'fa-solid fa-leaf',
'fa-brands fa-leanpub',
+ 'fa-solid fa-left-long',
+ 'fa-solid fa-left-right',
+ 'fa-solid fa-lemon',
+ 'fa-regular fa-lemon',
'fa-brands fa-less',
+ 'fa-solid fa-less-than',
+ 'fa-solid fa-less-than-equal',
+ 'fa-brands fa-letterboxd',
+ 'fa-solid fa-life-ring',
+ 'fa-regular fa-life-ring',
+ 'fa-solid fa-lightbulb',
+ 'fa-regular fa-lightbulb',
'fa-brands fa-line',
+ 'fa-solid fa-lines-leaning',
+ 'fa-solid fa-link',
+ 'fa-solid fa-link-slash',
'fa-brands fa-linkedin',
'fa-brands fa-linkedin-in',
'fa-brands fa-linode',
'fa-brands fa-linux',
+ 'fa-solid fa-lira-sign',
+ 'fa-solid fa-list',
+ 'fa-solid fa-list-check',
+ 'fa-solid fa-list-ol',
+ 'fa-solid fa-list-ul',
+ 'fa-solid fa-litecoin-sign',
+ 'fa-solid fa-location-arrow',
+ 'fa-solid fa-location-crosshairs',
+ 'fa-solid fa-location-dot',
+ 'fa-solid fa-location-pin',
+ 'fa-solid fa-location-pin-lock',
+ 'fa-solid fa-lock',
+ 'fa-solid fa-lock-open',
+ 'fa-solid fa-locust',
+ 'fa-solid fa-lungs',
+ 'fa-solid fa-lungs-virus',
'fa-brands fa-lyft',
+ 'fa-solid fa-m',
'fa-brands fa-magento',
+ 'fa-solid fa-magnet',
+ 'fa-solid fa-magnifying-glass',
+ 'fa-solid fa-magnifying-glass-arrow-right',
+ 'fa-solid fa-magnifying-glass-chart',
+ 'fa-solid fa-magnifying-glass-dollar',
+ 'fa-solid fa-magnifying-glass-location',
+ 'fa-solid fa-magnifying-glass-minus',
+ 'fa-solid fa-magnifying-glass-plus',
'fa-brands fa-mailchimp',
+ 'fa-solid fa-manat-sign',
'fa-brands fa-mandalorian',
+ 'fa-solid fa-map',
+ 'fa-regular fa-map',
+ 'fa-solid fa-map-location',
+ 'fa-solid fa-map-location-dot',
+ 'fa-solid fa-map-pin',
'fa-brands fa-markdown',
+ 'fa-solid fa-marker',
+ 'fa-solid fa-mars',
+ 'fa-solid fa-mars-and-venus',
+ 'fa-solid fa-mars-and-venus-burst',
+ 'fa-solid fa-mars-double',
+ 'fa-solid fa-mars-stroke',
+ 'fa-solid fa-mars-stroke-right',
+ 'fa-solid fa-mars-stroke-up',
+ 'fa-solid fa-martini-glass',
+ 'fa-solid fa-martini-glass-citrus',
+ 'fa-solid fa-martini-glass-empty',
+ 'fa-solid fa-mask',
+ 'fa-solid fa-mask-face',
+ 'fa-solid fa-mask-ventilator',
+ 'fa-solid fa-masks-theater',
'fa-brands fa-mastodon',
+ 'fa-solid fa-mattress-pillow',
'fa-brands fa-maxcdn',
+ 'fa-solid fa-maximize',
'fa-brands fa-mdb',
+ 'fa-solid fa-medal',
'fa-brands fa-medapps',
'fa-brands fa-medium',
- 'fa-brands fa-medium-m',
'fa-brands fa-medrt',
'fa-brands fa-meetup',
'fa-brands fa-megaport',
+ 'fa-solid fa-memory',
'fa-brands fa-mendeley',
+ 'fa-solid fa-menorah',
+ 'fa-solid fa-mercury',
+ 'fa-solid fa-message',
+ 'fa-regular fa-message',
+ 'fa-brands fa-meta',
+ 'fa-solid fa-meteor',
'fa-brands fa-microblog',
+ 'fa-solid fa-microchip',
+ 'fa-solid fa-microphone',
+ 'fa-solid fa-microphone-lines',
+ 'fa-solid fa-microphone-lines-slash',
+ 'fa-solid fa-microphone-slash',
+ 'fa-solid fa-microscope',
'fa-brands fa-microsoft',
+ 'fa-solid fa-mill-sign',
+ 'fa-solid fa-minimize',
+ 'fa-brands fa-mintbit',
+ 'fa-solid fa-minus',
+ 'fa-solid fa-mitten',
'fa-brands fa-mix',
'fa-brands fa-mixcloud',
'fa-brands fa-mixer',
'fa-brands fa-mizuni',
+ 'fa-solid fa-mobile',
+ 'fa-solid fa-mobile-button',
+ 'fa-solid fa-mobile-retro',
+ 'fa-solid fa-mobile-screen',
+ 'fa-solid fa-mobile-screen-button',
'fa-brands fa-modx',
'fa-brands fa-monero',
+ 'fa-solid fa-money-bill',
+ 'fa-solid fa-money-bill-1',
+ 'fa-regular fa-money-bill-1',
+ 'fa-solid fa-money-bill-1-wave',
+ 'fa-solid fa-money-bill-transfer',
+ 'fa-solid fa-money-bill-trend-up',
+ 'fa-solid fa-money-bill-wave',
+ 'fa-solid fa-money-bill-wheat',
+ 'fa-solid fa-money-bills',
+ 'fa-solid fa-money-check',
+ 'fa-solid fa-money-check-dollar',
+ 'fa-solid fa-monument',
+ 'fa-solid fa-moon',
+ 'fa-regular fa-moon',
+ 'fa-solid fa-mortar-pestle',
+ 'fa-solid fa-mosque',
+ 'fa-solid fa-mosquito',
+ 'fa-solid fa-mosquito-net',
+ 'fa-solid fa-motorcycle',
+ 'fa-solid fa-mound',
+ 'fa-solid fa-mountain',
+ 'fa-solid fa-mountain-city',
+ 'fa-solid fa-mountain-sun',
+ 'fa-solid fa-mug-hot',
+ 'fa-solid fa-mug-saucer',
+ 'fa-solid fa-music',
+ 'fa-solid fa-n',
+ 'fa-solid fa-naira-sign',
'fa-brands fa-napster',
'fa-brands fa-neos',
+ 'fa-solid fa-network-wired',
+ 'fa-solid fa-neuter',
+ 'fa-solid fa-newspaper',
+ 'fa-regular fa-newspaper',
+ 'fa-brands fa-nfc-directional',
+ 'fa-brands fa-nfc-symbol',
'fa-brands fa-nimblr',
'fa-brands fa-node',
'fa-brands fa-node-js',
+ 'fa-solid fa-not-equal',
+ 'fa-solid fa-notdef',
+ 'fa-solid fa-note-sticky',
+ 'fa-regular fa-note-sticky',
+ 'fa-solid fa-notes-medical',
'fa-brands fa-npm',
'fa-brands fa-ns8',
'fa-brands fa-nutritionix',
+ 'fa-solid fa-o',
+ 'fa-solid fa-object-group',
+ 'fa-regular fa-object-group',
+ 'fa-solid fa-object-ungroup',
+ 'fa-regular fa-object-ungroup',
'fa-brands fa-octopus-deploy',
'fa-brands fa-odnoklassniki',
- 'fa-brands fa-odnoklassniki-square',
+ 'fa-brands fa-odysee',
+ 'fa-solid fa-oil-can',
+ 'fa-solid fa-oil-well',
'fa-brands fa-old-republic',
+ 'fa-solid fa-om',
'fa-brands fa-opencart',
'fa-brands fa-openid',
+ 'fa-brands fa-opensuse',
'fa-brands fa-opera',
'fa-brands fa-optin-monster',
'fa-brands fa-orcid',
'fa-brands fa-osi',
+ 'fa-solid fa-otter',
+ 'fa-solid fa-outdent',
+ 'fa-solid fa-p',
+ 'fa-brands fa-padlet',
'fa-brands fa-page4',
'fa-brands fa-pagelines',
+ 'fa-solid fa-pager',
+ 'fa-solid fa-paint-roller',
+ 'fa-solid fa-paintbrush',
+ 'fa-solid fa-palette',
'fa-brands fa-palfed',
+ 'fa-solid fa-pallet',
+ 'fa-solid fa-panorama',
+ 'fa-solid fa-paper-plane',
+ 'fa-regular fa-paper-plane',
+ 'fa-solid fa-paperclip',
+ 'fa-solid fa-parachute-box',
+ 'fa-solid fa-paragraph',
+ 'fa-solid fa-passport',
+ 'fa-solid fa-paste',
+ 'fa-regular fa-paste',
'fa-brands fa-patreon',
+ 'fa-solid fa-pause',
+ 'fa-solid fa-paw',
'fa-brands fa-paypal',
- 'fa-brands fa-penny-arcade',
+ 'fa-solid fa-peace',
+ 'fa-solid fa-pen',
+ 'fa-solid fa-pen-clip',
+ 'fa-solid fa-pen-fancy',
+ 'fa-solid fa-pen-nib',
+ 'fa-solid fa-pen-ruler',
+ 'fa-solid fa-pen-to-square',
+ 'fa-regular fa-pen-to-square',
+ 'fa-solid fa-pencil',
+ 'fa-solid fa-people-arrows',
+ 'fa-solid fa-people-carry-box',
+ 'fa-solid fa-people-group',
+ 'fa-solid fa-people-line',
+ 'fa-solid fa-people-pulling',
+ 'fa-solid fa-people-robbery',
+ 'fa-solid fa-people-roof',
+ 'fa-solid fa-pepper-hot',
+ 'fa-brands fa-perbyte',
+ 'fa-solid fa-percent',
'fa-brands fa-periscope',
+ 'fa-solid fa-person',
+ 'fa-solid fa-person-arrow-down-to-line',
+ 'fa-solid fa-person-arrow-up-from-line',
+ 'fa-solid fa-person-biking',
+ 'fa-solid fa-person-booth',
+ 'fa-solid fa-person-breastfeeding',
+ 'fa-solid fa-person-burst',
+ 'fa-solid fa-person-cane',
+ 'fa-solid fa-person-chalkboard',
+ 'fa-solid fa-person-circle-check',
+ 'fa-solid fa-person-circle-exclamation',
+ 'fa-solid fa-person-circle-minus',
+ 'fa-solid fa-person-circle-plus',
+ 'fa-solid fa-person-circle-question',
+ 'fa-solid fa-person-circle-xmark',
+ 'fa-solid fa-person-digging',
+ 'fa-solid fa-person-dots-from-line',
+ 'fa-solid fa-person-dress',
+ 'fa-solid fa-person-dress-burst',
+ 'fa-solid fa-person-drowning',
+ 'fa-solid fa-person-falling',
+ 'fa-solid fa-person-falling-burst',
+ 'fa-solid fa-person-half-dress',
+ 'fa-solid fa-person-harassing',
+ 'fa-solid fa-person-hiking',
+ 'fa-solid fa-person-military-pointing',
+ 'fa-solid fa-person-military-rifle',
+ 'fa-solid fa-person-military-to-person',
+ 'fa-solid fa-person-praying',
+ 'fa-solid fa-person-pregnant',
+ 'fa-solid fa-person-rays',
+ 'fa-solid fa-person-rifle',
+ 'fa-solid fa-person-running',
+ 'fa-solid fa-person-shelter',
+ 'fa-solid fa-person-skating',
+ 'fa-solid fa-person-skiing',
+ 'fa-solid fa-person-skiing-nordic',
+ 'fa-solid fa-person-snowboarding',
+ 'fa-solid fa-person-swimming',
+ 'fa-solid fa-person-through-window',
+ 'fa-solid fa-person-walking',
+ 'fa-solid fa-person-walking-arrow-loop-left',
+ 'fa-solid fa-person-walking-arrow-right',
+ 'fa-solid fa-person-walking-dashed-line-arrow-right',
+ 'fa-solid fa-person-walking-luggage',
+ 'fa-solid fa-person-walking-with-cane',
+ 'fa-solid fa-peseta-sign',
+ 'fa-solid fa-peso-sign',
'fa-brands fa-phabricator',
'fa-brands fa-phoenix-framework',
'fa-brands fa-phoenix-squadron',
+ 'fa-solid fa-phone',
+ 'fa-solid fa-phone-flip',
+ 'fa-solid fa-phone-slash',
+ 'fa-solid fa-phone-volume',
+ 'fa-solid fa-photo-film',
'fa-brands fa-php',
'fa-brands fa-pied-piper',
'fa-brands fa-pied-piper-alt',
'fa-brands fa-pied-piper-hat',
'fa-brands fa-pied-piper-pp',
+ 'fa-solid fa-piggy-bank',
+ 'fa-solid fa-pills',
'fa-brands fa-pinterest',
'fa-brands fa-pinterest-p',
- 'fa-brands fa-pinterest-square',
+ 'fa-brands fa-pix',
+ 'fa-brands fa-pixiv',
+ 'fa-solid fa-pizza-slice',
+ 'fa-solid fa-place-of-worship',
+ 'fa-solid fa-plane',
+ 'fa-solid fa-plane-arrival',
+ 'fa-solid fa-plane-circle-check',
+ 'fa-solid fa-plane-circle-exclamation',
+ 'fa-solid fa-plane-circle-xmark',
+ 'fa-solid fa-plane-departure',
+ 'fa-solid fa-plane-lock',
+ 'fa-solid fa-plane-slash',
+ 'fa-solid fa-plane-up',
+ 'fa-solid fa-plant-wilt',
+ 'fa-solid fa-plate-wheat',
+ 'fa-solid fa-play',
'fa-brands fa-playstation',
+ 'fa-solid fa-plug',
+ 'fa-solid fa-plug-circle-bolt',
+ 'fa-solid fa-plug-circle-check',
+ 'fa-solid fa-plug-circle-exclamation',
+ 'fa-solid fa-plug-circle-minus',
+ 'fa-solid fa-plug-circle-plus',
+ 'fa-solid fa-plug-circle-xmark',
+ 'fa-solid fa-plus',
+ 'fa-solid fa-plus-minus',
+ 'fa-solid fa-podcast',
+ 'fa-solid fa-poo',
+ 'fa-solid fa-poo-storm',
+ 'fa-solid fa-poop',
+ 'fa-solid fa-power-off',
+ 'fa-solid fa-prescription',
+ 'fa-solid fa-prescription-bottle',
+ 'fa-solid fa-prescription-bottle-medical',
+ 'fa-solid fa-print',
'fa-brands fa-product-hunt',
+ 'fa-solid fa-pump-medical',
+ 'fa-solid fa-pump-soap',
'fa-brands fa-pushed',
+ 'fa-solid fa-puzzle-piece',
'fa-brands fa-python',
+ 'fa-solid fa-q',
'fa-brands fa-qq',
+ 'fa-solid fa-qrcode',
+ 'fa-solid fa-question',
'fa-brands fa-quinscape',
'fa-brands fa-quora',
+ 'fa-solid fa-quote-left',
+ 'fa-solid fa-quote-right',
+ 'fa-solid fa-r',
'fa-brands fa-r-project',
+ 'fa-solid fa-radiation',
+ 'fa-solid fa-radio',
+ 'fa-solid fa-rainbow',
+ 'fa-solid fa-ranking-star',
'fa-brands fa-raspberry-pi',
'fa-brands fa-ravelry',
'fa-brands fa-react',
'fa-brands fa-reacteurope',
'fa-brands fa-readme',
'fa-brands fa-rebel',
+ 'fa-solid fa-receipt',
+ 'fa-solid fa-record-vinyl',
+ 'fa-solid fa-rectangle-ad',
+ 'fa-solid fa-rectangle-list',
+ 'fa-regular fa-rectangle-list',
+ 'fa-solid fa-rectangle-xmark',
+ 'fa-regular fa-rectangle-xmark',
+ 'fa-solid fa-recycle',
'fa-brands fa-red-river',
'fa-brands fa-reddit',
'fa-brands fa-reddit-alien',
- 'fa-brands fa-reddit-square',
'fa-brands fa-redhat',
+ 'fa-solid fa-registered',
+ 'fa-regular fa-registered',
'fa-brands fa-renren',
+ 'fa-solid fa-repeat',
+ 'fa-solid fa-reply',
+ 'fa-solid fa-reply-all',
'fa-brands fa-replyd',
+ 'fa-solid fa-republican',
'fa-brands fa-researchgate',
'fa-brands fa-resolving',
+ 'fa-solid fa-restroom',
+ 'fa-solid fa-retweet',
'fa-brands fa-rev',
+ 'fa-solid fa-ribbon',
+ 'fa-solid fa-right-from-bracket',
+ 'fa-solid fa-right-left',
+ 'fa-solid fa-right-long',
+ 'fa-solid fa-right-to-bracket',
+ 'fa-solid fa-ring',
+ 'fa-solid fa-road',
+ 'fa-solid fa-road-barrier',
+ 'fa-solid fa-road-bridge',
+ 'fa-solid fa-road-circle-check',
+ 'fa-solid fa-road-circle-exclamation',
+ 'fa-solid fa-road-circle-xmark',
+ 'fa-solid fa-road-lock',
+ 'fa-solid fa-road-spikes',
+ 'fa-solid fa-robot',
+ 'fa-solid fa-rocket',
'fa-brands fa-rocketchat',
'fa-brands fa-rockrms',
+ 'fa-solid fa-rotate',
+ 'fa-solid fa-rotate-left',
+ 'fa-solid fa-rotate-right',
+ 'fa-solid fa-route',
+ 'fa-solid fa-rss',
+ 'fa-solid fa-ruble-sign',
+ 'fa-solid fa-rug',
+ 'fa-solid fa-ruler',
+ 'fa-solid fa-ruler-combined',
+ 'fa-solid fa-ruler-horizontal',
+ 'fa-solid fa-ruler-vertical',
+ 'fa-solid fa-rupee-sign',
+ 'fa-solid fa-rupiah-sign',
'fa-brands fa-rust',
+ 'fa-solid fa-s',
+ 'fa-solid fa-sack-dollar',
+ 'fa-solid fa-sack-xmark',
'fa-brands fa-safari',
+ 'fa-solid fa-sailboat',
'fa-brands fa-salesforce',
'fa-brands fa-sass',
+ 'fa-solid fa-satellite',
+ 'fa-solid fa-satellite-dish',
+ 'fa-solid fa-scale-balanced',
+ 'fa-solid fa-scale-unbalanced',
+ 'fa-solid fa-scale-unbalanced-flip',
'fa-brands fa-schlix',
+ 'fa-solid fa-school',
+ 'fa-solid fa-school-circle-check',
+ 'fa-solid fa-school-circle-exclamation',
+ 'fa-solid fa-school-circle-xmark',
+ 'fa-solid fa-school-flag',
+ 'fa-solid fa-school-lock',
+ 'fa-solid fa-scissors',
+ 'fa-brands fa-screenpal',
+ 'fa-solid fa-screwdriver',
+ 'fa-solid fa-screwdriver-wrench',
'fa-brands fa-scribd',
+ 'fa-solid fa-scroll',
+ 'fa-solid fa-scroll-torah',
+ 'fa-solid fa-sd-card',
'fa-brands fa-searchengin',
+ 'fa-solid fa-section',
+ 'fa-solid fa-seedling',
'fa-brands fa-sellcast',
'fa-brands fa-sellsy',
+ 'fa-solid fa-server',
'fa-brands fa-servicestack',
+ 'fa-solid fa-shapes',
+ 'fa-solid fa-share',
+ 'fa-solid fa-share-from-square',
+ 'fa-regular fa-share-from-square',
+ 'fa-solid fa-share-nodes',
+ 'fa-solid fa-sheet-plastic',
+ 'fa-solid fa-shekel-sign',
+ 'fa-solid fa-shield',
+ 'fa-solid fa-shield-cat',
+ 'fa-solid fa-shield-dog',
+ 'fa-solid fa-shield-halved',
+ 'fa-solid fa-shield-heart',
+ 'fa-solid fa-shield-virus',
+ 'fa-solid fa-ship',
+ 'fa-solid fa-shirt',
'fa-brands fa-shirtsinbulk',
+ 'fa-solid fa-shoe-prints',
+ 'fa-brands fa-shoelace',
+ 'fa-solid fa-shop',
+ 'fa-solid fa-shop-lock',
+ 'fa-solid fa-shop-slash',
'fa-brands fa-shopify',
'fa-brands fa-shopware',
+ 'fa-solid fa-shower',
+ 'fa-solid fa-shrimp',
+ 'fa-solid fa-shuffle',
+ 'fa-solid fa-shuttle-space',
+ 'fa-solid fa-sign-hanging',
+ 'fa-solid fa-signal',
+ 'fa-brands fa-signal-messenger',
+ 'fa-solid fa-signature',
+ 'fa-solid fa-signs-post',
+ 'fa-solid fa-sim-card',
'fa-brands fa-simplybuilt',
+ 'fa-solid fa-sink',
'fa-brands fa-sistrix',
+ 'fa-solid fa-sitemap',
'fa-brands fa-sith',
+ 'fa-brands fa-sitrox',
'fa-brands fa-sketch',
+ 'fa-solid fa-skull',
+ 'fa-solid fa-skull-crossbones',
'fa-brands fa-skyatlas',
'fa-brands fa-skype',
'fa-brands fa-slack',
- 'fa-brands fa-slack-hash',
+ 'fa-solid fa-slash',
+ 'fa-solid fa-sleigh',
+ 'fa-solid fa-sliders',
'fa-brands fa-slideshare',
+ 'fa-solid fa-smog',
+ 'fa-solid fa-smoking',
'fa-brands fa-snapchat',
- 'fa-brands fa-snapchat-ghost',
- 'fa-brands fa-snapchat-square',
+ 'fa-solid fa-snowflake',
+ 'fa-regular fa-snowflake',
+ 'fa-solid fa-snowman',
+ 'fa-solid fa-snowplow',
+ 'fa-solid fa-soap',
+ 'fa-solid fa-socks',
+ 'fa-solid fa-solar-panel',
+ 'fa-solid fa-sort',
+ 'fa-solid fa-sort-down',
+ 'fa-solid fa-sort-up',
'fa-brands fa-soundcloud',
'fa-brands fa-sourcetree',
+ 'fa-solid fa-spa',
+ 'fa-brands fa-space-awesome',
+ 'fa-solid fa-spaghetti-monster-flying',
'fa-brands fa-speakap',
'fa-brands fa-speaker-deck',
+ 'fa-solid fa-spell-check',
+ 'fa-solid fa-spider',
+ 'fa-solid fa-spinner',
+ 'fa-solid fa-splotch',
+ 'fa-solid fa-spoon',
'fa-brands fa-spotify',
+ 'fa-solid fa-spray-can',
+ 'fa-solid fa-spray-can-sparkles',
+ 'fa-solid fa-square',
+ 'fa-regular fa-square',
+ 'fa-solid fa-square-arrow-up-right',
+ 'fa-brands fa-square-behance',
+ 'fa-solid fa-square-binary',
+ 'fa-brands fa-square-bluesky',
+ 'fa-solid fa-square-caret-down',
+ 'fa-regular fa-square-caret-down',
+ 'fa-solid fa-square-caret-left',
+ 'fa-regular fa-square-caret-left',
+ 'fa-solid fa-square-caret-right',
+ 'fa-regular fa-square-caret-right',
+ 'fa-solid fa-square-caret-up',
+ 'fa-regular fa-square-caret-up',
+ 'fa-solid fa-square-check',
+ 'fa-regular fa-square-check',
+ 'fa-brands fa-square-dribbble',
+ 'fa-solid fa-square-envelope',
+ 'fa-brands fa-square-facebook',
'fa-brands fa-square-font-awesome',
'fa-brands fa-square-font-awesome-stroke',
+ 'fa-solid fa-square-full',
+ 'fa-regular fa-square-full',
+ 'fa-brands fa-square-git',
+ 'fa-brands fa-square-github',
+ 'fa-brands fa-square-gitlab',
+ 'fa-brands fa-square-google-plus',
+ 'fa-solid fa-square-h',
+ 'fa-brands fa-square-hacker-news',
+ 'fa-brands fa-square-instagram',
+ 'fa-brands fa-square-js',
+ 'fa-brands fa-square-lastfm',
+ 'fa-brands fa-square-letterboxd',
+ 'fa-solid fa-square-minus',
+ 'fa-regular fa-square-minus',
+ 'fa-solid fa-square-nfi',
+ 'fa-brands fa-square-odnoklassniki',
+ 'fa-solid fa-square-parking',
+ 'fa-solid fa-square-pen',
+ 'fa-solid fa-square-person-confined',
+ 'fa-solid fa-square-phone',
+ 'fa-solid fa-square-phone-flip',
+ 'fa-brands fa-square-pied-piper',
+ 'fa-brands fa-square-pinterest',
+ 'fa-solid fa-square-plus',
+ 'fa-regular fa-square-plus',
+ 'fa-solid fa-square-poll-horizontal',
+ 'fa-solid fa-square-poll-vertical',
+ 'fa-brands fa-square-reddit',
+ 'fa-solid fa-square-root-variable',
+ 'fa-solid fa-square-rss',
+ 'fa-solid fa-square-share-nodes',
+ 'fa-brands fa-square-snapchat',
+ 'fa-brands fa-square-steam',
+ 'fa-brands fa-square-threads',
+ 'fa-brands fa-square-tumblr',
+ 'fa-brands fa-square-twitter',
+ 'fa-solid fa-square-up-right',
+ 'fa-brands fa-square-upwork',
+ 'fa-brands fa-square-viadeo',
+ 'fa-brands fa-square-vimeo',
+ 'fa-solid fa-square-virus',
+ 'fa-brands fa-square-web-awesome',
+ 'fa-brands fa-square-web-awesome-stroke',
+ 'fa-brands fa-square-whatsapp',
+ 'fa-brands fa-square-x-twitter',
+ 'fa-brands fa-square-xing',
+ 'fa-solid fa-square-xmark',
+ 'fa-brands fa-square-youtube',
'fa-brands fa-squarespace',
'fa-brands fa-stack-exchange',
'fa-brands fa-stack-overflow',
'fa-brands fa-stackpath',
+ 'fa-solid fa-staff-snake',
+ 'fa-solid fa-stairs',
+ 'fa-solid fa-stamp',
+ 'fa-solid fa-stapler',
+ 'fa-solid fa-star',
+ 'fa-regular fa-star',
+ 'fa-solid fa-star-and-crescent',
+ 'fa-solid fa-star-half',
+ 'fa-regular fa-star-half',
+ 'fa-solid fa-star-half-stroke',
+ 'fa-regular fa-star-half-stroke',
+ 'fa-solid fa-star-of-david',
+ 'fa-solid fa-star-of-life',
'fa-brands fa-staylinked',
'fa-brands fa-steam',
- 'fa-brands fa-steam-square',
'fa-brands fa-steam-symbol',
+ 'fa-solid fa-sterling-sign',
+ 'fa-solid fa-stethoscope',
'fa-brands fa-sticker-mule',
+ 'fa-solid fa-stop',
+ 'fa-solid fa-stopwatch',
+ 'fa-solid fa-stopwatch-20',
+ 'fa-solid fa-store',
+ 'fa-solid fa-store-slash',
'fa-brands fa-strava',
+ 'fa-solid fa-street-view',
+ 'fa-solid fa-strikethrough',
'fa-brands fa-stripe',
'fa-brands fa-stripe-s',
+ 'fa-solid fa-stroopwafel',
+ 'fa-brands fa-stubber',
'fa-brands fa-studiovinari',
'fa-brands fa-stumbleupon',
'fa-brands fa-stumbleupon-circle',
+ 'fa-solid fa-subscript',
+ 'fa-solid fa-suitcase',
+ 'fa-solid fa-suitcase-medical',
+ 'fa-solid fa-suitcase-rolling',
+ 'fa-solid fa-sun',
+ 'fa-regular fa-sun',
+ 'fa-solid fa-sun-plant-wilt',
'fa-brands fa-superpowers',
+ 'fa-solid fa-superscript',
'fa-brands fa-supple',
'fa-brands fa-suse',
+ 'fa-solid fa-swatchbook',
'fa-brands fa-swift',
'fa-brands fa-symfony',
+ 'fa-solid fa-synagogue',
+ 'fa-solid fa-syringe',
+ 'fa-solid fa-t',
+ 'fa-solid fa-table',
+ 'fa-solid fa-table-cells',
+ 'fa-solid fa-table-cells-column-lock',
+ 'fa-solid fa-table-cells-large',
+ 'fa-solid fa-table-cells-row-lock',
+ 'fa-solid fa-table-cells-row-unlock',
+ 'fa-solid fa-table-columns',
+ 'fa-solid fa-table-list',
+ 'fa-solid fa-table-tennis-paddle-ball',
+ 'fa-solid fa-tablet',
+ 'fa-solid fa-tablet-button',
+ 'fa-solid fa-tablet-screen-button',
+ 'fa-solid fa-tablets',
+ 'fa-solid fa-tachograph-digital',
+ 'fa-solid fa-tag',
+ 'fa-solid fa-tags',
+ 'fa-solid fa-tape',
+ 'fa-solid fa-tarp',
+ 'fa-solid fa-tarp-droplet',
+ 'fa-solid fa-taxi',
'fa-brands fa-teamspeak',
+ 'fa-solid fa-teeth',
+ 'fa-solid fa-teeth-open',
'fa-brands fa-telegram',
- 'fa-brands fa-telegram-plane',
+ 'fa-solid fa-temperature-arrow-down',
+ 'fa-solid fa-temperature-arrow-up',
+ 'fa-solid fa-temperature-empty',
+ 'fa-solid fa-temperature-full',
+ 'fa-solid fa-temperature-half',
+ 'fa-solid fa-temperature-high',
+ 'fa-solid fa-temperature-low',
+ 'fa-solid fa-temperature-quarter',
+ 'fa-solid fa-temperature-three-quarters',
'fa-brands fa-tencent-weibo',
+ 'fa-solid fa-tenge-sign',
+ 'fa-solid fa-tent',
+ 'fa-solid fa-tent-arrow-down-to-line',
+ 'fa-solid fa-tent-arrow-left-right',
+ 'fa-solid fa-tent-arrow-turn-left',
+ 'fa-solid fa-tent-arrows-down',
+ 'fa-solid fa-tents',
+ 'fa-solid fa-terminal',
+ 'fa-solid fa-text-height',
+ 'fa-solid fa-text-slash',
+ 'fa-solid fa-text-width',
'fa-brands fa-the-red-yeti',
'fa-brands fa-themeco',
'fa-brands fa-themeisle',
+ 'fa-solid fa-thermometer',
'fa-brands fa-think-peaks',
+ 'fa-brands fa-threads',
+ 'fa-solid fa-thumbs-down',
+ 'fa-regular fa-thumbs-down',
+ 'fa-solid fa-thumbs-up',
+ 'fa-regular fa-thumbs-up',
+ 'fa-solid fa-thumbtack',
+ 'fa-solid fa-thumbtack-slash',
+ 'fa-solid fa-ticket',
+ 'fa-solid fa-ticket-simple',
'fa-brands fa-tiktok',
+ 'fa-solid fa-timeline',
+ 'fa-solid fa-toggle-off',
+ 'fa-solid fa-toggle-on',
+ 'fa-solid fa-toilet',
+ 'fa-solid fa-toilet-paper',
+ 'fa-solid fa-toilet-paper-slash',
+ 'fa-solid fa-toilet-portable',
+ 'fa-solid fa-toilets-portable',
+ 'fa-solid fa-toolbox',
+ 'fa-solid fa-tooth',
+ 'fa-solid fa-torii-gate',
+ 'fa-solid fa-tornado',
+ 'fa-solid fa-tower-broadcast',
+ 'fa-solid fa-tower-cell',
+ 'fa-solid fa-tower-observation',
+ 'fa-solid fa-tractor',
'fa-brands fa-trade-federation',
+ 'fa-solid fa-trademark',
+ 'fa-solid fa-traffic-light',
+ 'fa-solid fa-trailer',
+ 'fa-solid fa-train',
+ 'fa-solid fa-train-subway',
+ 'fa-solid fa-train-tram',
+ 'fa-solid fa-transgender',
+ 'fa-solid fa-trash',
+ 'fa-solid fa-trash-arrow-up',
+ 'fa-solid fa-trash-can',
+ 'fa-regular fa-trash-can',
+ 'fa-solid fa-trash-can-arrow-up',
+ 'fa-solid fa-tree',
+ 'fa-solid fa-tree-city',
'fa-brands fa-trello',
- 'fa-brands fa-tripadvisor',
+ 'fa-solid fa-triangle-exclamation',
+ 'fa-solid fa-trophy',
+ 'fa-solid fa-trowel',
+ 'fa-solid fa-trowel-bricks',
+ 'fa-solid fa-truck',
+ 'fa-solid fa-truck-arrow-right',
+ 'fa-solid fa-truck-droplet',
+ 'fa-solid fa-truck-fast',
+ 'fa-solid fa-truck-field',
+ 'fa-solid fa-truck-field-un',
+ 'fa-solid fa-truck-front',
+ 'fa-solid fa-truck-medical',
+ 'fa-solid fa-truck-monster',
+ 'fa-solid fa-truck-moving',
+ 'fa-solid fa-truck-pickup',
+ 'fa-solid fa-truck-plane',
+ 'fa-solid fa-truck-ramp-box',
+ 'fa-solid fa-tty',
'fa-brands fa-tumblr',
- 'fa-brands fa-tumblr-square',
+ 'fa-solid fa-turkish-lira-sign',
+ 'fa-solid fa-turn-down',
+ 'fa-solid fa-turn-up',
+ 'fa-solid fa-tv',
'fa-brands fa-twitch',
'fa-brands fa-twitter',
- 'fa-brands fa-twitter-square',
'fa-brands fa-typo3',
+ 'fa-solid fa-u',
'fa-brands fa-uber',
'fa-brands fa-ubuntu',
'fa-brands fa-uikit',
'fa-brands fa-umbraco',
+ 'fa-solid fa-umbrella',
+ 'fa-solid fa-umbrella-beach',
+ 'fa-brands fa-uncharted',
+ 'fa-solid fa-underline',
'fa-brands fa-uniregistry',
'fa-brands fa-unity',
+ 'fa-solid fa-universal-access',
+ 'fa-solid fa-unlock',
+ 'fa-solid fa-unlock-keyhole',
'fa-brands fa-unsplash',
'fa-brands fa-untappd',
+ 'fa-solid fa-up-down',
+ 'fa-solid fa-up-down-left-right',
+ 'fa-solid fa-up-long',
+ 'fa-solid fa-up-right-and-down-left-from-center',
+ 'fa-solid fa-up-right-from-square',
+ 'fa-solid fa-upload',
'fa-brands fa-ups',
+ 'fa-brands fa-upwork',
'fa-brands fa-usb',
+ 'fa-solid fa-user',
+ 'fa-regular fa-user',
+ 'fa-solid fa-user-astronaut',
+ 'fa-solid fa-user-check',
+ 'fa-solid fa-user-clock',
+ 'fa-solid fa-user-doctor',
+ 'fa-solid fa-user-gear',
+ 'fa-solid fa-user-graduate',
+ 'fa-solid fa-user-group',
+ 'fa-solid fa-user-injured',
+ 'fa-solid fa-user-large',
+ 'fa-solid fa-user-large-slash',
+ 'fa-solid fa-user-lock',
+ 'fa-solid fa-user-minus',
+ 'fa-solid fa-user-ninja',
+ 'fa-solid fa-user-nurse',
+ 'fa-solid fa-user-pen',
+ 'fa-solid fa-user-plus',
+ 'fa-solid fa-user-secret',
+ 'fa-solid fa-user-shield',
+ 'fa-solid fa-user-slash',
+ 'fa-solid fa-user-tag',
+ 'fa-solid fa-user-tie',
+ 'fa-solid fa-user-xmark',
+ 'fa-solid fa-users',
+ 'fa-solid fa-users-between-lines',
+ 'fa-solid fa-users-gear',
+ 'fa-solid fa-users-line',
+ 'fa-solid fa-users-rays',
+ 'fa-solid fa-users-rectangle',
+ 'fa-solid fa-users-slash',
+ 'fa-solid fa-users-viewfinder',
'fa-brands fa-usps',
'fa-brands fa-ussunnah',
+ 'fa-solid fa-utensils',
+ 'fa-solid fa-v',
'fa-brands fa-vaadin',
+ 'fa-solid fa-van-shuttle',
+ 'fa-solid fa-vault',
+ 'fa-solid fa-vector-square',
+ 'fa-solid fa-venus',
+ 'fa-solid fa-venus-double',
+ 'fa-solid fa-venus-mars',
+ 'fa-solid fa-vest',
+ 'fa-solid fa-vest-patches',
'fa-brands fa-viacoin',
'fa-brands fa-viadeo',
- 'fa-brands fa-viadeo-square',
+ 'fa-solid fa-vial',
+ 'fa-solid fa-vial-circle-check',
+ 'fa-solid fa-vial-virus',
+ 'fa-solid fa-vials',
'fa-brands fa-viber',
+ 'fa-solid fa-video',
+ 'fa-solid fa-video-slash',
+ 'fa-solid fa-vihara',
'fa-brands fa-vimeo',
- 'fa-brands fa-vimeo-square',
'fa-brands fa-vimeo-v',
'fa-brands fa-vine',
+ 'fa-solid fa-virus',
+ 'fa-solid fa-virus-covid',
+ 'fa-solid fa-virus-covid-slash',
+ 'fa-solid fa-virus-slash',
+ 'fa-solid fa-viruses',
'fa-brands fa-vk',
'fa-brands fa-vnv',
+ 'fa-solid fa-voicemail',
+ 'fa-solid fa-volcano',
+ 'fa-solid fa-volleyball',
+ 'fa-solid fa-volume-high',
+ 'fa-solid fa-volume-low',
+ 'fa-solid fa-volume-off',
+ 'fa-solid fa-volume-xmark',
+ 'fa-solid fa-vr-cardboard',
'fa-brands fa-vuejs',
+ 'fa-solid fa-w',
+ 'fa-solid fa-walkie-talkie',
+ 'fa-solid fa-wallet',
+ 'fa-solid fa-wand-magic',
+ 'fa-solid fa-wand-magic-sparkles',
+ 'fa-solid fa-wand-sparkles',
+ 'fa-solid fa-warehouse',
'fa-brands fa-watchman-monitoring',
+ 'fa-solid fa-water',
+ 'fa-solid fa-water-ladder',
+ 'fa-solid fa-wave-square',
'fa-brands fa-waze',
+ 'fa-solid fa-web-awesome',
+ 'fa-brands fa-web-awesome',
+ 'fa-brands fa-webflow',
'fa-brands fa-weebly',
'fa-brands fa-weibo',
+ 'fa-solid fa-weight-hanging',
+ 'fa-solid fa-weight-scale',
'fa-brands fa-weixin',
'fa-brands fa-whatsapp',
- 'fa-brands fa-whatsapp-square',
+ 'fa-solid fa-wheat-awn',
+ 'fa-solid fa-wheat-awn-circle-exclamation',
+ 'fa-solid fa-wheelchair',
+ 'fa-solid fa-wheelchair-move',
+ 'fa-solid fa-whiskey-glass',
'fa-brands fa-whmcs',
+ 'fa-solid fa-wifi',
'fa-brands fa-wikipedia-w',
+ 'fa-solid fa-wind',
+ 'fa-solid fa-window-maximize',
+ 'fa-regular fa-window-maximize',
+ 'fa-solid fa-window-minimize',
+ 'fa-regular fa-window-minimize',
+ 'fa-solid fa-window-restore',
+ 'fa-regular fa-window-restore',
'fa-brands fa-windows',
+ 'fa-solid fa-wine-bottle',
+ 'fa-solid fa-wine-glass',
+ 'fa-solid fa-wine-glass-empty',
+ 'fa-brands fa-wirsindhandwerk',
'fa-brands fa-wix',
'fa-brands fa-wizards-of-the-coast',
'fa-brands fa-wodu',
'fa-brands fa-wolf-pack-battalion',
+ 'fa-solid fa-won-sign',
'fa-brands fa-wordpress',
'fa-brands fa-wordpress-simple',
+ 'fa-solid fa-worm',
'fa-brands fa-wpbeginner',
'fa-brands fa-wpexplorer',
'fa-brands fa-wpforms',
'fa-brands fa-wpressr',
+ 'fa-solid fa-wrench',
+ 'fa-solid fa-x',
+ 'fa-solid fa-x-ray',
+ 'fa-brands fa-x-twitter',
'fa-brands fa-xbox',
'fa-brands fa-xing',
- 'fa-brands fa-xing-square',
+ 'fa-solid fa-xmark',
+ 'fa-solid fa-xmarks-lines',
+ 'fa-solid fa-y',
'fa-brands fa-y-combinator',
'fa-brands fa-yahoo',
'fa-brands fa-yammer',
@@ -979,160 +2053,12 @@ const icons = [
'fa-brands fa-yandex-international',
'fa-brands fa-yarn',
'fa-brands fa-yelp',
+ 'fa-solid fa-yen-sign',
+ 'fa-solid fa-yin-yang',
'fa-brands fa-yoast',
'fa-brands fa-youtube',
- 'fa-brands fa-youtube-square',
+ 'fa-solid fa-z',
'fa-brands fa-zhihu',
- 'fa-regular fa-address-book',
- 'fa-regular fa-address-card',
- 'fa-regular fa-angry',
- 'fa-regular fa-arrow-alt-circle-down',
- 'fa-regular fa-arrow-alt-circle-left',
- 'fa-regular fa-arrow-alt-circle-right',
- 'fa-regular fa-arrow-alt-circle-up',
- 'fa-regular fa-bell',
- 'fa-regular fa-bell-slash',
- 'fa-regular fa-bookmark',
- 'fa-regular fa-building',
- 'fa-regular fa-calendar',
- 'fa-regular fa-calendar-alt',
- 'fa-regular fa-calendar-check',
- 'fa-regular fa-calendar-minus',
- 'fa-regular fa-calendar-plus',
- 'fa-regular fa-calendar-times',
- 'fa-regular fa-caret-square-down',
- 'fa-regular fa-caret-square-left',
- 'fa-regular fa-caret-square-right',
- 'fa-regular fa-caret-square-up',
- 'fa-regular fa-chart-bar',
- 'fa-regular fa-check-circle',
- 'fa-regular fa-check-square',
- 'fa-regular fa-circle',
- 'fa-regular fa-clipboard',
- 'fa-regular fa-clock',
- 'fa-regular fa-clone',
- 'fa-regular fa-closed-captioning',
- 'fa-regular fa-comment',
- 'fa-regular fa-comment-alt',
- 'fa-regular fa-comment-dots',
- 'fa-regular fa-comments',
- 'fa-regular fa-compass',
- 'fa-regular fa-copy',
- 'fa-regular fa-copyright',
- 'fa-regular fa-credit-card',
- 'fa-regular fa-dizzy',
- 'fa-regular fa-dot-circle',
- 'fa-regular fa-edit',
- 'fa-regular fa-envelope',
- 'fa-regular fa-envelope-open',
- 'fa-regular fa-eye-slash',
- 'fa-regular fa-file',
- 'fa-regular fa-file-alt',
- 'fa-regular fa-file-archive',
- 'fa-regular fa-file-audio',
- 'fa-regular fa-file-code',
- 'fa-regular fa-file-excel',
- 'fa-regular fa-file-image',
- 'fa-regular fa-file-pdf',
- 'fa-regular fa-file-powerpoint',
- 'fa-regular fa-file-video',
- 'fa-regular fa-file-word',
- 'fa-regular fa-flag',
- 'fa-regular fa-flushed',
- 'fa-regular fa-folder',
- 'fa-regular fa-folder-open',
- 'fa-regular fa-frown',
- 'fa-regular fa-frown-open',
- 'fa-regular fa-futbol',
- 'fa-regular fa-gem',
- 'fa-regular fa-grimace',
- 'fa-regular fa-grin',
- 'fa-regular fa-grin-alt',
- 'fa-regular fa-grin-beam',
- 'fa-regular fa-grin-beam-sweat',
- 'fa-regular fa-grin-hearts',
- 'fa-regular fa-grin-squint',
- 'fa-regular fa-grin-squint-tears',
- 'fa-regular fa-grin-stars',
- 'fa-regular fa-grin-tears',
- 'fa-regular fa-grin-tongue',
- 'fa-regular fa-grin-tongue-squint',
- 'fa-regular fa-grin-tongue-wink',
- 'fa-regular fa-grin-wink',
- 'fa-regular fa-hand-lizard',
- 'fa-regular fa-hand-paper',
- 'fa-regular fa-hand-peace',
- 'fa-regular fa-hand-point-down',
- 'fa-regular fa-hand-point-left',
- 'fa-regular fa-hand-point-right',
- 'fa-regular fa-hand-point-up',
- 'fa-regular fa-hand-pointer',
- 'fa-regular fa-hand-rock',
- 'fa-regular fa-hand-scissors',
- 'fa-regular fa-hand-spock',
- 'fa-regular fa-handshake',
- 'fa-regular fa-hdd',
- 'fa-regular fa-heart',
- 'fa-regular fa-hospital',
- 'fa-regular fa-hourglass',
- 'fa-regular fa-id-badge',
- 'fa-regular fa-id-card',
- 'fa-regular fa-image',
- 'fa-regular fa-images',
- 'fa-regular fa-keyboard',
- 'fa-regular fa-kiss',
- 'fa-regular fa-kiss-beam',
- 'fa-regular fa-kiss-wink-heart',
- 'fa-regular fa-laugh',
- 'fa-regular fa-laugh-beam',
- 'fa-regular fa-laugh-squint',
- 'fa-regular fa-laugh-wink',
- 'fa-regular fa-lemon',
- 'fa-regular fa-life-ring',
- 'fa-regular fa-lightbulb',
- 'fa-regular fa-list-alt',
- 'fa-regular fa-map',
- 'fa-regular fa-meh',
- 'fa-regular fa-meh-blank',
- 'fa-regular fa-meh-rolling-eyes',
- 'fa-regular fa-minus-square',
- 'fa-regular fa-money-bill-alt',
- 'fa-regular fa-moon',
- 'fa-regular fa-newspaper',
- 'fa-regular fa-object-group',
- 'fa-regular fa-object-ungroup',
- 'fa-regular fa-paper-plane',
- 'fa-regular fa-pause-circle',
- 'fa-regular fa-play-circle',
- 'fa-regular fa-plus-square',
- 'fa-regular fa-question-circle',
- 'fa-regular fa-registered',
- 'fa-regular fa-sad-cry',
- 'fa-regular fa-sad-tear',
- 'fa-regular fa-save',
- 'fa-regular fa-share-square',
- 'fa-regular fa-smile',
- 'fa-regular fa-smile-beam',
- 'fa-regular fa-smile-wink',
- 'fa-regular fa-snowflake',
- 'fa-regular fa-square',
- 'fa-regular fa-star',
- 'fa-regular fa-star-half',
- 'fa-regular fa-sticky-note',
- 'fa-regular fa-stop-circle',
- 'fa-regular fa-sun',
- 'fa-regular fa-surprise',
- 'fa-regular fa-thumbs-down',
- 'fa-regular fa-thumbs-up',
- 'fa-regular fa-times-circle',
- 'fa-regular fa-tired',
- 'fa-regular fa-trash-alt',
- 'fa-regular fa-user',
- 'fa-regular fa-user-circle',
- 'fa-regular fa-window-close',
- 'fa-regular fa-window-maximize',
- 'fa-regular fa-window-minimize',
- 'fa-regular fa-window-restore',
];
@@ -1220,6 +2146,7 @@ document.addEventListener('DOMContentLoaded', function() {
input.value = selectedIconClass;
selectedIcon.className = selectedIconClass;
iconListContainer.style.display = 'none';
+ input.dispatchEvent(new Event('change', { bubbles: true }));
}
});
diff --git a/App/Bootstrap/.htaccess b/App/Bootstrap/.htaccess
new file mode 100644
index 00000000..c10abdcc
--- /dev/null
+++ b/App/Bootstrap/.htaccess
@@ -0,0 +1,2 @@
+# We disallow direct access to this directory
+Require all denied
\ No newline at end of file
diff --git a/App/Bootstrap/standalone.php b/App/Bootstrap/standalone.php
new file mode 100644
index 00000000..39949876
--- /dev/null
+++ b/App/Bootstrap/standalone.php
@@ -0,0 +1,22 @@
+Bootstrap file for the CMW application
+ * This file is responsible for initializing the application, loading configurations, and setting up the environment for standalone env.
+ * With this file, we don't load CMW routes / router.
+ */
+
+use CMW\Manager\Loader\Loader;
+
+// Set the environment to standalone
+$GLOBALS['CMW_ENV'] = 'standalone';
+
+// Set error reporting level
+error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_WARNING);
+
+// Standard CMW loading process
+require_once('App/Manager/Loader/Loader.php');
+Loader::loadProject();
+Loader::manageErrors();
+Loader::loadAttributes();
+Loader::setLocale();
\ No newline at end of file
diff --git a/App/Manager/Env/EnvManager.php b/App/Manager/Env/EnvManager.php
index cd1646b0..82041176 100644
--- a/App/Manager/Env/EnvManager.php
+++ b/App/Manager/Env/EnvManager.php
@@ -2,13 +2,36 @@
namespace CMW\Manager\Env;
+use Closure;
use CMW\Manager\Error\ErrorManager;
use CMW\Utils\Utils;
-use Closure;
use Exception;
-
+use function array_key_exists;
+use function bin2hex;
+use function count;
+use function dirname;
+use function explode;
+use function fclose;
+use function file;
+use function file_exists;
+use function file_get_contents;
+use function file_put_contents;
+use function fopen;
+use function fwrite;
+use function is_file;
use function is_readable;
use function is_writable;
+use function mb_strtoupper;
+use function openssl_random_pseudo_bytes;
+use function putenv;
+use function random_int;
+use function str_replace;
+use function str_starts_with;
+use function trim;
+use function unlink;
+use const FILE_IGNORE_NEW_LINES;
+use const FILE_SKIP_EMPTY_LINES;
+use const PHP_EOL;
/**
* Class: @EnvManager
@@ -20,7 +43,7 @@ class EnvManager
{
private static EnvManager $_instance;
- private string $envFileName = '.env';
+ private string $envFileName;
private string $envPath;
private string $path;
private string $absPath;
@@ -32,6 +55,7 @@ class EnvManager
public function __construct()
{
$this->absPath = dirname(__DIR__, 3) . '/';
+ $this->setFileName();
$this->envPath = $this->absPath;
$this->path = $this->envPath . $this->envFileName;
$this->apiURL = 'https://apiv2.craftmywebsite.fr';
@@ -43,7 +67,7 @@ public function __construct()
if (!$this->hasReadPerms()) {
ErrorManager::showCustomErrorPage(
'Permission error:',
- 'The file .env is not readable. Please check the permissions of the file.',
+ "The file $this->envFileName is not readable. Please check the permissions of the file.",
);
}
@@ -68,6 +92,16 @@ public function __isset(string $key)
return $this->valueExist($key);
}
+ private function setFileName(): void
+ {
+ if (isset($GLOBALS['CMW_ENV']) && $GLOBALS['CMW_ENV'] === 'standalone') {
+ $this->envFileName = '.env.standalone';
+ return;
+ }
+
+ $this->envFileName = '.env';
+ }
+
private function doWithFile(Closure $fn): void
{
$lines = file($this->path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
diff --git a/App/Manager/Error/ErrorManager.php b/App/Manager/Error/ErrorManager.php
index d2c533b0..4b3529d4 100644
--- a/App/Manager/Error/ErrorManager.php
+++ b/App/Manager/Error/ErrorManager.php
@@ -4,6 +4,7 @@
use CMW\Manager\Env\EnvManager;
use CMW\Manager\Permission\PermissionManager;
+use CMW\Manager\Theme\Loader\ThemeLoader;
use CMW\Manager\Theme\ThemeManager;
use CMW\Manager\Views\View;
use DateTime;
@@ -184,7 +185,7 @@ public static function showError(int $errorCode): void
// Here, we get data page we don't want to redirect user, just show him an error.
// Route /error get error file : $errorCode.view.php, if that file don't exist, we call Default.view.php (from errors package)
- $currentTheme = ThemeManager::getInstance()->getCurrentTheme()->name();
+ $currentTheme = ThemeLoader::getInstance()->getCurrentTheme()->name();
$defaultErrorFile = EnvManager::getInstance()->getValue('DIR') . "Public/Themes/$currentTheme/Views/Errors/default.view.php";
$errorFile = EnvManager::getInstance()->getValue('DIR') . "Public/Themes/$currentTheme/Views/Errors/$errorCode.view.php";
diff --git a/App/Manager/Filter/FilterManager.php b/App/Manager/Filter/FilterManager.php
index 2fe03b65..f2c0f12e 100644
--- a/App/Manager/Filter/FilterManager.php
+++ b/App/Manager/Filter/FilterManager.php
@@ -7,6 +7,7 @@
use function html_entity_decode;
use function is_null;
use function mb_substr;
+use function preg_match;
use function preg_replace;
use function trim;
use const ENT_QUOTES;
@@ -62,12 +63,21 @@ public static function filterMultiplesData(int $maxLength = 128, string ...$valu
* @param string $data
* @param int|null $maxLength
* @param mixed|null $orElse
+ * @param bool $allowScript
* @return mixed
- * @desc Securely filter data with maxlength parameter => optimized for strings.
- * If orElse parameter is used, you can return anything you want if value is not set or null.
- * If $maxLength is NULL, we are ignoring this parameter.
+ *
+ *
Securely filter data with maxlength parameter => optimized for strings.
+ *
If orElse parameter is used, you can return anything you want if value is not set or null.
+ *
If $maxLength is NULL, we are ignoring this parameter.
+ *
If $allowScript is true, we are removing all the data inside script tag.
+ *
*/
- public static function filterInputStringPost(string $data, ?int $maxLength = 255, mixed $orElse = false): mixed
+ public static function filterInputStringPost(
+ string $data,
+ ?int $maxLength = 255,
+ mixed $orElse = false,
+ bool $allowScript = false,
+ ): mixed
{
if ((!$orElse) && !isset($_POST[$data]) && !is_null($_POST[$data])) {
return $orElse;
@@ -75,13 +85,45 @@ public static function filterInputStringPost(string $data, ?int $maxLength = 255
$formattedData = trim(filter_input(INPUT_POST, $data, FILTER_UNSAFE_RAW));
+ if (!$allowScript) {
+ $formattedData = preg_replace('##is', '', $formattedData);
+ }
+
if (!is_null($maxLength)) {
- return mb_substr($formattedData, 0, $maxLength);
+ $formattedData = mb_substr($formattedData, 0, $maxLength);
}
return $formattedData;
}
+
+ /**
+ * @param string $data
+ * @param int|null $maxLength
+ * @param mixed|null $orElse
+ * @return mixed
+ *
+ *
Securely filter data with maxlength parameter => optimized for strings with strict validation.
+ *
Strict validation means that we are checking if the string contains only alphanumeric characters, underscores, and dashes.
+ *
If orElse parameter is used, you can return anything you want if value is not set or null.
+ *
If $maxLength is NULL, we are ignoring this parameter.
+ *
+ */
+ public static function filterInputStringPostStrict(string $data, ?int $maxLength = 255, mixed $orElse = false): mixed
+ {
+ if ((!$orElse) && !isset($_POST[$data]) && !is_null($_POST[$data])) {
+ return $orElse;
+ }
+
+ $formattedData = trim(filter_input(INPUT_POST, $data, FILTER_UNSAFE_RAW));
+
+ if (!is_null($maxLength)) {
+ return mb_substr($formattedData, 0, $maxLength);
+ }
+
+ return preg_replace('/^[a-zA-Z0-9_-]+$/u', '', $formattedData);
+ }
+
/**
* @param string $data
* @param int $maxLength
@@ -130,6 +172,34 @@ public static function filterInputIntGet(string $data, int $maxLength = 11, mixe
return mb_substr(trim(filter_input(INPUT_GET, $data, FILTER_SANITIZE_NUMBER_INT)), 0, $maxLength);
}
+
+ /**
+ * @param string $data
+ * @param string $pattern
+ * @param int|null $maxLength
+ * @param mixed $orElse
+ * @return mixed
+ */
+ public static function filterInputPostWithPattern(string $data, string $pattern, ?int $maxLength = 255, mixed $orElse = false): mixed
+ {
+ if ((!$orElse) && !isset($_POST[$data]) && !is_null($_POST[$data])) {
+ return $orElse;
+ }
+
+ $formattedData = trim(filter_input(INPUT_POST, $data, FILTER_UNSAFE_RAW));
+
+ if (!is_null($maxLength)) {
+ $formattedData = mb_substr($formattedData, 0, $maxLength);
+ }
+
+ if (!preg_match($pattern, $formattedData)) {
+ return $orElse;
+ }
+
+ return $formattedData;
+ }
+
+
/**
* @param string $mail
* @return bool
diff --git a/App/Manager/Flash/Flash.php b/App/Manager/Flash/Flash.php
index 4f6b037a..ea8c82cf 100644
--- a/App/Manager/Flash/Flash.php
+++ b/App/Manager/Flash/Flash.php
@@ -2,35 +2,82 @@
namespace CMW\Manager\Flash;
+use CMW\Manager\Flash\Implementations\BaseFlashImplementation;
+use CMW\Manager\Loader\Loader;
use JetBrains\PhpStorm\ExpectedValues;
class Flash
{
+ private static ?IFlash $instance = null;
+
+ public static function __callStatic(string $name, array $arguments)
+ {
+ if (self::$instance === null) {
+ self::$instance = self::loadFlashInstance();
+ }
+
+ if (!method_exists(self::$instance, $name)) {
+ throw new \BadMethodCallException("Method $name does not exist in " . get_class(self::$instance));
+ }
+
+ return self::$instance->$name(...$arguments);
+ }
+
+
+ private static function loadFlashInstance(): IFlash
+ {
+ return self::getHighestImplementation() ?? new BaseFlashImplementation();
+ }
+
+ private static function getHighestImplementation(): IFlash
+ {
+ $implementations = Loader::loadManagerImplementations(IFlash::class, 'Flash');
+
+ $highest = array_reduce($implementations, static function (?IFlash $highest, IFlash $current) {
+ return ($highest === null || $current->weight() > $highest->weight()) ? $current : $highest;
+ });
+
+ return $highest ?? new BaseFlashImplementation();
+ }
+
/**
* @return Alert[]
*/
public static function load(): array
{
- if (!isset($_SESSION['alerts'])) {
- $_SESSION['alerts'] = array();
+ if (self::$instance === null) {
+ self::$instance = self::loadFlashInstance();
}
- return $_SESSION['alerts'];
+
+ return self::$instance::load();
}
+ /**
+ * @return void
+ * Clear Flash data
+ */
public static function clear(): void
{
- $_SESSION['alerts'] = array();
+ if (self::$instance === null) {
+ self::$instance = self::loadFlashInstance();
+ }
+
+ self::$instance::clear();
}
+ /**
+ * @param string $alertType
+ * @param string $title
+ * @param string $message
+ * @param bool $isAdmin
+ * @return Alert
+ */
public static function send(#[ExpectedValues(flagsFromClass: Alert::class)] string $alertType, string $title, string $message, bool $isAdmin = false): Alert
{
- $alert = self::create($alertType, $title, $message, $isAdmin);
- $_SESSION['alerts'][] = $alert;
- return $alert;
- }
+ if (self::$instance === null) {
+ self::$instance = self::loadFlashInstance();
+ }
- private static function create(string $type, string $title, string $msg, bool $isAdmin): Alert
- {
- return new Alert($type, $title, $msg, $isAdmin);
+ return self::$instance::send($alertType, $title, $message, $isAdmin);
}
}
diff --git a/App/Manager/Flash/IFlash.php b/App/Manager/Flash/IFlash.php
new file mode 100644
index 00000000..5218704a
--- /dev/null
+++ b/App/Manager/Flash/IFlash.php
@@ -0,0 +1,25 @@
+ 'GET',
+ 'headers' => [],
+ 'timeout' => 30,
+ 'encoding' => 'utf-8',
+ 'body' => true,
+ 'follow' => true,
+ ];
+
+ public string|null $content = null;
+ public CurlHandle|false $curl;
+ public array $curlOpt = [];
+ public int $errorCode;
+ public string $errorMessage;
+ public array $headers = [];
+ public array $info = [];
+ public array $options = [];
+
+ public function __construct(string $url, array $options = [])
+ {
+ $defaults = static::$defaultsOptions;
+
+ $this->options = array_merge($defaults, $options);
+ $this->options['url'] = $url;
+
+ $this->fetch();
+ }
+
+ public function __call(string $method, array $arguments = [])
+ {
+ $method = str_replace('-', '_', Str::kebab($method));
+ return $this->info[$method] ?? null;
+ }
+
+ public static function __callStatic(string $method, array $arguments = []): static
+ {
+ return new static(
+ url: $arguments[0],
+ options: array_merge(
+ ['method' => strtoupper($method)],
+ $arguments[1] ?? []
+ )
+ );
+ }
+
+ /**
+ * Fetch the request
+ * @return $this
+ */
+ public function fetch(): static
+ {
+ // curl options
+ $this->curlOpt = [
+ CURLOPT_URL => $this->options['url'],
+ CURLOPT_ENCODING => $this->options['encoding'],
+ CURLOPT_CONNECTTIMEOUT => $this->options['timeout'],
+ CURLOPT_TIMEOUT => $this->options['timeout'],
+ CURLOPT_AUTOREFERER => true,
+ CURLOPT_RETURNTRANSFER => $this->options['body'],
+ CURLOPT_FOLLOWLOCATION => $this->options['follow'] ?? true,
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_HEADER => false,
+ CURLOPT_HEADERFUNCTION => $this->prepareHeaders(),
+ ];
+
+ // Set Progress
+ if (isset($this->options['progress']) && is_callable($this->options['progress'])) {
+ $this->curlOpt[CURLOPT_NOPROGRESS] = false;
+ $this->curlOpt[CURLOPT_PROGRESSFUNCTION] = $this->options['progress'];
+ }
+
+ // Add headers
+ if (empty($this->options['headers']) === false) {
+ $headers = [];
+ foreach ($this->options['headers'] as $key => $value) {
+ if (is_string($key) === true) {
+ $value = $key . ': ' . $value;
+ }
+
+ $headers[] = $value;
+ }
+
+ $this->curlOpt[CURLOPT_HTTPHEADER] = $headers;
+ }
+
+ // Set agent
+ if (empty($this->options['agent']) === false) {
+ $this->curlOpt[CURLOPT_USERAGENT] = $this->options['agent'];
+ }
+
+ // Prepare for specific methods
+ $this->prepareCurlOptions();
+
+ // Start curl request
+ $this->curl = curl_init();
+
+ curl_setopt_array($this->curl, $this->curlOpt);
+
+ $this->content = curl_exec($this->curl);
+ $this->info = curl_getinfo($this->curl);
+ $this->errorCode = curl_errno($this->curl);
+ $this->errorMessage = curl_error($this->curl);
+
+ if ($this->errorCode) {
+ throw new RuntimeException($this->errorMessage, $this->errorCode);
+ }
+
+ curl_close($this->curl);
+
+ return $this;
+ }
+
+ /**
+ * @param string $url
+ * @param array $params
+ * @return static
+ */
+ public static function request(string $url, array $params = []): static
+ {
+ return new static($url, $params);
+ }
+
+ /**
+ * Send a simple GET request
+ * @param string $url
+ * @param array $params
+ * @return static
+ */
+ public static function get(string $url, array $params = []): static
+ {
+ $options = ['method' => 'GET', 'data' => $params];
+ $query = http_build_query($options['data']);
+
+ if (!empty($query)) {
+ $url .= Url::hasQuery($url) ? '&' . $query : '?' . $query;
+ }
+
+ unset($options['data']);
+ return new static($url, $options);
+ }
+
+ /**
+ * Decode the json response content
+ * @param bool $array
+ * @return array|stdClass|null
+ */
+ public function json(bool $array = true): array|stdClass|null
+ {
+ try {
+ return json_decode($this->getContent(), $array, 512, JSON_THROW_ON_ERROR);
+ } catch (JsonException) {
+ return null;
+ }
+ }
+
+ /**
+ * @return Closure
+ */
+ public function prepareHeaders(): Closure
+ {
+ return function ($curl, $header): int {
+ $parts = Str::split($header, ':');
+
+ if (empty($parts[0]) === false && empty($parts[1]) === false) {
+ $key = array_shift($parts);
+ $this->headers[$key] = implode(':', $parts);
+ }
+
+ return strlen($header);
+ };
+ }
+
+ /**
+ * Prepare data for post fields
+ * @param array|string $data
+ * @return string
+ */
+ protected function preparePostFields(mixed $data): string
+ {
+ if (is_object($data) || is_array($data)) {
+ return http_build_query($data);
+ }
+
+ return $data;
+ }
+
+ /**
+ * Return the http status code
+ * @return int|null
+ */
+ public function getStatusCode(): ?int
+ {
+ return $this->info['http_code'] ?? null;
+ }
+
+ /**
+ * Return the response content
+ * @return string|null
+ */
+ public function getContent(): ?string
+ {
+ return $this->content;
+ }
+
+ /**
+ * Return the response headers
+ * @return array
+ */
+ public function getHeaders(): array
+ {
+ return $this->headers;
+ }
+
+ /**
+ * Return the response info
+ * @return array
+ */
+ public function getInfo(): array
+ {
+ return $this->info;
+ }
+
+ /**
+ * Return the error code
+ * @return int
+ */
+ public function getErrorCode(): int
+ {
+ return $this->errorCode;
+ }
+
+ /**
+ * Return the error message
+ * @return string
+ */
+ public function getErrorMessage(): string
+ {
+ return $this->errorMessage;
+ }
+
+ /**
+ * Return the request method
+ * @return string
+ */
+ public function getMethod(): string
+ {
+ return $this->options['method'];
+ }
+
+ /**
+ * Return the request URL
+ * @return string
+ */
+ public function getUrl(): string
+ {
+ return $this->options['url'];
+ }
+
+ /**
+ * Return the request options
+ * @return array
+ */
+ public function getOptions(): array
+ {
+ return $this->options;
+ }
+
+ /**
+ * @return void
+ */
+ private function prepareCurlOptions(): void
+ {
+ switch (HttpMethodsType::fromName(Str::upper($this->options['method']))) {
+ case HttpMethodsType::POST:
+ $this->curlOpt[CURLOPT_POST] = true;
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'POST';
+ $this->curlOpt[CURLOPT_POSTFIELDS] = $this->preparePostFields($this->options['data']);
+ break;
+ case HttpMethodsType::PUT:
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'PUT';
+ $this->curlOpt[CURLOPT_POSTFIELDS] = $this->preparePostFields($this->options['data']);
+
+ if ($this->options['file']) {
+ $this->curlOpt[CURLOPT_INFILE] = fopen($this->options['file'], 'rb');
+ $this->curlOpt[CURLOPT_INFILESIZE] = File::size($this->options['file']) ?? 0;
+ }
+ break;
+ case HttpMethodsType::PATCH:
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'PATCH';
+ $this->curlOpt[CURLOPT_POSTFIELDS] = $this->preparePostFields($this->options['data']);
+ break;
+ case HttpMethodsType::DELETE:
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+ $this->curlOpt[CURLOPT_POSTFIELDS] = $this->preparePostFields($this->options['data']);
+ break;
+ case HttpMethodsType::HEAD:
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'HEAD';
+ $this->curlOpt[CURLOPT_POSTFIELDS] = $this->preparePostFields($this->options['data']);
+ $this->curlOpt[CURLOPT_NOBODY] = true;
+ break;
+ case HttpMethodsType::GET:
+ $this->curlOpt[CURLOPT_CUSTOMREQUEST] = 'GET';
+ break;
+ }
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Http/Url.php b/App/Manager/Http/Url.php
new file mode 100644
index 00000000..a7e91f48
--- /dev/null
+++ b/App/Manager/Http/Url.php
@@ -0,0 +1,61 @@
+ 'App/Package/',
+ 'Controller', 'Model', 'Mapper', 'Entity', 'Implementation', 'Interface', 'Event', 'Exception', 'Type', 'Component', 'Classes', 'PackageInfo', 'Package', 'Permissions' => 'App/Package/',
'Manager' => 'App/Manager/',
'Utils' => 'App/Utils/',
'Theme' => 'Public/Themes/',
@@ -134,6 +134,7 @@ private static function getPackageElements(array $namespace, string $elementName
'Exception' => 'Exception/',
'Type' => 'Type/',
'Component' => 'Components/',
+ 'Classes' => 'Classes/',
'PackageInfo', 'Manager' => '',
'Package', 'Theme' => '/',
'Permissions' => 'Init/',
diff --git a/App/Manager/Loader/Loader.php b/App/Manager/Loader/Loader.php
index f7a36d3d..9b64f574 100644
--- a/App/Manager/Loader/Loader.php
+++ b/App/Manager/Loader/Loader.php
@@ -2,6 +2,7 @@
namespace CMW\Manager\Loader;
+use Closure;
use CMW\Controller\Core\PackageController;
use CMW\Controller\Installer\InstallerController;
use CMW\Manager\Class\PackageManager;
@@ -15,10 +16,18 @@
use ReflectionClass;
use function array_diff;
use function class_exists;
+use function date_default_timezone_set;
use function file_exists;
+use function in_array;
+use function is_array;
use function is_dir;
+use function is_file;
+use function is_null;
+use function is_subclass_of;
+use function method_exists;
use function pathinfo;
use function scandir;
+use function ucfirst;
use const PATHINFO_FILENAME;
class Loader
@@ -122,7 +131,11 @@ public static function loadManagerImplementations($interface, string $managerNam
continue;
}
- $instance = $namespace::getInstance();
+ if (method_exists($namespace, 'getInstance')) {
+ $instance = $namespace::getInstance();
+ } else {
+ $instance = new $namespace();
+ }
if (!($instance instanceof $interface)) {
continue;
@@ -237,6 +250,14 @@ public static function loadAttributes(): void
}
}
+ /**
+ * @param string $path
+ * @param string $fileName
+ * @param string $package
+ * @param string|null $name
+ * @param int $weight
+ * @return void
+ */
public static function createSimpleRoute(string $path, string $fileName, string $package, ?string $name = null, int $weight = 2): void
{
Router::getInstance()->get($path, function () use ($package, $fileName) {
@@ -244,6 +265,17 @@ public static function createSimpleRoute(string $path, string $fileName, string
}, $name, $weight);
}
+ /**
+ * @param string $path
+ * @param Closure $callable
+ * @param int $weight
+ * @return void
+ */
+ public static function createSimpleRouteCallable(string $path, Closure $callable, int $weight = 2): void
+ {
+ Router::getInstance()->get($path, $callable, $path, $weight);
+ }
+
public static function listAttributes(string $file): void
{
if (in_array($file, self::$fileLoadedAttr, true)) {
diff --git a/App/Manager/Mail/MailManager.php b/App/Manager/Mail/MailManager.php
index e0067fe4..e75bec18 100644
--- a/App/Manager/Mail/MailManager.php
+++ b/App/Manager/Mail/MailManager.php
@@ -60,10 +60,13 @@ public function sendMailSMTP(string $receiver, string $subject, string $body, ?s
$mail->addAddress($receiver);
$mail->addReplyTo($config?->getMailReply());
+ $emailTemplate = $config?->getBody() ?? '[MAIL_CONTENT]';
+ $finalBody = str_replace('[MAIL_CONTENT]', $body, $emailTemplate);
+
// Content
$mail->isHTML();
$mail->Subject = $subject;
- $mail->Body = $body . ' ' . $config?->getFooter();
+ $mail->Body = $finalBody;
// Send mail
$status = $mail->send();
diff --git a/App/Manager/Package/AbstractEntity.php b/App/Manager/Package/AbstractEntity.php
index 499d9712..e2a2f881 100644
--- a/App/Manager/Package/AbstractEntity.php
+++ b/App/Manager/Package/AbstractEntity.php
@@ -175,4 +175,17 @@ public function toArray(): array
return $data;
}
+
+ /**
+ * @param static[] $data
+ * @return array
+ */
+ public static function fromEntitiesToArray(array $data): array
+ {
+ $toReturn = [];
+ foreach ($data as $item) {
+ $toReturn[] = $item->toArray();
+ }
+ return $toReturn;
+ }
}
diff --git a/App/Manager/Requests/Request.php b/App/Manager/Requests/Request.php
index 6c795f60..55eb1163 100644
--- a/App/Manager/Requests/Request.php
+++ b/App/Manager/Requests/Request.php
@@ -7,19 +7,19 @@
class Request
{
private string $url;
- private string $method;
+ private HttpMethodsType $method;
private array $params;
private array $data;
private string $emitUrl;
/**
* @param string $url
- * @param string $method
+ * @param HttpMethodsType $method
* @param array $params
* @param array $data
* @param string $emitUrl
*/
- public function __construct(string $url, #[ExpectedValues(['GET', 'POST'])] string $method, array $params,
+ public function __construct(string $url, HttpMethodsType $method, array $params,
array $data, string $emitUrl)
{
$this->url = $url;
@@ -38,9 +38,9 @@ public function getUrl(): string
}
/**
- * @return string
+ * @return HttpMethodsType
*/
- public function getMethod(): string
+ public function getMethod(): HttpMethodsType
{
return $this->method;
}
diff --git a/App/Manager/Router/Implementations/BaseRouterImplementation.php b/App/Manager/Router/Implementations/BaseRouterImplementation.php
index 8fef2ee9..744f6094 100644
--- a/App/Manager/Router/Implementations/BaseRouterImplementation.php
+++ b/App/Manager/Router/Implementations/BaseRouterImplementation.php
@@ -63,7 +63,9 @@ public function weight(): int
private function registerGetRoute(Link $link, ReflectionMethod $method): Route
{
return $this->get($link->getPath(), function (...$values) use ($method) {
- $request = new Request(url: $this->url, method: 'GET',
+ $request = new Request(
+ url: $this->url,
+ method: HttpMethodsType::GET,
params: $this->getRouteByUrl($this->url)?->getParams() ?? [],
data: $_GET ?? [],
emitUrl: $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
@@ -88,7 +90,7 @@ private function registerPostRoute(Link $link, ReflectionMethod $method): Route
$request = new Request(
url: $this->url,
- method: 'POST',
+ method: HttpMethodsType::POST,
params: $this->getRouteByUrl($this->url)?->getParams() ?? [],
data: $_POST ?? [],
emitUrl: $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
diff --git a/App/Manager/Router/Link.php b/App/Manager/Router/Link.php
index 4ee3f867..fbdf7ca3 100644
--- a/App/Manager/Router/Link.php
+++ b/App/Manager/Router/Link.php
@@ -4,6 +4,7 @@
use JetBrains\PhpStorm\ExpectedValues;
use Attribute;
+use function str_contains;
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class Link
@@ -93,4 +94,13 @@ public function isSecure(): bool
{
return $this->secure;
}
+
+ /**
+ * Check if the route contains 'cmw-admin'
+ * @return bool
+ */
+ public function isAdmin(): bool
+ {
+ return str_contains($this->path, 'cmw-admin') || str_contains($this->scope, 'cmw-admin');
+ }
}
diff --git a/App/Manager/Router/Request.php b/App/Manager/Router/Request.php
new file mode 100644
index 00000000..c4cea77b
--- /dev/null
+++ b/App/Manager/Router/Request.php
@@ -0,0 +1,64 @@
+method = HttpMethodsType::fromName($_SERVER['REQUEST_METHOD']);
+ $this->url = Website::getUrl();
+ }
+
+ /**
+ * @return HttpMethodsType
+ */
+ public function getMethod(): HttpMethodsType
+ {
+ return $this->method;
+ }
+
+ /**
+ * @return string
+ */
+ public function getUrl(): string
+ {
+ return $this->url;
+ }
+
+ /**
+ * @return array
+ */
+ public function getHeaders(): array
+ {
+ if (empty($this->headers)) {
+ $this->headers = getallheaders();
+ }
+
+ return $this->headers;
+ }
+
+ /**
+ * @param string $name
+ * @param string|null $defaultValue
+ * @return string|null
+ */
+ public function getHeader(string $name, ?string $defaultValue = null): ?string
+ {
+ $headers = $this->getHeaders();
+ $name = str_replace('-', '_', strtoupper($name));
+
+ return $headers[$name] ?? $defaultValue;
+ }
+
+
+}
\ No newline at end of file
diff --git a/App/Manager/Security/HealthReport.php b/App/Manager/Security/HealthReport.php
index 80a48358..274ff290 100644
--- a/App/Manager/Security/HealthReport.php
+++ b/App/Manager/Security/HealthReport.php
@@ -6,6 +6,7 @@
use CMW\Controller\Users\UsersSessionsController;
use CMW\Manager\Database\DatabaseManager;
use CMW\Manager\Env\EnvManager;
+use CMW\Manager\Theme\Loader\ThemeLoader;
use CMW\Manager\Theme\ThemeManager;
use CMW\Manager\Updater\UpdatesManager;
use CMW\Model\Core\CoreModel;
@@ -60,8 +61,8 @@ public function generateReport(): string
// Themes
$themes = '';
- foreach (ThemeManager::getInstance()->getInstalledThemes() as $theme) {
- $isActiveTheme = ThemeManager::getInstance()->getCurrentTheme()->name() === $theme->name();
+ foreach (ThemeLoader::getInstance()->getInstalledThemes() as $theme) {
+ $isActiveTheme = ThemeLoader::getInstance()->getCurrentTheme()->name() === $theme->name();
$themes .= ' - ' . $theme->name() . ' @' . $theme->version();
diff --git a/App/Manager/Theme/Config/ThemeConfigResolver.php b/App/Manager/Theme/Config/ThemeConfigResolver.php
new file mode 100644
index 00000000..115e465e
--- /dev/null
+++ b/App/Manager/Theme/Config/ThemeConfigResolver.php
@@ -0,0 +1,124 @@
+getDefaultThemeValue($menuKey, $themeKey);
+ if (!$conf['theme_config_value'] || $conf['theme_config_value'] === $default) {
+ return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . "Public/Themes/{$themeName}/{$default}";
+ }
+ return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . "Public/Uploads/{$themeName}/Img/{$conf['theme_config_value']}";
+ }
+ return $conf['theme_config_value'] ?? "UNDEFINED_$themeConfigNameFormatted";
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Récupère la valeur par défaut d'une clé de thème depuis le fichier de configuration.
+ *
+ * @param string $MenuKey
+ * @param string $key
+ * @return string
+ */
+ public function getDefaultThemeValue(string $MenuKey, string $key): string
+ {
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
+ $configPath = EnvManager::getInstance()->getValue('DIR') . "Public/Themes/{$themeName}/Config/config.settings.php";
+
+ if (!file_exists($configPath)) {
+ return '';
+ }
+
+ $menus = include $configPath;
+
+ foreach ($menus as $menu) {
+ if (isset($menu->requiredPackage) && !PackageController::isInstalled($menu->requiredPackage)) {
+ continue;
+ }
+ if ($menu->key === $MenuKey) {
+ foreach ($menu->values as $value) {
+ if ($value->themeKey === $key) {
+ return $value->defaultValue;
+ }
+ }
+ }
+
+ }
+ return '';
+ }
+
+ /**
+ * @param string $menuKey
+ * @param string $themeKey
+ * @return string|null
+ */
+ public function getEditorType(string $menuKey, string $themeKey): ?string
+ {
+ foreach (ThemeEditorProcessor::getInstance()->getThemeMenus() as $menu) {
+ if ($menu->getMenuKey() === $menuKey) {
+ foreach ($menu->values as $value) {
+ if ($value->themeKey === $themeKey) {
+ return $value->type;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @param string $menuKey
+ * @param string $themeKey
+ * @return EditorRangeOptions|null
+ */
+ public function getEditorRangeOptions(string $menuKey, string $themeKey): ?EditorRangeOptions
+ {
+
+ foreach (ThemeEditorProcessor::getInstance()->getThemeMenus() as $menu) {
+ if ($menu->key !== $menuKey) continue;
+ foreach ($menu->values as $val) {
+ if ($val->themeKey === $themeKey && isset($val->rangeOptions[0])) {
+ return $val->rangeOptions[0];
+ }
+ }
+ }
+ return null;
+ }
+
+ public function resolveImagePath(string $themeName, ?string $value, string $menuKey, string $themeKey): string
+ {
+ $default = $this->getDefaultThemeValue($menuKey, $themeKey);
+ $subfolder = EnvManager::getInstance()->getValue('PATH_SUBFOLDER');
+
+ if (!$value || $value === $default) {
+ return $subfolder . "Public/Themes/{$themeName}/{$default}";
+ }
+
+ return $subfolder . "Public/Uploads/{$themeName}/Img/{$value}";
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Theme/Config/ThemeMapper.php b/App/Manager/Theme/Config/ThemeMapper.php
new file mode 100644
index 00000000..1cc18c68
--- /dev/null
+++ b/App/Manager/Theme/Config/ThemeMapper.php
@@ -0,0 +1,10 @@
+getValue('DIR') . "Public/Themes/$themeName/Config/config.settings.php";
+
+ if (!file_exists($configPath)) {
+ return [];
+ }
+
+ $menus = include $configPath;
+ $flat = [];
+
+ foreach ($menus as $menu) {
+ if (isset($menu->requiredPackage) && !PackageController::isInstalled($menu->requiredPackage)) {
+ continue;
+ }
+
+ foreach ($menu->values as $value) {
+ $key = ThemeMapper::mapConfigKey($menu->key, $value->themeKey);
+ $flat[$key] = $value->defaultValue;
+ }
+ }
+
+ return $flat;
+ }
+}
diff --git a/App/Manager/Theme/Editor/Entities/EditorMenu.php b/App/Manager/Theme/Editor/Entities/EditorMenu.php
new file mode 100644
index 00000000..c9043f94
--- /dev/null
+++ b/App/Manager/Theme/Editor/Entities/EditorMenu.php
@@ -0,0 +1,72 @@
+title = $title;
+ $this->key = $key;
+ $this->scope = $scope;
+ $this->requiredPackage = $requiredPackage;
+ $this->values = $values;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ /**
+ * @return string
+ */
+ public function getMenuKey(): string
+ {
+ return $this->key;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getScope(): ?string
+ {
+ return $this->scope;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getRequiredPackage(): ?string
+ {
+ return $this->requiredPackage;
+ }
+
+ /**
+ * @return \CMW\Manager\Theme\Editor\Entities\EditorValue[]
+ */
+ public function getValues(): array
+ {
+ return $this->values;
+ }
+}
diff --git a/App/Manager/Theme/Editor/Entities/EditorRangeOptions.php b/App/Manager/Theme/Editor/Entities/EditorRangeOptions.php
new file mode 100644
index 00000000..46addb01
--- /dev/null
+++ b/App/Manager/Theme/Editor/Entities/EditorRangeOptions.php
@@ -0,0 +1,71 @@
+min = $min;
+ $this->max = $max;
+ $this->step = $step;
+ $this->prefix = $prefix;
+ $this->suffix = $suffix;
+ }
+
+ /**
+ * @return float
+ */
+ public function getMin(): float
+ {
+ return $this->min;
+ }
+
+ /**
+ * @return float
+ */
+ public function getMax(): float
+ {
+ return $this->max;
+ }
+
+ /**
+ * @return float
+ */
+ public function getStep(): float
+ {
+ return $this->step;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getPrefix(): ?string
+ {
+ return $this->prefix;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getSuffix(): ?string
+ {
+ return $this->suffix;
+ }
+
+}
diff --git a/App/Manager/Theme/Editor/Entities/EditorSelectOptions.php b/App/Manager/Theme/Editor/Entities/EditorSelectOptions.php
new file mode 100644
index 00000000..f0d34499
--- /dev/null
+++ b/App/Manager/Theme/Editor/Entities/EditorSelectOptions.php
@@ -0,0 +1,31 @@
+value = $value;
+ $this->text = $text;
+ }
+
+ public function getValue(): string
+ {
+ return $this->value;
+ }
+
+ public function getText(): string
+ {
+ return $this->text;
+ }
+}
diff --git a/App/Manager/Theme/Editor/Entities/EditorType.php b/App/Manager/Theme/Editor/Entities/EditorType.php
new file mode 100644
index 00000000..9646393c
--- /dev/null
+++ b/App/Manager/Theme/Editor/Entities/EditorType.php
@@ -0,0 +1,18 @@
+title = $title;
+ $this->themeKey = $themeKey;
+ $this->defaultValue = $defaultValue;
+ $this->type = $type;
+ $this->selectOptions = $selectOptions;
+ $this->rangeOptions = $rangeOptions;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ /**
+ * @return string
+ */
+ public function getThemeKey(): string
+ {
+ return $this->themeKey;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getDefaultValue(): mixed
+ {
+ return $this->defaultValue;
+ }
+
+ /**
+ * @return string
+ */
+ public function getType(): string
+ {
+ return $this->type;
+ }
+
+ /**
+ * @return EditorSelectOptions[]
+ */
+ public function getSelectOptions(): array
+ {
+ return $this->selectOptions;
+ }
+
+ /**
+ * @return EditorRangeOptions[]
+ */
+ public function getRangeOptions(): array
+ {
+ return $this->rangeOptions;
+ }
+}
diff --git a/App/Manager/Theme/Editor/ThemeEditorProcessor.php b/App/Manager/Theme/Editor/ThemeEditorProcessor.php
new file mode 100644
index 00000000..7051b8e2
--- /dev/null
+++ b/App/Manager/Theme/Editor/ThemeEditorProcessor.php
@@ -0,0 +1,389 @@
+loadHTML('' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+
+ $xpath = new DOMXPath($dom);
+
+ $this->processCmwVisible($xpath);
+ $this->processCmwText($xpath);
+ $this->processCmwStyle($xpath);
+ $this->processCmwClass($xpath);
+ $this->processCmwAttr($xpath);
+ $this->processCmwVar($xpath);
+ $this->processCmwStyleComments($xpath);
+
+ return $dom->saveHTML();
+ }
+
+ /**
+ * @param \DOMXPath $xpath
+ * @return void
+ */
+ private function processCmwVisible(DOMXPath $xpath): void
+ {
+ $elements = $xpath->query('//*[@data-cmw-visible]');
+ foreach ($elements as $element) {
+ $data = $element->getAttribute('data-cmw-visible');
+
+ if (preg_match('/^([\w-]+):([\w-]+)$/', $data, $matches)) {
+ $menu = $matches[1];
+ $key = $matches[2];
+ $visible = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+
+ if (!$visible || $visible === '0') {
+ $element->parentNode?->removeChild($element);
+ } else {
+ $element->removeAttribute('data-cmw-visible');
+ }
+ }
+ }
+ }
+
+ /**
+ * @param \DOMXPath $xpath
+ * @return void
+ */
+ private function processCmwText(DOMXPath $xpath): void
+ {
+ $nodes = $xpath->query('//*[@data-cmw]');
+ foreach ($nodes as $node) {
+ if (preg_match('/^([\w-]+):([\w-]+)$/', $node->getAttribute('data-cmw'), $m)) {
+ $menu = $m[1];
+ $key = $m[2];
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+ $editorType = ThemeConfigResolver::getInstance()->getEditorType($menu, $key);
+
+ while ($node->firstChild) {
+ $node->removeChild($node->firstChild);
+ }
+
+ if ($editorType === EditorType::HTML) {
+ $tmpDoc = new DOMDocument();
+ $tmpDoc->loadHTML('' . $val . '
', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+ foreach ($tmpDoc->documentElement->childNodes as $child) {
+ $node->appendChild($node->ownerDocument->importNode($child, true));
+ }
+ } else {
+ $node->appendChild($node->ownerDocument->createTextNode($val));
+ }
+
+ $node->removeAttribute('data-cmw');
+ }
+ }
+ }
+
+ /**
+ * @param \DOMXPath $xpath
+ * @return void
+ */
+ private function processCmwStyle(DOMXPath $xpath): void
+ {
+ $nodes = $xpath->query('//*[@data-cmw-style]');
+ foreach ($nodes as $node) {
+ $styleAttr = $node->getAttribute('style');
+ $existingStyles = [];
+
+ if ($styleAttr) {
+ foreach (explode(';', $styleAttr) as $styleLine) {
+ if (strpos($styleLine, ':') !== false) {
+ [$k, $v] = explode(':', $styleLine, 2);
+ $existingStyles[trim($k)] = trim($v);
+ }
+ }
+ }
+
+ $rules = explode(';', $node->getAttribute('data-cmw-style'));
+ foreach ($rules as $rule) {
+ if (count(explode(':', $rule)) === 3) {
+ [$prop, $menu, $key] = explode(':', $rule);
+
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+ $editorType = ThemeConfigResolver::getInstance()->getEditorType($menu, $key);
+
+ if ($editorType === EditorType::RANGE) {
+ $opts = ThemeConfigResolver::getInstance()->getEditorRangeOptions($menu, $key);
+ $val = $opts->getPrefix() . $val . $opts->getSuffix();
+ }
+
+ if ($editorType === EditorType::IMAGE && in_array(trim($prop), ['background', 'background-image', 'list-style-image', 'mask-image'])) {
+ $val = "url('{$val}')";
+ }
+
+ $existingStyles[trim($prop)] = $val;
+ }
+ }
+
+ $finalStyle = implode('; ', array_map(fn($k, $v) => "$k: $v", array_keys($existingStyles), $existingStyles));
+ $node->setAttribute('style', $finalStyle);
+ $node->removeAttribute('data-cmw-style');
+ }
+ }
+
+ /**
+ * @param \DOMXPath $xpath
+ * @return void
+ */
+ private function processCmwClass(DOMXPath $xpath): void
+ {
+ $nodes = $xpath->query('//*[@data-cmw-class]');
+ foreach ($nodes as $node) {
+ $refs = explode(' ', $node->getAttribute('data-cmw-class'));
+
+ $dynamicClasses = [];
+ foreach ($refs as $ref) {
+ [$menu, $key] = explode(':', $ref);
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+
+ $editorType = ThemeConfigResolver::getInstance()->getEditorType($menu, $key);
+ if ($editorType === EditorType::RANGE) {
+ $opts = ThemeConfigResolver::getInstance()->getEditorRangeOptions($menu, $key);
+ if ($opts instanceof EditorRangeOptions) {
+ $val = $opts->getPrefix() . $val . $opts->getSuffix();
+ }
+ }
+
+ if ($val) {
+ $dynamicClasses[] = trim($val);
+ }
+ }
+
+ $existingClasses = explode(' ', $node->getAttribute('class') ?? '');
+ $finalClasses = array_filter(array_merge($existingClasses, $dynamicClasses));
+ $node->setAttribute('class', implode(' ', $finalClasses));
+ $node->removeAttribute('data-cmw-class');
+ }
+ }
+
+ /**
+ * @param \DOMXPath $xpath
+ * @return void
+ */
+ private function processCmwAttr(DOMXPath $xpath): void
+ {
+ $nodes = $xpath->query('//*[@data-cmw-attr]');
+ foreach ($nodes as $node) {
+ $defs = explode(' ', $node->getAttribute('data-cmw-attr'));
+
+ foreach ($defs as $def) {
+ [$attr, $menu, $key] = explode(':', $def);
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+ $node->setAttribute($attr, $val);
+ }
+
+ $node->removeAttribute('data-cmw-attr');
+ }
+ }
+
+ private function processCmwVar(DOMXPath $xpath): void
+ {
+ $nodes = $xpath->query('//*[@data-cmw-var]');
+ foreach ($nodes as $node) {
+ $defs = explode(' ', $node->getAttribute('data-cmw-var'));
+
+ foreach ($defs as $def) {
+ [$varName, $menu, $key] = explode(':', $def);
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+ $node->setAttribute('style', $node->getAttribute('style') . "; $varName: $val");
+ }
+
+ $node->removeAttribute('data-cmw-var');
+ }
+ }
+
+ private function processCmwStyleComments(DOMXPath $xpath): void
+ {
+ $styleTags = $xpath->query('//style');
+
+ foreach ($styleTags as $styleTag) {
+ $css = $styleTag->textContent;
+
+ $css = preg_replace_callback('/\/\*cmw:([\w-]+):([\w-]+)\*\//', function ($matches) {
+ [$full, $menu, $key] = $matches;
+ $val = ThemeModel::getInstance()->fetchConfigValue($menu, $key);
+
+ $editorType = ThemeConfigResolver::getInstance()->getEditorType($menu, $key);
+
+ if ($editorType === EditorType::RANGE) {
+ $opts = ThemeConfigResolver::getInstance()->getEditorRangeOptions($menu, $key);
+ $val = $opts->getPrefix() . $val . $opts->getSuffix();
+ }
+
+ return $val . " /*cmw:$menu:$key*/";
+ }, $css);
+
+ $styleTag->textContent = $css;
+ }
+ }
+
+
+ /**
+ * @return EditorMenu[]
+ */
+ public function getThemeMenus(): array
+ {
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
+
+ $configPath = EnvManager::getInstance()->getValue('DIR') . "Public/Themes/$themeName/Config/config.settings.php";
+
+ if (!file_exists($configPath)) {
+ return [];
+ }
+
+ $menus = include $configPath;
+
+ return array_filter($menus, function ($menu) {
+ return !isset($menu->requiredPackage) || PackageController::isInstalled($menu->requiredPackage);
+ });
+ }
+
+ /**
+ * @param $value
+ * @param $menuKey
+ * @param $val
+ * @return string
+ * @description render input by EditorType in builder menu
+ */
+ public function renderInput($value, $menuKey, $val) :string
+ {
+ $inputName = ThemeMapper::mapConfigKey($menuKey, $value->themeKey);
+ $inputId = htmlspecialchars($value->themeKey);
+ $label = htmlspecialchars($value->title);
+ $valEscaped = htmlspecialchars($val);
+
+ switch ($value->type) {
+ case 'color':
+ return <<{$label}
+
+HTML;
+
+ case 'number':
+ return <<{$label}
+
+HTML;
+
+ case 'text':
+ return <<{$label}
+
+HTML;
+
+ case 'html':
+ return <<{$label}
+
+
+HTML;
+
+
+ case 'faPicker':
+ return <<
+HTML;
+
+ case 'textarea':
+ case 'css':
+ return <<{$label}
+
+HTML;
+
+ case 'boolean':
+ $checked = ($val === "1" || ($val === null && $value->defaultValue === "1")) ? "checked" : "";
+ return <<
+ {$label}
+
+
+
+HTML;
+
+ case 'select':
+ $optionsHtml = '';
+ foreach ($value->selectOptions ?? [] as $option) {
+ $selected = ($val === $option->value || ($val === null && $value->defaultValue === $option->value)) ? 'selected' : '';
+ $optVal = htmlspecialchars($option->value);
+ $optText = htmlspecialchars($option->text);
+ $optionsHtml .= "{$optText} ";
+ }
+ return <<{$label}
+ {$optionsHtml}
+HTML;
+
+ case 'image':
+ return <<{$label}
+
+HTML;
+
+ case 'range':
+ $range = $value->rangeOptions[0] ?? null;
+
+ if (!$range) {
+ return ''; // si mal configuré
+ }
+
+ $min = $range->getMin();
+ $max = $range->getMax();
+ $step = $range->getStep();
+ $prefix = htmlspecialchars($range->getPrefix());
+ $suffix = htmlspecialchars($range->getSuffix());
+
+ return <<{$label} ({$prefix}{$valEscaped}{$suffix} )
+
+
+
+
+HTML;
+
+
+ default:
+ return <<{$label}
+
+HTML;
+ }
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Theme/File/ThemeFileManager.php b/App/Manager/Theme/File/ThemeFileManager.php
new file mode 100644
index 00000000..e007edca
--- /dev/null
+++ b/App/Manager/Theme/File/ThemeFileManager.php
@@ -0,0 +1,131 @@
+getValue('PATH_SUBFOLDER') . 'Admin/Resources/Assets/Img/local-theme.jpg';
+ }
+
+ /**
+ * @param string $theme
+ * @return void
+ * @desc Apply the settings of a theme and overwrite existing values.
+ */
+ public function installThemeSettings(string $theme): void
+ {
+ $themeConfigFile = "Public/Themes/$theme/Config/config.settings.php";
+
+ if (!file_exists($themeConfigFile)) {
+ return;
+ }
+
+ $menus = include $themeConfigFile;
+
+ foreach ($menus as $menu) {
+ if (!($menu instanceof EditorMenu)) {
+ continue;
+ }
+
+ foreach ($menu->values as $value) {
+ if (!($value instanceof EditorValue)) {
+ continue;
+ }
+
+ $configKey = ThemeMapper::mapConfigKey($menu->key, $value->themeKey);
+ $defaultValue = $value->defaultValue;
+
+ ThemeModel::getInstance()->storeThemeConfig($configKey, $defaultValue, $theme);
+ }
+ }
+ }
+
+ /**
+ * @param string $theme
+ * @return void
+ * @desc Update the settings of a theme without overwriting existing values.
+ */
+ public function updateThemeSettings(string $theme): void
+ {
+ $themeConfigFile = "Public/Themes/$theme/Config/config.settings.php";
+
+ if (!file_exists($themeConfigFile)) {
+ return;
+ }
+
+ $menus = include $themeConfigFile;
+
+ $existingKeys = ThemeModel::getInstance()->getExistingThemeConfigKeys($theme);
+
+
+ foreach ($menus as $menu) {
+ if (!($menu instanceof EditorMenu)) {
+ continue;
+ }
+
+ foreach ($menu->values as $value) {
+ if (!($value instanceof EditorValue)) {
+ continue;
+ }
+
+ $configKey = ThemeMapper::mapConfigKey($menu->key, $value->themeKey);
+
+ $newConfigs = [];
+
+ if (!in_array($configKey, $existingKeys, true)) {
+ $newConfigs[] = [
+ 'name' => $configKey,
+ 'value' => $value->defaultValue
+ ];
+ }
+ }
+ }
+ if (!empty($newConfigs)) {
+ ThemeModel::getInstance()->storeThemeConfigBulk($newConfigs, $theme);
+ }
+ }
+
+ /**
+ * @param string $name
+ * @return UninstallThemeType
+ * @desc Completely uninstall a local theme (delete files and database)
+ */
+ public static function uninstallLocalTheme(string $name): UninstallThemeType
+ {
+ if (!ThemeLoader::getInstance()->isLocalThemeExist($name)) {
+ return UninstallThemeType::ERROR_THEME_NOT_FOUND;
+ }
+
+ //Prevent default theme uninstallation
+ if ($name === ThemeManager::$defaultThemeName) {
+ return UninstallThemeType::ERROR_THEME_IS_DEFAULT;
+ }
+
+ // Uninstall DB
+ $configPdo = ThemeModel::getInstance()->getInstance()->transactionalDeleteThemeConfig($name);
+
+ // Uninstall files
+ if (!Directory::delete(EnvManager::getInstance()->getValue('DIR') . "Public/Themes/$name")) {
+ $configPdo->rollBack();
+ return UninstallThemeType::ERROR_THEME_DELETE_FILES;
+ }
+
+ //If all is good, we commit the transaction
+ $configPdo->commit();
+
+ return UninstallThemeType::SUCCESS;
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Theme/Loader/ThemeLoader.php b/App/Manager/Theme/Loader/ThemeLoader.php
new file mode 100644
index 00000000..e6649380
--- /dev/null
+++ b/App/Manager/Theme/Loader/ThemeLoader.php
@@ -0,0 +1,96 @@
+getValue('INSTALLSTEP') !== '-1';
+
+ if (!$isInstallation) {
+ $currentThemeName = CoreModel::getInstance()->fetchOption('Theme');
+ }
+
+ if (!$this::getInstance()->isLocalThemeExist($currentThemeName)) {
+ (new ThemeNotFoundException($currentThemeName))->invokeErrorPage();
+ }
+
+ return $this::getInstance()->getTheme($currentThemeName);
+ }
+
+ /**
+ * @param string $themeName
+ * @return IThemeConfig|null
+ */
+ public function getTheme(string $themeName): ?IThemeConfig
+ {
+ $namespace = 'CMW\\Theme\\' . $themeName . '\Theme';
+
+ if (!class_exists($namespace)) {
+ return null;
+ }
+
+ $classInstance = new $namespace();
+
+ if (!is_subclass_of($classInstance, IThemeConfig::class)) {
+ return null;
+ }
+
+ return $classInstance;
+ }
+
+ /**
+ * @return IThemeConfig[]
+ */
+ public function getInstalledThemes(): array
+ {
+ $toReturn = [];
+ $themesFolder = 'Public/Themes';
+ $themeDirs = Directory::getFolders($themesFolder);
+
+ foreach ($themeDirs as $theme) {
+ $themeFile = "$themesFolder/$theme/Theme.php";
+ if (file_exists($themeFile) && !empty(file_get_contents($themeFile))) {
+ $toReturn[] = $this->getTheme($theme);
+ }
+ }
+
+ return $toReturn;
+ }
+
+
+ /**
+ * @param string $theme
+ * @return bool
+ */
+ public function isThemeInstalled(string $theme): bool
+ {
+ foreach ($this->getInstalledThemes() as $installedTheme) {
+ if ($theme === $installedTheme->name()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string $name
+ * @return bool
+ */
+ public function isLocalThemeExist(string $name): bool
+ {
+ return file_exists("Public/Themes/$name/Theme.php");
+ }
+
+}
\ No newline at end of file
diff --git a/App/Manager/Theme/Market/ThemeMarketManager.php b/App/Manager/Theme/Market/ThemeMarketManager.php
new file mode 100644
index 00000000..169dde7a
--- /dev/null
+++ b/App/Manager/Theme/Market/ThemeMarketManager.php
@@ -0,0 +1,44 @@
+getInstalledThemes();
+
+ $marketThemesName = [];
+
+ foreach ($this->getMarketThemes() as $marketTheme):
+ $marketThemesName[] = $marketTheme['name'];
+ endforeach;
+
+ foreach ($installedThemes as $installedTheme):
+ if (!in_array($installedTheme->name(), $marketThemesName, true)):
+ $toReturn[] = $installedTheme;
+ endif;
+ endforeach;
+
+ return $toReturn;
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Theme/ThemeManager.php b/App/Manager/Theme/ThemeManager.php
index 233f4eb6..24165c64 100644
--- a/App/Manager/Theme/ThemeManager.php
+++ b/App/Manager/Theme/ThemeManager.php
@@ -2,116 +2,32 @@
namespace CMW\Manager\Theme;
-use CMW\Manager\Api\PublicAPI;
-use CMW\Manager\Env\EnvManager;
use CMW\Manager\Manager\AbstractManager;
-use CMW\Manager\Theme\Exceptions\ThemeNotFoundException;
-use CMW\Model\Core\CoreModel;
-use CMW\Model\Core\ThemeModel;
-use CMW\Utils\Directory;
+use CMW\Manager\Theme\Loader\ThemeLoader;
class ThemeManager extends AbstractManager
{
public static string $defaultThemeName = "Sampler";
- public function defaultImageLink(): string
- {
- return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'Admin/Resources/Assets/Img/local-theme.jpg';
- }
-
- public function getCurrentTheme(): IThemeConfig
- {
- $currentThemeName = self::$defaultThemeName;
- $isInstallation = EnvManager::getInstance()->getValue('INSTALLSTEP') !== '-1';
-
- if (!$isInstallation) {
- $currentThemeName = CoreModel::getInstance()->fetchOption('Theme');
- }
- if (!$this->isLocalThemeExist($currentThemeName)) {
- (new ThemeNotFoundException($currentThemeName))->invokeErrorPage();
- }
- return $this->getTheme($currentThemeName);
- }
-
- /**
- * @param string $themeName
- * @return IThemeConfig|null
- */
- public function getTheme(string $themeName): ?IThemeConfig
- {
- $namespace = 'CMW\\Theme\\' . $themeName . '\Theme';
- if (!class_exists($namespace)) {
- return null;
- }
- $classInstance = new $namespace();
- if (!is_subclass_of($classInstance, IThemeConfig::class)) {
- return null;
- }
- return $classInstance;
- }
- /**
- * @return IThemeConfig[]
- */
- public function getInstalledThemes(): array
- {
- $toReturn = [];
- $themesFolder = 'Public/Themes';
- $contentDirectory = array_diff(scandir("$themesFolder/"), ['..', '.']);
- foreach ($contentDirectory as $theme) {
- if (file_exists("$themesFolder/$theme/Theme.php") && !empty(file_get_contents("$themesFolder/$theme/Theme.php"))) {
- $toReturn[] = $this->getTheme($theme);
- }
- }
- return $toReturn;
- }
-
- /**
- * @return IThemeConfig[]
- * @desc Return all themes local (remove thème get from the public market)
- */
- public function getLocalThemes(): array
- {
- $toReturn = [];
- $installedThemes = $this->getInstalledThemes();
-
- $marketThemesName = [];
-
- foreach ($this->getMarketThemes() as $marketTheme):
- $marketThemesName[] = $marketTheme['name'];
- endforeach;
-
- foreach ($installedThemes as $installedTheme):
- if (!in_array($installedTheme->name(), $marketThemesName, true)):
- $toReturn[] = $installedTheme;
- endif;
- endforeach;
-
- return $toReturn;
- }
-
- /**
- * @return void
- */
- public function getCurrentThemeConfigFile(): void
- {
- $themeConfigFile = 'Public/Themes/' . $this->getCurrentTheme()->name() . '/Config/config.php';
- require_once $themeConfigFile;
- }
+ /*
+ * deprecated and unused method waiting for deletion
+ * */
/**
* @return array
+ * @deprecated Sera supprimé en alpha-10 remplacé par : getFlattenedThemeConfigSettings
*/
public function getCurrentThemeConfigSettings(): array
{
- $themeConfigFile = 'Public/Themes/' . $this->getCurrentTheme()->name() . '/Config/config.settings.php';
+ $themeConfigFile = 'Public/Themes/' . ThemeLoader::getInstance()->getCurrentTheme()->name() . '/Config/config.settings.php';
if (!file_exists($themeConfigFile)) {
return [];
@@ -130,92 +46,10 @@ public function getCurrentThemeConfigSettings(): array
* @param string $setting
* @return ?string
* @Desc Return a specific local setting
+ * @deprecated Sera supprimé en alpha-10. La methode est utilisée dans des méthodes dépréciées
*/
public function getCurrentThemeConfigSetting(string $setting): ?string
{
return $this->getCurrentThemeConfigSettings()[$setting] ?? null;
}
-
- /**
- * @param string $theme
- * @return bool
- */
- public function isThemeInstalled(string $theme): bool
- {
- foreach ($this->getInstalledThemes() as $installedTheme) {
- if ($theme === $installedTheme->name()) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * @param string $theme
- * @return void
- */
- public function installThemeSettings(string $theme): void
- {
- $themeConfigFile = "Public/Themes/$theme/Config/config.settings.php";
-
- if (!file_exists($themeConfigFile)) {
- return;
- }
-
- $content = include $themeConfigFile;
-
- foreach ($content as $config => $value) {
- ThemeModel::getInstance()->getInstance()->storeThemeConfig($config, $value, $theme);
- }
- }
-
- /**
- * @return array
- * @desc Return the list of public thèmes from our market
- */
- public function getMarketThemes(): array
- {
- return PublicAPI::getData('market/resources/filtered/0');
- }
-
- /**
- * @param string $name
- * @return bool
- */
- public function isLocalThemeExist(string $name): bool
- {
- return file_exists("Public/Themes/$name/Theme.php");
- }
-
- /**
- * @param string $name
- * @return UninstallThemeType
- * @desc Completely uninstall a local theme (delete files and database)
- */
- public function uninstallLocalTheme(string $name): UninstallThemeType
- {
- if (!$this->isLocalThemeExist($name)) {
- return UninstallThemeType::ERROR_THEME_NOT_FOUND;
- }
-
- //Prevent default theme uninstallation
- if ($name === self::$defaultThemeName) {
- return UninstallThemeType::ERROR_THEME_IS_DEFAULT;
- }
-
- // Uninstall DB
- $configPdo = ThemeModel::getInstance()->getInstance()->transactionalDeleteThemeConfig($name);
-
- // Uninstall files
- if (!Directory::delete(EnvManager::getInstance()->getValue('DIR') . "Public/Themes/$name")) {
- $configPdo->rollBack();
- return UninstallThemeType::ERROR_THEME_DELETE_FILES;
- }
-
- //If all is good, we commit the transaction
- $configPdo->commit();
-
- return UninstallThemeType::SUCCESS;
- }
}
diff --git a/App/Manager/Updater/CMSUpdaterManager.php b/App/Manager/Updater/CMSUpdaterManager.php
index a8b6674a..cc4530c6 100644
--- a/App/Manager/Updater/CMSUpdaterManager.php
+++ b/App/Manager/Updater/CMSUpdaterManager.php
@@ -8,13 +8,25 @@
use CMW\Manager\Flash\Alert;
use CMW\Manager\Flash\Flash;
use CMW\Manager\Lang\LangManager;
+use CMW\Manager\Manager\AbstractManager;
+use CMW\Utils\Directory;
+use CMW\Utils\Log;
use JsonException;
use ZipArchive;
-class CMSUpdaterManager
+class CMSUpdaterManager extends AbstractManager
{
- private static string $archivePath = 'Public/Uploads/cmw.zip';
- private static string $archiveUpdatePath = 'Public/Uploads/update.zip';
+ private readonly string $archivePath;
+ private readonly string $archiveUpdatePath;
+
+ private readonly string $dir;
+
+ public function __construct()
+ {
+ $this->dir = EnvManager::getInstance()->getValue('DIR');
+ $this->archivePath = $this->dir . 'Public/Uploads/cmw.zip';
+ $this->archiveUpdatePath = $this->dir . 'Public/Uploads/update.zip';
+ }
/**
* @param array $updateData
@@ -80,8 +92,7 @@ private function downloadUpdateFile(mixed $data): ?bool
return null;
}
- if (!file_put_contents(EnvManager::getInstance()->getValue('DIR') . self::$archivePath,
- fopen($data, 'rb'))) {
+ if (!file_put_contents($this->archivePath, fopen($data, 'rb'))) {
return false;
}
return true;
@@ -93,18 +104,27 @@ private function downloadUpdateFile(mixed $data): ?bool
*/
private function prepareArchive(): bool
{
+ $isInstallationFolderExist = is_dir($this->dir . 'Installation');
+
$archiveUpdate = new ZipArchive;
- if ($archiveUpdate->open(EnvManager::getInstance()->getValue('DIR') . self::$archivePath) === TRUE) {
- $archiveUpdate->extractTo(EnvManager::getInstance()->getValue('DIR') . 'Public/Uploads/');
+
+ if ($archiveUpdate->open($this->archivePath) === TRUE) {
+ $extractPath = $this->dir . 'Public/Uploads/';
+ $archiveUpdate->extractTo($extractPath);
$archiveUpdate->close();
// Delete download archive
- unlink(EnvManager::getInstance()->getValue('DIR') . self::$archivePath);
+ unlink($this->archivePath);
+
+ // Remove Installation files in Updated if the website doesn't use it
+ if (!$isInstallationFolderExist) {
+ $this->removeInstallationFolder($extractPath . 'Installation');
+ }
- if ($archiveUpdate->open(EnvManager::getInstance()->getValue('DIR') . self::$archiveUpdatePath) === TRUE) {
- $archiveUpdate->extractTo(EnvManager::getInstance()->getValue('DIR'));
+ if ($archiveUpdate->open($this->archiveUpdatePath) === TRUE) {
+ $archiveUpdate->extractTo($this->dir);
$archiveUpdate->close();
// Delete download archive
- unlink(EnvManager::getInstance()->getValue('DIR') . self::$archiveUpdatePath);
+ unlink($this->archiveUpdatePath);
return true;
}
return false;
@@ -112,13 +132,25 @@ private function prepareArchive(): bool
return false;
}
+ /**
+ * @param string $installationPath
+ * @return void
+ * @desc Remove the Installation folder if exists
+ */
+ private function removeInstallationFolder(string $installationPath): void
+ {
+ if (is_dir($installationPath)) {
+ Directory::delete($installationPath);
+ }
+ }
+
/**
* @return bool
* @desc Delete files, based on delete_files.json
*/
private function deletedFiles(): bool
{
- $filePath = EnvManager::getInstance()->getValue('DIR') . 'Public/Uploads/delete_files.json';
+ $filePath = $this->dir . 'Public/Uploads/delete_files.json';
if (!file_exists($filePath)) {
return true;
@@ -130,7 +162,7 @@ private function deletedFiles(): bool
$json = json_decode($deletedFiles, true, 512, JSON_THROW_ON_ERROR);
foreach ($json as $file) {
- if (!unlink(EnvManager::getInstance()->getValue('DIR') . $file)) {
+ if (!unlink($this->dir . $file)) {
Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'),
LangManager::translate('core.updates.errors.deleteFile', ['file' => $file]));
}
@@ -148,7 +180,7 @@ private function deletedFiles(): bool
*/
private function sqlUpdate(): bool
{
- $filePath = EnvManager::getInstance()->getValue('DIR') . 'Public/Uploads/sql_update.sql';
+ $filePath = $this->dir . 'Public/Uploads/sql_update.sql';
if (!file_exists($filePath)) {
return true;
diff --git a/App/Manager/Views/IView.php b/App/Manager/Views/IView.php
new file mode 100644
index 00000000..c772d882
--- /dev/null
+++ b/App/Manager/Views/IView.php
@@ -0,0 +1,50 @@
+package = $package;
+ $this->viewFile = $viewFile;
+ $this->includes = $this->generateInclude();
+ $this->variables = [];
+ $this->needAdminControl = false;
+ $this->isAdminFile = $isAdminFile;
+ $this->isPublicView = false;
+ $this->themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
+ $this->overrideBackendMode = false;
+ }
+
+ public function weight(): int
+ {
+ return 1;
+ }
+
+ public static function getInstance(): self
+ {
+ if (!isset(self::$_instance)) {
+ self::$_instance = new self();
+ }
+
+ return self::$_instance;
+ }
+
+
+ public function setPackage(string $package): static
+ {
+ $this->package = $package;
+ return $this;
+ }
+
+ public function setViewFile(string $viewFile): static
+ {
+ $this->viewFile = $viewFile;
+ return $this;
+ }
+
+ public function needAdminControl(bool $needAdminControl = true): static
+ {
+ $this->needAdminControl = $needAdminControl;
+ return $this;
+ }
+
+ public function setAdminView(bool $isAdminFile = true): static
+ {
+ $this->isAdminFile = $isAdminFile;
+ return $this;
+ }
+
+ public function addVariable(string $variableName, mixed $variable): static
+ {
+ $this->variables[$variableName] = $variable;
+ return $this;
+ }
+
+ public function addVariableList(array $variableList): static
+ {
+ foreach ($variableList as $key => $value) {
+ $this->addVariable($key, $value);
+ }
+ return $this;
+ }
+
+ public function addScriptBefore(string ...$script): static
+ {
+ foreach ($script as $s) {
+ $this->includes['scripts']['before'][] = $s;
+ }
+ return $this;
+ }
+
+ public function addScriptAfter(string ...$script): static
+ {
+ foreach ($script as $s) {
+ $this->includes['scripts']['after'][] = $s;
+ }
+ return $this;
+ }
+
+ public function addPhpBefore(string ...$php): static
+ {
+ foreach ($php as $p) {
+ $this->includes['php']['before'][] = $p;
+ }
+ return $this;
+ }
+
+ public function addPhpAfter(string ...$php): static
+ {
+ foreach ($php as $p) {
+ $this->includes['php']['after'][] = $p;
+ }
+ return $this;
+ }
+
+ public function addStyle(string ...$style): static
+ {
+ foreach ($style as $s) {
+ $this->includes['styles'][] = $s;
+ }
+ return $this;
+ }
+
+ public function setCustomPath(string $path): static
+ {
+ $this->customPath = $path;
+ return $this;
+ }
+
+ public function setCustomTemplate(string $path): static
+ {
+ $this->customTemplate = $path;
+ return $this;
+ }
+
+ public function setOverrideBackendMode(bool $overrideBackendMode): static
+ {
+ $this->overrideBackendMode = $overrideBackendMode;
+ return $this;
+ }
+
+ /**
+ * @param array $includes
+ * @param string ...$files
+ * @return void
+ */
+ public static function loadInclude(array $includes, #[ExpectedValues(flags: ['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])] string ...$files): void
+ {
+ foreach ($files as $file) {
+ self::loadIncludeFile($includes, $file);
+ }
+ }
+
+ /**
+ * @param string $package
+ * @param string $viewFile
+ * @return void
+ * @throws RouterException
+ */
+ public function basicPublicView(string $package, string $viewFile): void
+ {
+ $view = new self($package, $viewFile);
+ $view->view();
+ }
+
+ /**
+ * @param string $package
+ * @param string $viewFile
+ * @return self
+ */
+ public function createPublicView(string $package, string $viewFile): self
+ {
+ $view = new self($package, $viewFile);
+
+ $view->isPublicView = true;
+
+ return $view;
+ }
+
+ /**
+ * @param string $package
+ * @param string $viewFile
+ * @return self
+ */
+ public static function createAdminView(string $package, string $viewFile): self
+ {
+ $view = new self($package, $viewFile);
+
+ $view->setAdminView()->needAdminControl();
+
+ return $view;
+ }
+
+ /**
+ * @throws RouterException
+ */
+ public function view(): void
+ {
+ // Check admin permissions
+ if ($this->needAdminControl) {
+ UsersController::redirectIfNotHavePermissions('core.dashboard');
+ }
+
+ extract($this->variables);
+ $includes = $this->includes;
+
+ //Backend mode view logic
+ $this->backendView();
+
+ if (is_null($this->customPath) && Utils::containsNullValue($this->package, $this->viewFile)) {
+ throw new RouterException('Invalid View usage. Please set a correct path.', 404);
+ }
+
+ $path = $this->getViewPath();
+
+ if (!is_file($path)) {
+ throw new RouterException(null, 404);
+ }
+
+ //Load Elements
+ ComponentsManager::getInstance()->loadThemeComponents($this->themeName);
+
+ ob_start();
+ require_once $path;
+ echo $this->callAlerts();
+ if ($this->isPublicView) {
+ $content = ob_get_clean();
+ $editorMode = isset($_GET['editor']) && $_GET['editor'] == '1';
+ $content = ThemeEditorProcessor::getInstance()->replaceThemeValues($content, $editorMode);
+
+ // bufferisation de template pour la gestion de replaceThemeValue
+ ob_start();
+ require_once($this->getTemplateFile());
+ $templateContent = ob_get_clean();
+ $templateContent = ThemeEditorProcessor::getInstance()->replaceThemeValues($templateContent, $editorMode);
+ echo $templateContent;
+ } else {
+ $content = ob_get_clean();
+ require_once($this->getTemplateFile());
+ }
+ }
+
+ /**
+ * @param array $includes
+ * @param string $fileType
+ * @return void
+ */
+ private static function loadIncludeFile(array $includes, #[ExpectedValues(['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])] string $fileType): void
+ {
+ if (!in_array($fileType, ['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])) {
+ return;
+ }
+
+ // STYLES
+ if ($fileType === 'styles') {
+ foreach ($includes['styles'] as $style) {
+ $styleLink = EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $style;
+ echo <<
+ HTML;
+ }
+ }
+
+ // SCRIPTS
+ if (in_array($fileType, ['beforeScript', 'afterScript'])) {
+ $arrayAccessJs = $fileType === 'beforeScript' ? 'before' : 'after';
+ foreach ($includes['scripts'][$arrayAccessJs] as $script) {
+ $scriptLink = EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $script;
+ echo <<
+ HTML;
+ }
+ }
+
+ // PHP
+ if (in_array($fileType, ['beforePhp', 'afterPhp'])) {
+ $arrayAccessPhp = $fileType === 'beforePhp' ? 'before' : 'after';
+ foreach ($includes['php'][$arrayAccessPhp] as $php) {
+ $phpLink = EnvManager::getInstance()->getValue('DIR') . $php;
+ include_once $phpLink;
+ }
+ }
+ }
+
+ /**
+ * @return array|array[]
+ */
+ #[ArrayShape(['styles' => 'array', 'scripts' => 'array', 'php' => 'array'])]
+ private function generateInclude(): array
+ {
+ $array = ['styles' => [], 'scripts' => [], 'array' => []];
+
+ $array['scripts']['before'] = [];
+ $array['scripts']['after'] = [];
+
+ $array['php']['before'] = [];
+ $array['php']['after'] = [];
+
+ return $array;
+ }
+
+ /**
+ * @return string
+ */
+ private function getTemplateFile(): string
+ {
+ if ($this->customTemplate !== null) {
+ return $this->customTemplate;
+ }
+
+ return ($this->isAdminFile)
+ ? EnvManager::getInstance()->getValue('PATH_ADMIN_VIEW') . 'template.php'
+ : "Public/Themes/$this->themeName/Views/template.php";
+ }
+
+ /**
+ * @throws RouterException
+ */
+ private function callAlerts(): string
+ {
+ $alerts = Flash::load();
+ $alertContent = '';
+ foreach ($alerts as $alert) {
+ if (!$alert->isAdmin()) {
+ $view = new self('Core', 'Alerts/' . $alert->getType());
+ } else {
+ $view = new self('Core', 'Alerts/' . $alert->getType(), true);
+ }
+ $view->addVariable('alert', $alert);
+ $alertContent .= $view->loadFile();
+ }
+ Flash::clear();
+ return $alertContent;
+ }
+
+ /**
+ * @throws RouterException
+ */
+ public function loadFile(): string
+ {
+ $path = $this->getViewPath();
+
+ if (!is_file($path)) {
+ throw new RouterException(null, 404);
+ }
+
+ extract($this->variables);
+ $includes = $this->includes;
+
+ ob_start();
+ require($path);
+ return ob_get_clean();
+ }
+
+ /**
+ * @return string
+ */
+ private function getViewPath(): string
+ {
+ if ($this->customPath !== null) {
+ return $this->customPath;
+ }
+
+ if ($this->isAdminFile) {
+ return "App/Package/$this->package/Views/$this->viewFile.admin.view.php";
+ }
+
+ $publicPath = "Public/Themes/$this->themeName/Views/$this->package/$this->viewFile.view.php";
+
+ if (is_file($publicPath)) {
+ return $publicPath;
+ }
+
+ $this->isPublicView = true;
+ return "App/Package/$this->package/Public/$this->viewFile.view.php";
+ }
+
+
+ /**
+ * @return void
+ * @desc Return the view data if the backend mode is enabled
+ */
+ private function backendView(): void
+ {
+ $isBackendModeEnabled = EnvManager::getInstance()->getValue('ENABLE_BACKEND_MODE') === 'true';
+
+ if ($this->overrideBackendMode) {
+ return;
+ }
+
+ if ($isBackendModeEnabled && !$this->needAdminControl) {
+ print_r(
+ APIManager::createResponse(
+ data: [
+ 'package' => $this->package,
+ 'viewFile' => $this->viewFile,
+ 'viewFilePath' => $this->getViewPath(),
+ 'variables' => $this->variables,
+ 'includes' => $this->includes,
+ ],
+ )
+ );
+ die();
+ }
+ }
+}
\ No newline at end of file
diff --git a/App/Manager/Views/View.php b/App/Manager/Views/View.php
index 1f4eb795..6df94cd5 100644
--- a/App/Manager/Views/View.php
+++ b/App/Manager/Views/View.php
@@ -2,36 +2,14 @@
namespace CMW\Manager\Views;
-use CMW\Controller\Users\UsersController;
-use CMW\Manager\Api\APIManager;
-use CMW\Manager\Components\ComponentsManager;
-use CMW\Manager\Env\EnvManager;
-use CMW\Manager\Flash\Flash;
-use CMW\Manager\Router\RouterException;
-use CMW\Manager\Theme\ThemeManager;
-use CMW\Utils\Utils;
-use JetBrains\PhpStorm\ArrayShape;
+use CMW\Manager\Loader\Loader;
+use CMW\Manager\Views\Implementations\BaseViewImplementation;
use JetBrains\PhpStorm\ExpectedValues;
-use function extract;
-use function in_array;
-use function is_file;
-use function is_null;
-use function ob_get_clean;
-use function ob_start;
-use function print_r;
+use function array_reduce;
class View
{
- private ?string $package;
- private ?string $viewFile;
- private ?string $customPath = null;
- private ?string $customTemplate = null;
- private array $includes;
- private array $variables;
- private bool $needAdminControl;
- private bool $isAdminFile;
- private string $themeName;
- private bool $overrideBackendMode;
+ private static ?IView $_instance = null;
/**
* @param string|null $package
@@ -40,381 +18,198 @@ class View
*/
public function __construct(?string $package = null, ?string $viewFile = null, ?bool $isAdminFile = false)
{
- $this->package = $package;
- $this->viewFile = $viewFile;
- $this->includes = $this->generateInclude();
- $this->variables = [];
- $this->needAdminControl = false;
- $this->isAdminFile = $isAdminFile;
- $this->themeName = ThemeManager::getInstance()->getCurrentTheme()->name();
- $this->overrideBackendMode = false;
+ $instance = self::getInstance();
+
+ $instance->setPackage($package);
+ $instance->setViewFile($viewFile);
+ $instance->setAdminView($isAdminFile);
}
- /**
- * @param string $package
- * @param string $viewFile
- * @return void
- * @throws RouterException
- */
- public static function basicPublicView(string $package, string $viewFile): void
+ public static function getInstance(): IView
{
- $view = new self($package, $viewFile);
- $view->view();
+ if (self::$_instance === null) {
+ self::$_instance = self::loadViewInstance();
+ }
+
+ return self::$_instance;
}
- /**
- * @param string $package
- * @param string $viewFile
- * @return View
- */
- public static function createPublicView(string $package, string $viewFile): View
+ private static function loadViewInstance(): IView
{
- return new self($package, $viewFile);
+ return self::getHighestImplementation() ?? BaseViewImplementation::getInstance();
}
- /**
- * @param string $package
- * @param string $viewFile
- * @return View
- */
- public static function createAdminView(string $package, string $viewFile): View
+ private static function getHighestImplementation(): ?IView
{
- $view = new self($package, $viewFile);
+ $implementations = Loader::loadManagerImplementations(IView::class, 'Views');
- $view->setAdminView()->needAdminControl();
-
- return $view;
+ return array_reduce($implementations, static function (?IView $highest, IView $current) {
+ return ($highest === null || $current->weight() > $highest->weight()) ? $current : $highest;
+ });
}
+
/**
- * @return array|array[]
+ * @param string $package
+ * @param string $viewFile
+ * @return void
*/
- #[ArrayShape(['styles' => 'array', 'scripts' => 'array', 'php' => 'array'])]
- private function generateInclude(): array
+ public static function basicPublicView(string $package, string $viewFile): void
{
- $array = ['styles' => [], 'scripts' => [], 'array' => []];
-
- $array['scripts']['before'] = [];
- $array['scripts']['after'] = [];
-
- $array['php']['before'] = [];
- $array['php']['after'] = [];
-
- return $array;
+ self::getInstance()->basicPublicView($package, $viewFile);
}
/**
- * @param string $position
- * @param string $fileName
- * @return void
+ * @param string $package
+ * @param string $viewFile
+ * @return IView
*/
- private function addScript(#[ExpectedValues(['after', 'before'])] string $position, string $fileName): void
+ public static function createPublicView(string $package, string $viewFile): IView
{
- $this->includes['scripts'][$position][] = $fileName;
+ return self::getInstance()->createPublicView($package, $viewFile);
}
/**
- * @param string $position
- * @param string $fileName
- * @return void
+ * @param string $package
+ * @param string $viewFile
+ * @return IView
*/
- private function addPhp(#[ExpectedValues(['after', 'before'])] string $position, string $fileName): void
+ public static function createAdminView(string $package, string $viewFile): IView
{
- $this->includes['php'][$position][] = $fileName;
+ return self::getInstance()->createAdminView($package, $viewFile);
}
/**
* @param string $package
- * @return $this
+ * @return IView
*/
- public function setPackage(string $package): self
+ public function setPackage(string $package): IView
{
- $this->package = $package;
- return $this;
+ return self::getInstance()->setPackage($package);
}
/**
* @param string $viewFile
- * @return $this
+ * @return IView
*/
- public function setViewFile(string $viewFile): self
+ public function setViewFile(string $viewFile): IView
{
- $this->viewFile = $viewFile;
- return $this;
+ return self::getInstance()->setViewFile($viewFile);
}
/**
* @param bool $needAdminControl
- * @return $this
+ * @return IView
*/
- public function needAdminControl(bool $needAdminControl = true): self
+ public function needAdminControl(bool $needAdminControl = true): IView
{
- $this->needAdminControl = $needAdminControl;
- return $this;
+ return self::getInstance()->needAdminControl($needAdminControl);
}
/**
* @param bool $isAdminFile
- * @return $this
+ * @return IView
*/
- public function setAdminView(bool $isAdminFile = true): self
+ public function setAdminView(bool $isAdminFile = true): IView
{
- $this->isAdminFile = $isAdminFile;
- return $this;
+ return self::getInstance()->setAdminView($isAdminFile);
}
/**
* @param string $variableName
* @param mixed $variable
- * @return $this
+ * @return IView
*/
- public function addVariable(string $variableName, mixed $variable): self
+ public function addVariable(string $variableName, mixed $variable): IView
{
- $this->variables[$variableName] ??= $variable;
- return $this;
+ return self::getInstance()->addVariable($variableName, $variable);
}
/**
* @param array $variableList
- * @return $this
+ * @return IView
*/
- public function addVariableList(array $variableList): self
+ public function addVariableList(array $variableList): IView
{
- foreach ($variableList as $key => $value) {
- $this->addVariable($key, $value);
- }
-
- return $this;
+ return self::getInstance()->addVariableList($variableList);
}
/**
* @param string ...$script
- * @return $this
+ * @return IView
*/
- public function addScriptBefore(string ...$script): self
+ public function addScriptBefore(string ...$script): IView
{
- foreach ($script as $scriptFile) {
- $this->addScript('before', $scriptFile);
- }
-
- return $this;
+ return self::getInstance()->addScriptBefore(...$script);
}
/**
* @param string ...$script
- * @return $this
+ * @return IView
*/
- public function addScriptAfter(string ...$script): self
+ public function addScriptAfter(string ...$script): IView
{
- foreach ($script as $scriptFile) {
- $this->addScript('after', $scriptFile);
- }
-
- return $this;
+ return self::getInstance()->addScriptAfter(...$script);
}
/**
* @param string ...$php
- * @return $this
+ * @return IView
*/
- public function addPhpBefore(string ...$php): self
+ public function addPhpBefore(string ...$php): IView
{
- foreach ($php as $scriptFile) {
- $this->addPhp('before', $scriptFile);
- }
-
- return $this;
+ return self::getInstance()->addPhpBefore(...$php);
}
/**
* @param string ...$php
- * @return $this
+ * @return IView
*/
- public function addPhpAfter(string ...$php): self
+ public function addPhpAfter(string ...$php): IView
{
- foreach ($php as $scriptFile) {
- $this->addPhp('after', $scriptFile);
- }
-
- return $this;
+ return self::getInstance()->addPhpAfter(...$php);
}
/**
* @param string ...$style
- * @return $this
+ * @return IView
*/
- public function addStyle(string ...$style): self
+ public function addStyle(string ...$style): IView
{
- foreach ($style as $styleFile) {
- $this->includes['styles'][] = $styleFile;
- }
-
- return $this;
+ return self::getInstance()->addStyle(...$style);
}
/**
* @param string $path
- * @return $this
+ * @return IView
*/
- public function setCustomPath(string $path): self
+ public function setCustomPath(string $path): IView
{
- $this->customPath = $path;
- return $this;
+ return self::getInstance()->setCustomPath($path);
}
/**
* @param string $path
- * @return $this
+ * @return IView
*/
- public function setCustomTemplate(string $path): self
+ public function setCustomTemplate(string $path): IView
{
- $this->customTemplate = $path;
- return $this;
+ return self::getInstance()->setCustomTemplate($path);
}
/**
* @param bool $overrideBackendMode
- * @return View
+ * @return IView
* If true, the view will be displayed even if the backend mode is enabled
*/
- public function setOverrideBackendMode(bool $overrideBackendMode): self
- {
- $this->overrideBackendMode = $overrideBackendMode;
- return $this;
- }
-
- /**
- * @return string
- */
- private function getViewPath(): string
- {
- if ($this->customPath !== null) {
- return $this->customPath;
- }
-
- if ($this->isAdminFile) {
- return "App/Package/$this->package/Views/$this->viewFile.admin.view.php";
- }
-
- $publicPath = "Public/Themes/$this->themeName/Views/$this->package/$this->viewFile.view.php";
-
- if (is_file($publicPath)) {
- return $publicPath;
- }
-
- return "App/Package/$this->package/Public/$this->viewFile.view.php";
- }
-
- /**
- * @return string
- */
- private function getTemplateFile(): string
+ public function setOverrideBackendMode(bool $overrideBackendMode): IView
{
- if ($this->customTemplate !== null) {
- return $this->customTemplate;
- }
-
- return ($this->isAdminFile)
- ? EnvManager::getInstance()->getValue('PATH_ADMIN_VIEW') . 'template.php'
- : "Public/Themes/$this->themeName/Views/template.php";
+ return self::getInstance()->setOverrideBackendMode($overrideBackendMode);
}
- /**
- * @param array $includes
- * @param string $fileType
- * @return void
- */
- private static function loadIncludeFile(array $includes, #[ExpectedValues(['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])] string $fileType): void
- {
- if (!in_array($fileType, ['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])) {
- return;
- }
-
- // STYLES
- if ($fileType === 'styles') {
- foreach ($includes['styles'] as $style) {
- $styleLink = EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $style;
- echo <<
- HTML;
- }
- }
-
- // SCRIPTS
- if (in_array($fileType, ['beforeScript', 'afterScript'])) {
- $arrayAccessJs = $fileType === 'beforeScript' ? 'before' : 'after';
- foreach ($includes['scripts'][$arrayAccessJs] as $script) {
- $scriptLink = EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $script;
- echo <<
- HTML;
- }
- }
-
- // PHP
- if (in_array($fileType, ['beforePhp', 'afterPhp'])) {
- $arrayAccessPhp = $fileType === 'beforePhp' ? 'before' : 'after';
- foreach ($includes['php'][$arrayAccessPhp] as $php) {
- $phpLink = EnvManager::getInstance()->getValue('DIR') . $php;
- include_once $phpLink;
- }
- }
- }
-
- /**
- * @throws RouterException
- */
- public function loadFile(): string
- {
- $path = $this->getViewPath();
-
- if (!is_file($path)) {
- throw new RouterException(null, 404);
- }
-
- extract($this->variables);
- $includes = $this->includes;
-
- ob_start();
- require($path);
- return ob_get_clean();
- }
-
- /**
- * @throws RouterException
- */
public function view(): void
{
- // Check admin permissions
- if ($this->needAdminControl) {
- UsersController::redirectIfNotHavePermissions('core.dashboard');
- }
-
- extract($this->variables);
- $includes = $this->includes;
-
- //Backend mode view logic
- $this->backendView();
-
- if (is_null($this->customPath) && Utils::containsNullValue($this->package, $this->viewFile)) {
- throw new RouterException("Invalid View usage. Please set a correct path.", 404);
- }
-
- $path = $this->getViewPath();
-
- if (!is_file($path)) {
- throw new RouterException(null, 404);
- }
-
- //Load Elements
- ComponentsManager::getInstance()->loadThemeComponents($this->themeName);
-
- ob_start();
- require_once $path;
- echo $this->callAlerts();
- $content = ob_get_clean();
-
- require_once($this->getTemplateFile());
+ self::getInstance()->view();
}
/**
@@ -424,56 +219,6 @@ public function view(): void
*/
public static function loadInclude(array $includes, #[ExpectedValues(flags: ['beforeScript', 'afterScript', 'beforePhp', 'afterPhp', 'styles'])] string ...$files): void
{
- foreach ($files as $file) {
- self::loadIncludeFile($includes, $file);
- }
- }
-
- /**
- * @throws RouterException
- */
- private function callAlerts(): string
- {
- $alerts = Flash::load();
- $alertContent = '';
- foreach ($alerts as $alert) {
- if (!$alert->isAdmin()) {
- $view = new View('Core', 'Alerts/' . $alert->getType());
- } else {
- $view = new View('Core', 'Alerts/' . $alert->getType(), true);
- }
- $view->addVariable('alert', $alert);
- $alertContent .= $view->loadFile();
- }
- Flash::clear();
- return $alertContent;
- }
-
- /**
- * @return void
- * @desc Return the view data if the backend mode is enabled
- */
- private function backendView(): void
- {
- $isBackendModeEnabled = EnvManager::getInstance()->getValue('ENABLE_BACKEND_MODE') === 'true';
-
- if ($this->overrideBackendMode) {
- return;
- }
-
- if ($isBackendModeEnabled && !$this->needAdminControl) {
- print_r(
- APIManager::createResponse(
- data: [
- 'package' => $this->package,
- 'viewFile' => $this->viewFile,
- 'viewFilePath' => $this->getViewPath(),
- 'variables' => $this->variables,
- 'includes' => $this->includes,
- ],
- )
- );
- die();
- }
+ self::getInstance()->loadInclude($includes, ...$files);
}
}
diff --git a/App/Package/Core/Controllers/MailController.php b/App/Package/Core/Controllers/MailController.php
index 07e63ed7..f6935d8a 100644
--- a/App/Package/Core/Controllers/MailController.php
+++ b/App/Package/Core/Controllers/MailController.php
@@ -3,10 +3,13 @@
namespace CMW\Controller\Core;
use CMW\Controller\Users\UsersController;
+use CMW\Interface\Core\IMailTemplate;
+use CMW\Interface\Shop\IVirtualItems;
use CMW\Manager\Filter\FilterManager;
use CMW\Manager\Flash\Alert;
use CMW\Manager\Flash\Flash;
use CMW\Manager\Lang\LangManager;
+use CMW\Manager\Loader\Loader;
use CMW\Manager\Mail\MailManager;
use CMW\Manager\Package\AbstractController;
use CMW\Manager\Router\Link;
@@ -34,6 +37,15 @@ private function mailConfiguration(): void
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.settings.mails');
$config = MailModel::getInstance()->getConfig();
+ $mailTemplates = $this->getMailTemplateMethods();
+
+ usort($mailTemplates, function ($a, $b) {
+ $priority = ['empty', 'empty_signed'];
+ $aPriority = in_array($a->getVarName(), $priority) ? array_search($a->getVarName(), $priority) : PHP_INT_MAX;
+ $bPriority = in_array($b->getVarName(), $priority) ? array_search($b->getVarName(), $priority) : PHP_INT_MAX;
+
+ return $aPriority <=> $bPriority;
+ });
View::createAdminView('Core', 'Mail/mailConfig')
->addStyle('Admin/Resources/Vendors/Izitoast/iziToast.min.css')
@@ -41,7 +53,7 @@ private function mailConfiguration(): void
'App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js')
->addScriptAfter('App/Package/Core/Views/Mail/Resources/sendMail.js',
'Admin/Resources/Vendors/Izitoast/iziToast.min.js')
- ->addVariableList(['config' => $config])
+ ->addVariableList(['config' => $config, 'mailTemplates' => $mailTemplates])
->view();
}
@@ -50,10 +62,15 @@ private function mailConfigurationPost(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.settings.mails');
- [$mail, $mailReply, $addressSMTP, $user, $password, $port, $protocol, $footer, $enableSMTP] = Utils::filterInput(
- 'mail', 'mailReply', 'addressSMTP', 'user', 'password', 'port', 'protocol', 'footer', 'enableSMTP'
+ [$mail, $mailReply, $addressSMTP, $user, $password, $port, $protocol, $body, $enableSMTP] = Utils::filterInput(
+ 'mail', 'mailReply', 'addressSMTP', 'user', 'password', 'port', 'protocol', 'body', 'enableSMTP'
);
+ if (!str_contains($body, '[MAIL_CONTENT]')) {
+ Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), LangManager::translate('core.mail.editor.render_alert'));
+ Redirect::redirectPreviousRoute();
+ }
+
MailModel::getInstance()->create($mail,
$mailReply,
$addressSMTP,
@@ -61,7 +78,7 @@ private function mailConfigurationPost(): void
$password,
$port,
$protocol,
- $footer,
+ $body,
(is_null($enableSMTP) ? 0 : 1),
);
@@ -82,7 +99,7 @@ private function testMailConfigurationPost(): void
}
$receiver = FilterManager::filterInputStringPost('receiver');
- $status = MailManager::getInstance()->sendMail($receiver, 'Test CraftMyWebsite - MAILS', 'Hello World !
');
+ $status = MailManager::getInstance()->sendMail($receiver, LangManager::translate('core.mail.test.object'), LangManager::translate('core.mail.test.body'));
if ($status) {
http_response_code(204);
@@ -90,4 +107,12 @@ private function testMailConfigurationPost(): void
http_response_code(500);
}
}
+
+ /**
+ * @return IMailTemplate[]
+ */
+ public function getMailTemplateMethods(): array
+ {
+ return Loader::loadImplementations(IMailTemplate::class);
+ }
}
diff --git a/App/Package/Core/Controllers/ThemeController.php b/App/Package/Core/Controllers/ThemeController.php
index b37247ba..5281e4f4 100644
--- a/App/Package/Core/Controllers/ThemeController.php
+++ b/App/Package/Core/Controllers/ThemeController.php
@@ -15,6 +15,12 @@
use CMW\Manager\Package\AbstractController;
use CMW\Manager\Router\Link;
use CMW\Manager\Security\SecurityManager;
+use CMW\Manager\Theme\Config\ThemeMapper;
+use CMW\Manager\Theme\Config\ThemeSettingsMapper;
+use CMW\Manager\Theme\Editor\ThemeEditorProcessor;
+use CMW\Manager\Theme\File\ThemeFileManager;
+use CMW\Manager\Theme\Loader\ThemeLoader;
+use CMW\Manager\Theme\Market\ThemeMarketManager;
use CMW\Manager\Theme\ThemeManager;
use CMW\Manager\Theme\UninstallThemeType;
use CMW\Manager\Updater\UpdatesManager;
@@ -42,9 +48,9 @@ private function adminThemeMarket(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.market');
- $currentTheme = ThemeManager::getInstance()->getCurrentTheme();
- $installedThemes = ThemeManager::getInstance()->getInstalledThemes();
- $themesList = ThemeManager::getInstance()->getMarketThemes();
+ $currentTheme = ThemeLoader::getInstance()->getCurrentTheme();
+ $installedThemes = ThemeLoader::getInstance()->getInstalledThemes();
+ $themesList = ThemeMarketManager::getInstance()->getMarketThemes();
$themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs($currentTheme->name());
SimpleCacheManager::storeCache($themeConfigs, 'config', 'Themes/' . $currentTheme->name());
@@ -60,9 +66,9 @@ private function adminThemeConfiguration(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.manage');
- $currentTheme = ThemeManager::getInstance()->getCurrentTheme();
- $installedThemes = ThemeManager::getInstance()->getInstalledThemes();
- $themesList = ThemeManager::getInstance()->getMarketThemes();
+ $currentTheme = ThemeLoader::getInstance()->getCurrentTheme();
+ $installedThemes = ThemeLoader::getInstance()->getInstalledThemes();
+ $themesList = ThemeMarketManager::getInstance()->getMarketThemes();
$themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs($currentTheme->name());
SimpleCacheManager::storeCache($themeConfigs, 'config', 'Themes/' . $currentTheme->name());
@@ -94,9 +100,9 @@ private function adminThemeConfigurationRegenerate(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.edit');
- $themeName = ThemeManager::getInstance()->getCurrentTheme()->name();
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
ThemeModel::getInstance()->getInstance()->deleteThemeConfig($themeName);
- ThemeManager::getInstance()->installThemeSettings($themeName);
+ ThemeFileManager::getInstance()->updateThemeSettings($themeName);
$themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs($themeName);
SimpleCacheManager::storeCache($themeConfigs, 'config', 'Themes/' . $themeName);
@@ -137,7 +143,7 @@ private function adminThemeInstallation(int $id): void
}
// Install Theme settings
- ThemeManager::getInstance()->installThemeSettings($theme['name']);
+ ThemeFileManager::getInstance()->installThemeSettings($theme['name']);
CoreModel::getInstance()->updateOption('theme', $theme['name']);
$themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs($theme['name']);
@@ -153,9 +159,55 @@ private function adminThemeInstallation(int $id): void
private function adminThemeManage(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.edit');
- View::createAdminView('Core', 'Theme/themeManage')
- ->addScriptBefore('Admin/Resources/Vendors/Tinymce/tinymce.min.js', 'Admin/Resources/Vendors/Tinymce/Config/full.js', 'Admin/Resources/Vendors/PageLoader/main.js')
- ->view();
+
+ //Vérifie si la valeur par défaut est en base de donnée si ce n'est pas le cas, on l'ajoute, cela permet aux mises à jour des thèmes de gérer les nouvelles valeurs :)
+ $themeMenus = ThemeEditorProcessor::getInstance()->getThemeMenus();
+ $currentTheme = ThemeLoader::getInstance()->getCurrentTheme()->name();
+ $themeConfigs = ThemeModel::getInstance()->fetchThemeConfigs($currentTheme);
+ $configNames = array_column($themeConfigs, 'theme_config_name');
+ $menuKeys = [];
+
+ foreach ($themeMenus as $themeMenu) {
+ $menuKey = $themeMenu->getMenuKey();
+
+ // Warning si le menu est défini plusieurs fois
+ if (in_array($menuKey, $menuKeys)) {
+ Flash::send(Alert::ERROR, LangManager::translate('core.toaster.theme.editor.title'), LangManager::translate('core.toaster.theme.editor.multipleMenu', ['menukey' => $menuKey]));
+ } else {
+ $menuKeys[] = $menuKey;
+ }
+
+ $themeKeys = [];
+
+ foreach ($themeMenu->getValues() as $value) {
+ $key = $value->getThemeKey();
+
+ if (in_array($key, $themeKeys)) {
+ Flash::send(Alert::ERROR, LangManager::translate('core.toaster.theme.editor.title'), LangManager::translate('core.toaster.theme.editor.multipleMenuKey', ['key' => $key, 'menukey' => $menuKey]));
+ } else {
+ $themeKeys[] = $key;
+ }
+
+ $dbKey = $menuKey ? ThemeMapper::mapConfigKey($menuKey, $key) : $key;
+
+ if (!in_array($dbKey, $configNames)) {
+ ThemeModel::getInstance()->storeThemeConfig($dbKey, $value->getDefaultValue(), $currentTheme);
+ // Ajoute ici aussi à $themeConfigs pour éviter de devoir reload
+ $themeConfigs[] = [
+ 'theme_config_name' => $dbKey,
+ 'theme_config_value' => $value->getDefaultValue(),
+ 'theme_config_theme' => $currentTheme,
+ ];
+ }
+ }
+ }
+
+ $view = new View('Core', 'Editor/themeManage');
+ $view
+ ->addVariableList(['themeMenus' => $themeMenus, 'themeConfigs' => $themeConfigs])
+ ->setCustomPath(EnvManager::getInstance()->getValue('DIR') . "App/Package/Core/Views/Theme/Editor/themeManage.admin.view.php")
+ ->setCustomTemplate(EnvManager::getInstance()->getValue('DIR') . 'App/Package/Core/Views/Theme/Editor/template.php');
+ $view->view();
}
#[NoReturn]
@@ -166,6 +218,7 @@ private function adminThemeManagePost(): void
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.edit');
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
try {
$newCsrfTokenId = bin2hex(random_bytes(8));
$newCsrfToken = SecurityManager::getInstance()->getCSRFToken($newCsrfTokenId);
@@ -176,30 +229,27 @@ private function adminThemeManagePost(): void
$aresFiles['__images__'][$conf] = true;
if ($file['name'] !== '') {
- $imageName = ImagesManager::convertAndUpload($file, ThemeManager::getInstance()->getCurrentTheme()->name() . '/Img');
- $remoteImageValue = ThemeModel::getInstance()->getInstance()->fetchConfigValue($conf);
- $localImageValue = ThemeManager::getInstance()->getCurrentThemeConfigSetting($conf);
+ $imageName = ImagesManager::convertAndUpload($file, $themeName . '/Img');
- if ($remoteImageValue !== $file && $remoteImageValue !== $localImageValue) {
- ImagesManager::deleteImage(ThemeManager::getInstance()->getCurrentTheme()->name() . "/Img/$remoteImageValue");
- }
+ $currentImage = ThemeModel::getInstance()->getConfigValue($conf);
+ ImagesManager::deleteImage($themeName . "/Img/$currentImage");
- ThemeModel::getInstance()->getInstance()->updateThemeConfig($conf, $imageName, ThemeManager::getInstance()->getCurrentTheme()->name());
+ ThemeModel::getInstance()->getInstance()->updateThemeConfig($conf, $imageName, $themeName);
}
}
- foreach (ThemeManager::getInstance()->getCurrentThemeConfigSettings() as $conf => $value) {
+ foreach (ThemeSettingsMapper::getFlattened($themeName) as $conf => $defaultValue) {
if (isset($aresFiles['__images__'][$conf])) {
continue;
}
- if (!isset($_POST[$conf]) || !empty($_POST[$conf])) {
- ThemeModel::getInstance()->getInstance()->updateThemeConfig($conf, $_POST[$conf] ?? '0', ThemeManager::getInstance()->getCurrentTheme()->name());
+ if (isset($_POST[$conf])) {
+ ThemeModel::getInstance()->updateThemeConfig($conf, $_POST[$conf], $themeName);
}
}
- $themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs(ThemeManager::getInstance()->getCurrentTheme()->name());
- SimpleCacheManager::storeCache($themeConfigs, 'config', 'Themes/' . ThemeManager::getInstance()->getCurrentTheme()->name());
+ $themeConfigs = ThemeModel::getInstance()->getInstance()->fetchThemeConfigs($themeName);
+ SimpleCacheManager::storeCache($themeConfigs, 'config', 'Themes/' . $themeName);
echo json_encode([
'success' => true,
@@ -262,6 +312,9 @@ private function adminThemeUpdate(int $id, string $actualVersion, string $themeN
}
}
+ //Une fois que toutes les mises à jour sont terminé, on rajoute les nouvelles configs :
+ ThemeFileManager::getInstance()->updateThemeSettings($themeName);
+
SimpleCacheManager::deleteSpecificCacheFile("config", "Themes/$themeName");
Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'),
@@ -301,9 +354,9 @@ private function adminThemeDelete(string $theme): void
UsersController::redirectIfNotHavePermissions('core.dashboard', 'core.themes.manage');
$themeName = base64_decode($theme);
- $currentTheme = ThemeManager::getInstance()->getCurrentTheme();
+ $currentTheme = ThemeLoader::getInstance()->getCurrentTheme();
- switch (ThemeManager::getInstance()->uninstallLocalTheme($themeName)) {
+ switch (ThemeFileManager::uninstallLocalTheme($themeName)) {
case UninstallThemeType::SUCCESS:
if ($themeName === $currentTheme->name()) {
CoreModel::getInstance()->updateOption('theme', ThemeManager::$defaultThemeName);
diff --git a/App/Package/Core/Controllers/UpdatesController.php b/App/Package/Core/Controllers/UpdatesController.php
index 58ee430b..14c28ca5 100644
--- a/App/Package/Core/Controllers/UpdatesController.php
+++ b/App/Package/Core/Controllers/UpdatesController.php
@@ -93,7 +93,7 @@ private function adminUpdatesInstall(): void
$versions = PublicAPI::postData('cms/update', ['current_version' => UpdatesManager::getVersion()]);
foreach ($versions as $version) {
- (new CMSUpdaterManager())->doUpdate($version);
+ CMSUpdaterManager::getInstance()->doUpdate($version);
}
SimpleCacheManager::deleteAllFiles();
diff --git a/App/Package/Core/Entities/MailConfigEntity.php b/App/Package/Core/Entities/MailConfigEntity.php
index 48a220f1..57ce00b2 100644
--- a/App/Package/Core/Entities/MailConfigEntity.php
+++ b/App/Package/Core/Entities/MailConfigEntity.php
@@ -14,6 +14,7 @@ class MailConfigEntity extends AbstractEntity
private ?string $password;
private ?int $port;
private ?string $protocol;
+ private ?string $body;
private ?string $footer;
private ?int $enable;
@@ -26,11 +27,12 @@ class MailConfigEntity extends AbstractEntity
* @param string|null $password
* @param int|null $port
* @param string|null $protocol
+ * @param string|null $body
* @param string|null $footer
* @param int|null $enable
*/
public function __construct(?int $id, ?string $mail, ?string $mailReply, ?string $addressSMTP, ?string $user,
- ?string $password, ?int $port, ?string $protocol, ?string $footer, ?int $enable)
+ ?string $password, ?int $port, ?string $protocol, ?string $body, ?string $footer, ?int $enable)
{
$this->id = $id;
$this->mail = $mail;
@@ -40,6 +42,7 @@ public function __construct(?int $id, ?string $mail, ?string $mailReply, ?str
$this->password = $password;
$this->port = $port;
$this->protocol = $protocol;
+ $this->body = $body;
$this->footer = $footer;
$this->enable = $enable;
}
@@ -108,6 +111,14 @@ public function getProtocol(): ?string
return $this->protocol;
}
+ /**
+ * @return string|null
+ */
+ public function getBody(): ?string
+ {
+ return $this->body;
+ }
+
/**
* @return string|null
*/
diff --git a/App/Package/Core/Implementations/Core/BasicSignTemplateImplementations.php b/App/Package/Core/Implementations/Core/BasicSignTemplateImplementations.php
new file mode 100644
index 00000000..992a8a5a
--- /dev/null
+++ b/App/Package/Core/Implementations/Core/BasicSignTemplateImplementations.php
@@ -0,0 +1,45 @@
+
+body {
+ font-family: Arial, sans-serif;
+ background-color: #f4f4f4;
+ margin: 0;
+ padding: 0;
+}
+
+
+[MAIL_CONTENT]
+--
+
+' . Website::getWebsiteName() . '
+';
+ }
+
+ public function getPreviewImg(): string
+ {
+ return EnvManager::getInstance()->getValue('PATH_SUBFOLDER').'App/Package/Core/Views/Mail/Resources/Images/signed.png';
+ }
+}
\ No newline at end of file
diff --git a/App/Package/Core/Implementations/Core/EmptyMailTemplateImplementations.php b/App/Package/Core/Implementations/Core/EmptyMailTemplateImplementations.php
new file mode 100644
index 00000000..e9f48c0c
--- /dev/null
+++ b/App/Package/Core/Implementations/Core/EmptyMailTemplateImplementations.php
@@ -0,0 +1,30 @@
+getValue('PATH_SUBFOLDER').'App/Package/Core/Views/Mail/Resources/Images/empty.png';
+ }
+}
\ No newline at end of file
diff --git a/App/Package/Core/Implementations/Core/RedMailTemplateImplementations.php b/App/Package/Core/Implementations/Core/RedMailTemplateImplementations.php
new file mode 100644
index 00000000..11c41879
--- /dev/null
+++ b/App/Package/Core/Implementations/Core/RedMailTemplateImplementations.php
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+ [MAIL_CONTENT]
+
+
+
+
+';
+ }
+
+ public function getPreviewImg(): string
+ {
+ return EnvManager::getInstance()->getValue('PATH_SUBFOLDER').'App/Package/Core/Views/Mail/Resources/Images/red.png';
+ }
+}
\ No newline at end of file
diff --git a/App/Package/Core/Interfaces/IMailTemplate.php b/App/Package/Core/Interfaces/IMailTemplate.php
new file mode 100644
index 00000000..1a286b0c
--- /dev/null
+++ b/App/Package/Core/Interfaces/IMailTemplate.php
@@ -0,0 +1,35 @@
+ [
'test' => 'Mail send to %mail%',
],
- 'Theme' => [
+ 'theme' => [
'regenerate' => 'Theme configuration regenerate',
'installed' => '%theme% just installed and activated.',
'reset' => 'Theme configuration reset',
@@ -145,6 +145,11 @@
'delete_files' => 'Unable to delete theme files',
],
],
+ 'editor' => [
+ 'title' => 'Editor - DEV',
+ 'multipleMenu' => 'Warning: the menu %menukey% is defined multiple times!',
+ 'multipleMenuKey' => 'Warning: the key %key% is present multiple times in the menu %menukey% !',
+ ],
],
'package' => [
'updateBeforeInstall' => 'Please update CMS before installing this package!',
@@ -197,7 +202,10 @@
'notVerified' => 'Not verified by CMW.',
'active' => 'Active theme',
'configure' => 'Configure',
- 'reset' => 'Reset',
+ 'reset' => 'Reset %theme%',
+ "leave" => "Leave editor",
+ "menu" => "EDITOR MENU",
+ "backMenu" => "Back to menu",
'reinstall' => 'Reinstall',
'description' => 'Description : ',
'update' => 'An update is available !',
@@ -292,7 +300,7 @@
'replyMail' => 'Email reply',
'serverSMTP' => 'SMTP address',
'userSMTP' => 'SMTP user',
- 'passwordSMTP' => 'Password',
+ 'passwordSMTP' => 'Password SMTP',
'portSMTP' => 'Port SMTP',
'protocol' => 'Sending protocol',
'footer' => 'Mails footer',
@@ -308,6 +316,28 @@
'receiverMailPlaceholder' => 'Enter your mail',
],
],
+ 'test' => [
+ 'object' => '✅ CraftMyWebsite Email Sending Test',
+ 'body' => 'Hello,
This message was sent automatically to verify that the email sending system on your site is working properly.
If you received this message, it means everything is configured correctly.
Thank you for using CraftMyWebsite! 🚀
',
+ ],
+ 'editor' => [
+ 'title' => 'Mail Editor (HTML)',
+ 'select' => 'Select a template',
+ 'select_alert' => 'Selecting a template will overwrite your current model!',
+ 'apply_btn' => 'Apply',
+ 'modal_title' => 'Good to know',
+ 'modal_text_1' => 'This editor allows you to customize the appearance of your emails. You must understand that this template is used every time an email is sent, regardless of its type (shop, forum, newsletter, login, registration...), so keep that in mind when configuring your template.',
+ 'modal_text_2' => 'It is essential to use [MAIL_CONTENT] in your template. This is where the message sent by the site will be placed.',
+ 'modal_text_3' => 'Tip: The fonts supported by most email clients by default are:',
+ 'render' => 'Live email preview',
+ 'render_example' => '[EXAMPLE]
This is an example of your email content.
The message will be automatically inserted here.
[EXAMPLE]
',
+ 'render_alert' => 'The email content must contain [MAIL_CONTENT]!',
+ ],
+ 'implementations' => [
+ 'basicSign' => 'No style - With signature',
+ 'emptyMail' => 'No style',
+ 'redMail' => 'Red with centered card',
+ ],
],
'downloads' => [
'errors' => [
@@ -424,6 +454,7 @@
'disable' => 'Disable',
'disabled' => 'Disabled',
'saving' => 'Saving ...',
+ 'reset' => 'Reset',
],
'months' => [
'list' => '["January","February","March","April","May","June","July","August","September","October","November","December"]',
diff --git a/App/Package/Core/Lang/fr.php b/App/Package/Core/Lang/fr.php
index dd0e60fd..f4f646d2 100644
--- a/App/Package/Core/Lang/fr.php
+++ b/App/Package/Core/Lang/fr.php
@@ -145,6 +145,11 @@
'delete_files' => 'Impossible de supprimer les fichiers du thème',
],
],
+ 'editor' => [
+ 'title' => 'Editeur - DEV',
+ 'multipleMenu' => 'Attention le menu %menukey% est défini plusieurs fois !',
+ 'multipleMenuKey' => 'Attention la clé %key% est présente plusieurs fois dans le menu %menukey% !',
+ ],
],
'package' => [
'updateBeforeInstall' => 'Veuillez mettre à jour le CMS avant d\'installer ce package !',
@@ -197,7 +202,10 @@
"notVerified" => "Non verifié par CMW.",
"active" => "Thème actif",
"configure" => "Configurer",
- "reset" => "Réinitialiser",
+ "reset" => "Réinitialiser %theme%",
+ "leave" => "Quitter l'éditeur",
+ "menu" => "MENU D'ÉDITION",
+ "backMenu" => "Retour au menu",
"reinstall" => "Réinstaller",
"description" => "Description : ",
"update" => "Mise à jour disponible !",
@@ -292,7 +300,7 @@
'replyMail' => 'Adresse mail de réponse',
'serverSMTP' => 'Adresse du serveur SMTP',
'userSMTP' => 'Utilisateur SMTP',
- 'passwordSMTP' => 'Mot de passe',
+ 'passwordSMTP' => 'Mot de passe SMTP',
'portSMTP' => 'Port SMTP',
'protocol' => "Protocole d'envoi",
'footer' => 'Signature de vos mails',
@@ -308,6 +316,28 @@
'receiverMailPlaceholder' => "Entrez l'adresse mail",
],
],
+ 'test' => [
+ 'object' => '✅ Test d’envoi d’email CraftMyWebsite',
+ 'body' => 'Bonjour,
Ce message a été envoyé automatiquement pour vérifier le bon fonctionnement du système d’envoi d’emails de votre site.
Si vous avez bien reçu ce message, cela signifie que tout est configuré correctement.
Merci d’utiliser CraftMyWebsite ! 🚀
',
+ ],
+ 'editor' => [
+ 'title' => 'Éditeur de mail (HTML)',
+ 'select' => 'Sélectionnez un template',
+ 'select_alert' => 'La selection d\'un template écrasera votre model actuel !',
+ 'apply_btn' => 'Appliquer',
+ 'modal_title' => 'Bon à savoir',
+ 'modal_text_1' => 'Cet éditeur vous permet de personnaliser l\'apparence de vos e-Mails, vous devez comprendre que ce model est envoyé à chaque fois qu\'un mail part peu importe le type de mail envoyé (shop, forum, newsletter, connexion, inscription...), gardez-bien cela a l\'esprit quand vous configurez votre template.',
+ 'modal_text_2' => 'Il est impératif d\'utiliser [MAIL_CONTENT] dans votre template, c\'est ici que sera placé le message envoyé par le site',
+ 'modal_text_3' => 'Tips : Les police d\'écriture pris en charge par défaut par la plupart des boites mails sont :',
+ 'render' => 'Rendu en direct des mails',
+ 'render_example' => '[EXEMPLE]
Ceci est un exemple de contenu de vos mails envoyés.
Le message sera inséré automatiquement ici.
[EXEMPLE]
',
+ 'render_alert' => 'Le contenu du mail doit contenir [MAIL_CONTENT] !',
+ ],
+ 'implementations' => [
+ 'basicSign' => 'Sans style - Avec signature',
+ 'emptyMail' => 'Sans style',
+ 'redMail' => 'Rouge avec carte centré',
+ ],
],
'downloads' => [
'errors' => [
@@ -427,6 +457,7 @@
'disable' => 'Désactiver',
'disabled' => 'Désactivée',
'saving' => 'Sauvegarde ...',
+ 'reset' => 'Réinitialiser',
],
'months' => [
'list' => '["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"]',
diff --git a/App/Package/Core/Models/CoreModel.php b/App/Package/Core/Models/CoreModel.php
index 64d3db40..74601258 100644
--- a/App/Package/Core/Models/CoreModel.php
+++ b/App/Package/Core/Models/CoreModel.php
@@ -2,9 +2,11 @@
namespace CMW\Model\Core;
-use CMW\Manager\Cache\SimpleCacheManager;
use CMW\Manager\Database\DatabaseManager;
use CMW\Manager\Package\AbstractModel;
+use function get_defined_constants;
+use function mb_strtoupper;
+use function str_starts_with;
/**
* Class: @coreController
@@ -14,7 +16,7 @@
*/
class CoreModel extends AbstractModel
{
- public function fetchOption(string $option): string
+ public function fetchOption(string $option): ?string
{
// TODO Le cache ne fonctionne pas et du coup ralenti le chargement des page
/*if (SimpleCacheManager::cacheExist('options', "Options")){
@@ -29,9 +31,17 @@ public function fetchOption(string $option): string
$db = DatabaseManager::getInstance();
$req = $db->prepare('SELECT option_value FROM cmw_core_options WHERE option_name = ?');
- $req->execute(array($option));
+
+ if (!$req->execute([$option])){
+ return null;
+ }
+
$option = $req->fetch();
+ if (!$option){
+ return null;
+ }
+
return $option['option_value'];
}
@@ -45,7 +55,7 @@ public static function getOptionValue(string $option): string
$db = DatabaseManager::getInstance();
$req = $db->prepare('SELECT option_value FROM cmw_core_options WHERE option_name = ?');
- return ($req->execute(array($option))) ? $req->fetch()['option_value'] : '';
+ return ($req->execute([$option])) ? $req->fetch()['option_value'] : '';
}
public function fetchOptions(): array
@@ -60,22 +70,18 @@ public function fetchOptions(): array
return ($req->execute()) ? $req->fetchAll() : [];
}
+ /**
+ * @param string $option_name
+ * @param string $option_value
+ * @return bool
+ */
public function updateOption(string $option_name, string $option_value): bool
{
+ $sql = 'INSERT INTO cmw_core_options (option_name, option_value, option_updated)
+ VALUES (:option_name, :option_value, NOW())
+ ON DUPLICATE KEY UPDATE option_value=VALUES(option_value), option_updated=NOW()';
$db = DatabaseManager::getInstance();
- $req = $db->prepare('UPDATE cmw_core_options SET option_value=:option_value, option_updated=NOW() WHERE option_name=:option_name');
- return $req->execute(array('option_name' => $option_name, 'option_value' => $option_value));
- }
-
- public static function getLanguages(string $prefix): array|string
- {
- foreach (get_defined_constants(false) as $key => $value) {
- if (str_starts_with($key, mb_strtoupper($prefix, 'UTF-8'))) {
- $dump[$key] = $value;
- }
- }
- // Todo Error Manager.
- return !empty($dump) ? $dump : "Error: No Constants found with prefix '" . $prefix . "'";
+ return $db->prepare($sql)->execute(['option_name' => $option_name, 'option_value' => $option_value]);
}
}
diff --git a/App/Package/Core/Models/MailModel.php b/App/Package/Core/Models/MailModel.php
index a99a4926..b37bb433 100644
--- a/App/Package/Core/Models/MailModel.php
+++ b/App/Package/Core/Models/MailModel.php
@@ -17,17 +17,17 @@ class MailModel extends AbstractModel
* @param string $password
* @param int $port
* @param string $protocol
- * @param string $footer
+ * @param string $body
* @param int $enable
* @return \CMW\Entity\Core\MailConfigEntity|null
* @desc Create or edit a config (only 1 config is allowed)
*/
- public function create(string $mail, string $mailReply, string $addressSMTP, string $user, string $password, int $port, string $protocol, string $footer, int $enable): ?MailConfigEntity
+ public function create(string $mail, string $mailReply, string $addressSMTP, string $user, string $password, int $port, string $protocol, string $body, int $enable): ?MailConfigEntity
{
if ($this->configExist() && !is_null($this->getConfig())) {
$id = $this->getConfig()?->getId();
- return $this->update($id, $mail, $mailReply, $addressSMTP, $user, $password, $port, $protocol, $footer, $enable);
+ return $this->update($id, $mail, $mailReply, $addressSMTP, $user, $password, $port, $protocol, $body, $enable);
}
$var = array(
@@ -103,6 +103,7 @@ public function getConfig(): ?MailConfigEntity
EnvManager::getInstance()->getValue('SMTP_PASSWORD') ?? '',
$res['mail_config_port'] ?? '',
$res['mail_config_protocol'] ?? '',
+ $res['mail_config_body'] ?? '',
$res['mail_config_footer'] ?? '',
$res['mail_config_enable'] ?? ''
);
@@ -117,12 +118,12 @@ public function getConfig(): ?MailConfigEntity
* @param string $password
* @param int $port
* @param string $protocol
- * @param string $footer
+ * @param string $body
* @param int $enable
* @return \CMW\Entity\Core\MailConfigEntity|null
* @desc Update the current config
*/
- public function update(int $id, string $mail, string $mailReply, string $addressSMTP, string $user, string $password, int $port, string $protocol, string $footer, int $enable): ?MailConfigEntity
+ public function update(int $id, string $mail, string $mailReply, string $addressSMTP, string $user, string $password, int $port, string $protocol, string $body, int $enable): ?MailConfigEntity
{
$var = array(
'id' => $id,
@@ -132,13 +133,13 @@ public function update(int $id, string $mail, string $mailReply, string $address
'user' => $user,
'port' => $port,
'protocol' => $protocol,
- 'footer' => $footer,
+ 'body' => $body,
'enable' => $enable
);
$sql = 'UPDATE cmw_mail_config_smtp SET mail_config_mail = :mail, mail_config_mail_reply = :mailReply,
mail_config_address_smtp = :addressSMTP, mail_config_user = :user, mail_config_port = :port,
- mail_config_protocol = :protocol, mail_config_footer = :footer, mail_config_enable = :enable
+ mail_config_protocol = :protocol, mail_config_body = :body, mail_config_enable = :enable
WHERE mail_config_id = :id';
$db = DatabaseManager::getInstance();
diff --git a/App/Package/Core/Models/ThemeModel.php b/App/Package/Core/Models/ThemeModel.php
index 482ac6c3..4308e2e7 100644
--- a/App/Package/Core/Models/ThemeModel.php
+++ b/App/Package/Core/Models/ThemeModel.php
@@ -2,11 +2,17 @@
namespace CMW\Model\Core;
-use CMW\Manager\Cache\SimpleCacheManager;
use CMW\Manager\Database\DatabaseManager;
use CMW\Manager\Env\EnvManager;
use CMW\Manager\Package\AbstractModel;
+use CMW\Manager\Theme\Config\ThemeConfigResolver;
+use CMW\Manager\Theme\Config\ThemeMapper;
+use CMW\Manager\Theme\Editor\Entities\EditorType;
+use CMW\Manager\Theme\Loader\ThemeLoader;
use CMW\Manager\Theme\ThemeManager;
+use Exception;
+use PDO;
+use RuntimeException;
/**
* Class: @ThemeModel
@@ -17,7 +23,8 @@
class ThemeModel extends AbstractModel
{
/**
- * @param string $config
+ * @param string $menuKey
+ * @param string $themeKey
* @param string|null $themeName
*
* If empty, we take the current active Theme
@@ -25,30 +32,34 @@ class ThemeModel extends AbstractModel
* @return string|null
* @desc Fetch config data
*/
- public function fetchConfigValue(string $config, string $themeName = null): ?string
+ public function fetchConfigValue(string $menuKey, string $themeKey, string $themeName = null): ?string
{
if ($themeName === null) {
- $themeName = ThemeManager::getInstance()->getCurrentTheme()->name();
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
}
- // TODO Add a toggle ?
- if (SimpleCacheManager::cacheExist('config', "Themes/$themeName")) {
- $data = SimpleCacheManager::getCache('config', "Themes/$themeName");
+ $type = ThemeConfigResolver::getInstance()->getEditorType($menuKey, $themeKey);
+ $themeConfigNameFormatted = ThemeMapper::mapConfigKey($menuKey, $themeKey);
- foreach ($data as $conf) {
- if ($conf['theme_config_name'] === $config) {
- return $conf['theme_config_value'] ?? "UNDEFINED_$config";
- }
- }
+ $cachedValue = ThemeConfigResolver::getInstance()->getConfigValueFromCache($themeName, $themeConfigNameFormatted, $menuKey, $themeKey, $type);
+ if ($cachedValue !== null) {
+ return $cachedValue;
}
+ $data = ['config' => $themeConfigNameFormatted, 'theme' => $themeName];
+
$db = DatabaseManager::getInstance();
- $req = $db->prepare('SELECT theme_config_value FROM cmw_theme_config
- WHERE theme_config_name = :config AND theme_config_theme = :theme');
+ $req = $db->prepare('SELECT theme_config_value FROM cmw_theme_config WHERE theme_config_name = :config AND theme_config_theme = :theme');
- $req->execute(['config' => $config, 'theme' => $themeName]);
+ if ($req->execute($data)) {
+ $value = $req->fetch()['theme_config_value'] ?? null;
+ }
- return $req->fetch()['theme_config_value'] ?? '';
+ if ($type === EditorType::IMAGE) {
+ return ThemeConfigResolver::getInstance()->resolveImagePath($themeName, $value ?? null, $menuKey, $themeKey);
+ }
+
+ return $value ?? ThemeConfigResolver::getInstance()->getDefaultThemeValue($menuKey, $themeKey);
}
/**
@@ -59,11 +70,12 @@ public function fetchConfigValue(string $config, string $themeName = null): ?str
*
* @return string|null
* @desc Fetch config data
+ * @deprecated Sera supprimé en alpha-10 gérer nativement dans fetchConfigValue
*/
public function fetchImageLink(string $configName, string $theme = null): ?string
{
if ($theme === null) {
- $theme = ThemeManager::getInstance()->getCurrentTheme()->name();
+ $theme = ThemeLoader::getInstance()->getCurrentTheme()->name();
}
$db = DatabaseManager::getInstance();
@@ -90,11 +102,12 @@ public function fetchImageLink(string $configName, string $theme = null): ?strin
*
* @return string|null
* @desc Fetch config data
+ * @deprecated Sera supprimé en alpha-10 gérer nativement dans fetchConfigValue
*/
public function fetchVideoLink(string $configName, string $theme = null): ?string
{
if ($theme === null) {
- $theme = ThemeManager::getInstance()->getCurrentTheme()->name();
+ $theme = ThemeLoader::getInstance()->getCurrentTheme()->name();
}
$db = DatabaseManager::getInstance();
@@ -113,6 +126,10 @@ public function fetchVideoLink(string $configName, string $theme = null): ?strin
return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'Public/Uploads/' . $theme . '/Videos/' . $value;
}
+ /**
+ * @param string $theme
+ * @return array
+ */
public function fetchThemeConfigs(string $theme): array
{
$db = DatabaseManager::getInstance();
@@ -163,4 +180,80 @@ public function transactionalDeleteThemeConfig(string $themeName): \PDO
return $db;
}
+
+ /**
+ * @param string $config
+ * @param string|null $themeName
+ * @return string|null
+ * @desc Retourne simplement la valeur en DB par rapport à la clé complete
+ */
+ public function getConfigValue(string $config, string $themeName = null): ?string
+ {
+ if ($themeName === null) {
+ $themeName = ThemeLoader::getInstance()->getCurrentTheme()->name();
+ }
+
+ $data = [
+ 'config' => $config,
+ 'theme' => $themeName
+ ];
+
+ $db = DatabaseManager::getInstance();
+ $req = $db->prepare('SELECT theme_config_value FROM cmw_theme_config WHERE theme_config_name = :config AND theme_config_theme = :theme');
+
+ if ($req->execute($data)) {
+ $value = $req->fetch()['theme_config_value'] ?? null;
+ }
+
+ return $value ?? null;
+ }
+
+ public function getExistingThemeConfigKeys(string $theme): array
+ {
+ $db = DatabaseManager::getInstance();
+ $req = $db->prepare('SELECT theme_config_name FROM cmw_theme_config WHERE theme_config_theme = :theme');
+
+ if (!$req->execute(['theme' => $theme])) {
+ return [];
+ }
+
+ $results = $req->fetchAll(PDO::FETCH_ASSOC);
+ if (!is_array($results)) {
+ return [];
+ }
+
+ return array_column($results, 'theme_config_name');
+ }
+
+
+ public function storeThemeConfigBulk(array $configs, string $theme): bool
+ {
+ if (empty($configs)) return true;
+
+ $db = DatabaseManager::getInstance();
+ $db->beginTransaction();
+
+ try {
+ $stmt = $db->prepare('INSERT INTO cmw_theme_config (theme_config_name, theme_config_value, theme_config_theme) VALUES (:name, :value, :theme)');
+
+ foreach ($configs as $config) {
+ $data = [
+ 'name' => $config['name'],
+ 'value' => $config['value'],
+ 'theme' => $theme
+ ];
+
+ if (!$stmt->execute($data)) {
+ throw new RuntimeException('Failed to insert config');
+ }
+ }
+
+ $db->commit();
+ return true;
+ } catch (Exception $e) {
+ $db->rollBack();
+ return false;
+ }
+ }
+
}
diff --git a/App/Package/Core/Package.php b/App/Package/Core/Package.php
index dbe94a6e..4dc4c2d8 100644
--- a/App/Package/Core/Package.php
+++ b/App/Package/Core/Package.php
@@ -6,6 +6,7 @@
use CMW\Manager\Package\IPackageConfig;
use CMW\Manager\Package\PackageMenuType;
use CMW\Manager\Package\PackageSubMenuType;
+use CMW\Manager\Theme\Loader\ThemeLoader;
use CMW\Manager\Theme\ThemeManager;
use CMW\Manager\Updater\UpdatesManager;
@@ -101,7 +102,7 @@ public function menus(): ?array
permission: null,
subMenus: [
new PackageSubMenuType(
- title: LangManager::translate('core.menu.themes.edit') . ThemeManager::getInstance()->getCurrentTheme()->name(),
+ title: LangManager::translate('core.menu.themes.edit') . ThemeLoader::getInstance()->getCurrentTheme()->name(),
permission: 'core.themes.edit',
url: 'theme/manage',
subMenus: []
diff --git a/App/Package/Core/Views/Configuration/configuration.admin.view.php b/App/Package/Core/Views/Configuration/configuration.admin.view.php
index 224837c3..2597d828 100644
--- a/App/Package/Core/Views/Configuration/configuration.admin.view.php
+++ b/App/Package/Core/Views/Configuration/configuration.admin.view.php
@@ -1,4 +1,5 @@
-
+
*= LangManager::translate('core.config.favicon_tips') ?>
diff --git a/App/Package/Core/Views/Mail/Resources/Images/empty.png b/App/Package/Core/Views/Mail/Resources/Images/empty.png
new file mode 100644
index 00000000..05802525
Binary files /dev/null and b/App/Package/Core/Views/Mail/Resources/Images/empty.png differ
diff --git a/App/Package/Core/Views/Mail/Resources/Images/red.png b/App/Package/Core/Views/Mail/Resources/Images/red.png
new file mode 100644
index 00000000..2b33b3a4
Binary files /dev/null and b/App/Package/Core/Views/Mail/Resources/Images/red.png differ
diff --git a/App/Package/Core/Views/Mail/Resources/Images/signed.png b/App/Package/Core/Views/Mail/Resources/Images/signed.png
new file mode 100644
index 00000000..f9a04a5d
Binary files /dev/null and b/App/Package/Core/Views/Mail/Resources/Images/signed.png differ
diff --git a/App/Package/Core/Views/Mail/mailConfig.admin.view.php b/App/Package/Core/Views/Mail/mailConfig.admin.view.php
index 167d4ce1..17487fce 100644
--- a/App/Package/Core/Views/Mail/mailConfig.admin.view.php
+++ b/App/Package/Core/Views/Mail/mailConfig.admin.view.php
@@ -1,109 +1,246 @@
+
SMTP & Mailing
- = LangManager::translate('core.btn.save') ?>
+
+ = LangManager::translate('core.btn.save') ?>
+