diff --git a/.gitignore b/.gitignore index 64c1fdb..161a591 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ auth.json # -------------------------------------------------- /public/fileadmin/ /public/uploads/ +/public/_frontend/ # -------------------------------------------------- # Projektspezifisch ignoriert diff --git a/packages/vitec/Classes/Controller/MarketController.php b/packages/vitec/Classes/Controller/MarketController.php index e4aca8d..26da4cf 100644 --- a/packages/vitec/Classes/Controller/MarketController.php +++ b/packages/vitec/Classes/Controller/MarketController.php @@ -57,4 +57,18 @@ class MarketController extends ActionController return $this->htmlResponse(); } + + /** + * action list + * + * Extbase registration target for the Marketlist plugin. In headless mode + * the JSON output is produced by MarketListJsonRenderer, not by this + * controller — same arrangement as LocationController::listAction(). + * + * @return ResponseInterface + */ + public function listAction(): ResponseInterface + { + return $this->htmlResponse(); + } } diff --git a/packages/vitec/Classes/DataProcessing/ContainerChildrenProcessor.php b/packages/vitec/Classes/DataProcessing/ContainerChildrenProcessor.php index e06b939..c3c0ca6 100755 --- a/packages/vitec/Classes/DataProcessing/ContainerChildrenProcessor.php +++ b/packages/vitec/Classes/DataProcessing/ContainerChildrenProcessor.php @@ -7,6 +7,7 @@ use Evomedien\Vitec\UserFunc\ProductListJsonRenderer; use Evomedien\Vitec\UserFunc\ProductShowJsonRenderer; use Evomedien\Vitec\UserFunc\UsecaseListJsonRenderer; use Evomedien\Vitec\UserFunc\UsecaseShowJsonRenderer; +use Evomedien\Vitec\UserFunc\MarketListJsonRenderer; use Evomedien\Vitec\UserFunc\MarketShowJsonRenderer; use Evomedien\Vitec\UserFunc\SolutionShowJsonRenderer; use Evomedien\Vitec\UserFunc\DownloadcardJsonRenderer; @@ -110,6 +111,7 @@ final class ContainerChildrenProcessor implements DataProcessorInterface 'vitec_usecaselist' => [UsecaseListJsonRenderer::class, 'usecases'], 'vitec_usecaseshow' => [UsecaseShowJsonRenderer::class, 'usecase'], 'vitec_marketshow' => [MarketShowJsonRenderer::class, 'market'], + 'vitec_marketlist' => [MarketListJsonRenderer::class, 'markets'], 'vitec_solutionshow' => [SolutionShowJsonRenderer::class, 'solution'], 'vitec_downloadcard' => [DownloadcardJsonRenderer::class, 'downloadcard'], 'vitec_downloadcardcollection' => [DownloadcardcollectionJsonRenderer::class, 'downloadcardcollection'], diff --git a/packages/vitec/Classes/Domain/Model/Market.php b/packages/vitec/Classes/Domain/Model/Market.php index 3ed79bb..3a06d75 100644 --- a/packages/vitec/Classes/Domain/Model/Market.php +++ b/packages/vitec/Classes/Domain/Model/Market.php @@ -13,6 +13,18 @@ class Market extends AbstractEntity */ protected $title = ''; + /** + * @var string + */ + protected $slug = ''; + + /** + * Page uid presenting this market (TCA type "group", allowed: pages). + * + * @var int + */ + protected $detailPage = 0; + /** * @var string */ @@ -65,6 +77,38 @@ class Market extends AbstractEntity $this->title = $title; } + /** + * @return string + */ + public function getSlug(): string + { + return $this->slug; + } + + /** + * @param string $slug + */ + public function setSlug(string $slug): void + { + $this->slug = $slug; + } + + /** + * @return int + */ + public function getDetailPage(): int + { + return $this->detailPage; + } + + /** + * @param int $detailPage + */ + public function setDetailPage(int $detailPage): void + { + $this->detailPage = $detailPage; + } + /** * @return string */ diff --git a/packages/vitec/Classes/Domain/Model/Solution.php b/packages/vitec/Classes/Domain/Model/Solution.php index aa6243c..c478ae5 100644 --- a/packages/vitec/Classes/Domain/Model/Solution.php +++ b/packages/vitec/Classes/Domain/Model/Solution.php @@ -13,6 +13,11 @@ class Solution extends AbstractEntity */ protected $title = ''; + /** + * @var string + */ + protected $slug = ''; + /** * @var string */ @@ -65,6 +70,22 @@ class Solution extends AbstractEntity $this->title = $title; } + /** + * @return string + */ + public function getSlug(): string + { + return $this->slug; + } + + /** + * @param string $slug + */ + public function setSlug(string $slug): void + { + $this->slug = $slug; + } + /** * @return string */ diff --git a/packages/vitec/Classes/Service/ContentElementResolver.php b/packages/vitec/Classes/Service/ContentElementResolver.php index ca49065..81a5e47 100755 --- a/packages/vitec/Classes/Service/ContentElementResolver.php +++ b/packages/vitec/Classes/Service/ContentElementResolver.php @@ -9,6 +9,7 @@ use Evomedien\Vitec\UserFunc\ProductListJsonRenderer; use Evomedien\Vitec\UserFunc\ProductShowJsonRenderer; use Evomedien\Vitec\UserFunc\UsecaseListJsonRenderer; use Evomedien\Vitec\UserFunc\UsecaseShowJsonRenderer; +use Evomedien\Vitec\UserFunc\MarketListJsonRenderer; use Evomedien\Vitec\UserFunc\MarketShowJsonRenderer; use Evomedien\Vitec\UserFunc\SolutionShowJsonRenderer; use Evomedien\Vitec\UserFunc\DownloadcardJsonRenderer; @@ -75,6 +76,7 @@ final class ContentElementResolver 'vitec_usecaselist' => [UsecaseListJsonRenderer::class, 'usecases'], 'vitec_usecaseshow' => [UsecaseShowJsonRenderer::class, 'usecase'], 'vitec_marketshow' => [MarketShowJsonRenderer::class, 'market'], + 'vitec_marketlist' => [MarketListJsonRenderer::class, 'markets'], 'vitec_solutionshow' => [SolutionShowJsonRenderer::class, 'solution'], 'vitec_downloadcard' => [DownloadcardJsonRenderer::class, 'downloadcard'], 'vitec_downloadcardcollection' => [DownloadcardcollectionJsonRenderer::class, 'downloadcardcollection'], diff --git a/packages/vitec/Classes/Service/RteResolver.php b/packages/vitec/Classes/Service/RteResolver.php new file mode 100644 index 0000000..8d48fee --- /dev/null +++ b/packages/vitec/Classes/Service/RteResolver.php @@ -0,0 +1,56 @@ +`, legacy content as `` tags, images with + * relative paths. Fluid resolves those through `parseFunc` when it renders; a + * headless UserFunc renderer that hands the raw column straight to JSON does + * not, and the frontend receives dead links. + * + * The two upstream packages already close this gap for the output they own: + * `friendsoftypo3/headless` applies `parseFunc =< lib.parseFunc_RTE` to the core + * text elements via TypoScript, and `nb-headless-content-blocks` calls + * `parseFunc($value, null, '< lib.parseFunc_RTE')` for every Content Block field + * whose TCA has `enableRichtext`. This class closes it for the VITEC UserFunc + * renderers, using exactly the same call. + * + * Static by design: the conversion is stateless, and the call sites are payload + * array literals where a `GeneralUtility::makeInstance(...)->` prefix would add + * only noise. Same rationale as `CropVariants::firstImage()` and + * `FormDefinitions::get()`. + * + * Fail-soft per architecture spec clause 9.5: when parsing is impossible — most + * notably outside a frontend request, where no TypoScript setup exists — the raw + * value is returned. Content is never lost; at worst it stays unresolved. + */ +final class RteResolver +{ + /** + * @param mixed $value raw column value; null and non-strings are tolerated + */ + public static function html(mixed $value): string + { + $raw = (string)($value ?? ''); + if (trim($raw) === '') { + return ''; + } + + try { + $parsed = GeneralUtility::makeInstance(ContentObjectRenderer::class) + ->parseFunc($raw, null, '< lib.parseFunc_RTE'); + + return $parsed !== '' ? $parsed : $raw; + } catch (\Throwable $e) { + return $raw; + } + } +} diff --git a/packages/vitec/Classes/UserFunc/DatasheetsJsonRenderer.php b/packages/vitec/Classes/UserFunc/DatasheetsJsonRenderer.php index 26b9683..1bde441 100755 --- a/packages/vitec/Classes/UserFunc/DatasheetsJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/DatasheetsJsonRenderer.php @@ -11,6 +11,7 @@ use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -261,7 +262,7 @@ class DatasheetsJsonRenderer 'title' => (string)($download['title'] ?? ''), 'slug' => (string)($download['slug'] ?? ''), 'teaser' => (string)($download['teaser'] ?? ''), - 'description' => (string)($download['description'] ?? ''), + 'description' => RteResolver::html($download['description'] ?? ''), 'tstamp' => (int)($download['tstamp'] ?? 0), 'filetype' => $filetype, 'file' => $this->getDownloadFile($uid, (string)($download['fileprefix'] ?? ''), $filetype), diff --git a/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php b/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php index a24ba70..6684663 100755 --- a/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php @@ -10,6 +10,7 @@ use Doctrine\DBAL\ParameterType; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @@ -254,7 +255,7 @@ class DownloadcardJsonRenderer 'title' => (string)($download['title'] ?? ''), 'slug' => (string)($download['slug'] ?? ''), 'teaser' => (string)($download['teaser'] ?? ''), - 'description' => (string)($download['description'] ?? ''), + 'description' => RteResolver::html($download['description'] ?? ''), 'keywords' => (string)($download['keywords'] ?? ''), 'icon' => (string)($download['icon'] ?? ''), 'filepath' => (string)($download['filepath'] ?? ''), diff --git a/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php b/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php index 61283e8..94303c5 100755 --- a/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php @@ -12,6 +12,7 @@ use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -258,7 +259,7 @@ class DownloadcardcollectionJsonRenderer 'title' => (string)($download['title'] ?? ''), 'slug' => (string)($download['slug'] ?? ''), 'teaser' => (string)($download['teaser'] ?? ''), - 'description' => (string)($download['description'] ?? ''), + 'description' => RteResolver::html($download['description'] ?? ''), 'keywords' => (string)($download['keywords'] ?? ''), 'icon' => (string)($download['icon'] ?? ''), 'filepath' => (string)($download['filepath'] ?? ''), diff --git a/packages/vitec/Classes/UserFunc/EventlistJsonRenderer.php b/packages/vitec/Classes/UserFunc/EventlistJsonRenderer.php index b261b7c..2514001 100755 --- a/packages/vitec/Classes/UserFunc/EventlistJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/EventlistJsonRenderer.php @@ -9,6 +9,7 @@ use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -195,7 +196,7 @@ class EventlistJsonRenderer 'title' => (string)($event['title'] ?? ''), 'slug' => (string)($event['slug'] ?? ''), 'teaser' => (string)($event['teaser'] ?? ''), - 'description' => (string)($event['description'] ?? ''), + 'description' => RteResolver::html($event['description'] ?? ''), 'eventstart' => $start > 0 ? date('Y-m-d', $start) : null, 'eventend' => $end > 0 ? date('Y-m-d', $end) : null, 'venue' => (string)($event['venue'] ?? ''), diff --git a/packages/vitec/Classes/UserFunc/LocationsJsonRenderer.php b/packages/vitec/Classes/UserFunc/LocationsJsonRenderer.php index 49c118d..065c7a4 100755 --- a/packages/vitec/Classes/UserFunc/LocationsJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/LocationsJsonRenderer.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\ParameterType; use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; @@ -82,7 +83,7 @@ class LocationsJsonRenderer $settings = $flexFormData['settings'] ?? []; $variant = (string)($settings['variant'] ?? 'grid'); - $mapText = trim((string)($settings['maptext'] ?? '')); + $mapText = RteResolver::html($settings['maptext'] ?? ''); $debugMode = (bool)($settings['debug'] ?? false); $qb = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE); diff --git a/packages/vitec/Classes/UserFunc/MarketListJsonRenderer.php b/packages/vitec/Classes/UserFunc/MarketListJsonRenderer.php new file mode 100644 index 0000000..2a17bae --- /dev/null +++ b/packages/vitec/Classes/UserFunc/MarketListJsonRenderer.php @@ -0,0 +1,196 @@ + ALL visible markets, alphabetical by title + * (tx_vitec_domain_model_market has no `sorting` column) + * - markets selected -> exactly those, in the order the editor arranged + * them in the FlexForm + * + * The page carrying the plugin is never used as a filter. + * + * Each item uses the same shape as the card payload (ModelcardJsonRenderer, + * model type "market"), so the frontend can render list and single card with + * one component. Image resolution is delegated to UsecaseSerializer::image() + * rather than re-implemented inline (architecture spec, clause 9.2). + * + * `render()` = top-level plugin / page discovery. `renderForRecord()` = one + * specific tt_content row (reused by ContainerChildrenProcessor for nested + * plugins). Exception-safe. + */ +class MarketListJsonRenderer +{ + private const TABLE = 'tx_vitec_domain_model_market'; + private const CTYPE = 'vitec_marketlist'; + + #[AsAllowedCallable] + public function render(string $content, array $conf): string + { + $row = is_array($this->cObj->data ?? null) ? $this->cObj->data : null; + if ($row && (string)($row['CType'] ?? '') === self::CTYPE) { + return $this->renderForRecord($row); + } + + $pageId = 0; + $request = $GLOBALS['TYPO3_REQUEST'] ?? null; + if ($request !== null) { + $pageInfo = $request->getAttribute('frontend.page.information'); + if ($pageInfo !== null) { + $pageId = (int)$pageInfo->getId(); + } + } + if ($pageId <= 0) { + $pageId = (int)($GLOBALS['TSFE']->id ?? 0); + } + if ($pageId <= 0) { + return ''; + } + + $qb = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content'); + $ces = $qb + ->select('*') + ->from('tt_content') + ->where( + $qb->expr()->eq('pid', $qb->createNamedParameter($pageId, ParameterType::INTEGER)), + $qb->expr()->eq('CType', $qb->createNamedParameter(self::CTYPE, ParameterType::STRING)), + $qb->expr()->eq('deleted', 0), + $qb->expr()->eq('hidden', 0) + ) + ->executeQuery() + ->fetchAllAssociative(); + + if (empty($ces)) { + return ''; + } + + return $this->renderForRecord($ces[0]); + } + + /** + * @param array $contentElement + */ + public function renderForRecord(array $contentElement): string + { + try { + $flexFormService = GeneralUtility::makeInstance(FlexFormService::class); + $flexFormData = $flexFormService->convertFlexFormContentToArray($contentElement['pi_flexform'] ?? ''); + $settings = $flexFormData['settings'] ?? []; + + $layout = (string)($settings['layout'] ?? 'grid'); + $debugMode = (bool)($settings['debug'] ?? false); + $selectedUids = GeneralUtility::intExplode(',', (string)($settings['markets'] ?? ''), true); + + // Always fetch the full (small) table once — that way a selected + // record that has meanwhile been hidden or deleted simply drops out. + $qb = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(self::TABLE); + $rows = $qb + ->select('*') + ->from(self::TABLE) + ->where( + $qb->expr()->eq('deleted', 0), + $qb->expr()->eq('hidden', 0) + ) + ->orderBy('title', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + + $serializer = GeneralUtility::makeInstance(UsecaseSerializer::class); + + if ($selectedUids === []) { + $markets = array_map( + fn(array $r): array => $this->serializeMarket($r, $serializer), + $rows + ); + } else { + // Keep the editor's FlexForm order. A SQL IN() would return the + // rows in storage order, so the sequence is rebuilt here. + $byUid = []; + foreach ($rows as $r) { + $byUid[(int)$r['uid']] = $r; + } + $markets = []; + foreach ($selectedUids as $uid) { + if (isset($byUid[$uid])) { + $markets[] = $this->serializeMarket($byUid[$uid], $serializer); + } + } + } + + $response = [ + 'layout' => $layout, + 'markets' => $markets, + ]; + + if ($debugMode) { + $response['debug'] = [ + 'count' => count($markets), + 'selected' => $selectedUids, + 'settings' => $settings, + ]; + } + + return (string)json_encode($response); + } catch (\Throwable $e) { + return ''; + } + } + + /** + * @param array $r + * @return array + */ + private function serializeMarket(array $r, UsecaseSerializer $serializer): array + { + $uid = (int)$r['uid']; + + return [ + 'uid' => $uid, + 'title' => (string)($r['title'] ?? ''), + 'slug' => (string)($r['slug'] ?? ''), + 'subtitle' => (string)($r['subtitle'] ?? ''), + 'teaser' => (string)($r['teaser'] ?? ''), + 'description' => RteResolver::html($r['description'] ?? ''), + 'detailUrl' => $this->detailUrl((int)($r['detail_page'] ?? 0)), + 'image' => $serializer->image($uid, 'image', self::TABLE, true), + ]; + } + + /** + * Resolve the `detail_page` uid to a URL. The frontend cannot do anything + * with a raw page uid, so the link is built server side — same convention + * as `headerLink` and LocationsJsonRenderer. + * + * Returns null when no page is set or the link cannot be resolved. + */ + private function detailUrl(int $pageUid): ?string + { + if ($pageUid <= 0) { + return null; + } + try { + $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class); + $url = $cObj->typoLink_URL(['parameter' => (string)$pageUid]); + return $url !== '' ? $url : null; + } catch (\Throwable $e) { + return null; + } + } +} diff --git a/packages/vitec/Classes/UserFunc/MarketShowJsonRenderer.php b/packages/vitec/Classes/UserFunc/MarketShowJsonRenderer.php index a790e9f..980088b 100755 --- a/packages/vitec/Classes/UserFunc/MarketShowJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/MarketShowJsonRenderer.php @@ -10,8 +10,10 @@ use Doctrine\DBAL\ParameterType; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; +use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; /** * UserFunc to render a single market as JSON for headless output. @@ -155,9 +157,11 @@ class MarketShowJsonRenderer return [ 'uid' => $uid, 'title' => (string)($market['title'] ?? ''), + 'slug' => (string)($market['slug'] ?? ''), 'subtitle' => (string)($market['subtitle'] ?? ''), 'teaser' => (string)($market['teaser'] ?? ''), - 'description' => (string)($market['description'] ?? ''), + 'description' => RteResolver::html($market['description'] ?? ''), + 'detailUrl' => $this->detailUrl((int)($market['detail_page'] ?? 0)), 'categories' => $this->getMarketCategories($uid), 'image' => $this->getMarketImage($uid), ]; @@ -267,4 +271,25 @@ class MarketShowJsonRenderer ]; }, $categories); } + + /** + * Resolve the `detail_page` uid to a URL. The frontend cannot do anything + * with a raw page uid, so the link is built server side — same convention + * as `headerLink` and LocationsJsonRenderer. + * + * Returns null when no page is set or the link cannot be resolved. + */ + private function detailUrl(int $pageUid): ?string + { + if ($pageUid <= 0) { + return null; + } + try { + $cObj = GeneralUtility::makeInstance(ContentObjectRenderer::class); + $url = $cObj->typoLink_URL(['parameter' => (string)$pageUid]); + return $url !== '' ? $url : null; + } catch (\Throwable $e) { + return null; + } + } } diff --git a/packages/vitec/Classes/UserFunc/ModelcardJsonRenderer.php b/packages/vitec/Classes/UserFunc/ModelcardJsonRenderer.php index 762b1a7..58638c6 100755 --- a/packages/vitec/Classes/UserFunc/ModelcardJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/ModelcardJsonRenderer.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Evomedien\Vitec\UserFunc; use Doctrine\DBAL\ParameterType; +use Evomedien\Vitec\Service\RteResolver; use Evomedien\Vitec\Service\UsecaseSerializer; use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Database\ConnectionPool; @@ -166,9 +167,10 @@ class ModelcardJsonRenderer return [ 'uid' => $uid, 'title' => (string)($row['title'] ?? ''), + 'slug' => (string)($row['slug'] ?? ''), 'subtitle' => (string)($row['subtitle'] ?? ''), 'teaser' => (string)($row['teaser'] ?? ''), - 'description' => (string)($row['description'] ?? ''), + 'description' => RteResolver::html($row['description'] ?? ''), 'image' => $serializer->image($uid, 'image', self::MODEL_TABLES[$modelType], true), ]; } diff --git a/packages/vitec/Classes/UserFunc/NewsJsonRenderer.php b/packages/vitec/Classes/UserFunc/NewsJsonRenderer.php index d4da1a3..568c1d7 100644 --- a/packages/vitec/Classes/UserFunc/NewsJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/NewsJsonRenderer.php @@ -11,6 +11,7 @@ use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -319,7 +320,7 @@ final class NewsJsonRenderer 'detailUrl' => $urls['detailUrl'], 'canonicalUrl' => $urls['canonicalUrl'], 'teaser' => (string)($news['teaser'] ?? ''), - 'bodytext' => (string)($news['bodytext'] ?? ''), + 'bodytext' => RteResolver::html($news['bodytext'] ?? ''), 'datetime' => (int)($news['datetime'] ?? 0), 'archive' => (int)($news['archive'] ?? 0), 'istopnews' => (bool)($news['istopnews'] ?? false), diff --git a/packages/vitec/Classes/UserFunc/ProductListJsonRenderer.php b/packages/vitec/Classes/UserFunc/ProductListJsonRenderer.php index 1ce637b..57de408 100755 --- a/packages/vitec/Classes/UserFunc/ProductListJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/ProductListJsonRenderer.php @@ -16,6 +16,7 @@ use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection; use TYPO3\CMS\Core\Resource\FileReference; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -177,9 +178,9 @@ class ProductListJsonRenderer 'teaser' => (string)($product['teaser'] ?? ''), 'subtitle' => (string)($product['subtitle'] ?? ''), 'video' => (string)($product['video'] ?? ''), - 'applications' => (string)($product['applications'] ?? ''), - 'description' => (string)($product['description'] ?? ''), - 'highlights' => (string)($product['highlights'] ?? ''), + 'applications' => RteResolver::html($product['applications'] ?? ''), + 'description' => RteResolver::html($product['description'] ?? ''), + 'highlights' => RteResolver::html($product['highlights'] ?? ''), 'shortcutpid' => (string)($product['shortcutpid'] ?? ''), 'contentelement' => \Evomedien\Vitec\Service\ContentElementResolver::resolveLink((string)($product['contentelement'] ?? '')), 'contentelementcta' => \Evomedien\Vitec\Service\ContentElementResolver::resolveLink((string)($product['contentelementcta'] ?? '')), @@ -697,7 +698,7 @@ class ProductListJsonRenderer 'title' => $download['title'] ?? '', 'slug' => $download['slug'] ?? '', 'teaser' => $download['teaser'] ?? '', - 'description' => $download['description'] ?? '', + 'description' => RteResolver::html($download['description'] ?? ''), 'keywords' => $download['keywords'] ?? '', 'icon' => $download['icon'] ?? '', 'fileprefix' => $fileprefix, @@ -741,7 +742,7 @@ class ProductListJsonRenderer 'slug' => (string)($rel['slug'] ?? ''), 'subtitle' => (string)($rel['subtitle'] ?? ''), 'teaser' => (string)($rel['teaser'] ?? ''), - 'description' => (string)($rel['description'] ?? ''), + 'description' => RteResolver::html($rel['description'] ?? ''), 'link' => '/product/' . (string)($rel['slug'] ?? ''), 'images' => $this->getProductImages($relUid), ]; diff --git a/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php b/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php index 4696961..ab264ca 100755 --- a/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php @@ -10,6 +10,7 @@ use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection; @@ -192,9 +193,9 @@ class ProductShowJsonRenderer 'teaser' => (string)($product['teaser'] ?? ''), 'subtitle' => (string)($product['subtitle'] ?? ''), 'video' => (string)($product['video'] ?? ''), - 'applications' => (string)($product['applications'] ?? ''), - 'description' => (string)($product['description'] ?? ''), - 'highlights' => (string)($product['highlights'] ?? ''), + 'applications' => RteResolver::html($product['applications'] ?? ''), + 'description' => RteResolver::html($product['description'] ?? ''), + 'highlights' => RteResolver::html($product['highlights'] ?? ''), 'shortcutpid' => (string)($product['shortcutpid'] ?? ''), 'contentelement' => \Evomedien\Vitec\Service\ContentElementResolver::resolveLink((string)($product['contentelement'] ?? '')), 'contentelementcta' => \Evomedien\Vitec\Service\ContentElementResolver::resolveLink((string)($product['contentelementcta'] ?? '')), @@ -769,7 +770,7 @@ class ProductShowJsonRenderer 'title' => $download['title'] ?? '', 'slug' => $download['slug'] ?? '', 'teaser' => $download['teaser'] ?? '', - 'description' => $download['description'] ?? '', + 'description' => RteResolver::html($download['description'] ?? ''), 'keywords' => $download['keywords'] ?? '', 'icon' => $download['icon'] ?? '', 'fileprefix' => $fileprefix, @@ -813,7 +814,7 @@ class ProductShowJsonRenderer 'slug' => (string)($rel['slug'] ?? ''), 'subtitle' => (string)($rel['subtitle'] ?? ''), 'teaser' => (string)($rel['teaser'] ?? ''), - 'description' => (string)($rel['description'] ?? ''), + 'description' => RteResolver::html($rel['description'] ?? ''), 'link' => '/product/' . (string)($rel['slug'] ?? ''), 'images' => $this->getProductImages($relUid), ]; diff --git a/packages/vitec/Classes/UserFunc/SolutionShowJsonRenderer.php b/packages/vitec/Classes/UserFunc/SolutionShowJsonRenderer.php index 133dc8a..2757157 100755 --- a/packages/vitec/Classes/UserFunc/SolutionShowJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/SolutionShowJsonRenderer.php @@ -10,6 +10,7 @@ use Doctrine\DBAL\ParameterType; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Service\FlexFormService; +use Evomedien\Vitec\Service\RteResolver; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Service\ImageService; @@ -155,9 +156,10 @@ class SolutionShowJsonRenderer return [ 'uid' => $uid, 'title' => (string)($solution['title'] ?? ''), + 'slug' => (string)($solution['slug'] ?? ''), 'subtitle' => (string)($solution['subtitle'] ?? ''), 'teaser' => (string)($solution['teaser'] ?? ''), - 'description' => (string)($solution['description'] ?? ''), + 'description' => RteResolver::html($solution['description'] ?? ''), 'categories' => $this->getSolutionCategories($uid), 'image' => $this->getSolutionImage($uid), ]; diff --git a/packages/vitec/Configuration/FlexForms/Marketlist.xml b/packages/vitec/Configuration/FlexForms/Marketlist.xml new file mode 100644 index 0000000..a347452 --- /dev/null +++ b/packages/vitec/Configuration/FlexForms/Marketlist.xml @@ -0,0 +1,61 @@ + + + + 1 + + + + + Market List Settings + array + + + + Display variant for the market cards. + + select + selectSingle + + + + grid + + + + list + + + + carousel + + + grid + + + + + + Leave empty to show all markets alphabetically. If you select markets, exactly those are shown — in the order you arrange them here (use the arrows to sort). + + select + selectMultipleSideBySide + tx_vitec_domain_model_market + AND tx_vitec_domain_model_market.hidden = 0 AND tx_vitec_domain_model_market.deleted = 0 ORDER BY tx_vitec_domain_model_market.title + 8 + 0 + 999 + + + + + + + check + 0 + + + + + + + diff --git a/packages/vitec/Configuration/Icons.php b/packages/vitec/Configuration/Icons.php index 6615d2a..2977dbf 100755 --- a/packages/vitec/Configuration/Icons.php +++ b/packages/vitec/Configuration/Icons.php @@ -80,6 +80,10 @@ return [ 'provider' => SvgIconProvider::class, 'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-locationlist.svg', ], + 'vitec-plugin-marketlist' => [ + 'provider' => SvgIconProvider::class, + 'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-marketlist.svg', + ], 'vitec-plugin-customerlogos' => [ 'provider' => SvgIconProvider::class, 'source' => 'EXT:vitec/Resources/Public/Icons/vitec-plugin-customerlogos.svg', diff --git a/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript b/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript index d1cce82..d8fa192 100755 --- a/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript +++ b/packages/vitec/Configuration/Sets/Vitecset/setup.typoscript @@ -101,6 +101,18 @@ tt_content { } } + vitec_marketlist < lib.contentElementWithHeader + vitec_marketlist { + fields { + content { + fields { + markets = USER + markets.userFunc = Evomedien\Vitec\UserFunc\MarketListJsonRenderer->render + } + } + } + } + vitec_solutionshow < lib.contentElementWithHeader vitec_solutionshow { fields { diff --git a/packages/vitec/Configuration/TCA/Overrides/tt_content.php b/packages/vitec/Configuration/TCA/Overrides/tt_content.php index 1f4af79..14c38c1 100644 --- a/packages/vitec/Configuration/TCA/Overrides/tt_content.php +++ b/packages/vitec/Configuration/TCA/Overrides/tt_content.php @@ -101,6 +101,16 @@ use TYPO3\CMS\Extbase\Utility\ExtensionUtility; 'FILE:EXT:vitec/Configuration/FlexForms/Locationlist.xml' ); + ExtensionUtility::registerPlugin( + 'Vitec', + 'Marketlist', + 'VITEC Market List', + 'vitec-plugin-marketlist', + 'vitec', + 'All markets as grid, list or carousel.', + 'FILE:EXT:vitec/Configuration/FlexForms/Marketlist.xml' + ); + // Change frame_class to allow multiple selections. $GLOBALS['TCA']['tt_content']['columns']['frame_class']['config']['renderType'] = 'selectCheckBox'; diff --git a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_market.php b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_market.php index 1cc90ff..1011acb 100644 --- a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_market.php +++ b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_market.php @@ -24,7 +24,7 @@ return [ ], 'types' => [ '1' => [ - 'showitem' => 'title, subtitle, teaser, description, image, + 'showitem' => 'title, slug, detail_page, subtitle, teaser, description, image, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime', @@ -112,6 +112,34 @@ return [ 'default' => '', ], ], + 'slug' => [ + 'exclude' => false, + 'label' => 'URL Segment', + 'config' => [ + 'type' => 'slug', + 'size' => 50, + 'generatorOptions' => [ + 'fields' => ['title'], + 'fieldSeparator' => '-', + 'replacements' => [ + '/' => '', + ], + ], + 'fallbackCharacter' => '-', + 'eval' => 'uniqueInPid', + ], + ], + 'detail_page' => [ + 'exclude' => true, + 'label' => 'Detail Page', + 'description' => 'Page that presents this market. Resolved to a URL in the JSON output; leave empty for no link.', + 'config' => [ + 'type' => 'group', + 'allowed' => 'pages', + 'size' => 1, + 'maxitems' => 1, + ], + ], 'subtitle' => [ 'exclude' => true, 'label' => 'Subtitle', diff --git a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_product.php b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_product.php index 5a5efe0..b1ddb93 100755 --- a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_product.php +++ b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_product.php @@ -311,7 +311,7 @@ return [ 'label' => 'Applications', 'config' => [ 'type' => 'text', - 'enableRichtext' => 'true', + 'enableRichtext' => true, 'eval' => 'trim', 'default' => '' ], @@ -322,7 +322,7 @@ return [ 'label' => 'Description', 'config' => [ 'type' => 'text', - 'enableRichtext' => 'true', + 'enableRichtext' => true, 'eval' => 'trim', 'default' => '' ], @@ -334,7 +334,7 @@ return [ 'label' => 'Highlights', 'config' => [ 'type' => 'text', - 'enableRichtext' => 'true', + 'enableRichtext' => true, 'eval' => 'trim', 'default' => '' ], diff --git a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_solution.php b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_solution.php index 14dd45b..d481f56 100644 --- a/packages/vitec/Configuration/TCA/tx_vitec_domain_model_solution.php +++ b/packages/vitec/Configuration/TCA/tx_vitec_domain_model_solution.php @@ -24,7 +24,7 @@ return [ ], 'types' => [ '1' => [ - 'showitem' => 'title, subtitle, teaser, description, image, + 'showitem' => 'title, slug, subtitle, teaser, description, image, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, categories, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, sys_language_uid, l10n_parent, l10n_diffsource, --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, hidden, starttime, endtime', @@ -112,6 +112,23 @@ return [ 'default' => '', ], ], + 'slug' => [ + 'exclude' => false, + 'label' => 'URL Segment', + 'config' => [ + 'type' => 'slug', + 'size' => 50, + 'generatorOptions' => [ + 'fields' => ['title'], + 'fieldSeparator' => '-', + 'replacements' => [ + '/' => '', + ], + ], + 'fallbackCharacter' => '-', + 'eval' => 'uniqueInPid', + ], + ], 'subtitle' => [ 'exclude' => true, 'label' => 'Subtitle', diff --git a/packages/vitec/Documentation/Headless-JSON-Architecture.md b/packages/vitec/Documentation/Headless-JSON-Architecture.md index b885358..0a9083f 100755 --- a/packages/vitec/Documentation/Headless-JSON-Architecture.md +++ b/packages/vitec/Documentation/Headless-JSON-Architecture.md @@ -3,12 +3,23 @@ | | | |---|---| | **Document identifier** | EVO‑VITEC‑HL‑001 | -| **Version** | 1.0 | +| **Version** | 1.5 | | **Status** | Released | -| **Date** | 2026‑07‑09 | +| **Date** | 2026‑08‑05 | | **Applies to** | `evomedien/vitec` on TYPO3 v14.3 (headless) | | **Owner** | evomedien — VITEC relaunch | +**Revision history** + +| Version | Date | Changes | +|---|---|---| +| 1.0 | 2026‑07‑09 | Initial released specification. | +| 1.1 | 2026‑08‑05 | Catalogue completed with the card, customer‑logo, location and form plugins (7.8–7.11, 8). Page‑level auxiliary fields — menus and favicons — specified (6.7, 7.12). Form‑submission endpoint added to the interface (7.8.2). Crop‑variant and debug‑flag conventions added (9.9, 9.10). News CType count corrected to nine and the `=<` marking on `news_pi1` withdrawn (7.6, 8, B‑1). Nonconformities B‑8…B‑10 recorded. | +| 1.2 | 2026‑08‑05 | **Interface change (additive):** `tx_vitec_domain_model_market` and `tx_vitec_domain_model_solution` gained a `slug` field, now emitted by `MarketShowJsonRenderer`, `SolutionShowJsonRenderer` and the card payload. Market and Solution detail payloads specified (7.13); 7.9 updated. | +| 1.3 | 2026‑08‑05 | **New plugin** `vitec_marketlist` (`MarketListJsonRenderer`, payload key `markets`) — first list plugin built entirely on the shared serializer per 9.2, with editor‑controlled selection and ordering. Clause 7.13 restructured into detail (7.13.1) and list (7.13.2); catalogue updated. | +| 1.4 | 2026‑08‑05 | **Interface change (additive):** `tx_vitec_domain_model_market` gained a `detail_page` field (TCA `group`/`pages`), emitted as the **resolved** `detailUrl` in both market payloads (7.13.1, 7.13.2). Not added to Solution — see B‑11. | +| 1.5 | 2026‑08‑05 | **Defect fix, output‑changing:** richtext fields were emitted as raw database content by every VITEC UserFunc renderer, leaving `t3://` links unresolved in the JSON. New `RteResolver` service and mandatory convention 9.11; applied at all 19 richtext call sites across 11 renderers. Duplication register 10.2 updated. | + This document is drafted in the style of, and adopts the terminology conventions of, ISO/IEC/IEEE 42010 (architecture description), ISO/IEC/IEEE 26514 (information for users) and ISO/IEC 25010 (product quality). The key words **shall**, **should** and @@ -34,7 +45,8 @@ The platform combines the generic headless page renderer (`friendsoftypo3/headle with three sources of content JSON: 1. **Custom plugins** (product, use case/success story, market, solution, downloads, - datasheets, events, news) rendered by dedicated *UserFunc* classes; + datasheets, events, news, cards, customer logos, locations, forms) rendered by + dedicated *UserFunc* classes; 2. **Layout containers** (b13/container based column grids and a card carousel) rendered by a *DataProcessor*; 3. **Content Blocks** (`friendsoftypo3/content-blocks`) serialised automatically by @@ -43,6 +55,11 @@ with three sources of content JSON: All three are unified under a single **content‑element envelope** so that the front end can consume every element with one predictable shape. +Alongside `content[]` the page object carries **page‑level auxiliary fields** — the +navigation menus, the favicon set and the schema.org graph (Clause 6.7). One +**write‑side** endpoint complements the read interface: form submissions are POSTed +back to the CMS (Clause 7.8.2). + --- ## 1 Scope @@ -51,7 +68,8 @@ end can consume every element with one predictable shape. This document specifies: - the runtime environment and the software stack (Clause 5); - the JSON rendering pipeline and its layers (Clause 6); -- the public JSON interface — envelope, payloads, structured data (Clause 7); +- the public JSON interface — envelope, payloads, structured data, page‑level + auxiliary fields and the form‑submission endpoint (Clause 7); - the catalogue of content types and their JSON keys (Clause 8); - the mandatory conventions for implementing and extending renderers (Clause 9); - maintainability and upgrade‑safety requirements (Clause 10); @@ -157,7 +175,17 @@ definitions on top. The headless page response carries enhancers for products (`tx_vitec_domain_model_product.slug`) and news detail (`path_segment`). -### 5.3 Architectural principles (rationale) +### 5.3 Frontend middlewares +Two middlewares are registered in `Configuration/RequestMiddlewares.php`, both after +`typo3/cms-core/normalized-params-attribute` and before `typo3/cms-frontend/site` — +that is, **before page resolution**: + +| Middleware | Purpose | +|---|---| +| `vitec/form-submission` | Answers `POST /api/vitec/form/` (Clause 7.8.2). Every other request passes through untouched. | +| `vitec/success-story-path-rewrite` | Rewrites `/success-stories/` internally to `/success-stories/story/` when `` matches a visible Success Story. The page router would otherwise always resolve the public SEO URL to the list page (longest page‑slug prefix), so the detail subpage could never answer it. The browser URL is unchanged; a non‑matching slug leaves the request untouched; any exception leaves the request untouched. | + +### 5.4 Architectural principles (rationale) - **P1 — One envelope.** Every content element, regardless of source, is exposed with the same outer shape so the front end has a single rendering contract. - **P2 — Payload isolation.** Domain JSON is produced in PHP, fully decoupled from @@ -192,6 +220,8 @@ HTTP request (Accept: application/json, headless:1) [L5] Normalisation & nesting ContentElementResolver / PLUGIN_RENDERERS ▼ [L6] Structured data (JSON‑LD) PageJsonLdRenderer + StructuredDataService + ▼ +[L7] Page‑level fields menus (MenuProcessor) + favicons ``` ### 6.1 L1 — Page renderer @@ -282,6 +312,32 @@ Node types and their triggers: FAQ and event nodes are collected from the respective tables; event image URLs are currently built with a hard‑coded `/fileadmin` prefix (see 10.3 / Annex B‑5). +### 6.7 L7 — Page‑level auxiliary fields +Beyond `content[]` and `jsonLd`, four further fields are attached to the page object +in `Configuration/TypoScript/Headless/vitec_menus.typoscript`: + +```typoscript +page.10.fields.mainNavigation =< lib.mainNavigation +page.10.fields.footerMenu =< lib.footerMenu +page.10.fields.metaMenu =< lib.metaMenu +page.10.fields.favicons = USER +page.10.fields.favicons.userFunc = Evomedien\Vitec\UserFunc\FaviconsJsonRenderer->render +``` + +The three menus are built by `FriendsOfTYPO3\Headless\DataProcessing\MenuProcessor`, +which resolves shortcut pages to their target, skips pages with `nav_hide = 1`, marks +active/current items and nests sub‑levels under `children`. `mainNavigation` is the +full hierarchy (`levels = 10`, `expandAll = 1`); `footerMenu` and `metaMenu` are +curated flat lists driven by the site settings `menu.footer.pageUids` and +`menu.meta.pageUids`. All three use the title field `nav_title // title` and exclude +spacers. + +> **NOTE** These menus use the reference operator `=<` against `lib.*` objects. That +> is the idiomatic headless form and is safe; the `<`‑copy rule of 6.4/10.5(1) +> constrains `tt_content → tt_content` derivations only. + +Payloads are specified in Clause 7.12. + --- ## 7 JSON interface specification @@ -348,6 +404,24 @@ a lean variant of the envelope: (`tx_vitec_col{N}_align/justify`); they therefore apply to **all** children of that column. These container‑only fields **shall not** appear in a child’s `data` (enforced by `CONTAINER_FIELDS` filtering). +- `tx_vitec_bg_variant` is passed through unchanged (background variant of the grid). +- `vitec_container` and `vitec_cards_carousel` **drop** `gap` (single column / single + track) and add `cssClass`, read from the FlexForm `settings.cssClass`. + +`vitec_cards_carousel` additionally emits a `carousel` object from its FlexForm: + +```jsonc +{ "carousel": { "slidesPerView": "3", "showArrows": "1", "showIndicators": "1", + "loop": "0", "autoplay": "1", "autoplayInterval": "5000" } } +``` + +> **NOTE** These members are TypoScript `TEXT` values and therefore arrive as +> **strings**, not numbers or booleans. The front end coerces them. + +The `colPos` value of each column is fixed by `COLPOS_TO_COLUMN` in +`ContainerChildrenProcessor` — 211/212 (50/50), 221–223 (33/33/33), 231–234 +(25/25/25/25), 241/242 (66/33), 251/252 (33/66) — and **shall** be kept in sync with +the container TCA (Annex B‑5). ### 7.5 Success Story (use case) detail payload Produced by `UsecaseSerializer::serializeDetail()` — the reference implementation of @@ -389,8 +463,13 @@ Produced by `NewsJsonRenderer` under `content.news`: "templateLayoutLabel": "Compact List", "detailPid": 45, … } } ``` -Ten News CTypes (`news_pi1`, `news_newsdetail`, `news_newsliststicky`, …) share one -renderer; `news_newsdetail` yields `mode: "detail"` with a single `news` object. +Nine News CTypes share this one renderer — `news_pi1` plus the eight variants +`news_newsliststicky`, `news_newsselectedlist`, `news_newsdetail`, +`news_newsdatemenu`, `news_categorylist`, `news_newssearchform`, +`news_newssearchresult`, `news_taglist`. `news_newsdetail` yields `mode: "detail"` +with a single `news` object. `news_pi1` is derived with the `<` copy operator from +`lib.contentElementWithHeader`, the eight variants with `<` from +`tt_content.news_pi1`. ### 7.7 Content Blocks Content Blocks (`card`, `cta-banner`, `hero-section`, `intro-paragraph`, `video`, @@ -406,6 +485,245 @@ its collection items are resolved explicitly by `UsecaseSerializer::resolveColum into `{ header…, layout, columns: { left: [], right: [] } }`, with the collection storage table discovered from TCA (`foreign_table`) rather than hard‑coded. +### 7.8 Forms + +#### 7.8.1 Form plugin payload +Produced by `FormsJsonRenderer` under `content.form` for all three form CTypes +(`vitec_contactform`, `vitec_demoform`, `vitec_helpdeskform`); the CType selects the +definition through `FormDefinitions::CTYPE_MAP`: + +```jsonc +{ "formKey": "contact", // contact | demo | helpdesk + "title": "Contact VITEC", + "endpoint": "/api/vitec/form/contact", + "honeypot": "_website", + "fields": [ + { "name": "firstName", "type": "text", "label": "First Name", "required": true }, + { "name": "email", "type": "email", "label": "Email", "required": true }, + { "name": "country", "type": "select", "label": "Country", "required": false, + "optionsSource": "countries" }, + { "name": "solution", "type": "select", "label": "Solution of Interest", + "required": false, "options": [ "IPTV Distribution", "…" ] } + ] } +``` + +Field `type` is one of `text`, `email`, `tel`, `select`, `textarea`. A `select` carries +either an inline `options` array **or** an `optionsSource` key (`countries`, +`usStates`) naming a list the front end supplies itself — this keeps long ISO lists out +of every page response and consistent across the app. `contact` and `demo` share one +field set; `helpdesk` has its own, adding `product` and `serialNumber`. + +`Classes/Forms/FormDefinitions.php` is the **single source of truth**: the same +definition produces this JSON *and* validates the submission server‑side. Fields +**shall** be added there and nowhere else. + +#### 7.8.2 Submission endpoint (write side) +`FormSubmissionMiddleware` (5.3) answers: + +``` +POST /api/vitec/form/ Content-Type: application/json +``` + +Processing order: honeypot check → validation → persistence → delivery. + +| Situation | HTTP | Body | +|---|---|---| +| Accepted — including honeypot tripped and delivery failure | 200 | `{"success": true}` | +| Validation failed | 422 | `{"success": false, "errors": {"": ""}}` | +| Unknown `formKey` | 404 | `{"success": false, "errors": {"_form": "Unknown form"}}` | +| Method not POST | 405 | `{"success": false, "errors": {"_form": "POST only"}}` | +| Unexpected error | 500 | `{"success": false, "errors": {"_form": "Unexpected error"}}` | + +Every accepted submission is written to `tx_vitec_form_submission` (`form_key`, +`payload` as JSON, `delivery_method`, `delivery_status` ∈ {`pending`, `sent`, +`failed`}, `delivery_error`) **before** delivery is attempted. Delivery therefore +cannot lose data: a failed delivery still answers `success: true` and the failure is +visible on the backend record. Unknown payload keys are dropped by +`FormDefinitions::filterPayload()`; a filled honeypot field (`_website`) is answered +with `success: true` and stored nowhere. + +Delivery is a strategy (`Classes/Forms/Delivery/DeliveryInterface`), selected by the +FlexForm setting `delivery` (default `email`): + +| Strategy | State | +|---|---| +| `EmailDelivery` | active | +| `SalesforceDelivery` | **prepared stub** — `deliver()` always throws. A submission with `delivery = salesforce` is stored and then marked `delivery_status = failed`; the endpoint still answers `success: true`, so no data is lost. The previous website posted to Salesforce Web‑to‑Lead; completing it requires the credentials plus the camelCase → Salesforce field‑id mapping. | + +> **NOTE (design constraint)** Delivery settings are read from the **first** +> non‑deleted, non‑hidden plugin element of that CType found site‑wide — the endpoint +> is stateless and receives no element uid. There is therefore **one delivery +> configuration per form type**, not per placed element (Annex B‑10). + +### 7.9 Card payload (`vitec_modelcard`) +One plugin serves four model types. The FlexForm picks `modelType` plus one record, +and **all** card data comes from that record — nothing is authored on the element: + +```jsonc +{ "modelType": "product", // product | story | market | solution + "layout": "vertical", + "item": { "uid": 12, "title": "…", "slug": "…", "subtitle": "…", "teaser": "…", + "image": { "url": "…", "srcset": [ … ] } } } +``` + +`item` is `null` when no record is selected or the record is hidden/deleted. Per model +type: `story` reuses `UsecaseSerializer::serializeListItem()` verbatim (the canonical +card serialisation); `product` falls back from the `image` field to `productimage`; +`market` and `solution` share one field set and add `description`. **All four model +types carry `slug`** (since v1.2), so the front end can build a detail link from any +card without a second request. +Image resolution is delegated to `UsecaseSerializer::image()`. This renderer is the +reference for reusing a serializer instead of re‑implementing FAL logic (9.2). + +Model table names are held in the class constant `MODEL_TABLES` (10.3). + +### 7.10 Locations payload (`vitec_locationlist`) +Produced by `LocationsJsonRenderer` under `content.locations`. The plugin is +**global**: every visible `tx_vitec_domain_model_location` record is emitted, ordered +by `sorting`; the page carrying the plugin is not used as a filter. + +```jsonc +{ "variant": "grid", // grid | list | map + "mapText": "

", // only when variant = "map" and text is set, else null + "locations": [ + { "id": 3, "slug": "…", "name": "…", "countryCode": "DE", + "coordinates": { "latitude": 50.1, "longitude": 8.6 }, + "address": { "company": …, "street": …, "additional": …, + "postalCode": …, "city": …, "region": …, "country": … }, + "contact": { "phone": …, "fax": …, "email": … }, + "links": { "contact": "/contact", "legal": [ "/imprint", "…" ] }, + "marker": { "label": "…", "color": "#ff6633", "size": 0.5 }, + "sorting": 1, "active": true } ] } +``` + +Empty `address` and `contact` members are `null`, never `""`, so the front end can +test presence directly. `links.contact` is a resolved typolink; `links.legal` is a +newline‑separated list of typolinks, each resolved individually. `marker.label` falls +back to the location name, `marker.color` to `#ff6633`, `marker.size` to `0.5`. + +### 7.11 Customer‑logo payload (`vitec_customerlogos`) +Produced by `CustomerlogosJsonRenderer` under `content.customerlogos`: + +```jsonc +{ "layout": "grid", // list | grid | carousel | marquee + "logos": [ { "id": 7, "name": "…", "emphasized": false, "color": true, + "logo": { "uid": 42, "url": "…", "title": "…", "alternative": "…", + "srcset": [ … ], "properties": { "mimeType": "…" } } } ] } +``` + +Selection semantics — normative for the front end: + +| FlexForm state | Result | +|---|---| +| no customers selected | **all** logos, each `color: false` (render black‑and‑white) | +| customers selected | the selected ones **first**, in selection order, `color: true`; then all remaining logos, `color: false` | +| customers selected + `onlySelected` | only the selected ones, `color: true` | + +`color` is therefore a *rendering hint*, not a property of the record. SVG logos are +delivered unprocessed with an empty `srcset`; raster logos receive a WebP `srcset`. + +### 7.12 Page‑level auxiliary payloads +Attached to the page object, not to a content element (Clause 6.7). + +**`mainNavigation` / `footerMenu` / `metaMenu`** — arrays of headless `MenuProcessor` +items (`title`, `link`, `active`, `current`, `spacer`, `children[]`). + +**`favicons`** — a static, page‑independent descriptor set produced by +`FaviconsJsonRenderer`, so the head tags are CMS‑driven instead of hard‑coded in React: + +```jsonc +{ "themeColor": "#26358C", + "manifest": "/fileadmin/icons/site.webmanifest", + "links": [ { "rel": "icon", "type": "image/x-icon", + "href": "/fileadmin/icons/favicon.ico" }, + { "rel": "icon", "type": "image/png", "sizes": "32x32", "href": "…" }, + { "rel": "icon", "type": "image/png", "sizes": "16x16", "href": "…" }, + { "rel": "apple-touch-icon", "sizes": "180x180", "href": "…" }, + { "rel": "manifest", "href": "…" } ] } +``` + +`links` is ordered most‑ to least‑specific and is meant to be rendered verbatim as +`` elements. Hrefs are root‑relative under `/fileadmin/icons/` — the same +convention as image URLs (`UsecaseSerializer::image()`). **If the front end is ever +served from an origin other than the CMS, it must prefix these hrefs with the CMS base +URL**, exactly as it does for image URLs. + +### 7.13 Market and Solution payloads + +#### 7.13.1 Detail payloads +`MarketShowJsonRenderer` and `SolutionShowJsonRenderer` emit the same shape under +`content.market` and `content.solution` respectively — the two models are field‑for‑field +identical: + +```jsonc +{ "uid": 4, "title": "…", "slug": "…", "subtitle": "…", "teaser": "…", + "description": "

", // RTE HTML + "detailUrl": "/markets/aviation/", // market only, null when unset + "categories": [ { "uid": 9, "title": "…", "description": "…" } ], + "image": { "uid": 12, "url": "…", "title": "…", "alternative": "…", + "description": "…", "srcset": [ … ], + "properties": { "width": 1920, "height": 1080, … } } } +``` + +`slug` was added in v1.2. It is generated from `title` with `eval: uniqueInPid`, exactly +as on `product` and `usecase` (9.9 governs their images, 9.6 their naming), and is the +routing handle for the `/markets//` and `/solutions//` URLs of the relaunch +sitemap. + +`detailUrl` was added in v1.4 and exists on **Market only**. It is backed by the TCA +field `detail_page` (`type: group`, `allowed: pages`, `maxitems: 1`) — the editor picks +the page with the standard page browser. The renderer **shall not** expose the raw page +uid: a headless front end cannot turn a uid into a link, so the value is resolved with +`typoLink_URL()` server side, the same convention as `headerLink` (6.2) and the location +links (7.10). It is `null` when no page is selected or the link cannot be resolved — +never `0` and never an empty string, so the front end can test it directly. + +> **NOTE** Neither model is *routed* by slug yet: market and solution pages are still +> resolved as ordinary TYPO3 pages carrying a `…show` plugin that selects one record via +> its FlexForm. The field exists so the front end can build canonical URLs today, and so +> slug‑based routing (a route enhancer, as `product` already has, or a middleware, as +> Success Stories have) can be introduced later without a second data migration. + +#### 7.13.2 Market list payload (`vitec_marketlist`) +`MarketListJsonRenderer` emits, under `content.markets`: + +```jsonc +{ "layout": "grid", // grid | list | carousel + "markets": [ + { "uid": 4, "title": "…", "slug": "…", "subtitle": "…", "teaser": "…", + "description": "

", // RTE HTML, resolved per 9.11 + "detailUrl": "/markets/aviation/", // null when no detail page is set + "image": { "url": "…", "srcset": [ … ] } } ] } +``` + +The page carrying the plugin is never used as a filter. Which markets appear, and in +which order, is decided by the FlexForm field `settings.markets`: + +| FlexForm state | Result | +|---|---| +| nothing selected | **all** visible markets, alphabetical by `title` | +| markets selected | exactly those, **in the order the editor arranged them** in the FlexForm | + +The second row is the load‑bearing one: `settings.markets` stores a comma‑separated uid +list whose sequence *is* the intended display order. A `WHERE uid IN (…)` query returns +rows in storage order and would silently discard it, so the renderer fetches the (small) +table once and rebuilds the sequence in PHP — the same approach +`CustomerlogosJsonRenderer` uses. Fetching everything also means a selected record that +has since been hidden or deleted simply drops out instead of producing a gap or an error. + +`tx_vitec_domain_model_market` has **no `sorting` column**, which is why the unselected +case falls back to alphabetical rather than to a backend‑defined order. + +Each item carries the **same field set as the detail payload** (7.13.1) apart from +`categories`, so the front end can render a list item, a card and a detail header from +one shape. `description` is included and is RTE HTML resolved per 9.11 — it was omitted +in v1.3 on the assumption that lists only need `teaser`, which turned out to be wrong in +practice. Image resolution is delegated to `UsecaseSerializer::image()` per 9.2; this +renderer duplicates no FAL logic. + +A Solution list counterpart does not exist yet. When it is added it **should** reuse this +shape under `content.solutions`. + --- ## 8 Content‑type catalogue @@ -416,13 +734,20 @@ storage table discovered from TCA (`foreign_table`) rather than hard‑coded. | `vitec_productshow` | `< lib.…WithHeader` | ProductShowJsonRenderer | `product` | detail | | `vitec_usecaselist` | `< lib.…WithHeader` | UsecaseListJsonRenderer → **UsecaseSerializer** | `usecases` | list | | `vitec_usecaseshow` | `< lib.…WithHeader` | UsecaseShowJsonRenderer → **UsecaseSerializer** | `usecase` | detail | +| `vitec_marketlist` | `< lib.…WithHeader` | MarketListJsonRenderer | `markets` | list (global) | | `vitec_marketshow` | `< lib.…WithHeader` | MarketShowJsonRenderer | `market` | detail | | `vitec_solutionshow` | `< lib.…WithHeader` | SolutionShowJsonRenderer | `solution` | detail | | `vitec_downloadcard` | `< lib.…WithHeader` | DownloadcardJsonRenderer | `downloadcard` | detail | | `vitec_downloadcardcollection` | `< lib.…WithHeader` | DownloadcardcollectionJsonRenderer | `downloadcardcollection` | list | | `vitec_datasheets` | `< lib.…WithHeader` | DatasheetsJsonRenderer | `datasheets` | list | | `vitec_eventlist` | `=< lib.…WithHeader` ⚠ | EventlistJsonRenderer | `eventlist` | list | -| `news_pi1` (+9 variants) | `=< lib.…WithHeader`; variants `<` | NewsJsonRenderer | `news` | list/detail | +| `vitec_locationlist` | `< lib.…WithHeader` | LocationsJsonRenderer | `locations` | list (global) | +| `vitec_customerlogos` | `< lib.…WithHeader` | CustomerlogosJsonRenderer | `customerlogos` | list | +| `vitec_modelcard` | `< lib.…WithHeader` | ModelcardJsonRenderer | `card` | detail (4 model types) | +| `vitec_contactform` | `< lib.…WithHeader` | FormsJsonRenderer | `form` | form | +| `vitec_demoform` | `< tt_content.vitec_contactform` | FormsJsonRenderer | `form` | form | +| `vitec_helpdeskform` | `< tt_content.vitec_contactform` | FormsJsonRenderer | `form` | form | +| `news_pi1` (+8 variants) | `< lib.…WithHeader`; variants `< tt_content.news_pi1` | NewsJsonRenderer | `news` | list/detail | | `vitec_cols_50_50` | `= JSON` | ContainerChildrenProcessor | `items` | container | | `vitec_cols_33_66 / 66_33 / 33_33_33 / 25_25_25_25` | `< vitec_cols_50_50` | ContainerChildrenProcessor | `items` | container | | `vitec_container` | `< vitec_cols_50_50` | ContainerChildrenProcessor | `items` | container (1 col) | @@ -430,7 +755,18 @@ storage table discovered from TCA (`foreign_table`) rather than hard‑coded. | Content Blocks (`vitec_card`, …) | Content Blocks + nb‑headless | — | (auto) | element | | `vitec_columns` (CB, inline) | Content Blocks | UsecaseSerializer (special) | `columns` | element | -⚠ = uses the reference operator `=<`; see Annex B‑1. +⚠ = uses the reference operator `=<` against a `lib.*` object; verified safe, see +Annex B‑1. `vitec_eventlist` is the only remaining `=<` derivation among the content +elements. + +**Page‑level fields** (not content elements): `jsonLd` (`PageJsonLdRenderer`), +`favicons` (`FaviconsJsonRenderer`) and `mainNavigation` / `footerMenu` / `metaMenu` +(headless `MenuProcessor`) — Clauses 6.7 and 7.12. + +**Registered but not headless‑enabled:** `vitec_simplecard` is registered as an +Extbase plugin and offered in the content‑element wizard, but has neither a TypoScript +mapping nor a renderer; placed on a page it emits a content element without a payload +(Annex B‑8). --- @@ -492,6 +828,61 @@ Every custom CE/plugin/container **shall** expose the standard header section (t "header convention". Header fields in JSON use the names `header`, `subheader`, `headerLayout`, `headerPosition`, `headerLink`. +### 9.9 Image crop variants +The "first image" of every card‑capable model (Product, Success Story, Market, +Solution) **shall** declare its crop variants through the single definition +`Evomedien\Vitec\Tca\CropVariants::firstImage()`, referenced from the model TCA: + +```php +'cropVariants' => \Evomedien\Vitec\Tca\CropVariants::firstImage(), +``` + +It yields three editor tabs — `default` (free, 16:9, 4:3, 1:1; for detail, hero and +list use), `card` (4:3) and `largeCard` (16:9); a free crop stays available in each. +Crop variants **shall not** be redefined per model. + +### 9.10 Debug flag +A plugin FlexForm **may** expose a `settings.debug` checkbox. When it is set the +renderer **shall** attach a `debug` member to its payload (typically `settings` plus a +count or the resolved record uid) and **shall not** change the regular payload in any +other way. This is the only sanctioned form of diagnostic output (9.5); `debug` is +absent from production payloads. + +### 9.11 Richtext fields +Any field whose TCA carries `enableRichtext` **shall** be passed through +`Evomedien\Vitec\Service\RteResolver::html()` before it enters a payload. Handing the +raw database column to JSON is **prohibited**. + +```php +'description' => RteResolver::html($market['description'] ?? ''), // correct +'description' => (string)($market['description'] ?? ''), // prohibited +``` + +**Rationale.** TYPO3 stores richtext with unresolved internal references — internal +links as ``, legacy content as `` tags, images with +relative paths. Fluid resolves these through `parseFunc` at render time. A headless +renderer that skips that step ships dead links to the front end, and the defect is +invisible until an editor actually places an internal link. + +The upstream packages already do this for the output they own: `friendsoftypo3/headless` +applies `parseFunc =< lib.parseFunc_RTE` to the core text elements via TypoScript, and +`nb-headless-content-blocks` calls `parseFunc($value, null, '< lib.parseFunc_RTE')` for +every Content Block field with `enableRichtext`. `RteResolver` performs the identical +call, so all three paths produce the same HTML. + +The resolver is **static** — the conversion is stateless and the call sites are payload +array literals — and **fail‑soft** per 9.5: when no TypoScript setup is available it +returns the raw value rather than throwing, so content is never lost. + +> **NOTE** `enableRichtext` **shall** be the boolean `true`, not the string `'true'`. +> FormEngine accepts both, but `nb-headless-content-blocks` tests with `=== true` and a +> string silently disables its richtext conversion. Three product fields carried the +> string form until v1.5. + +Fields that merely *look* like richtext are out of scope: FAL metadata +(`sys_file_reference.description`), `sys_category.description` and `sys_file` metadata +are plain text and **shall not** be passed through the resolver. + --- ## 10 Maintainability and upgrade‑safety (ISO 25010) @@ -501,8 +892,12 @@ and the concrete risks and rules that preserve them. ### 10.1 Modularity — current state Strengths: uniform envelope, dual‑entry pattern, exception safety, a shared -`PLUGIN_RENDERERS` map, and the `UsecaseSerializer` reference pattern. -Weakness: **substantial duplication** across the inline renderers. +`PLUGIN_RENDERERS` map, and the `UsecaseSerializer` reference pattern — reused without +duplication by `ModelcardJsonRenderer` (7.9), while `FormDefinitions` (7.8.1) is the +equivalent single source of truth for the form plugins. +Weakness: **substantial duplication** remains across the older inline renderers +(Product, Download, Datasheet), which is why those are the largest files in the +extension. ### 10.2 Reusability — duplication register The following logic is duplicated across many renderers and **should** be extracted @@ -510,13 +905,14 @@ into shared services (target design in parentheses): | Duplicated logic | Occurrences | Target service | |---|---|---| -| FAL image/`srcset` resolution | Product(List/Show), Market, Solution, Event, Datasheets | `FalImageResolver` | +| FAL image/`srcset` resolution | Product(List/Show), Market, Solution, Event, Datasheets, Customerlogos | `FalImageResolver` | | FAL video resolution | Product, Usecase, hero | `FalImageResolver::video()` | | `sys_category` MM query | ≥ 9 renderers | `CategoryResolver` | | Custom MM (product↔download, …) | ≥ 5 renderers | `RelationResolver::resolveMany()` | | Download file‑by‑convention | 5 renderers | `ConventionFileResolver` | | `letterSequenceToRank()` sort helper | 5 renderers | static utility | | Page‑id discovery | all renderers | `PageIdResolver::resolve()` | +| RTE `parseFunc` conversion | 19 sites / 11 renderers | **`RteResolver::html()` — DONE (v1.5)** | > **RULE** When a shared resolver service exists, new renderers **shall** use it and > **shall not** re‑implement the logic inline. @@ -569,15 +965,20 @@ Deviations are recorded in Annex B and **shall** carry a remediation plan. and/or `serializeDetail()`; reuse existing resolver services. 3. **Renderer** — add `Classes/UserFunc/JsonRenderer` per 9.1, delegating to the serializer; implement `render()` (9.3/9.4) and `renderForRecord()`. -4. **TypoScript** — in `Configuration/Sets/Vitecset/setup.typoscript`: +4. **Registration** — `ExtensionUtility::configurePlugin()` in `ext_localconf.php`, a + FlexForm under `Configuration/FlexForms/`, an icon, and a wizard entry in + `Configuration/page.tsconfig`. +5. **TypoScript** — in `Configuration/Sets/Vitecset/setup.typoscript`: `tt_content. < lib.contentElementWithHeader` and - `content.fields. = USER` + `.userFunc = …->render`. -5. **Header section** — ensure the `headers` palette is present (9.8). -6. **Nesting** — if the plugin may sit inside a container, register it in + `content.fields. = USER` + `.userFunc = …->render`. **Omitting this step + yields a content element with no payload** (Annex B‑8). +6. **Header section** — ensure the `headers` palette is present (9.8). +7. **Nesting** — if the plugin may sit inside a container, register it in `PLUGIN_RENDERERS` in **both** the resolver and the processor (9.7). -7. **Deploy** — `vendor/bin/typo3 database:updateschema "*.add,*.change"` then +8. **Deploy** — `vendor/bin/typo3 database:updateschema "*.add,*.change"` then `vendor/bin/typo3 cache:flush`. -8. **Verify** — fetch the page JSON; confirm envelope (C1), keys (C4) and nested output. +9. **Verify** — fetch the page JSON; confirm envelope (C1), keys (C4) and nested + output; confirm `debug` is absent unless the FlexForm flag is set (9.10). --- @@ -587,25 +988,61 @@ The following items were identified during architecture analysis. Items marked *(to verify)* were reported by static review and **shall** be confirmed before remediation. -- **B‑1 — `=<` on Event/News CTypes.** `vitec_eventlist` and `news_pi1` use the - reference operator `=< lib.contentElementWithHeader`. Reference *to a `lib.*` object* - is used by headless itself and is generally safe; however, for consistency with - 10.5(1) these are VERIFIED SAFE and left as-is (references to lib.* are idiomatic in headless; only tt_content-to-tt_content references are unsafe, and those are already `<` for containers). +- **B‑1 — `=<` on the Event CType.** `vitec_eventlist` uses the reference operator + `=< lib.contentElementWithHeader`. VERIFIED SAFE and left as is: a reference *to a + `lib.*` object* is idiomatic in headless and used by headless itself; only + `tt_content → tt_content` references are unsafe, and those are `<` copies throughout + (containers, News variants, form variants). The page‑level menus use `=<` against + `lib.*` objects for the same reason (6.7). **CORRECTION 2026‑08‑05:** v1.0 of this + document also listed `news_pi1` here — `news_pi1` is, and was, derived with `<`. - **B‑2 — Containers cannot be authored inline (IRRE).** b13 container children live in `tx_container_parent` and require the page‑module grid; they cannot be created inside an inline field. This is a platform limitation, not a defect. The Success Story "Columns" Content Block (`vitec_columns`) is the sanctioned inline alternative. - **B‑3 — Duplicated `PLUGIN_RENDERERS` map** in `ContentElementResolver` and - `ContainerChildrenProcessor` (9.7/10.3). + `ContainerChildrenProcessor` (9.7/10.3). OPEN. Both copies verified in sync on + 2026‑08‑05 — 25 entries each (16 VITEC CTypes + 9 News CTypes). Remediation: + promote to a single shared constant. - **B‑4 — Inline duplication** of image/category/MM/page‑id logic (10.2). - **B‑5 — Hard‑coded literals** — model/MM table names, a `/fileadmin` prefix for - event JSON‑LD image URLs (`PageJsonLdRenderer`), and at least one magic - parent‑category uid appear as inline literals across download/datasheet/structured‑data - code *(to verify and extract to constants)*. `COLPOS_TO_COLUMN` in + event JSON‑LD image URLs (`PageJsonLdRenderer`), the `/fileadmin/icons` prefix and + the theme colour in `FaviconsJsonRenderer`, and at least one magic parent‑category + uid appear as inline literals across download/datasheet/structured‑data code + *(to verify and extract to constants)*. `COLPOS_TO_COLUMN` in `ContainerChildrenProcessor` must be kept in sync with the container TCA colPos values. - **B‑6 — `DownloadcardcollectionJsonRenderer`**: two misplaced thumbnail output lines referenced an undefined variable in the image resolver. FIXED 2026-07-09 (removed; the PDF-thumbnail method is unaffected). - **B‑7 — v13→v14 `CType`/`list_type` compatibility branches** in some download/ datasheet renderers FIXED 2026-07-09: the unsatisfiable legacy OR branch was removed; the query now filters on the v14 CType only. +- **B‑8 — `vitec_simplecard` has no headless rendering.** The plugin is registered in + `ext_localconf.php`, has a FlexForm, Fluid templates and a wizard entry in + `Configuration/page.tsconfig`, but there is no `tt_content.vitec_simplecard` mapping + in `setup.typoscript` and no `*JsonRenderer`. Placed on a page it produces a content + element without a payload. Decide: complete it per Annex A, or withdraw the plugin + registration and the wizard entry. +- **B‑9 — Stray files in the extension.** Four `*.bak.rebuild` files + (`UsecaseListJsonRenderer`, `UsecaseShowJsonRenderer`, + `tx_vitec_domain_model_usecase`, `ext_tables.sql`) and several tracked + `.msys00000…` artefacts under `Classes/DataProcessing/` and `Classes/Service/`. + They are never loaded, but they are indexed by IDEs and static analysis. Remove. +- **B‑10 — One delivery configuration per form type.** `FormSubmissionMiddleware` + reads the delivery settings from the first matching plugin element found site‑wide + (7.8.2). Per‑element configuration would require the front end to submit the element + uid and the endpoint to resolve it. This is a documented constraint, not a defect — + but placing two elements of the same form type with different `delivery` settings is + silently ineffective. +- **B‑11 — `detail_page` exists on Market but not on Solution.** Introduced in v1.4 on + `tx_vitec_domain_model_market` only, because that is what was requested. The two models + are otherwise field‑for‑field identical (7.13.1) and their renderers share one payload + shape, so the asymmetry is a latent inconsistency: `SolutionShowJsonRenderer` emits no + `detailUrl` at all. Either add the field to Solution as well, or record the divergence + as intended. Related: `ModelcardJsonRenderer` serves `market` and `solution` from one + shared branch and therefore emits no `detailUrl` either — the card payload (7.9) cannot + link to a market detail page until this is resolved. +- **B‑12 — `detailUrl()` duplicated** in `MarketListJsonRenderer` and + `MarketShowJsonRenderer`, and a third near‑identical `resolveLink()` lives in + `LocationsJsonRenderer` (7.10). Three copies of "resolve a link server side" is the + smallest concrete case of B‑4; it is the natural seed for the `LinkResolver` service + that 10.2 calls for. --- @@ -616,4 +1053,4 @@ remediation. - Header convention — the uniform header section across CEs, plugins and containers. - `Configuration/Sets/Vitecset/setup.typoscript` — the single TypoScript entry point. -*End of document EVO‑VITEC‑HL‑001 v1.0.* +*End of document EVO‑VITEC‑HL‑001 v1.5.* diff --git a/packages/vitec/README.md b/packages/vitec/README.md index ae8d4ea..e10b9d6 100755 --- a/packages/vitec/README.md +++ b/packages/vitec/README.md @@ -34,6 +34,8 @@ this extension turns every content element into clean **JSON** for a React front - [Content elements & plugins](#content-elements--plugins) - [Content Blocks](#content-blocks) - [Layout containers](#layout-containers) +- [Forms](#forms) +- [Page‑level fields](#pagelevel-fields) - [Structured data (JSON‑LD)](#structured-data-json-ld) - [Requirements](#requirements) - [Installation](#installation) @@ -52,6 +54,8 @@ this extension turns every content element into clean **JSON** for a React front children inside layout containers. - 🎛️ **Editor‑friendly Content Blocks** — hero, cards, CTA, FAQ, video, intro and a two‑column layout block, all with a unified header section. +- 📮 **Forms without a form framework** — one PHP definition drives both the JSON the + React app renders *and* the server‑side validation of the submission. - 🔎 **SEO built in** — a schema.org `@graph` (Organization, Product, FAQ, Events, News …) is emitted per page. - 🛡️ **Fail‑soft** — a failing element yields empty output, never a broken page. @@ -78,6 +82,9 @@ HTTP request (headless: 1) │ ▼ [L6] Structured data PageJsonLdRenderer + StructuredDataService → @graph + │ + ▼ +[L7] Page-level fields MenuProcessor + FaviconsJsonRenderer → menus, favicons ``` Each renderer follows one pattern — an `#[AsAllowedCallable] render()` for top‑level use @@ -94,12 +101,23 @@ as the reference). |---|---|---|---| | Products | `vitec_productlist` / `vitec_productshow` | `ProductList/ProductShowJsonRenderer` | `products` / `product` | | Success Stories | `vitec_usecaselist` / `vitec_usecaseshow` | `UsecaseList/ShowJsonRenderer` → `UsecaseSerializer` | `usecases` / `usecase` | -| Markets | `vitec_marketshow` | `MarketShowJsonRenderer` | `market` | +| Markets | `vitec_marketlist` / `vitec_marketshow` | `MarketList/MarketShowJsonRenderer` | `markets` / `market` | | Solutions | `vitec_solutionshow` | `SolutionShowJsonRenderer` | `solution` | | Downloads | `vitec_downloadcard` / `vitec_downloadcardcollection` | `Downloadcard*JsonRenderer` | `downloadcard` / `downloadcardcollection` | | Datasheets | `vitec_datasheets` | `DatasheetsJsonRenderer` | `datasheets` | | Events | `vitec_eventlist` | `EventlistJsonRenderer` | `eventlist` | -| News | `news_pi1` (+ variants) | `NewsJsonRenderer` | `news` | +| Locations | `vitec_locationlist` | `LocationsJsonRenderer` | `locations` | +| Customer logos | `vitec_customerlogos` | `CustomerlogosJsonRenderer` | `customerlogos` | +| Cards | `vitec_modelcard` | `ModelcardJsonRenderer` | `card` | +| Forms | `vitec_contactform` / `vitec_demoform` / `vitec_helpdeskform` | `FormsJsonRenderer` | `form` | +| News | `news_pi1` (+ 8 variants) | `NewsJsonRenderer` | `news` | + +**Cards** (`vitec_modelcard`) are one plugin for four model types — the FlexForm picks +`product`, `story`, `market` or `solution` plus a record, and every card field comes +from that record. Image resolution is delegated to `UsecaseSerializer::image()`. + +> ⚠️ `vitec_simplecard` is registered as a plugin and offered in the wizard, but has +> no JSON renderer — it emits no payload in headless mode. See Annex B‑8 of the spec. ## Content Blocks @@ -130,6 +148,40 @@ Nested column grids (`b13/container`) that own child content elements and emit t | `vitec_container` | Single column with a custom CSS class | | `vitec_cards_carousel` | Carousel of card elements | +## Forms + +Three form plugins (contact · demo · helpdesk) share one renderer and one definition. +[`FormDefinitions`](Classes/Forms/FormDefinitions.php) is the single source of truth: +the same field list produces the JSON the React app renders **and** validates the +submission server‑side. + +``` +GET page JSON → content.form = { formKey, title, endpoint, honeypot, fields[] } +POST /api/vitec/form/ → { "success": true } | 422 { success:false, errors{} } +``` + +`FormSubmissionMiddleware` handles the endpoint: honeypot → validation → store in +`tx_vitec_form_submission` → deliver. Delivery is a strategy +([`DeliveryInterface`](Classes/Forms/Delivery/DeliveryInterface.php)) with +`EmailDelivery` (active) and `SalesforceDelivery` (**prepared stub — `deliver()` always +throws**), chosen per form via the FlexForm. Because the submission is stored *before* +delivery is attempted, a failed delivery never loses data — it is recorded as +`delivery_status = failed` on the record and the endpoint still answers `success: true`. + +## Page‑level fields + +Beyond `content[]`, every page response carries: + +| Field | Source | +|---|---| +| `mainNavigation` / `footerMenu` / `metaMenu` | headless `MenuProcessor`; the curated menus are driven by the site settings `menu.footer.pageUids` / `menu.meta.pageUids` | +| `favicons` | `FaviconsJsonRenderer` — ready‑to‑render `` descriptors plus `themeColor` | +| `jsonLd` | `PageJsonLdRenderer` (see below) | + +Two frontend middlewares run before page resolution: `vitec/form-submission` (the form +endpoint) and `vitec/success-story-path-rewrite`, which lets the public SEO URL +`/success-stories/` resolve to the detail subpage without changing the browser URL. + ## Structured data (JSON‑LD) `PageJsonLdRenderer` + `StructuredDataService` assemble a schema.org `@graph` per page: @@ -177,15 +229,18 @@ The short version (full normative rules in the architecture spec, Clause 9 & 2. **Serializer** — `Classes/Service/Serializer` with `serializeListItem()` / `serializeDetail()`. 3. **Renderer** — `Classes/UserFunc/JsonRenderer` with `#[AsAllowedCallable] render()` + `renderForRecord()`, delegating to the serializer. -4. **TypoScript** — in `Configuration/Sets/Vitecset/setup.typoscript`: +4. **Registration** — `configurePlugin()` in `ext_localconf.php`, a FlexForm, an icon + and a wizard entry in `Configuration/page.tsconfig`. +5. **TypoScript** — in `Configuration/Sets/Vitecset/setup.typoscript`: ```typoscript tt_content. < lib.contentElementWithHeader tt_content..fields.content.fields. = USER tt_content..fields.content.fields..userFunc = Evomedien\Vitec\UserFunc\->render ``` -5. **Nesting** — if it may sit inside a container, register it in `PLUGIN_RENDERERS` + Skipping this step is exactly what leaves a plugin payload‑less (see `vitec_simplecard`). +6. **Nesting** — if it may sit inside a container, register it in `PLUGIN_RENDERERS` (in both `ContentElementResolver` and `ContainerChildrenProcessor`). -6. **Deploy** — `database:updateschema "*.add,*.change"` & `cache:flush`. +7. **Deploy** — `database:updateschema "*.add,*.change"` & `cache:flush`. > **Conventions:** list keys are plural, detail keys singular; page‑id via the > `frontend.page.information` request attribute; container CTypes derive with `<` (copy), @@ -202,9 +257,11 @@ packages/vitec/ │ ├── UserFunc/ # JSON renderers (one per plugin) — headless entry points │ ├── Service/ # Serializers, ContentElementResolver, StructuredDataService │ ├── DataProcessing/ # ContainerChildrenProcessor (container → items) +│ ├── Forms/ # FormDefinitions + Delivery/ (email, salesforce) +│ ├── Middleware/ # form endpoint, success-story path rewrite │ ├── Domain/Model|Repository/ │ ├── Controller/ # Extbase controllers (non-headless / backend) -│ └── Backend/ · View/ · Hook/ · EventListener/ +│ └── Backend/ · View/ · Hook/ · EventListener/ · Tca/ · Preview/ ├── ContentBlocks/ │ └── ContentElements/ # card, cta-banner, columns, faq, hero-section, intro-paragraph, video ├── Configuration/ diff --git a/packages/vitec/Resources/Public/Icons/vitec-plugin-marketlist.svg b/packages/vitec/Resources/Public/Icons/vitec-plugin-marketlist.svg new file mode 100644 index 0000000..a0db739 --- /dev/null +++ b/packages/vitec/Resources/Public/Icons/vitec-plugin-marketlist.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/vitec/ext_localconf.php b/packages/vitec/ext_localconf.php index f3a15ae..87714d0 100755 --- a/packages/vitec/ext_localconf.php +++ b/packages/vitec/ext_localconf.php @@ -93,6 +93,17 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeRegistry'][1750000000] = [ ] ); + ExtensionUtility::configurePlugin( + 'Vitec', + 'Marketlist', + [ + \Evomedien\Vitec\Controller\MarketController::class => 'list' + ], + [ + \Evomedien\Vitec\Controller\MarketController::class => 'list' + ] + ); + ExtensionUtility::configurePlugin( 'Vitec', 'Solutionshow', diff --git a/packages/vitec/ext_tables.sql b/packages/vitec/ext_tables.sql index bf72035..784eb07 100755 --- a/packages/vitec/ext_tables.sql +++ b/packages/vitec/ext_tables.sql @@ -154,6 +154,7 @@ CREATE TABLE tx_vitec_domain_model_solution ( l10n_parent int(11) DEFAULT '0' NOT NULL, l10n_diffsource mediumblob, title varchar(255) DEFAULT '' NOT NULL, + slug varchar(255) DEFAULT '' NOT NULL, subtitle varchar(255) DEFAULT '' NOT NULL, teaser varchar(255) DEFAULT '' NOT NULL, description text, @@ -177,6 +178,8 @@ CREATE TABLE tx_vitec_domain_model_market ( l10n_parent int(11) DEFAULT '0' NOT NULL, l10n_diffsource mediumblob, title varchar(255) DEFAULT '' NOT NULL, + slug varchar(255) DEFAULT '' NOT NULL, + detail_page int(11) DEFAULT '0' NOT NULL, subtitle varchar(255) DEFAULT '' NOT NULL, teaser varchar(255) DEFAULT '' NOT NULL, description text, diff --git a/public/_frontend/assets/VitecDebugToggle-Bp07RQC2.js b/public/_frontend/assets/VitecDebugToggle-Bp07RQC2.js deleted file mode 100644 index e27d035..0000000 --- a/public/_frontend/assets/VitecDebugToggle-Bp07RQC2.js +++ /dev/null @@ -1 +0,0 @@ -import{t as e}from"./useControlled-CztbT67m.js";import{A as t,G as n,I as r,K as i,N as a,O as o,P as s,Q as c,X as l,Z as u,at as d,i as f,it as p,mt as m,ot as h,rt as g,tt as _,ut as v}from"./index-CM0zIqrs.js";var y=m(v()),b=y.createContext(void 0);function x(){return y.useContext(b)}function S(e){return p(`PrivateSwitchBase`,e)}g(`PrivateSwitchBase`,[`root`,`checked`,`disabled`,`input`,`edgeStart`,`edgeEnd`]);var C=h(),w=e=>{let{classes:t,checked:n,disabled:r,edge:a}=e;return _({root:[`root`,n&&`checked`,r&&`disabled`,a&&`edge${i(a)}`],input:[`input`]},S,t)},T=u(s,{name:`MuiSwitchBase`})({padding:9,borderRadius:`50%`,variants:[{props:{edge:`start`,size:`small`},style:{marginLeft:-3}},{props:({edge:e,ownerState:t})=>e===`start`&&t.size!==`small`,style:{marginLeft:-12}},{props:{edge:`end`,size:`small`},style:{marginRight:-3}},{props:({edge:e,ownerState:t})=>e===`end`&&t.size!==`small`,style:{marginRight:-12}}]}),E=u(`input`,{name:`MuiSwitchBase`,shouldForwardProp:c})({cursor:`inherit`,position:`absolute`,opacity:0,width:`100%`,height:`100%`,top:0,left:0,margin:0,padding:0,zIndex:1}),D=y.forwardRef(function(t,n){let{autoFocus:i,checked:a,checkedIcon:o,defaultChecked:s,disabled:c,disableFocusRipple:l=!1,edge:u=!1,icon:d,id:f,inputProps:p,inputRef:m,name:h,onBlur:g,onChange:_,onFocus:v,readOnly:y,required:b=!1,tabIndex:S,type:D,value:O,slots:k={},slotProps:A={},...j}=t,[M,N]=e({controlled:a,default:!!s,name:`SwitchBase`,state:`checked`}),P=x(),F=e=>{v&&v(e),P&&P.onFocus&&P.onFocus(e)},I=e=>{g&&g(e),P&&P.onBlur&&P.onBlur(e)},L=e=>{if(e.nativeEvent.defaultPrevented)return;let t=e.target.checked;N(t),_&&_(e,t)},R=c;P&&R===void 0&&(R=P.disabled);let z=D===`checkbox`||D===`radio`,B={...t,checked:M,disabled:R,disableFocusRipple:l,edge:u},V=w(B),H={slots:k,slotProps:{input:p,...A}},[U,W]=r(`root`,{ref:n,elementType:T,className:V.root,shouldForwardComponentProp:!0,externalForwardedProps:{...H,component:`span`,...j},getSlotProps:e=>({...e,onFocus:t=>{e.onFocus?.(t),F(t)},onBlur:t=>{e.onBlur?.(t),I(t)}}),ownerState:B,additionalProps:{centerRipple:!0,focusRipple:!l,disabled:R,role:void 0,tabIndex:null}}),[G,K]=r(`input`,{ref:m,elementType:E,className:V.input,externalForwardedProps:H,getSlotProps:e=>({...e,onChange:t=>{e.onChange?.(t),L(t)}}),ownerState:B,additionalProps:{autoFocus:i,checked:a,defaultChecked:s,disabled:R,id:z?f:void 0,name:h,readOnly:y,required:b,tabIndex:S,type:D,...D===`checkbox`&&O===void 0?{}:{value:O}}});return(0,C.jsxs)(U,{...W,children:[(0,C.jsx)(G,{...K}),M?o:d]})});function O(e){return p(`MuiSwitch`,e)}var k=g(`MuiSwitch`,[`root`,`edgeStart`,`edgeEnd`,`switchBase`,`colorPrimary`,`colorSecondary`,`sizeSmall`,`sizeMedium`,`checked`,`disabled`,`input`,`thumb`,`track`]),A=e=>{let{classes:t,edge:n,size:r,color:a,checked:o,disabled:s}=e,c=_({root:[`root`,n&&`edge${i(n)}`,`size${i(r)}`],switchBase:[`switchBase`,`color${i(a)}`,o&&`checked`,s&&`disabled`],thumb:[`thumb`],track:[`track`],input:[`input`]},O,t);return{...t,...c}},j=u(`span`,{name:`MuiSwitch`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.edge&&t[`edge${i(n.edge)}`],t[`size${i(n.size)}`]]}})({display:`inline-flex`,width:58,height:38,overflow:`hidden`,padding:12,boxSizing:`border-box`,position:`relative`,flexShrink:0,zIndex:0,verticalAlign:`middle`,"@media print":{colorAdjust:`exact`},variants:[{props:{edge:`start`},style:{marginLeft:-8}},{props:{edge:`end`},style:{marginRight:-8}},{props:{size:`small`},style:{width:40,height:24,padding:7,[`& .${k.thumb}`]:{width:16,height:16},[`& .${k.switchBase}`]:{padding:4,[`&.${k.checked}`]:{transform:`translateX(16px)`}}}}]}),M=u(D,{name:`MuiSwitch`,slot:`SwitchBase`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.switchBase,{[`& .${k.input}`]:t.input},n.color!==`default`&&t[`color${i(n.color)}`]]}})(n(({theme:e})=>({position:`absolute`,top:0,left:0,zIndex:1,color:e.vars?e.vars.palette.Switch.defaultColor:`${e.palette.mode===`light`?e.palette.common.white:e.palette.grey[300]}`,transition:e.transitions.create([`left`,`transform`],{duration:e.transitions.duration.shortest}),[`&.${k.checked}`]:{transform:`translateX(20px)`},[`&.${k.disabled}`]:{color:e.vars?e.vars.palette.Switch.defaultDisabledColor:`${e.palette.mode===`light`?e.palette.grey[100]:e.palette.grey[600]}`},[`&.${k.checked} + .${k.track}`]:{opacity:.5},[`&.${k.disabled} + .${k.track}`]:{opacity:e.vars?e.vars.opacity.switchTrackDisabled:`${e.palette.mode===`light`?.12:.2}`},[`& .${k.input}`]:{left:`-100%`,width:`300%`}})),n(({theme:e})=>({"&:hover":{backgroundColor:e.alpha((e.vars||e).palette.action.active,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},variants:[...Object.entries(e.palette).filter(a([`light`])).map(([t])=>({props:{color:t},style:{[`&.${k.checked}`]:{color:(e.vars||e).palette[t].main,"&:hover":{backgroundColor:e.alpha((e.vars||e).palette[t].main,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},[`&.${k.disabled}`]:{color:e.vars?e.vars.palette.Switch[`${t}DisabledColor`]:`${e.palette.mode===`light`?e.lighten(e.palette[t].main,.62):e.darken(e.palette[t].main,.55)}`}},[`&.${k.checked} + .${k.track}`]:{backgroundColor:(e.vars||e).palette[t].main}}}))]}))),N=u(`span`,{name:`MuiSwitch`,slot:`Track`})(n(({theme:e})=>({height:`100%`,width:`100%`,borderRadius:14/2,zIndex:-1,transition:e.transitions.create([`opacity`,`background-color`],{duration:e.transitions.duration.shortest}),backgroundColor:e.vars?e.vars.palette.common.onBackground:`${e.palette.mode===`light`?e.palette.common.black:e.palette.common.white}`,opacity:e.vars?e.vars.opacity.switchTrack:`${e.palette.mode===`light`?.38:.3}`}))),P=u(`span`,{name:`MuiSwitch`,slot:`Thumb`})(n(({theme:e})=>({boxShadow:(e.vars||e).shadows[1],backgroundColor:`currentColor`,width:20,height:20,borderRadius:`50%`}))),F=y.forwardRef(function(e,t){let n=l({props:e,name:`MuiSwitch`}),{className:i,color:a=`primary`,edge:o=!1,size:s=`medium`,sx:c,slots:u={},slotProps:f={},...p}=n,m={...n,color:a,edge:o,size:s},h=A(m),g={slots:u,slotProps:f},[_,v]=r(`root`,{className:d(h.root,i),elementType:j,externalForwardedProps:g,ownerState:m,additionalProps:{sx:c}}),[y,b]=r(`thumb`,{className:h.thumb,elementType:P,externalForwardedProps:g,ownerState:m}),x=(0,C.jsx)(y,{...b}),[S,w]=r(`track`,{className:h.track,elementType:N,externalForwardedProps:g,ownerState:m});return(0,C.jsxs)(_,{...v,children:[(0,C.jsx)(M,{type:`checkbox`,icon:x,checkedIcon:x,ref:t,ownerState:m,...p,classes:{...h,root:h.switchBase},slots:{...u.switchBase&&{root:u.switchBase},...u.input&&{input:u.input}},slotProps:{...f.switchBase&&{root:typeof f.switchBase==`function`?f.switchBase(m):f.switchBase},input:{role:`switch`},...f.input&&{input:typeof f.input==`function`?f.input(m):f.input}}}),(0,C.jsx)(S,{...w})]})});function I({enabled:e,onChange:n}){return f?(0,C.jsxs)(o,{sx:{position:`fixed`,bottom:`1rem`,right:`1rem`,zIndex:9999,display:`flex`,alignItems:`center`,gap:`0.5rem`,bgcolor:`background.paper`,border:`1px solid`,borderColor:`divider`,borderRadius:`2rem`,px:`0.75rem`,py:`0.25rem`,boxShadow:3},children:[(0,C.jsx)(t,{variant:`caption`,sx:{userSelect:`none`,fontWeight:600,letterSpacing:`0.05em`},children:`Debug`}),(0,C.jsx)(F,{size:`small`,checked:e,onChange:(e,t)=>n(t)})]}):null}export{I as VitecDebugToggle}; \ No newline at end of file diff --git a/public/_frontend/assets/header-CddkKp_g.js b/public/_frontend/assets/header-CddkKp_g.js deleted file mode 100644 index 5ba7590..0000000 --- a/public/_frontend/assets/header-CddkKp_g.js +++ /dev/null @@ -1 +0,0 @@ -import{A as e,S as t,T as n,_ as r,b as i,d as a,f as o,g as s,m as c,ot as l,p as u,r as d,t as f,v as p,x as m}from"./index-CM0zIqrs.js";var h=l();function g({element:l,className:g,nested:_,devInfoTags:v,uid:y,spaceBefore:b,spaceAfter:x}){let S=a(l),C=c(l),w=Number(o(l)??0),T=m(w),E=t(w),D=i(u(l)),O=D===`center`?`center`:D===`right`?`right`:`left`,k=D===`center`?`center`:D===`right`?`flex-end`:`flex-start`,A=s(l.content?.headerLink),j=p(l.content?.headerLink),M=r(l.content?.headerLink,`Mehr erfahren`);return w===100?null:(0,h.jsx)(d,{className:g,devInfoTags:v,nested:_,uid:y,spaceBefore:b,spaceAfter:x,children:(0,h.jsx)(`div`,{className:`header__inner`,children:(0,h.jsxs)(n,{spacing:.75,sx:{textAlign:O,alignItems:k},children:[S&&(0,h.jsx)(e,{variant:T,children:S}),C&&(0,h.jsx)(e,{variant:E,sx:{opacity:.6},children:C}),A&&(0,h.jsx)(f,{href:A,target:j??`_self`,variant:`outlined`,size:`sm`,children:M})]})})})}export{g as VitecHeader}; \ No newline at end of file diff --git a/public/_frontend/assets/index-B6-rfpgz.css b/public/_frontend/assets/index-B6-rfpgz.css deleted file mode 100644 index d449dc4..0000000 --- a/public/_frontend/assets/index-B6-rfpgz.css +++ /dev/null @@ -1 +0,0 @@ -.fa,.fa-brands,.fa-classic,.fa-regular,.fa-solid,.fab,.far,.fas{--_fa-family:var(--fa-family,var(--fa-style-family,"Font Awesome 7 Free"));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:var(--fa-display,inline-block);font-family:var(--_fa-family);font-feature-settings:normal;font-synthesis:none;font-variant:normal;font-style:normal;font-weight:var(--fa-style,900);text-align:center;text-rendering:auto;width:var(--fa-width,1.25em);line-height:1}:is(.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa-classic,.fa):before{content:var(--fa)/""}@supports not (content:""/""){:is(.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa-classic,.fa):before{content:var(--fa)}}.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{vertical-align:.225em;font-size:.625em;line-height:.1em}.fa-xs{vertical-align:.125em;font-size:.75em;line-height:.08333em}.fa-sm{vertical-align:.05357em;font-size:.875em;line-height:.07143em}.fa-lg{vertical-align:-.075em;font-size:1.25em;line-height:.05em}.fa-xl{vertical-align:-.125em;font-size:1.5em;line-height:.04167em}.fa-2xl{vertical-align:-.1875em;font-size:2em;line-height:.03125em}.fa-width-auto{--fa-width:auto}.fa-fw,.fa-width-fixed{--fa-width:1.25em}.fa-canvas-square{margin-block-end:-.125em;padding-block:.125em}.fa-canvas-roomy{box-sizing:content-box;margin-block-end:-.25em;padding-block:.25em;padding-inline:.125em}.fa-ul{margin-inline-start:var(--fa-li-margin,2.5em);padding-inline-start:0;list-style-type:none}.fa-ul>li{position:relative}.fa-li{text-align:center;width:var(--fa-li-width,2em);line-height:inherit;position:absolute;inset-inline-start:calc(var(--fa-li-width,2em)*-1)}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.0625em)var(--fa-border-style,solid)var(--fa-border-color,#eee);box-sizing:var(--fa-border-box-sizing,content-box);padding:var(--fa-border-padding,.1875em .25em)}.fa-pull-left,.fa-pull-start{float:inline-start;margin-inline-end:var(--fa-pull-margin,.3em)}.fa-pull-end,.fa-pull-right{float:inline-end;margin-inline-start: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,ease-in-out)}.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,ease-in-out)}.fa-flip{animation-name:fa-flip;animation-duration:var(--fa-animation-duration,1.5s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-flip,.fa-flip-360{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-flip-360{animation-name:fa-flip-360;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-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,.75s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);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))}.fa-spin-snap{animation-name:fa-spin-snap;animation-duration:var(--fa-animation-duration,3s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-snap,.fa-spin-snap-4{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin-snap-4{animation-name:fa-spin-snap-4;animation-duration:var(--fa-animation-duration,2.4s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-snap-8{animation-name:fa-spin-snap-8;animation-duration:var(--fa-animation-duration,4s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-buzz,.fa-spin-snap-8{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-buzz{animation-name:fa-buzz;animation-duration:var(--fa-animation-duration,.6s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-wag{animation-name:fa-wag;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,.9s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-out);transform-origin:bottom}.fa-float{animation-name:fa-float;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,3s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out);will-change:transform}.fa-swing{animation-name:fa-swing;animation-duration:var(--fa-animation-duration,1.2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-out);transform-origin:top}.fa-jello,.fa-swing{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-jello{animation-name:fa-jello;animation-duration:var(--fa-animation-duration,.9s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-out)}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-buzz,.fa-fade,.fa-flip,.fa-flip-360,.fa-float,.fa-jello,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse,.fa-spin-snap,.fa-spin-snap-4,.fa-spin-snap-8,.fa-swing,.fa-wag{transition:none!important;animation:none!important}}@keyframes fa-beat{0%{transform:scale(1)}25%{transform:scale(calc(var(--fa-beat-scale,1.25)*1.25))}45%{transform:scale(calc(var(--fa-beat-scale,1.22)*1.22))}65%{transform:scale(calc(var(--fa-beat-scale,1.25)*1.25))}90%{transform:scale(1)}}@keyframes fa-bounce{0%{animation-timing-function:var(--fa-animation-timing);transform:scale(1)translateY(0)}14%{transform:scale(var(--fa-bounce-start-scale-x,1.06),var(--fa-bounce-start-scale-y,.94))translateY(var(--fa-bounce-anticipation,3px));animation-timing-function:cubic-bezier(.33,0,.66,.33)}32%{transform:scale(var(--fa-bounce-jump-scale-x,.94),var(--fa-bounce-jump-scale-y,1.12))translateY(calc(var(--fa-bounce-height,.5em)*-1));animation-timing-function:cubic-bezier(.33,.66,.66,1)}52%{transform:scale(1)translateY(calc(var(--fa-bounce-height,.5em)*-1*1.1));animation-timing-function:cubic-bezier(.5,0,1,.5)}70%{transform:scale(var(--fa-bounce-land-scale-x,1.06),var(--fa-bounce-land-scale-y,.92))translateY(0);animation-timing-function:cubic-bezier(.33,.33,.66,1)}85%{transform:scale(.98,1.04)translateY(calc(-2px*var(--fa-bounce-rebound,1)));animation-timing-function:cubic-bezier(.33,0,.66,1)}to{transform:scale(1)translateY(0)}}@keyframes fa-fade{0%{opacity:1;animation-timing-function:cubic-bezier(.2,0,.4,1);transform:scale(1)}40%{opacity:var(--fa-fade-opacity,.4);animation-timing-function:cubic-bezier(.4,0,.6,1);transform:scale(.98)}to{opacity:1;transform:scale(1)}}@keyframes fa-beat-fade{0%{opacity:var(--fa-beat-fade-opacity,.4);animation-timing-function:cubic-bezier(.2,0,.4,1);transform:scale(1)}25%{opacity:calc(var(--fa-beat-fade-opacity,.4) + .4);transform:scale(var(--fa-beat-fade-scale,1.28));animation-timing-function:cubic-bezier(.4,0,.6,1)}45%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.25));animation-timing-function:cubic-bezier(.4,0,.2,1)}65%{opacity:calc(var(--fa-beat-fade-opacity,.4) + .4);transform:scale(var(--fa-beat-fade-scale,1.28));animation-timing-function:cubic-bezier(.4,0,.6,1)}to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}}@keyframes fa-flip{0%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),0deg);animation-timing-function:cubic-bezier(.2,0,.4,1)}8%{transform:perspective(2em)scale(var(--fa-flip-anticipation-scale,.95))rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),0deg);animation-timing-function:cubic-bezier(.33,0,.66,.33)}35%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),calc(var(--fa-flip-angle,-1turn)*.6));animation-timing-function:linear}65%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),calc(var(--fa-flip-angle,-1turn)*.5));animation-timing-function:cubic-bezier(.33,.66,.66,1)}92%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),calc(var(--fa-flip-angle,-1turn)*var(--fa-flip-overshoot,1.04)));animation-timing-function:cubic-bezier(.33,0,.66,1)}to{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-1turn))}}@keyframes fa-flip-360{0%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),0deg);animation-timing-function:cubic-bezier(.2,0,.4,1)}8%{transform:perspective(2em)scale(var(--fa-flip-anticipation-scale,.95))rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),0deg);animation-timing-function:cubic-bezier(.33,0,.66,.33)}50%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),calc(var(--fa-flip-angle,-1turn)*.6));animation-timing-function:cubic-bezier(.33,.66,.66,1)}80%{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),calc(var(--fa-flip-angle,-1turn)*var(--fa-flip-overshoot,1.04)));animation-timing-function:cubic-bezier(.33,0,.66,1)}to{transform:perspective(2em)scale(1)rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-1turn))}}@keyframes fa-shake{0%{animation-timing-function:cubic-bezier(.2,0,.8,1);transform:rotate(0)}8%{animation-timing-function:cubic-bezier(.3,0,.7,1);transform:rotate(35deg)translate(1px)}20%{animation-timing-function:cubic-bezier(.3,0,.7,1);transform:rotate(-22deg)translate(-1px)}35%{animation-timing-function:cubic-bezier(.3,0,.7,1);transform:rotate(15deg)translate(1px)}50%{animation-timing-function:cubic-bezier(.4,0,.6,1);transform:rotate(-9deg)}65%{animation-timing-function:cubic-bezier(.4,0,.6,1);transform:rotate(5deg)}78%{animation-timing-function:cubic-bezier(.4,0,.6,1);transform:rotate(-3deg)}90%{animation-timing-function:cubic-bezier(.4,0,.2,1);transform:rotate(1deg)}to{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes fa-spin-snap{0%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(0)}12%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(60deg)}16.67%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(60deg)}28.67%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(120deg)}33.33%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(120deg)}45.33%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(180deg)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(180deg)}62%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(240deg)}66.67%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(240deg)}78.67%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(300deg)}83.33%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(300deg)}95.33%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(1turn)}to{transform:rotate(1turn)}}@keyframes fa-spin-snap-4{0%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(0)}15%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(90deg)}25%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(90deg)}40%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(180deg)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(180deg)}65%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(270deg)}75%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(270deg)}90%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(1turn)}to{transform:rotate(1turn)}}@keyframes fa-spin-snap-8{0%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(0)}9%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(45deg)}12.5%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(45deg)}21.5%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(90deg)}25%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(90deg)}34%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(135deg)}37.5%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(135deg)}46.5%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(180deg)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(180deg)}59%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(225deg)}62.5%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(225deg)}71.5%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(270deg)}75%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(270deg)}84%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(315deg)}87.5%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:rotate(315deg)}96.5%{animation-timing-function:cubic-bezier(.8,0,1,1);transform:rotate(1turn)}to{transform:rotate(1turn)}}@keyframes fa-buzz{0%{animation-timing-function:cubic-bezier(.1,0,.9,1);transform:translate(0)rotate(0)}5%{transform:translateX(var(--fa-buzz-distance,4px))rotate(.5deg)}10%{transform:translateX(calc(var(--fa-buzz-distance,4px)*-1))rotate(-.5deg)}15%{transform:translateX(var(--fa-buzz-distance,4px))rotate(.3deg)}20%{transform:translateX(calc(var(--fa-buzz-distance,4px)*-1))rotate(-.3deg)}25%{transform:translateX(calc(var(--fa-buzz-distance,4px)*.7))rotate(.2deg)}30%{transform:translateX(calc(var(--fa-buzz-distance,4px)*-1*.7))rotate(-.2deg)}35%{transform:translateX(calc(var(--fa-buzz-distance,4px)*.4))rotate(.1deg)}40%{transform:translate(0)rotate(0)}to{transform:translate(0)rotate(0)}}@keyframes fa-wag{0%{animation-timing-function:cubic-bezier(.2,0,.6,1);transform:rotate(0)}12%{transform:rotate(var(--fa-wag-angle,12deg));animation-timing-function:cubic-bezier(.4,0,.2,1)}24%{animation-timing-function:cubic-bezier(.2,0,.6,1);transform:rotate(2deg)}36%{transform:rotate(calc(var(--fa-wag-angle,12deg)*.85));animation-timing-function:cubic-bezier(.4,0,.2,1)}48%{animation-timing-function:cubic-bezier(.2,0,.6,1);transform:rotate(1deg)}58%{transform:rotate(calc(var(--fa-wag-angle,12deg)*.6));animation-timing-function:cubic-bezier(.4,0,.2,1)}68%{transform:rotate(0)}to{transform:rotate(0)}}@keyframes fa-float{0%{transform:translateY(0)translateX(0)rotate(0deg)scale(var(--fa-float-squash-x,1.02),var(--fa-float-squash-y,.98));animation-timing-function:cubic-bezier(.33,0,.66,.33)}15%{transform:translateY(calc(var(--fa-float-height,6px)*-.4))translateX(var(--fa-float-drift,1px))rotate(var(--fa-float-tilt,1deg))scale(1);animation-timing-function:cubic-bezier(.33,.66,.66,1)}35%{transform:translateY(calc(var(--fa-float-height,6px)*-1))translateX(0)rotate(0deg)scale(var(--fa-float-stretch-x,.98),var(--fa-float-stretch-y,1.03));animation-timing-function:cubic-bezier(.5,0,.5,0)}50%{transform:translateY(calc(var(--fa-float-height,6px)*-.92))translateX(calc(var(--fa-float-drift,1px)*-.5))rotate(calc(var(--fa-float-tilt,1deg)*-.5))scale(.995,1.01);animation-timing-function:cubic-bezier(.33,0,.66,.33)}70%{transform:translateY(calc(var(--fa-float-height,6px)*-.3))translateX(calc(var(--fa-float-drift,1px)*-1))rotate(calc(var(--fa-float-tilt,1deg)*-1))scale(1);animation-timing-function:cubic-bezier(.33,.66,.66,1)}90%{transform:translateY(calc(var(--fa-float-height,6px)*.05))translateX(0)rotate(0deg)scale(var(--fa-float-squash-x,1.02),var(--fa-float-squash-y,.98));animation-timing-function:cubic-bezier(.33,0,.66,1)}to{transform:translateY(0)translateX(0)rotate(0deg)scale(var(--fa-float-squash-x,1.02),var(--fa-float-squash-y,.98))}}@keyframes fa-swing{0%{animation-timing-function:cubic-bezier(.2,0,.8,1);transform:rotate(0)}8%{transform:rotate(var(--fa-swing-angle,22deg));animation-timing-function:cubic-bezier(.3,0,.7,1)}18%{transform:rotate(calc(var(--fa-swing-angle,22deg)*-1*.85));animation-timing-function:cubic-bezier(.3,0,.7,1)}28%{transform:rotate(calc(var(--fa-swing-angle,22deg)*.65));animation-timing-function:cubic-bezier(.35,0,.65,1)}38%{transform:rotate(calc(var(--fa-swing-angle,22deg)*-1*.45));animation-timing-function:cubic-bezier(.4,0,.6,1)}48%{transform:rotate(calc(var(--fa-swing-angle,22deg)*.25));animation-timing-function:cubic-bezier(.4,0,.6,1)}56%{transform:rotate(calc(var(--fa-swing-angle,22deg)*-1*.1));animation-timing-function:cubic-bezier(.4,0,.6,1)}64%{transform:rotate(0)}to{transform:rotate(0)}}@keyframes fa-jello{0%{animation-timing-function:cubic-bezier(.2,0,.8,1);transform:scale(1)}12%{transform:scale(var(--fa-jello-scale-x,1.15),calc(2 - var(--fa-jello-scale-x,1.15)));animation-timing-function:cubic-bezier(.3,0,.7,1)}24%{transform:scale(calc(2 - var(--fa-jello-scale-y,1.12)),var(--fa-jello-scale-y,1.12));animation-timing-function:cubic-bezier(.3,0,.7,1)}36%{transform:scale(calc(.5 + var(--fa-jello-scale-x,1.15)*.5),calc(1.5 - var(--fa-jello-scale-x,1.15)*.5));animation-timing-function:cubic-bezier(.4,0,.6,1)}48%{transform:scale(calc(1.3 - var(--fa-jello-scale-y,1.12)*.3),calc(.7 + var(--fa-jello-scale-y,1.12)*.3));animation-timing-function:cubic-bezier(.4,0,.6,1)}58%{animation-timing-function:cubic-bezier(.4,0,.2,1);transform:scale(1.02,.98)}68%{transform:scale(1)}to{transform:scale(1)}}.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{vertical-align:middle;width:2.5em;height:2em;line-height:2em;display:inline-block;position:relative}.fa-stack-1x,.fa-stack-2x{--fa-width:100%;text-align:center;width:var(--fa-width);z-index:var(--fa-stack-z-index,auto);position:absolute;inset:0}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0{--fa:"0"}.fa-1{--fa:"1"}.fa-2{--fa:"2"}.fa-3{--fa:"3"}.fa-4{--fa:"4"}.fa-5{--fa:"5"}.fa-6{--fa:"6"}.fa-7{--fa:"7"}.fa-8{--fa:"8"}.fa-9{--fa:"9"}.fa-exclamation{--fa:"!"}.fa-hashtag{--fa:"#"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"$"}.fa-percent,.fa-percentage{--fa:"%"}.fa-asterisk{--fa:"*"}.fa-add,.fa-plus{--fa:"+"}.fa-less-than{--fa:"<"}.fa-equals{--fa:"="}.fa-greater-than{--fa:">"}.fa-question{--fa:"?"}.fa-at{--fa:"@"}.fa-a{--fa:"A"}.fa-b{--fa:"B"}.fa-c{--fa:"C"}.fa-d{--fa:"D"}.fa-e{--fa:"E"}.fa-f{--fa:"F"}.fa-g{--fa:"G"}.fa-h{--fa:"H"}.fa-i{--fa:"I"}.fa-j{--fa:"J"}.fa-k{--fa:"K"}.fa-l{--fa:"L"}.fa-m{--fa:"M"}.fa-n{--fa:"N"}.fa-o{--fa:"O"}.fa-p{--fa:"P"}.fa-q{--fa:"Q"}.fa-r{--fa:"R"}.fa-s{--fa:"S"}.fa-t{--fa:"T"}.fa-u{--fa:"U"}.fa-v{--fa:"V"}.fa-w{--fa:"W"}.fa-x{--fa:"X"}.fa-y{--fa:"Y"}.fa-z{--fa:"Z"}.fa-faucet{--fa:""}.fa-faucet-drip{--fa:""}.fa-house-chimney-window{--fa:""}.fa-house-signal{--fa:""}.fa-temperature-arrow-down,.fa-temperature-down{--fa:""}.fa-temperature-arrow-up,.fa-temperature-up{--fa:""}.fa-trailer{--fa:""}.fa-bacteria{--fa:""}.fa-bacterium{--fa:""}.fa-box-tissue{--fa:""}.fa-hand-holding-medical{--fa:""}.fa-hand-sparkles{--fa:""}.fa-hands-bubbles,.fa-hands-wash{--fa:""}.fa-handshake-alt-slash,.fa-handshake-simple-slash,.fa-handshake-slash{--fa:""}.fa-head-side-cough{--fa:""}.fa-head-side-cough-slash{--fa:""}.fa-head-side-mask{--fa:""}.fa-head-side-virus{--fa:""}.fa-house-chimney-user{--fa:""}.fa-house-laptop,.fa-laptop-house{--fa:""}.fa-lungs-virus{--fa:""}.fa-people-arrows,.fa-people-arrows-left-right{--fa:""}.fa-plane-slash{--fa:""}.fa-pump-medical{--fa:""}.fa-pump-soap{--fa:""}.fa-shield-virus{--fa:""}.fa-sink{--fa:""}.fa-soap{--fa:""}.fa-stopwatch-20{--fa:""}.fa-shop-slash,.fa-store-alt-slash{--fa:""}.fa-store-slash{--fa:""}.fa-toilet-paper-slash{--fa:""}.fa-users-slash{--fa:""}.fa-virus{--fa:""}.fa-virus-slash{--fa:""}.fa-viruses{--fa:""}.fa-vest{--fa:""}.fa-vest-patches{--fa:""}.fa-arrow-trend-down{--fa:""}.fa-arrow-trend-up{--fa:""}.fa-arrow-up-from-bracket{--fa:""}.fa-austral-sign{--fa:""}.fa-baht-sign{--fa:""}.fa-bitcoin-sign{--fa:""}.fa-bolt-lightning{--fa:""}.fa-book-bookmark{--fa:""}.fa-camera-rotate{--fa:""}.fa-cedi-sign{--fa:""}.fa-chart-column{--fa:""}.fa-chart-gantt{--fa:""}.fa-clapperboard{--fa:""}.fa-closed-captioning-slash{--fa:""}.fa-clover{--fa:""}.fa-code-compare{--fa:""}.fa-code-fork{--fa:""}.fa-code-pull-request{--fa:""}.fa-colon-sign{--fa:""}.fa-cruzeiro-sign{--fa:""}.fa-display{--fa:""}.fa-dong-sign{--fa:""}.fa-elevator{--fa:""}.fa-filter-circle-xmark{--fa:""}.fa-florin-sign{--fa:""}.fa-folder-closed{--fa:""}.fa-franc-sign{--fa:""}.fa-guarani-sign{--fa:""}.fa-gun{--fa:""}.fa-hands-clapping{--fa:""}.fa-home-user,.fa-house-user{--fa:""}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:""}.fa-kip-sign{--fa:""}.fa-lari-sign{--fa:""}.fa-litecoin-sign{--fa:""}.fa-manat-sign{--fa:""}.fa-mask-face{--fa:""}.fa-mill-sign{--fa:""}.fa-money-bills{--fa:""}.fa-naira-sign{--fa:""}.fa-notdef{--fa:""}.fa-panorama{--fa:""}.fa-peseta-sign{--fa:""}.fa-peso-sign{--fa:""}.fa-plane-up{--fa:""}.fa-rupiah-sign{--fa:""}.fa-stairs{--fa:""}.fa-timeline{--fa:""}.fa-truck-front{--fa:""}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:""}.fa-vault{--fa:""}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:""}.fa-wheat-alt,.fa-wheat-awn{--fa:""}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:""}.fa-bangladeshi-taka-sign{--fa:""}.fa-bowl-rice{--fa:""}.fa-person-pregnant{--fa:""}.fa-home-lg,.fa-house-chimney{--fa:""}.fa-house-crack{--fa:""}.fa-house-medical{--fa:""}.fa-cent-sign{--fa:""}.fa-plus-minus{--fa:""}.fa-sailboat{--fa:""}.fa-section{--fa:""}.fa-shrimp{--fa:""}.fa-brazilian-real-sign{--fa:""}.fa-chart-simple{--fa:""}.fa-diagram-next{--fa:""}.fa-diagram-predecessor{--fa:""}.fa-diagram-successor{--fa:""}.fa-earth-oceania,.fa-globe-oceania{--fa:""}.fa-bug-slash{--fa:""}.fa-file-circle-plus{--fa:""}.fa-shop-lock{--fa:""}.fa-virus-covid{--fa:""}.fa-virus-covid-slash{--fa:""}.fa-anchor-circle-check{--fa:""}.fa-anchor-circle-exclamation{--fa:""}.fa-anchor-circle-xmark{--fa:""}.fa-anchor-lock{--fa:""}.fa-arrow-down-up-across-line{--fa:""}.fa-arrow-down-up-lock{--fa:""}.fa-arrow-right-to-city{--fa:""}.fa-arrow-up-from-ground-water{--fa:""}.fa-arrow-up-from-water-pump{--fa:""}.fa-arrow-up-right-dots{--fa:""}.fa-arrows-down-to-line{--fa:""}.fa-arrows-down-to-people{--fa:""}.fa-arrows-left-right-to-line{--fa:""}.fa-arrows-spin{--fa:""}.fa-arrows-split-up-and-left{--fa:""}.fa-arrows-to-circle{--fa:""}.fa-arrows-to-dot{--fa:""}.fa-arrows-to-eye{--fa:""}.fa-arrows-turn-right{--fa:""}.fa-arrows-turn-to-dots{--fa:""}.fa-arrows-up-to-line{--fa:""}.fa-bore-hole{--fa:""}.fa-bottle-droplet{--fa:""}.fa-bottle-water{--fa:""}.fa-bowl-food{--fa:""}.fa-boxes-packing{--fa:""}.fa-bridge{--fa:""}.fa-bridge-circle-check{--fa:""}.fa-bridge-circle-exclamation{--fa:""}.fa-bridge-circle-xmark{--fa:""}.fa-bridge-lock{--fa:""}.fa-bridge-water{--fa:""}.fa-bucket{--fa:""}.fa-bugs{--fa:""}.fa-building-circle-arrow-right{--fa:""}.fa-building-circle-check{--fa:""}.fa-building-circle-exclamation{--fa:""}.fa-building-circle-xmark{--fa:""}.fa-building-flag{--fa:""}.fa-building-lock{--fa:""}.fa-building-ngo{--fa:""}.fa-building-shield{--fa:""}.fa-building-un{--fa:""}.fa-building-user{--fa:""}.fa-building-wheat{--fa:""}.fa-burst{--fa:""}.fa-car-on{--fa:""}.fa-car-tunnel{--fa:""}.fa-child-combatant,.fa-child-rifle{--fa:""}.fa-children{--fa:""}.fa-circle-nodes{--fa:""}.fa-clipboard-question{--fa:""}.fa-cloud-showers-water{--fa:""}.fa-computer{--fa:""}.fa-cubes-stacked{--fa:""}.fa-envelope-circle-check{--fa:""}.fa-explosion{--fa:""}.fa-ferry{--fa:""}.fa-file-circle-exclamation{--fa:""}.fa-file-circle-minus{--fa:""}.fa-file-circle-question{--fa:""}.fa-file-shield{--fa:""}.fa-fire-burner{--fa:""}.fa-fish-fins{--fa:""}.fa-flask-vial{--fa:""}.fa-glass-water{--fa:""}.fa-glass-water-droplet{--fa:""}.fa-group-arrows-rotate{--fa:""}.fa-hand-holding-hand{--fa:""}.fa-handcuffs{--fa:""}.fa-hands-bound{--fa:""}.fa-hands-holding-child{--fa:""}.fa-hands-holding-circle{--fa:""}.fa-heart-circle-bolt{--fa:""}.fa-heart-circle-check{--fa:""}.fa-heart-circle-exclamation{--fa:""}.fa-heart-circle-minus{--fa:""}.fa-heart-circle-plus{--fa:""}.fa-heart-circle-xmark{--fa:""}.fa-helicopter-symbol{--fa:""}.fa-helmet-un{--fa:""}.fa-hill-avalanche{--fa:""}.fa-hill-rockslide{--fa:""}.fa-house-circle-check{--fa:""}.fa-house-circle-exclamation{--fa:""}.fa-house-circle-xmark{--fa:""}.fa-house-fire{--fa:""}.fa-house-flag{--fa:""}.fa-house-flood-water{--fa:""}.fa-house-flood-water-circle-arrow-right{--fa:""}.fa-house-lock{--fa:""}.fa-house-medical-circle-check{--fa:""}.fa-house-medical-circle-exclamation{--fa:""}.fa-house-medical-circle-xmark{--fa:""}.fa-house-medical-flag{--fa:""}.fa-house-tsunami{--fa:""}.fa-jar{--fa:""}.fa-jar-wheat{--fa:""}.fa-jet-fighter-up{--fa:""}.fa-jug-detergent{--fa:""}.fa-kitchen-set{--fa:""}.fa-land-mine-on{--fa:""}.fa-landmark-flag{--fa:""}.fa-laptop-file{--fa:""}.fa-lines-leaning{--fa:""}.fa-location-pin-lock{--fa:""}.fa-locust{--fa:""}.fa-magnifying-glass-arrow-right{--fa:""}.fa-magnifying-glass-chart{--fa:""}.fa-mars-and-venus-burst{--fa:""}.fa-mask-ventilator{--fa:""}.fa-mattress-pillow{--fa:""}.fa-mobile-retro{--fa:""}.fa-money-bill-transfer{--fa:""}.fa-money-bill-trend-up{--fa:""}.fa-money-bill-wheat{--fa:""}.fa-mosquito{--fa:""}.fa-mosquito-net{--fa:""}.fa-mound{--fa:""}.fa-mountain-city{--fa:""}.fa-mountain-sun{--fa:""}.fa-oil-well{--fa:""}.fa-people-group{--fa:""}.fa-people-line{--fa:""}.fa-people-pulling{--fa:""}.fa-people-robbery{--fa:""}.fa-people-roof{--fa:""}.fa-person-arrow-down-to-line{--fa:""}.fa-person-arrow-up-from-line{--fa:""}.fa-person-breastfeeding{--fa:""}.fa-person-burst{--fa:""}.fa-person-cane{--fa:""}.fa-person-chalkboard{--fa:""}.fa-person-circle-check{--fa:""}.fa-person-circle-exclamation{--fa:""}.fa-person-circle-minus{--fa:""}.fa-person-circle-plus{--fa:""}.fa-person-circle-question{--fa:""}.fa-person-circle-xmark{--fa:""}.fa-person-dress-burst{--fa:""}.fa-person-drowning{--fa:""}.fa-person-falling{--fa:""}.fa-person-falling-burst{--fa:""}.fa-person-half-dress{--fa:""}.fa-person-harassing{--fa:""}.fa-person-military-pointing{--fa:""}.fa-person-military-rifle{--fa:""}.fa-person-military-to-person{--fa:""}.fa-person-rays{--fa:""}.fa-person-rifle{--fa:""}.fa-person-shelter{--fa:""}.fa-person-walking-arrow-loop-left{--fa:""}.fa-person-walking-arrow-right{--fa:""}.fa-person-walking-dashed-line-arrow-right{--fa:""}.fa-person-walking-luggage{--fa:""}.fa-plane-circle-check{--fa:""}.fa-plane-circle-exclamation{--fa:""}.fa-plane-circle-xmark{--fa:""}.fa-plane-lock{--fa:""}.fa-plate-wheat{--fa:""}.fa-plug-circle-bolt{--fa:""}.fa-plug-circle-check{--fa:""}.fa-plug-circle-exclamation{--fa:""}.fa-plug-circle-minus{--fa:""}.fa-plug-circle-plus{--fa:""}.fa-plug-circle-xmark{--fa:""}.fa-ranking-star{--fa:""}.fa-road-barrier{--fa:""}.fa-road-bridge{--fa:""}.fa-road-circle-check{--fa:""}.fa-road-circle-exclamation{--fa:""}.fa-road-circle-xmark{--fa:""}.fa-road-lock{--fa:""}.fa-road-spikes{--fa:""}.fa-rug{--fa:""}.fa-sack-xmark{--fa:""}.fa-school-circle-check{--fa:""}.fa-school-circle-exclamation{--fa:""}.fa-school-circle-xmark{--fa:""}.fa-school-flag{--fa:""}.fa-school-lock{--fa:""}.fa-sheet-plastic{--fa:""}.fa-shield-cat{--fa:""}.fa-shield-dog{--fa:""}.fa-shield-heart{--fa:""}.fa-square-nfi{--fa:""}.fa-square-person-confined{--fa:""}.fa-square-virus{--fa:""}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:""}.fa-sun-plant-wilt{--fa:""}.fa-tarp{--fa:""}.fa-tarp-droplet{--fa:""}.fa-tent{--fa:""}.fa-tent-arrow-down-to-line{--fa:""}.fa-tent-arrow-left-right{--fa:""}.fa-tent-arrow-turn-left{--fa:""}.fa-tent-arrows-down{--fa:""}.fa-tents{--fa:""}.fa-toilet-portable{--fa:""}.fa-toilets-portable{--fa:""}.fa-tower-cell{--fa:""}.fa-tower-observation{--fa:""}.fa-tree-city{--fa:""}.fa-trowel{--fa:""}.fa-trowel-bricks{--fa:""}.fa-truck-arrow-right{--fa:""}.fa-truck-droplet{--fa:""}.fa-truck-field{--fa:""}.fa-truck-field-un{--fa:""}.fa-truck-plane{--fa:""}.fa-users-between-lines{--fa:""}.fa-users-line{--fa:""}.fa-users-rays{--fa:""}.fa-users-rectangle{--fa:""}.fa-users-viewfinder{--fa:""}.fa-vial-circle-check{--fa:""}.fa-vial-virus{--fa:""}.fa-wheat-awn-circle-exclamation{--fa:""}.fa-worm{--fa:""}.fa-xmarks-lines{--fa:""}.fa-child-dress{--fa:""}.fa-child-reaching{--fa:""}.fa-file-circle-check{--fa:""}.fa-file-circle-xmark{--fa:""}.fa-person-through-window{--fa:""}.fa-plant-wilt{--fa:""}.fa-stapler{--fa:""}.fa-train-tram{--fa:""}.fa-table-cells-column-lock{--fa:""}.fa-table-cells-row-lock{--fa:""}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:""}.fa-table-cells-row-unlock{--fa:""}.fa-chart-diagram{--fa:""}.fa-comment-nodes{--fa:""}.fa-file-fragment{--fa:""}.fa-file-half-dashed{--fa:""}.fa-hexagon-nodes{--fa:""}.fa-hexagon-nodes-bolt{--fa:""}.fa-square-binary{--fa:""}.fa-pentagon{--fa:""}.fa-non-binary{--fa:""}.fa-spiral{--fa:""}.fa-picture-in-picture{--fa:""}.fa-mobile-vibrate{--fa:""}.fa-single-quote-left{--fa:""}.fa-single-quote-right{--fa:""}.fa-bus-side{--fa:""}.fa-heptagon,.fa-septagon{--fa:""}.fa-aquarius{--fa:""}.fa-aries{--fa:""}.fa-cancer{--fa:""}.fa-capricorn{--fa:""}.fa-gemini{--fa:""}.fa-leo{--fa:""}.fa-libra{--fa:""}.fa-pisces{--fa:""}.fa-sagittarius{--fa:""}.fa-scorpio{--fa:""}.fa-taurus{--fa:""}.fa-virgo{--fa:""}.fa-glass-martini,.fa-martini-glass-empty{--fa:""}.fa-music{--fa:""}.fa-magnifying-glass,.fa-search{--fa:""}.fa-heart{--fa:""}.fa-star{--fa:""}.fa-user,.fa-user-alt,.fa-user-large{--fa:""}.fa-film,.fa-film-alt,.fa-film-simple{--fa:""}.fa-table-cells-large,.fa-th-large{--fa:""}.fa-table-cells,.fa-th{--fa:""}.fa-table-list,.fa-th-list{--fa:""}.fa-check{--fa:""}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:""}.fa-magnifying-glass-plus,.fa-search-plus{--fa:""}.fa-magnifying-glass-minus,.fa-search-minus{--fa:""}.fa-power-off{--fa:""}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:""}.fa-cog,.fa-gear{--fa:""}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:""}.fa-clock,.fa-clock-four{--fa:""}.fa-road{--fa:""}.fa-download{--fa:""}.fa-inbox{--fa:""}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:""}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:""}.fa-list-alt,.fa-rectangle-list{--fa:""}.fa-lock{--fa:""}.fa-flag{--fa:""}.fa-headphones,.fa-headphones-alt,.fa-headphones-simple{--fa:""}.fa-volume-off{--fa:""}.fa-volume-down,.fa-volume-low{--fa:""}.fa-volume-high,.fa-volume-up{--fa:""}.fa-qrcode{--fa:""}.fa-barcode{--fa:""}.fa-tag{--fa:""}.fa-tags{--fa:""}.fa-book{--fa:""}.fa-bookmark{--fa:""}.fa-print{--fa:""}.fa-camera,.fa-camera-alt{--fa:""}.fa-font{--fa:""}.fa-bold{--fa:""}.fa-italic{--fa:""}.fa-text-height{--fa:""}.fa-text-width{--fa:""}.fa-align-left{--fa:""}.fa-align-center{--fa:""}.fa-align-right{--fa:""}.fa-align-justify{--fa:""}.fa-list,.fa-list-squares{--fa:""}.fa-dedent,.fa-outdent{--fa:""}.fa-indent{--fa:""}.fa-video,.fa-video-camera{--fa:""}.fa-image{--fa:""}.fa-location-pin,.fa-map-marker{--fa:""}.fa-adjust,.fa-circle-half-stroke{--fa:""}.fa-droplet,.fa-tint{--fa:""}.fa-edit,.fa-pen-to-square{--fa:""}.fa-arrows,.fa-arrows-up-down-left-right{--fa:""}.fa-backward-step,.fa-step-backward{--fa:""}.fa-backward-fast,.fa-fast-backward{--fa:""}.fa-backward{--fa:""}.fa-play{--fa:""}.fa-pause{--fa:""}.fa-stop{--fa:""}.fa-forward{--fa:""}.fa-fast-forward,.fa-forward-fast{--fa:""}.fa-forward-step,.fa-step-forward{--fa:""}.fa-eject{--fa:""}.fa-chevron-left{--fa:""}.fa-chevron-right{--fa:""}.fa-circle-plus,.fa-plus-circle{--fa:""}.fa-circle-minus,.fa-minus-circle{--fa:""}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:""}.fa-check-circle,.fa-circle-check{--fa:""}.fa-circle-question,.fa-question-circle{--fa:""}.fa-circle-info,.fa-info-circle{--fa:""}.fa-crosshairs{--fa:""}.fa-ban,.fa-cancel{--fa:""}.fa-arrow-left{--fa:""}.fa-arrow-right{--fa:""}.fa-arrow-up{--fa:""}.fa-arrow-down{--fa:""}.fa-mail-forward,.fa-share{--fa:""}.fa-expand{--fa:""}.fa-compress{--fa:""}.fa-minus,.fa-subtract{--fa:""}.fa-circle-exclamation,.fa-exclamation-circle{--fa:""}.fa-gift{--fa:""}.fa-leaf{--fa:""}.fa-fire{--fa:""}.fa-eye{--fa:""}.fa-eye-slash{--fa:""}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:""}.fa-plane{--fa:""}.fa-calendar-alt,.fa-calendar-days{--fa:""}.fa-random,.fa-shuffle{--fa:""}.fa-comment{--fa:""}.fa-magnet{--fa:""}.fa-chevron-up{--fa:""}.fa-chevron-down{--fa:""}.fa-retweet{--fa:""}.fa-cart-shopping,.fa-shopping-cart{--fa:""}.fa-folder,.fa-folder-blank{--fa:""}.fa-folder-open{--fa:""}.fa-arrows-up-down,.fa-arrows-v{--fa:""}.fa-arrows-h,.fa-arrows-left-right{--fa:""}.fa-bar-chart,.fa-chart-bar{--fa:""}.fa-camera-retro{--fa:""}.fa-key{--fa:""}.fa-cogs,.fa-gears{--fa:""}.fa-comments{--fa:""}.fa-star-half{--fa:""}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:""}.fa-thumb-tack,.fa-thumbtack{--fa:""}.fa-arrow-up-right-from-square,.fa-external-link{--fa:""}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:""}.fa-trophy{--fa:""}.fa-upload{--fa:""}.fa-lemon{--fa:""}.fa-phone{--fa:""}.fa-phone-square,.fa-square-phone{--fa:""}.fa-unlock{--fa:""}.fa-credit-card,.fa-credit-card-alt{--fa:""}.fa-feed,.fa-rss{--fa:""}.fa-hard-drive,.fa-hdd{--fa:""}.fa-bullhorn{--fa:""}.fa-certificate{--fa:""}.fa-hand-point-right{--fa:""}.fa-hand-point-left{--fa:""}.fa-hand-point-up{--fa:""}.fa-hand-point-down{--fa:""}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:""}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:""}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:""}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:""}.fa-globe{--fa:""}.fa-wrench{--fa:""}.fa-list-check,.fa-tasks{--fa:""}.fa-filter{--fa:""}.fa-briefcase{--fa:""}.fa-arrows-alt,.fa-up-down-left-right{--fa:""}.fa-users{--fa:""}.fa-chain,.fa-link{--fa:""}.fa-cloud{--fa:""}.fa-flask{--fa:""}.fa-cut,.fa-scissors{--fa:""}.fa-copy{--fa:""}.fa-paperclip{--fa:""}.fa-floppy-disk,.fa-save{--fa:""}.fa-square{--fa:""}.fa-bars,.fa-navicon{--fa:""}.fa-list-dots,.fa-list-ul{--fa:""}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:""}.fa-strikethrough{--fa:""}.fa-underline{--fa:""}.fa-table{--fa:""}.fa-magic,.fa-wand-magic{--fa:""}.fa-truck{--fa:""}.fa-money-bill{--fa:""}.fa-caret-down{--fa:""}.fa-caret-up{--fa:""}.fa-caret-left{--fa:""}.fa-caret-right{--fa:""}.fa-columns,.fa-table-columns{--fa:""}.fa-sort,.fa-unsorted{--fa:""}.fa-sort-desc,.fa-sort-down{--fa:""}.fa-sort-asc,.fa-sort-up{--fa:""}.fa-envelope{--fa:""}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:""}.fa-gavel,.fa-legal{--fa:""}.fa-bolt,.fa-zap{--fa:""}.fa-sitemap{--fa:""}.fa-umbrella{--fa:""}.fa-file-clipboard,.fa-paste{--fa:""}.fa-lightbulb{--fa:""}.fa-arrow-right-arrow-left,.fa-exchange{--fa:""}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:""}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:""}.fa-user-doctor,.fa-user-md{--fa:""}.fa-stethoscope{--fa:""}.fa-suitcase{--fa:""}.fa-bell{--fa:""}.fa-coffee,.fa-mug-saucer{--fa:""}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:""}.fa-ambulance,.fa-truck-medical{--fa:""}.fa-medkit,.fa-suitcase-medical{--fa:""}.fa-fighter-jet,.fa-jet-fighter{--fa:""}.fa-beer,.fa-beer-mug-empty{--fa:""}.fa-h-square,.fa-square-h{--fa:""}.fa-plus-square,.fa-square-plus{--fa:""}.fa-angle-double-left,.fa-angles-left{--fa:""}.fa-angle-double-right,.fa-angles-right{--fa:""}.fa-angle-double-up,.fa-angles-up{--fa:""}.fa-angle-double-down,.fa-angles-down{--fa:""}.fa-angle-left{--fa:""}.fa-angle-right{--fa:""}.fa-angle-up{--fa:""}.fa-angle-down{--fa:""}.fa-laptop{--fa:""}.fa-tablet-button{--fa:""}.fa-mobile-button{--fa:""}.fa-quote-left,.fa-quote-left-alt{--fa:""}.fa-quote-right,.fa-quote-right-alt{--fa:""}.fa-spinner{--fa:""}.fa-circle{--fa:""}.fa-face-smile,.fa-smile{--fa:""}.fa-face-frown,.fa-frown{--fa:""}.fa-face-meh,.fa-meh{--fa:""}.fa-gamepad{--fa:""}.fa-keyboard{--fa:""}.fa-flag-checkered{--fa:""}.fa-terminal{--fa:""}.fa-code{--fa:""}.fa-mail-reply-all,.fa-reply-all{--fa:""}.fa-location-arrow{--fa:""}.fa-crop{--fa:""}.fa-code-branch{--fa:""}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:""}.fa-info{--fa:""}.fa-superscript{--fa:""}.fa-subscript{--fa:""}.fa-eraser{--fa:""}.fa-puzzle-piece{--fa:""}.fa-microphone{--fa:""}.fa-microphone-slash{--fa:""}.fa-shield,.fa-shield-blank{--fa:""}.fa-calendar{--fa:""}.fa-fire-extinguisher{--fa:""}.fa-rocket{--fa:""}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:""}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:""}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:""}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:""}.fa-anchor{--fa:""}.fa-unlock-alt,.fa-unlock-keyhole{--fa:""}.fa-bullseye{--fa:""}.fa-ellipsis,.fa-ellipsis-h{--fa:""}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:""}.fa-rss-square,.fa-square-rss{--fa:""}.fa-circle-play,.fa-play-circle{--fa:""}.fa-ticket{--fa:""}.fa-minus-square,.fa-square-minus{--fa:""}.fa-arrow-turn-up,.fa-level-up{--fa:""}.fa-arrow-turn-down,.fa-level-down{--fa:""}.fa-check-square,.fa-square-check{--fa:""}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:""}.fa-external-link-square,.fa-square-arrow-up-right{--fa:""}.fa-share-from-square,.fa-share-square{--fa:""}.fa-compass{--fa:""}.fa-caret-square-down,.fa-square-caret-down{--fa:""}.fa-caret-square-up,.fa-square-caret-up{--fa:""}.fa-caret-square-right,.fa-square-caret-right{--fa:""}.fa-eur,.fa-euro,.fa-euro-sign{--fa:""}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:""}.fa-rupee,.fa-rupee-sign{--fa:""}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:""}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:""}.fa-krw,.fa-won,.fa-won-sign{--fa:""}.fa-file{--fa:""}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:""}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:""}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:""}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:""}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:""}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:""}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:""}.fa-thumbs-up{--fa:""}.fa-thumbs-down{--fa:""}.fa-arrow-down-long,.fa-long-arrow-down{--fa:""}.fa-arrow-up-long,.fa-long-arrow-up{--fa:""}.fa-arrow-left-long,.fa-long-arrow-left{--fa:""}.fa-arrow-right-long,.fa-long-arrow-right{--fa:""}.fa-female,.fa-person-dress{--fa:""}.fa-male,.fa-person{--fa:""}.fa-sun{--fa:""}.fa-moon{--fa:""}.fa-archive,.fa-box-archive{--fa:""}.fa-bug{--fa:""}.fa-caret-square-left,.fa-square-caret-left{--fa:""}.fa-circle-dot,.fa-dot-circle{--fa:""}.fa-wheelchair{--fa:""}.fa-lira-sign{--fa:""}.fa-shuttle-space,.fa-space-shuttle{--fa:""}.fa-envelope-square,.fa-square-envelope{--fa:""}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:""}.fa-graduation-cap,.fa-mortar-board{--fa:""}.fa-language{--fa:""}.fa-fax{--fa:""}.fa-building{--fa:""}.fa-child{--fa:""}.fa-paw{--fa:""}.fa-cube{--fa:""}.fa-cubes{--fa:""}.fa-recycle{--fa:""}.fa-automobile,.fa-car{--fa:""}.fa-cab,.fa-taxi{--fa:""}.fa-tree{--fa:""}.fa-database{--fa:""}.fa-file-pdf{--fa:""}.fa-file-word{--fa:""}.fa-file-excel{--fa:""}.fa-file-powerpoint{--fa:""}.fa-file-image{--fa:""}.fa-file-archive,.fa-file-zipper{--fa:""}.fa-file-audio{--fa:""}.fa-file-video{--fa:""}.fa-file-code{--fa:""}.fa-life-ring{--fa:""}.fa-circle-notch{--fa:""}.fa-paper-plane{--fa:""}.fa-clock-rotate-left,.fa-history{--fa:""}.fa-header,.fa-heading{--fa:""}.fa-paragraph{--fa:""}.fa-sliders,.fa-sliders-h{--fa:""}.fa-share-alt,.fa-share-nodes{--fa:""}.fa-share-alt-square,.fa-square-share-nodes{--fa:""}.fa-bomb{--fa:""}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:""}.fa-teletype,.fa-tty{--fa:""}.fa-binoculars{--fa:""}.fa-plug{--fa:""}.fa-newspaper{--fa:""}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:""}.fa-calculator{--fa:""}.fa-bell-slash{--fa:""}.fa-trash{--fa:""}.fa-copyright{--fa:""}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:""}.fa-paint-brush,.fa-paintbrush{--fa:""}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:""}.fa-area-chart,.fa-chart-area{--fa:""}.fa-chart-pie,.fa-pie-chart{--fa:""}.fa-chart-line,.fa-line-chart{--fa:""}.fa-toggle-off{--fa:""}.fa-toggle-on{--fa:""}.fa-bicycle{--fa:""}.fa-bus{--fa:""}.fa-closed-captioning{--fa:""}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:""}.fa-cart-plus{--fa:""}.fa-cart-arrow-down{--fa:""}.fa-diamond{--fa:""}.fa-ship{--fa:""}.fa-user-secret{--fa:""}.fa-motorcycle{--fa:""}.fa-street-view{--fa:""}.fa-heart-pulse,.fa-heartbeat{--fa:""}.fa-venus{--fa:""}.fa-mars{--fa:""}.fa-mercury{--fa:""}.fa-mars-and-venus{--fa:""}.fa-transgender,.fa-transgender-alt{--fa:""}.fa-venus-double{--fa:""}.fa-mars-double{--fa:""}.fa-venus-mars{--fa:""}.fa-mars-stroke{--fa:""}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:""}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:""}.fa-neuter{--fa:""}.fa-genderless{--fa:""}.fa-server{--fa:""}.fa-user-plus{--fa:""}.fa-user-times,.fa-user-xmark{--fa:""}.fa-bed{--fa:""}.fa-train{--fa:""}.fa-subway,.fa-train-subway{--fa:""}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:""}.fa-battery-4,.fa-battery-three-quarters{--fa:""}.fa-battery-3,.fa-battery-half{--fa:""}.fa-battery-2,.fa-battery-quarter{--fa:""}.fa-battery-0,.fa-battery-empty{--fa:""}.fa-arrow-pointer,.fa-mouse-pointer{--fa:""}.fa-i-cursor{--fa:""}.fa-object-group{--fa:""}.fa-object-ungroup{--fa:""}.fa-note-sticky,.fa-sticky-note{--fa:""}.fa-clone{--fa:""}.fa-balance-scale,.fa-scale-balanced{--fa:""}.fa-hourglass-1,.fa-hourglass-start{--fa:""}.fa-hourglass-2,.fa-hourglass-half{--fa:""}.fa-hourglass-3,.fa-hourglass-end{--fa:""}.fa-hourglass,.fa-hourglass-empty{--fa:""}.fa-hand-back-fist,.fa-hand-rock{--fa:""}.fa-hand,.fa-hand-paper{--fa:""}.fa-hand-scissors{--fa:""}.fa-hand-lizard{--fa:""}.fa-hand-spock{--fa:""}.fa-hand-pointer{--fa:""}.fa-hand-peace{--fa:""}.fa-trademark{--fa:""}.fa-registered{--fa:""}.fa-television,.fa-tv,.fa-tv-alt{--fa:""}.fa-calendar-plus{--fa:""}.fa-calendar-minus{--fa:""}.fa-calendar-times,.fa-calendar-xmark{--fa:""}.fa-calendar-check{--fa:""}.fa-industry{--fa:""}.fa-map-pin{--fa:""}.fa-map-signs,.fa-signs-post{--fa:""}.fa-map{--fa:""}.fa-comment-alt,.fa-message{--fa:""}.fa-circle-pause,.fa-pause-circle{--fa:""}.fa-circle-stop,.fa-stop-circle{--fa:""}.fa-bag-shopping,.fa-shopping-bag{--fa:""}.fa-basket-shopping,.fa-shopping-basket{--fa:""}.fa-universal-access{--fa:""}.fa-blind,.fa-person-walking-with-cane{--fa:""}.fa-audio-description{--fa:""}.fa-phone-volume,.fa-volume-control-phone{--fa:""}.fa-braille{--fa:""}.fa-assistive-listening-systems,.fa-ear-listen{--fa:""}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:""}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:""}.fa-hands,.fa-sign-language,.fa-signing{--fa:""}.fa-eye-low-vision,.fa-low-vision{--fa:""}.fa-handshake,.fa-handshake-alt,.fa-handshake-simple{--fa:""}.fa-envelope-open{--fa:""}.fa-address-book,.fa-contact-book{--fa:""}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:""}.fa-circle-user,.fa-user-circle{--fa:""}.fa-id-badge{--fa:""}.fa-drivers-license,.fa-id-card{--fa:""}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:""}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:""}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:""}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:""}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:""}.fa-shower{--fa:""}.fa-bath,.fa-bathtub{--fa:""}.fa-podcast{--fa:""}.fa-window-maximize{--fa:""}.fa-window-minimize{--fa:""}.fa-window-restore{--fa:""}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:""}.fa-microchip{--fa:""}.fa-snowflake{--fa:""}.fa-spoon,.fa-utensil-spoon{--fa:""}.fa-cutlery,.fa-utensils{--fa:""}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:""}.fa-trash-alt,.fa-trash-can{--fa:""}.fa-rotate,.fa-sync-alt{--fa:""}.fa-stopwatch{--fa:""}.fa-right-from-bracket,.fa-sign-out-alt{--fa:""}.fa-right-to-bracket,.fa-sign-in-alt{--fa:""}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:""}.fa-poo{--fa:""}.fa-images{--fa:""}.fa-pencil,.fa-pencil-alt{--fa:""}.fa-pen{--fa:""}.fa-pen-alt,.fa-pen-clip{--fa:""}.fa-octagon{--fa:""}.fa-down-long,.fa-long-arrow-alt-down{--fa:""}.fa-left-long,.fa-long-arrow-alt-left{--fa:""}.fa-long-arrow-alt-right,.fa-right-long{--fa:""}.fa-long-arrow-alt-up,.fa-up-long{--fa:""}.fa-hexagon{--fa:""}.fa-file-edit,.fa-file-pen{--fa:""}.fa-expand-arrows-alt,.fa-maximize{--fa:""}.fa-clipboard{--fa:""}.fa-arrows-alt-h,.fa-left-right{--fa:""}.fa-arrows-alt-v,.fa-up-down{--fa:""}.fa-alarm-clock{--fa:""}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:""}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:""}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:""}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:""}.fa-external-link-alt,.fa-up-right-from-square{--fa:""}.fa-external-link-square-alt,.fa-square-up-right{--fa:""}.fa-exchange-alt,.fa-right-left{--fa:""}.fa-repeat{--fa:""}.fa-code-commit{--fa:""}.fa-code-merge{--fa:""}.fa-desktop,.fa-desktop-alt{--fa:""}.fa-gem{--fa:""}.fa-level-down-alt,.fa-turn-down{--fa:""}.fa-level-up-alt,.fa-turn-up{--fa:""}.fa-lock-open{--fa:""}.fa-location-dot,.fa-map-marker-alt{--fa:""}.fa-microphone-alt,.fa-microphone-lines{--fa:""}.fa-mobile-alt,.fa-mobile-screen-button{--fa:""}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:""}.fa-mobile-android-alt,.fa-mobile-screen{--fa:""}.fa-money-bill-1,.fa-money-bill-alt{--fa:""}.fa-phone-slash{--fa:""}.fa-image-portrait,.fa-portrait{--fa:""}.fa-mail-reply,.fa-reply{--fa:""}.fa-shield-alt,.fa-shield-halved{--fa:""}.fa-tablet-alt,.fa-tablet-screen-button{--fa:""}.fa-tablet,.fa-tablet-android{--fa:""}.fa-ticket-alt,.fa-ticket-simple{--fa:""}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:""}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:""}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:""}.fa-baseball-bat-ball{--fa:""}.fa-baseball,.fa-baseball-ball{--fa:""}.fa-basketball,.fa-basketball-ball{--fa:""}.fa-bowling-ball{--fa:""}.fa-chess{--fa:""}.fa-chess-bishop{--fa:""}.fa-chess-board{--fa:""}.fa-chess-king{--fa:""}.fa-chess-knight{--fa:""}.fa-chess-pawn{--fa:""}.fa-chess-queen{--fa:""}.fa-chess-rook{--fa:""}.fa-dumbbell{--fa:""}.fa-football,.fa-football-ball{--fa:""}.fa-golf-ball,.fa-golf-ball-tee{--fa:""}.fa-hockey-puck{--fa:""}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:""}.fa-square-full{--fa:""}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:""}.fa-volleyball,.fa-volleyball-ball{--fa:""}.fa-allergies,.fa-hand-dots{--fa:""}.fa-band-aid,.fa-bandage{--fa:""}.fa-box{--fa:""}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:""}.fa-briefcase-medical{--fa:""}.fa-burn,.fa-fire-flame-simple{--fa:""}.fa-capsules{--fa:""}.fa-clipboard-check{--fa:""}.fa-clipboard-list{--fa:""}.fa-diagnoses,.fa-person-dots-from-line{--fa:""}.fa-dna{--fa:""}.fa-dolly,.fa-dolly-box{--fa:""}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:""}.fa-file-medical{--fa:""}.fa-file-medical-alt,.fa-file-waveform{--fa:""}.fa-first-aid,.fa-kit-medical{--fa:""}.fa-circle-h,.fa-hospital-symbol{--fa:""}.fa-id-card-alt,.fa-id-card-clip{--fa:""}.fa-notes-medical{--fa:""}.fa-pallet{--fa:""}.fa-pills{--fa:""}.fa-prescription-bottle{--fa:""}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:""}.fa-bed-pulse,.fa-procedures{--fa:""}.fa-shipping-fast,.fa-truck-fast{--fa:""}.fa-smoking{--fa:""}.fa-syringe{--fa:""}.fa-tablets{--fa:""}.fa-thermometer{--fa:""}.fa-vial{--fa:""}.fa-vials{--fa:""}.fa-warehouse{--fa:""}.fa-weight,.fa-weight-scale{--fa:""}.fa-x-ray{--fa:""}.fa-box-open{--fa:""}.fa-comment-dots,.fa-commenting{--fa:""}.fa-comment-slash{--fa:""}.fa-couch{--fa:""}.fa-circle-dollar-to-slot,.fa-donate{--fa:""}.fa-dove{--fa:""}.fa-hand-holding{--fa:""}.fa-hand-holding-heart{--fa:""}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:""}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:""}.fa-hands-holding{--fa:""}.fa-hands-helping,.fa-handshake-angle{--fa:""}.fa-parachute-box{--fa:""}.fa-people-carry,.fa-people-carry-box{--fa:""}.fa-piggy-bank{--fa:""}.fa-ribbon{--fa:""}.fa-route{--fa:""}.fa-seedling,.fa-sprout{--fa:""}.fa-sign,.fa-sign-hanging{--fa:""}.fa-face-smile-wink,.fa-smile-wink{--fa:""}.fa-tape{--fa:""}.fa-truck-loading,.fa-truck-ramp-box{--fa:""}.fa-truck-moving{--fa:""}.fa-video-slash{--fa:""}.fa-wine-glass{--fa:""}.fa-user-astronaut{--fa:""}.fa-user-check{--fa:""}.fa-user-clock{--fa:""}.fa-user-cog,.fa-user-gear{--fa:""}.fa-user-edit,.fa-user-pen{--fa:""}.fa-user-friends,.fa-user-group{--fa:""}.fa-user-graduate{--fa:""}.fa-user-lock{--fa:""}.fa-user-minus{--fa:""}.fa-user-ninja{--fa:""}.fa-user-shield{--fa:""}.fa-user-alt-slash,.fa-user-large-slash,.fa-user-slash{--fa:""}.fa-user-tag{--fa:""}.fa-user-tie{--fa:""}.fa-users-cog,.fa-users-gear{--fa:""}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:""}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:""}.fa-blender{--fa:""}.fa-book-open{--fa:""}.fa-broadcast-tower,.fa-tower-broadcast{--fa:""}.fa-broom{--fa:""}.fa-blackboard,.fa-chalkboard{--fa:""}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:""}.fa-church{--fa:""}.fa-coins{--fa:""}.fa-compact-disc{--fa:""}.fa-crow{--fa:""}.fa-crown{--fa:""}.fa-dice{--fa:""}.fa-dice-five{--fa:""}.fa-dice-four{--fa:""}.fa-dice-one{--fa:""}.fa-dice-six{--fa:""}.fa-dice-three{--fa:""}.fa-dice-two{--fa:""}.fa-divide{--fa:""}.fa-door-closed{--fa:""}.fa-door-open{--fa:""}.fa-feather{--fa:""}.fa-frog{--fa:""}.fa-gas-pump{--fa:""}.fa-glasses{--fa:""}.fa-greater-than-equal{--fa:""}.fa-helicopter{--fa:""}.fa-infinity{--fa:""}.fa-kiwi-bird{--fa:""}.fa-less-than-equal{--fa:""}.fa-memory{--fa:""}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:""}.fa-money-bill-wave{--fa:""}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:""}.fa-money-check{--fa:""}.fa-money-check-alt,.fa-money-check-dollar{--fa:""}.fa-not-equal{--fa:""}.fa-palette{--fa:""}.fa-parking,.fa-square-parking{--fa:""}.fa-diagram-project,.fa-project-diagram{--fa:""}.fa-receipt{--fa:""}.fa-robot{--fa:""}.fa-ruler{--fa:""}.fa-ruler-combined{--fa:""}.fa-ruler-horizontal{--fa:""}.fa-ruler-vertical{--fa:""}.fa-school{--fa:""}.fa-screwdriver{--fa:""}.fa-shoe-prints{--fa:""}.fa-skull{--fa:""}.fa-ban-smoking,.fa-smoking-ban{--fa:""}.fa-store{--fa:""}.fa-shop,.fa-store-alt{--fa:""}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:""}.fa-stroopwafel{--fa:""}.fa-toolbox{--fa:""}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:""}.fa-person-walking,.fa-walking{--fa:""}.fa-wallet{--fa:""}.fa-angry,.fa-face-angry{--fa:""}.fa-archway{--fa:""}.fa-atlas,.fa-book-atlas{--fa:""}.fa-award{--fa:""}.fa-backspace,.fa-delete-left{--fa:""}.fa-bezier-curve{--fa:""}.fa-bong{--fa:""}.fa-brush{--fa:""}.fa-bus-alt,.fa-bus-simple{--fa:""}.fa-cannabis{--fa:""}.fa-check-double{--fa:""}.fa-cocktail,.fa-martini-glass-citrus{--fa:""}.fa-bell-concierge,.fa-concierge-bell{--fa:""}.fa-cookie{--fa:""}.fa-cookie-bite{--fa:""}.fa-crop-alt,.fa-crop-simple{--fa:""}.fa-digital-tachograph,.fa-tachograph-digital{--fa:""}.fa-dizzy,.fa-face-dizzy{--fa:""}.fa-compass-drafting,.fa-drafting-compass{--fa:""}.fa-drum{--fa:""}.fa-drum-steelpan{--fa:""}.fa-feather-alt,.fa-feather-pointed{--fa:""}.fa-file-contract{--fa:""}.fa-file-arrow-down,.fa-file-download{--fa:""}.fa-arrow-right-from-file,.fa-file-export{--fa:""}.fa-arrow-right-to-file,.fa-file-import{--fa:""}.fa-file-invoice{--fa:""}.fa-file-invoice-dollar{--fa:""}.fa-file-prescription{--fa:""}.fa-file-signature{--fa:""}.fa-file-arrow-up,.fa-file-upload{--fa:""}.fa-fill{--fa:""}.fa-fill-drip{--fa:""}.fa-fingerprint{--fa:""}.fa-fish{--fa:""}.fa-face-flushed,.fa-flushed{--fa:""}.fa-face-frown-open,.fa-frown-open{--fa:""}.fa-glass-martini-alt,.fa-martini-glass{--fa:""}.fa-earth-africa,.fa-globe-africa{--fa:""}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:""}.fa-earth-asia,.fa-globe-asia{--fa:""}.fa-face-grimace,.fa-grimace{--fa:""}.fa-face-grin,.fa-grin{--fa:""}.fa-face-grin-wide,.fa-grin-alt{--fa:""}.fa-face-grin-beam,.fa-grin-beam{--fa:""}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:""}.fa-face-grin-hearts,.fa-grin-hearts{--fa:""}.fa-face-grin-squint,.fa-grin-squint{--fa:""}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:""}.fa-face-grin-stars,.fa-grin-stars{--fa:""}.fa-face-grin-tears,.fa-grin-tears{--fa:""}.fa-face-grin-tongue,.fa-grin-tongue{--fa:""}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:""}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:""}.fa-face-grin-wink,.fa-grin-wink{--fa:""}.fa-grid-horizontal,.fa-grip,.fa-grip-horizontal{--fa:""}.fa-grid-vertical,.fa-grip-vertical{--fa:""}.fa-headset{--fa:""}.fa-highlighter{--fa:""}.fa-hot-tub,.fa-hot-tub-person{--fa:""}.fa-hotel{--fa:""}.fa-joint{--fa:""}.fa-face-kiss,.fa-kiss{--fa:""}.fa-face-kiss-beam,.fa-kiss-beam{--fa:""}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:""}.fa-face-laugh,.fa-laugh{--fa:""}.fa-face-laugh-beam,.fa-laugh-beam{--fa:""}.fa-face-laugh-squint,.fa-laugh-squint{--fa:""}.fa-face-laugh-wink,.fa-laugh-wink{--fa:""}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:""}.fa-map-location,.fa-map-marked{--fa:""}.fa-map-location-dot,.fa-map-marked-alt{--fa:""}.fa-marker{--fa:""}.fa-medal{--fa:""}.fa-face-meh-blank,.fa-meh-blank{--fa:""}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:""}.fa-monument{--fa:""}.fa-mortar-pestle{--fa:""}.fa-paint-roller{--fa:""}.fa-passport{--fa:""}.fa-pen-fancy{--fa:""}.fa-pen-nib{--fa:""}.fa-pen-ruler,.fa-pencil-ruler{--fa:""}.fa-plane-arrival{--fa:""}.fa-plane-departure{--fa:""}.fa-prescription{--fa:""}.fa-face-sad-cry,.fa-sad-cry{--fa:""}.fa-face-sad-tear,.fa-sad-tear{--fa:""}.fa-shuttle-van,.fa-van-shuttle{--fa:""}.fa-signature{--fa:""}.fa-face-smile-beam,.fa-smile-beam{--fa:""}.fa-solar-panel{--fa:""}.fa-lotus,.fa-spa{--fa:""}.fa-splotch{--fa:""}.fa-spray-can{--fa:""}.fa-stamp{--fa:""}.fa-star-half-alt,.fa-star-half-stroke{--fa:""}.fa-suitcase-rolling{--fa:""}.fa-face-surprise,.fa-surprise{--fa:""}.fa-swatchbook{--fa:""}.fa-person-swimming,.fa-swimmer{--fa:""}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:""}.fa-droplet-slash,.fa-tint-slash{--fa:""}.fa-face-tired,.fa-tired{--fa:""}.fa-tooth{--fa:""}.fa-umbrella-beach{--fa:""}.fa-weight-hanging{--fa:""}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:""}.fa-air-freshener,.fa-spray-can-sparkles{--fa:""}.fa-apple-alt,.fa-apple-whole{--fa:""}.fa-atom{--fa:""}.fa-bone{--fa:""}.fa-book-open-reader,.fa-book-reader{--fa:""}.fa-brain{--fa:""}.fa-car-alt,.fa-car-rear{--fa:""}.fa-battery-car,.fa-car-battery{--fa:""}.fa-car-burst,.fa-car-crash{--fa:""}.fa-car-side{--fa:""}.fa-charging-station{--fa:""}.fa-diamond-turn-right,.fa-directions{--fa:""}.fa-draw-polygon,.fa-vector-polygon{--fa:""}.fa-laptop-code{--fa:""}.fa-layer-group{--fa:""}.fa-location,.fa-location-crosshairs{--fa:""}.fa-lungs{--fa:""}.fa-microscope{--fa:""}.fa-oil-can{--fa:""}.fa-poop{--fa:""}.fa-shapes,.fa-triangle-circle-square{--fa:""}.fa-star-of-life{--fa:""}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:""}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:""}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:""}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:""}.fa-teeth{--fa:""}.fa-teeth-open{--fa:""}.fa-masks-theater,.fa-theater-masks{--fa:""}.fa-traffic-light{--fa:""}.fa-truck-monster{--fa:""}.fa-truck-pickup{--fa:""}.fa-ad,.fa-rectangle-ad{--fa:""}.fa-ankh{--fa:""}.fa-bible,.fa-book-bible{--fa:""}.fa-briefcase-clock,.fa-business-time{--fa:""}.fa-city{--fa:""}.fa-comment-dollar{--fa:""}.fa-comments-dollar{--fa:""}.fa-cross{--fa:""}.fa-dharmachakra{--fa:""}.fa-envelope-open-text{--fa:""}.fa-folder-minus{--fa:""}.fa-folder-plus{--fa:""}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:""}.fa-gopuram{--fa:""}.fa-hamsa{--fa:""}.fa-bahai,.fa-haykal{--fa:""}.fa-jedi{--fa:""}.fa-book-journal-whills,.fa-journal-whills{--fa:""}.fa-kaaba{--fa:""}.fa-khanda{--fa:""}.fa-landmark{--fa:""}.fa-envelopes-bulk,.fa-mail-bulk{--fa:""}.fa-menorah{--fa:""}.fa-mosque{--fa:""}.fa-om{--fa:""}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:""}.fa-peace{--fa:""}.fa-place-of-worship{--fa:""}.fa-poll,.fa-square-poll-vertical{--fa:""}.fa-poll-h,.fa-square-poll-horizontal{--fa:""}.fa-person-praying,.fa-pray{--fa:""}.fa-hands-praying,.fa-praying-hands{--fa:""}.fa-book-quran,.fa-quran{--fa:""}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:""}.fa-magnifying-glass-location,.fa-search-location{--fa:""}.fa-socks{--fa:""}.fa-square-root-alt,.fa-square-root-variable{--fa:""}.fa-star-and-crescent{--fa:""}.fa-star-of-david{--fa:""}.fa-synagogue{--fa:""}.fa-scroll-torah,.fa-torah{--fa:""}.fa-torii-gate{--fa:""}.fa-vihara{--fa:""}.fa-volume,.fa-volume-medium{--fa:""}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:""}.fa-yin-yang{--fa:""}.fa-blender-phone{--fa:""}.fa-book-dead,.fa-book-skull{--fa:""}.fa-campground{--fa:""}.fa-cat{--fa:""}.fa-chair{--fa:""}.fa-cloud-moon{--fa:""}.fa-cloud-sun{--fa:""}.fa-cow{--fa:""}.fa-dice-d20{--fa:""}.fa-dice-d6{--fa:""}.fa-dog{--fa:""}.fa-dragon{--fa:""}.fa-drumstick-bite{--fa:""}.fa-dungeon{--fa:""}.fa-file-csv{--fa:""}.fa-fist-raised,.fa-hand-fist{--fa:""}.fa-ghost{--fa:""}.fa-hammer{--fa:""}.fa-hanukiah{--fa:""}.fa-hat-wizard{--fa:""}.fa-hiking,.fa-person-hiking{--fa:""}.fa-hippo{--fa:""}.fa-horse{--fa:""}.fa-house-chimney-crack,.fa-house-damage{--fa:""}.fa-hryvnia,.fa-hryvnia-sign{--fa:""}.fa-mask{--fa:""}.fa-mountain{--fa:""}.fa-network-wired{--fa:""}.fa-otter{--fa:""}.fa-ring{--fa:""}.fa-person-running,.fa-running{--fa:""}.fa-scroll{--fa:""}.fa-skull-crossbones{--fa:""}.fa-slash{--fa:""}.fa-spider{--fa:""}.fa-toilet-paper,.fa-toilet-paper-alt,.fa-toilet-paper-blank{--fa:""}.fa-tractor{--fa:""}.fa-user-injured{--fa:""}.fa-vr-cardboard{--fa:""}.fa-wand-sparkles{--fa:""}.fa-wind{--fa:""}.fa-wine-bottle{--fa:""}.fa-cloud-meatball{--fa:""}.fa-cloud-moon-rain{--fa:""}.fa-cloud-rain{--fa:""}.fa-cloud-showers-heavy{--fa:""}.fa-cloud-sun-rain{--fa:""}.fa-democrat{--fa:""}.fa-flag-usa{--fa:""}.fa-hurricane{--fa:""}.fa-landmark-alt,.fa-landmark-dome{--fa:""}.fa-meteor{--fa:""}.fa-person-booth{--fa:""}.fa-poo-bolt,.fa-poo-storm{--fa:""}.fa-rainbow{--fa:""}.fa-republican{--fa:""}.fa-smog{--fa:""}.fa-temperature-high{--fa:""}.fa-temperature-low{--fa:""}.fa-cloud-bolt,.fa-thunderstorm{--fa:""}.fa-tornado{--fa:""}.fa-volcano{--fa:""}.fa-check-to-slot,.fa-vote-yea{--fa:""}.fa-water{--fa:""}.fa-baby{--fa:""}.fa-baby-carriage,.fa-carriage-baby{--fa:""}.fa-biohazard{--fa:""}.fa-blog{--fa:""}.fa-calendar-day{--fa:""}.fa-calendar-week{--fa:""}.fa-candy-cane{--fa:""}.fa-carrot{--fa:""}.fa-cash-register{--fa:""}.fa-compress-arrows-alt,.fa-minimize{--fa:""}.fa-dumpster{--fa:""}.fa-dumpster-fire{--fa:""}.fa-ethernet{--fa:""}.fa-gifts{--fa:""}.fa-champagne-glasses,.fa-glass-cheers{--fa:""}.fa-glass-whiskey,.fa-whiskey-glass{--fa:""}.fa-earth-europe,.fa-globe-europe{--fa:""}.fa-grip-lines{--fa:""}.fa-grip-lines-vertical{--fa:""}.fa-guitar{--fa:""}.fa-heart-broken,.fa-heart-crack{--fa:""}.fa-holly-berry{--fa:""}.fa-horse-head{--fa:""}.fa-icicles{--fa:""}.fa-igloo{--fa:""}.fa-mitten{--fa:""}.fa-mug-hot{--fa:""}.fa-radiation{--fa:""}.fa-circle-radiation,.fa-radiation-alt{--fa:""}.fa-restroom{--fa:""}.fa-satellite{--fa:""}.fa-satellite-dish{--fa:""}.fa-sd-card{--fa:""}.fa-sim-card{--fa:""}.fa-person-skating,.fa-skating{--fa:""}.fa-person-skiing,.fa-skiing{--fa:""}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:""}.fa-sleigh{--fa:""}.fa-comment-sms,.fa-sms{--fa:""}.fa-person-snowboarding,.fa-snowboarding{--fa:""}.fa-snowman{--fa:""}.fa-snowplow{--fa:""}.fa-tenge,.fa-tenge-sign{--fa:""}.fa-toilet{--fa:""}.fa-screwdriver-wrench,.fa-tools{--fa:""}.fa-cable-car,.fa-tram{--fa:""}.fa-fire-alt,.fa-fire-flame-curved{--fa:""}.fa-bacon{--fa:""}.fa-book-medical{--fa:""}.fa-bread-slice{--fa:""}.fa-cheese{--fa:""}.fa-clinic-medical,.fa-house-chimney-medical{--fa:""}.fa-clipboard-user{--fa:""}.fa-comment-medical{--fa:""}.fa-crutch{--fa:""}.fa-disease{--fa:""}.fa-egg{--fa:""}.fa-folder-tree{--fa:""}.fa-burger,.fa-hamburger{--fa:""}.fa-hand-middle-finger{--fa:""}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:""}.fa-hospital-user{--fa:""}.fa-hotdog{--fa:""}.fa-ice-cream{--fa:""}.fa-laptop-medical{--fa:""}.fa-pager{--fa:""}.fa-pepper-hot{--fa:""}.fa-pizza-slice{--fa:""}.fa-sack-dollar{--fa:""}.fa-book-tanakh,.fa-tanakh{--fa:""}.fa-bars-progress,.fa-tasks-alt{--fa:""}.fa-trash-arrow-up,.fa-trash-restore{--fa:""}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:""}.fa-user-nurse{--fa:""}.fa-wave-square{--fa:""}.fa-biking,.fa-person-biking{--fa:""}.fa-border-all{--fa:""}.fa-border-none{--fa:""}.fa-border-style,.fa-border-top-left{--fa:""}.fa-digging,.fa-person-digging{--fa:""}.fa-fan{--fa:""}.fa-heart-music-camera-bolt,.fa-icons{--fa:""}.fa-phone-alt,.fa-phone-flip{--fa:""}.fa-phone-square-alt,.fa-square-phone-flip{--fa:""}.fa-photo-film,.fa-photo-video{--fa:""}.fa-remove-format,.fa-text-slash{--fa:""}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:""}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:""}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:""}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:""}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:""}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:""}.fa-spell-check{--fa:""}.fa-voicemail{--fa:""}.fa-hat-cowboy{--fa:""}.fa-hat-cowboy-side{--fa:""}.fa-computer-mouse,.fa-mouse{--fa:""}.fa-radio{--fa:""}.fa-record-vinyl{--fa:""}.fa-walkie-talkie{--fa:""}.fa-caravan{--fa:""}:host,:root{--fa-family-brands:"Font Awesome 7 Brands";--fa-font-brands:normal 400 1em/1 var(--fa-family-brands)}@font-face{font-family:"Font Awesome 7 Brands";font-style:normal;font-weight:400;font-display:block;src:url(/_frontend/assets/fa-brands-400-BK5CuonO.woff2)}.fa-brands,.fa-classic.fa-brands,.fab{--fa-family:var(--fa-family-brands);--fa-style:400}.fa-firefox-browser{--fa:""}.fa-ideal{--fa:""}.fa-microblog{--fa:""}.fa-pied-piper-square,.fa-square-pied-piper{--fa:""}.fa-unity{--fa:""}.fa-dailymotion{--fa:""}.fa-instagram-square,.fa-square-instagram{--fa:""}.fa-mixer{--fa:""}.fa-shopify{--fa:""}.fa-deezer{--fa:""}.fa-edge-legacy{--fa:""}.fa-google-pay{--fa:""}.fa-rust{--fa:""}.fa-tiktok{--fa:""}.fa-unsplash{--fa:""}.fa-cloudflare{--fa:""}.fa-guilded{--fa:""}.fa-hive{--fa:""}.fa-42-group,.fa-innosoft{--fa:""}.fa-instalod{--fa:""}.fa-octopus-deploy{--fa:""}.fa-perbyte{--fa:""}.fa-uncharted{--fa:""}.fa-watchman-monitoring{--fa:""}.fa-wodu{--fa:""}.fa-wirsindhandwerk,.fa-wsh{--fa:""}.fa-bots{--fa:""}.fa-cmplid{--fa:""}.fa-bilibili{--fa:""}.fa-golang{--fa:""}.fa-pix{--fa:""}.fa-sitrox{--fa:""}.fa-hashnode{--fa:""}.fa-meta{--fa:""}.fa-padlet{--fa:""}.fa-nfc-directional{--fa:""}.fa-nfc-symbol{--fa:""}.fa-screenpal{--fa:""}.fa-space-awesome{--fa:""}.fa-square-font-awesome{--fa:""}.fa-gitlab-square,.fa-square-gitlab{--fa:""}.fa-odysee{--fa:""}.fa-stubber{--fa:""}.fa-debian{--fa:""}.fa-shoelace{--fa:""}.fa-threads{--fa:""}.fa-square-threads{--fa:""}.fa-square-x-twitter{--fa:""}.fa-x-twitter{--fa:""}.fa-opensuse{--fa:""}.fa-letterboxd{--fa:""}.fa-square-letterboxd{--fa:""}.fa-mintbit{--fa:""}.fa-google-scholar{--fa:""}.fa-brave{--fa:""}.fa-brave-reverse{--fa:""}.fa-pixiv{--fa:""}.fa-upwork{--fa:""}.fa-webflow{--fa:""}.fa-signal-messenger{--fa:""}.fa-bluesky{--fa:""}.fa-jxl{--fa:""}.fa-square-upwork{--fa:""}.fa-web-awesome{--fa:""}.fa-square-web-awesome{--fa:""}.fa-square-web-awesome-stroke{--fa:""}.fa-dart-lang{--fa:""}.fa-flutter{--fa:""}.fa-files-pinwheel{--fa:""}.fa-css{--fa:""}.fa-square-bluesky{--fa:""}.fa-openai{--fa:""}.fa-square-linkedin{--fa:""}.fa-cash-app{--fa:""}.fa-disqus{--fa:""}.fa-11ty,.fa-eleventy{--fa:""}.fa-kakao-talk{--fa:""}.fa-linktree{--fa:""}.fa-notion{--fa:""}.fa-pandora{--fa:""}.fa-pixelfed{--fa:""}.fa-tidal{--fa:""}.fa-vsco{--fa:""}.fa-w3c{--fa:""}.fa-lumon{--fa:""}.fa-lumon-drop{--fa:""}.fa-square-figma{--fa:""}.fa-tex{--fa:""}.fa-duolingo{--fa:""}.fa-supportnow{--fa:""}.fa-tor-browser{--fa:""}.fa-typescript{--fa:""}.fa-square-deskpro{--fa:""}.fa-circle-zulip{--fa:""}.fa-julia{--fa:""}.fa-zulip{--fa:""}.fa-unison{--fa:""}.fa-bgg,.fa-board-game-geek{--fa:""}.fa-ko-fi{--fa:""}.fa-kubernetes{--fa:""}.fa-postgresql{--fa:""}.fa-scaleway{--fa:""}.fa-venmo{--fa:""}.fa-venmo-v{--fa:""}.fa-unreal-engine{--fa:""}.fa-globaleaks{--fa:""}.fa-solana{--fa:""}.fa-threema{--fa:""}.fa-forgejo{--fa:""}.fa-claude{--fa:""}.fa-gitee{--fa:""}.fa-xmpp{--fa:""}.fa-fediverse{--fa:""}.fa-tailwind-css{--fa:""}.fa-arch-linux{--fa:""}.fa-svelte{--fa:""}.fa-hugging-face{--fa:""}.fa-leetcode{--fa:""}.fa-openstreetmap{--fa:""}.fa-ultralytics{--fa:""}.fa-ultralytics-hub{--fa:""}.fa-ultralytics-yolo{--fa:""}.fa-obsidian{--fa:""}.fa-zoom{--fa:""}.fa-vim{--fa:""}.fa-symfonycasts{--fa:""}.fa-build-awesome{--fa:""}.fa-codeberg{--fa:""}.fa-devpost{--fa:""}.fa-internet-archive{--fa:""}.fa-lets-encrypt{--fa:""}.fa-matrix{--fa:""}.fa-mattermost{--fa:""}.fa-nextcloud{--fa:""}.fa-roblox-creator-studio{--fa:""}.fa-square-build-awesome-stroke{--fa:""}.fa-substack{--fa:""}.fa-tesla{--fa:""}.fa-xrp{--fa:""}.fa-xrpl{--fa:""}.fa-youtube-shorts{--fa:""}.fa-ror{--fa:""}.fa-square-twitter,.fa-twitter-square{--fa:""}.fa-facebook-square,.fa-square-facebook{--fa:""}.fa-linkedin{--fa:""}.fa-github-square,.fa-square-github{--fa:""}.fa-twitter{--fa:""}.fa-facebook{--fa:""}.fa-github{--fa:""}.fa-pinterest{--fa:""}.fa-pinterest-square,.fa-square-pinterest{--fa:""}.fa-google-plus-square,.fa-square-google-plus{--fa:""}.fa-google-plus-g{--fa:""}.fa-linkedin-in{--fa:""}.fa-github-alt{--fa:""}.fa-maxcdn{--fa:""}.fa-html5{--fa:""}.fa-css3{--fa:""}.fa-btc{--fa:""}.fa-youtube{--fa:""}.fa-xing{--fa:""}.fa-square-xing,.fa-xing-square{--fa:""}.fa-dropbox{--fa:""}.fa-stack-overflow{--fa:""}.fa-instagram{--fa:""}.fa-flickr{--fa:""}.fa-adn{--fa:""}.fa-bitbucket{--fa:""}.fa-tumblr{--fa:""}.fa-square-tumblr,.fa-tumblr-square{--fa:""}.fa-apple{--fa:""}.fa-windows{--fa:""}.fa-android{--fa:""}.fa-linux{--fa:""}.fa-dribbble{--fa:""}.fa-skype{--fa:""}.fa-foursquare{--fa:""}.fa-trello{--fa:""}.fa-gratipay{--fa:""}.fa-vk{--fa:""}.fa-weibo{--fa:""}.fa-renren{--fa:""}.fa-pagelines{--fa:""}.fa-stack-exchange{--fa:""}.fa-square-vimeo,.fa-vimeo-square{--fa:""}.fa-slack,.fa-slack-hash{--fa:""}.fa-wordpress{--fa:""}.fa-openid{--fa:""}.fa-yahoo{--fa:""}.fa-google{--fa:""}.fa-reddit{--fa:""}.fa-reddit-square,.fa-square-reddit{--fa:""}.fa-stumbleupon-circle{--fa:""}.fa-stumbleupon{--fa:""}.fa-delicious{--fa:""}.fa-digg{--fa:""}.fa-pied-piper-pp{--fa:""}.fa-pied-piper-alt{--fa:""}.fa-drupal{--fa:""}.fa-joomla{--fa:""}.fa-behance{--fa:""}.fa-behance-square,.fa-square-behance{--fa:""}.fa-steam{--fa:""}.fa-square-steam,.fa-steam-square{--fa:""}.fa-spotify{--fa:""}.fa-deviantart{--fa:""}.fa-soundcloud{--fa:""}.fa-vine{--fa:""}.fa-codepen{--fa:""}.fa-jsfiddle{--fa:""}.fa-rebel{--fa:""}.fa-empire{--fa:""}.fa-git-square,.fa-square-git{--fa:""}.fa-git{--fa:""}.fa-hacker-news{--fa:""}.fa-tencent-weibo{--fa:""}.fa-qq{--fa:""}.fa-weixin{--fa:""}.fa-slideshare{--fa:""}.fa-twitch{--fa:""}.fa-yelp{--fa:""}.fa-paypal{--fa:""}.fa-google-wallet{--fa:""}.fa-cc-visa{--fa:""}.fa-cc-mastercard{--fa:""}.fa-cc-discover{--fa:""}.fa-cc-amex{--fa:""}.fa-cc-paypal{--fa:""}.fa-cc-stripe{--fa:""}.fa-lastfm{--fa:""}.fa-lastfm-square,.fa-square-lastfm{--fa:""}.fa-ioxhost{--fa:""}.fa-angellist{--fa:""}.fa-buysellads{--fa:""}.fa-connectdevelop{--fa:""}.fa-dashcube{--fa:""}.fa-forumbee{--fa:""}.fa-leanpub{--fa:""}.fa-sellsy{--fa:""}.fa-shirtsinbulk{--fa:""}.fa-simplybuilt{--fa:""}.fa-skyatlas{--fa:""}.fa-pinterest-p{--fa:""}.fa-whatsapp{--fa:""}.fa-viacoin{--fa:""}.fa-medium,.fa-medium-m{--fa:""}.fa-y-combinator{--fa:""}.fa-optin-monster{--fa:""}.fa-opencart{--fa:""}.fa-expeditedssl{--fa:""}.fa-cc-jcb{--fa:""}.fa-cc-diners-club{--fa:""}.fa-creative-commons{--fa:""}.fa-gg{--fa:""}.fa-gg-circle{--fa:""}.fa-odnoklassniki{--fa:""}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:""}.fa-get-pocket{--fa:""}.fa-wikipedia-w{--fa:""}.fa-safari{--fa:""}.fa-chrome{--fa:""}.fa-firefox{--fa:""}.fa-opera{--fa:""}.fa-internet-explorer{--fa:""}.fa-contao{--fa:""}.fa-500px{--fa:""}.fa-amazon{--fa:""}.fa-houzz{--fa:""}.fa-vimeo-v{--fa:""}.fa-black-tie{--fa:""}.fa-fonticons{--fa:""}.fa-reddit-alien{--fa:""}.fa-edge{--fa:""}.fa-codiepie{--fa:""}.fa-modx{--fa:""}.fa-fort-awesome{--fa:""}.fa-usb{--fa:""}.fa-product-hunt{--fa:""}.fa-mixcloud{--fa:""}.fa-scribd{--fa:""}.fa-bluetooth{--fa:""}.fa-bluetooth-b{--fa:""}.fa-gitlab{--fa:""}.fa-wpbeginner{--fa:""}.fa-wpforms{--fa:""}.fa-envira{--fa:""}.fa-glide{--fa:""}.fa-glide-g{--fa:""}.fa-viadeo{--fa:""}.fa-square-viadeo,.fa-viadeo-square{--fa:""}.fa-snapchat,.fa-snapchat-ghost{--fa:""}.fa-snapchat-square,.fa-square-snapchat{--fa:""}.fa-pied-piper{--fa:""}.fa-first-order{--fa:""}.fa-yoast{--fa:""}.fa-themeisle{--fa:""}.fa-google-plus{--fa:""}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:""}.fa-linode{--fa:""}.fa-quora{--fa:""}.fa-free-code-camp{--fa:""}.fa-telegram,.fa-telegram-plane{--fa:""}.fa-bandcamp{--fa:""}.fa-grav{--fa:""}.fa-etsy{--fa:""}.fa-imdb{--fa:""}.fa-ravelry{--fa:""}.fa-sellcast{--fa:""}.fa-superpowers{--fa:""}.fa-wpexplorer{--fa:""}.fa-meetup{--fa:""}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:""}.fa-accessible-icon{--fa:""}.fa-accusoft{--fa:""}.fa-adversal{--fa:""}.fa-affiliatetheme{--fa:""}.fa-algolia{--fa:""}.fa-amilia{--fa:""}.fa-angrycreative{--fa:""}.fa-app-store{--fa:""}.fa-app-store-ios{--fa:""}.fa-apper{--fa:""}.fa-asymmetrik{--fa:""}.fa-audible{--fa:""}.fa-avianex{--fa:""}.fa-aws{--fa:""}.fa-bimobject{--fa:""}.fa-bitcoin{--fa:""}.fa-bity{--fa:""}.fa-blackberry{--fa:""}.fa-blogger{--fa:""}.fa-blogger-b{--fa:""}.fa-buromobelexperte{--fa:""}.fa-centercode{--fa:""}.fa-cloudscale{--fa:""}.fa-cloudsmith{--fa:""}.fa-cloudversify{--fa:""}.fa-cpanel{--fa:""}.fa-css3-alt{--fa:""}.fa-cuttlefish{--fa:""}.fa-d-and-d{--fa:""}.fa-deploydog{--fa:""}.fa-deskpro{--fa:""}.fa-digital-ocean{--fa:""}.fa-discord{--fa:""}.fa-discourse{--fa:""}.fa-dochub{--fa:""}.fa-docker{--fa:""}.fa-draft2digital{--fa:""}.fa-dribbble-square,.fa-square-dribbble{--fa:""}.fa-dyalog{--fa:""}.fa-earlybirds{--fa:""}.fa-erlang{--fa:""}.fa-facebook-f{--fa:""}.fa-facebook-messenger{--fa:""}.fa-firstdraft{--fa:""}.fa-fonticons-fi{--fa:""}.fa-fort-awesome-alt{--fa:""}.fa-freebsd{--fa:""}.fa-gitkraken{--fa:""}.fa-gofore{--fa:""}.fa-goodreads{--fa:""}.fa-goodreads-g{--fa:""}.fa-google-drive{--fa:""}.fa-google-play{--fa:""}.fa-gripfire{--fa:""}.fa-grunt{--fa:""}.fa-gulp{--fa:""}.fa-hacker-news-square,.fa-square-hacker-news{--fa:""}.fa-hire-a-helper{--fa:""}.fa-hotjar{--fa:""}.fa-hubspot{--fa:""}.fa-itunes{--fa:""}.fa-itunes-note{--fa:""}.fa-jenkins{--fa:""}.fa-joget{--fa:""}.fa-js{--fa:""}.fa-js-square,.fa-square-js{--fa:""}.fa-keycdn{--fa:""}.fa-kickstarter,.fa-square-kickstarter{--fa:""}.fa-kickstarter-k{--fa:""}.fa-laravel{--fa:""}.fa-line{--fa:""}.fa-lyft{--fa:""}.fa-magento{--fa:""}.fa-medapps{--fa:""}.fa-medrt{--fa:""}.fa-microsoft{--fa:""}.fa-mix{--fa:""}.fa-mizuni{--fa:""}.fa-monero{--fa:""}.fa-napster{--fa:""}.fa-node-js{--fa:""}.fa-npm{--fa:""}.fa-ns8{--fa:""}.fa-nutritionix{--fa:""}.fa-page4{--fa:""}.fa-palfed{--fa:""}.fa-patreon{--fa:""}.fa-periscope{--fa:""}.fa-phabricator{--fa:""}.fa-phoenix-framework{--fa:""}.fa-playstation{--fa:""}.fa-pushed{--fa:""}.fa-python{--fa:""}.fa-red-river{--fa:""}.fa-rendact,.fa-wpressr{--fa:""}.fa-replyd{--fa:""}.fa-resolving{--fa:""}.fa-rocketchat{--fa:""}.fa-rockrms{--fa:""}.fa-schlix{--fa:""}.fa-searchengin{--fa:""}.fa-servicestack{--fa:""}.fa-sistrix{--fa:""}.fa-speakap{--fa:""}.fa-staylinked{--fa:""}.fa-steam-symbol{--fa:""}.fa-sticker-mule{--fa:""}.fa-studiovinari{--fa:""}.fa-supple{--fa:""}.fa-uber{--fa:""}.fa-uikit{--fa:""}.fa-uniregistry{--fa:""}.fa-untappd{--fa:""}.fa-ussunnah{--fa:""}.fa-vaadin{--fa:""}.fa-viber{--fa:""}.fa-vimeo{--fa:""}.fa-vnv{--fa:""}.fa-square-whatsapp,.fa-whatsapp-square{--fa:""}.fa-whmcs{--fa:""}.fa-wordpress-simple{--fa:""}.fa-xbox{--fa:""}.fa-yandex{--fa:""}.fa-yandex-international{--fa:""}.fa-apple-pay{--fa:""}.fa-cc-apple-pay{--fa:""}.fa-fly{--fa:""}.fa-node{--fa:""}.fa-osi{--fa:""}.fa-react{--fa:""}.fa-autoprefixer{--fa:""}.fa-less{--fa:""}.fa-sass{--fa:""}.fa-vuejs{--fa:""}.fa-angular{--fa:""}.fa-aviato{--fa:""}.fa-ember{--fa:""}.fa-gitter{--fa:""}.fa-hooli{--fa:""}.fa-strava{--fa:""}.fa-stripe{--fa:""}.fa-stripe-s{--fa:""}.fa-typo3{--fa:""}.fa-amazon-pay{--fa:""}.fa-cc-amazon-pay{--fa:""}.fa-ethereum{--fa:""}.fa-korvue{--fa:""}.fa-elementor{--fa:""}.fa-square-youtube,.fa-youtube-square{--fa:""}.fa-flipboard{--fa:""}.fa-hips{--fa:""}.fa-php{--fa:""}.fa-quinscape{--fa:""}.fa-readme{--fa:""}.fa-java{--fa:""}.fa-pied-piper-hat{--fa:""}.fa-creative-commons-by{--fa:""}.fa-creative-commons-nc{--fa:""}.fa-creative-commons-nc-eu{--fa:""}.fa-creative-commons-nc-jp{--fa:""}.fa-creative-commons-nd{--fa:""}.fa-creative-commons-pd{--fa:""}.fa-creative-commons-pd-alt{--fa:""}.fa-creative-commons-remix{--fa:""}.fa-creative-commons-sa{--fa:""}.fa-creative-commons-sampling{--fa:""}.fa-creative-commons-sampling-plus{--fa:""}.fa-creative-commons-share{--fa:""}.fa-creative-commons-zero{--fa:""}.fa-ebay{--fa:""}.fa-keybase{--fa:""}.fa-mastodon{--fa:""}.fa-r-project{--fa:""}.fa-researchgate{--fa:""}.fa-teamspeak{--fa:""}.fa-first-order-alt{--fa:""}.fa-fulcrum{--fa:""}.fa-galactic-republic{--fa:""}.fa-galactic-senate{--fa:""}.fa-jedi-order{--fa:""}.fa-mandalorian{--fa:""}.fa-old-republic{--fa:""}.fa-phoenix-squadron{--fa:""}.fa-sith{--fa:""}.fa-trade-federation{--fa:""}.fa-wolf-pack-battalion{--fa:""}.fa-hornbill{--fa:""}.fa-mailchimp{--fa:""}.fa-megaport{--fa:""}.fa-nimblr{--fa:""}.fa-rev{--fa:""}.fa-shopware{--fa:""}.fa-squarespace{--fa:""}.fa-themeco{--fa:""}.fa-weebly{--fa:""}.fa-wix{--fa:""}.fa-ello{--fa:""}.fa-hackerrank{--fa:""}.fa-kaggle{--fa:""}.fa-markdown{--fa:""}.fa-neos{--fa:""}.fa-zhihu{--fa:""}.fa-alipay{--fa:""}.fa-the-red-yeti{--fa:""}.fa-critical-role{--fa:""}.fa-d-and-d-beyond{--fa:""}.fa-dev{--fa:""}.fa-fantasy-flight-games{--fa:""}.fa-wizards-of-the-coast{--fa:""}.fa-think-peaks{--fa:""}.fa-reacteurope{--fa:""}.fa-artstation{--fa:""}.fa-atlassian{--fa:""}.fa-canadian-maple-leaf{--fa:""}.fa-centos{--fa:""}.fa-confluence{--fa:""}.fa-dhl{--fa:""}.fa-diaspora{--fa:""}.fa-fedex{--fa:""}.fa-fedora{--fa:""}.fa-figma{--fa:""}.fa-intercom{--fa:""}.fa-invision{--fa:""}.fa-jira{--fa:""}.fa-mendeley{--fa:""}.fa-raspberry-pi{--fa:""}.fa-redhat{--fa:""}.fa-sketch{--fa:""}.fa-sourcetree{--fa:""}.fa-suse{--fa:""}.fa-ubuntu{--fa:""}.fa-ups{--fa:""}.fa-usps{--fa:""}.fa-yarn{--fa:""}.fa-airbnb{--fa:""}.fa-battle-net{--fa:""}.fa-bootstrap{--fa:""}.fa-buffer{--fa:""}.fa-chromecast{--fa:""}.fa-evernote{--fa:""}.fa-itch-io{--fa:""}.fa-salesforce{--fa:""}.fa-speaker-deck{--fa:""}.fa-symfony{--fa:""}.fa-waze{--fa:""}.fa-yammer{--fa:""}.fa-git-alt{--fa:""}.fa-stackpath{--fa:""}.fa-cotton-bureau{--fa:""}.fa-buy-n-large{--fa:""}.fa-mdb{--fa:""}.fa-orcid{--fa:""}.fa-swift{--fa:""}.fa-umbraco{--fa:""}:host,:root{--fa-font-regular:normal 400 1em/1 var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:400;font-display:block;src:url(/_frontend/assets/fa-regular-400-WLfxSHV3.woff2)}.far{--fa-family:var(--fa-family-classic)}.fa-regular,.far{--fa-style:400}:host,:root{--fa-family-classic:"Font Awesome 7 Free";--fa-font-solid:normal 900 1em/1 var(--fa-family-classic);--fa-style-family-classic:var(--fa-family-classic)}@font-face{font-family:"Font Awesome 7 Free";font-style:normal;font-weight:900;font-display:block;src:url(/_frontend/assets/fa-solid-900-Iz_TytpP.woff2)}.fas{--fa-style:900}.fa-classic,.fas{--fa-family:var(--fa-family-classic)}.fa-solid{--fa-style:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(/_frontend/assets/fa-brands-400-BK5CuonO.woff2)format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/_frontend/assets/fa-solid-900-Iz_TytpP.woff2)format("woff2")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/_frontend/assets/fa-regular-400-WLfxSHV3.woff2)format("woff2")}@font-face{font-family:FontAwesome;font-display:block;src:url(/_frontend/assets/fa-solid-900-Iz_TytpP.woff2)format("woff2")}@font-face{font-family:FontAwesome;font-display:block;src:url(/_frontend/assets/fa-brands-400-BK5CuonO.woff2)format("woff2")}@font-face{font-family:FontAwesome;font-display:block;src:url(/_frontend/assets/fa-regular-400-WLfxSHV3.woff2)format("woff2");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(/_frontend/assets/fa-v4compatibility-CMhGCN2W.woff2)format("woff2");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}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:#ffffffde;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#242424;font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;font-weight:400;line-height:1.5}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}a{color:#646cff;-webkit-text-decoration:inherit;text-decoration:inherit;font-weight:500}a:hover{color:#535bf2}body{place-items:center;min-width:320px;min-height:100vh;margin:0;display:flex}h1{font-size:3.2em;line-height:1.1}button{cursor:pointer;background-color:#1a1a1a;border:1px solid #0000;border-radius:8px;padding:.6em 1.2em;font-family:inherit;font-size:1em;font-weight:500;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme:light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}:root{--vitec-brand:38,53,140;--vitec-graphite:49,49,49;--vitec-digital-blue:6,108,255;--vitec-midnight:38,53,140;--vitec-orange:244,121,55;--vitec-orange-dark:217,100,31;--vitec-white:255,255,255;--vitec-black:0,0,0;--vitec-near-white:248,250,252;--vitec-body-text:31,41,55;--vitec-surface-dark:15,23,42;--vitec-navy-deep:30,58,138;--vitec-footer-bg:33,33,33;--vitec-muted-text:226,232,240;--vitec-graphite-mid:55,65,81;--vitec-graphite-light:107,114,128;--vitec-slate-400:148,163,184;--vitec-highlight:250,204,21;--vitec-mark-yellow:253,230,138;--radius-sm:4px;--radius-md:12px;--radius-lg:24px}.vitec-element{box-shadow:none;color:inherit;background-color:#0000;background-image:none;border:none;border-radius:0;margin-top:.5rem;margin-bottom:.5rem;padding:0;position:relative}.vitec-element--full-width{width:100vw;margin-left:calc(50% - 50vw)}.vitec-content-box{box-sizing:border-box;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:24px;padding-right:24px}@media (max-width:600px){.vitec-content-box{padding-left:16px;padding-right:16px}}.vitec-element__stack{flex-direction:column;display:flex}.vitec-space-before--extra-small{margin-top:.5rem}.vitec-space-before--small{margin-top:1rem}.vitec-space-before--medium{margin-top:2.5rem}.vitec-space-before--large{margin-top:4rem}.vitec-space-before--extra-large{margin-top:6rem}.vitec-space-after--extra-small{margin-bottom:.5rem}.vitec-space-after--small{margin-bottom:1rem}.vitec-space-after--medium{margin-bottom:2.5rem}.vitec-space-after--large{margin-bottom:4rem}.vitec-space-after--extra-large{margin-bottom:6rem}.vitec-frame-ruler-before{border-top:1px solid #94a3b866;margin-top:1rem;padding-top:1.5rem}.vitec-frame-ruler-after{border-bottom:1px solid #94a3b866;margin-bottom:1rem;padding-bottom:1.5rem}.vitec-frame-indent{padding-left:2rem;padding-right:2rem}.vitec-frame-indent-left{margin-left:33%}.vitec-frame-indent-right{margin-right:33%}.vitec-frame-none{display:none}.vitec-card{background:#f8fafc;border:1px solid #94a3b840;border-radius:.75rem;padding:1.5rem;box-shadow:0 .125rem .75rem #00000014}.vitec-dark{color:#f8fafc;background:#0f172a;border-radius:.75rem;padding:2rem}.vitec-dark p,.vitec-dark h1,.vitec-dark h2,.vitec-dark h3,.vitec-dark h4,.vitec-dark h5,.vitec-dark h6,.vitec-dark .MuiTypography-root{color:inherit}.vitec-highlight{background:#26358c0d;border-left:3px solid #26358c;border-radius:0 .5rem .5rem 0;padding:1.25rem 1.5rem}.vitec_herosection__inner--sm>*{min-height:320px}.vitec_herosection__inner--md>*{min-height:600px}.vitec_herosection__inner--fullscreen>*{min-height:100svh}.vitec_herosection__box{border-radius:1.5rem;flex-direction:column;align-items:center;padding:1.5rem 2.5rem;display:flex;overflow:hidden}@media (min-width:900px){.vitec_herosection__box{padding:2rem 3rem}}.vitec_herosection__grid{width:100%}@media (min-width:900px){.vitec_herosection__text-col--order-last{order:2}}.vitec_herosection__content-stack{max-width:42.5rem}.vitec_herosection__content-stack--side{max-width:100%}.vitec_herosection__content-stack--centered{text-align:center;align-items:center;max-width:100%;margin-left:auto;margin-right:auto}.vitec_herosection__eyebrow{opacity:.8;letter-spacing:.14em!important}.vitec_herosection__subheader{opacity:.85;font-weight:500!important}.vitec_herosection__bodytext{line-height:1.6}.vitec_herosection__bodytext p{margin:0 0 1rem}.vitec_herosection__bodytext p:last-of-type{margin-bottom:0}.vitec_herosection__bodytext a{color:inherit}.vitec_herosection__bodytext mark{background-color:rgba(var(--vitec-highlight),.85);padding:0 .2rem}@media (min-width:900px){.vitec_herosection__media-col--order-first{order:1}}.vitec_herosection__stacked-media{max-width:100%;margin-top:1.5rem}.vitec_herosection__stacked-media--center{max-width:45rem;margin-left:auto;margin-right:auto}.vitec_herosection__logo-wall-placeholder{border:1px dashed rgba(var(--vitec-white),.35);opacity:.85;border-radius:1rem;width:fit-content;margin-top:.5rem;padding:.75rem 1.25rem}#header.header--with-hero{min-height:0;box-shadow:none;background:0 0;justify-content:flex-start;gap:0;padding:0;position:relative;overflow:hidden}#header.header--with-hero .header-inner{padding:1.65rem 1.75rem 0;position:absolute;inset:0 0 auto}.header-hero{color:#f8fafc;background:#0f172a;width:100%;min-height:620px;margin-left:0;position:relative;top:0;overflow:hidden}.header-hero-media,.header-hero-overlay{position:absolute;left:0;right:0}.header-hero-overlay{top:0;bottom:0}.header-hero-media{opacity:.45;will-change:transform;background-position:50%;background-repeat:no-repeat;background-size:cover;top:-20%;bottom:-20%}.header-hero-media--video{object-fit:cover;object-position:center;background:0 0;width:100%;height:100%;display:block;top:0;bottom:0}.header-hero-overlay{background:linear-gradient(170deg,#313131 50%,#26358c80 100%)}.header-hero-content{z-index:1;align-items:center;min-height:620px;padding-top:9.5rem;padding-bottom:4rem;display:flex;position:relative}.header-hero-heading{letter-spacing:-.01em;color:inherit;font-weight:300;line-height:1.2;margin:3rem 0 0!important}h1.header-hero-heading{font-size:clamp(2.5rem,5.5vw,3.5rem)}h2.header-hero-heading{font-size:clamp(2rem,4.5vw,3rem)}h3.header-hero-heading{font-size:clamp(1.5rem,3.5vw,2.5rem)}h4.header-hero-heading{font-size:clamp(1.25rem,2.5vw,1.875rem);font-weight:400}h5.header-hero-heading{font-size:clamp(1.1rem,2vw,1.5rem);font-weight:400}h6.header-hero-heading{font-size:clamp(1rem,1.5vw,1.25rem);font-weight:500}.header-hero-subheader{opacity:.88;letter-spacing:.01em;margin-top:.4em;font-size:clamp(1rem,1.5vw,1.25rem);font-weight:500;line-height:1.4;display:block}.header-hero-fallback{text-align:center;flex-direction:column;align-items:center;gap:.5rem;width:100%;display:flex}.header-hero-fallback h1.header-hero-heading,.header-hero-fallback h2.header-hero-heading,.header-hero-fallback h3.header-hero-heading{font-size:clamp(1.5rem,3vw,2.25rem);font-weight:300}.header-hero-stack{z-index:1;max-width:47.5rem;position:relative}.header-hero-stack--full{max-width:100%}.header-hero-stack--centered{text-align:center;align-items:center;max-width:100%;margin-left:auto;margin-right:auto}.header-hero-stack--right{text-align:right;align-items:flex-end;margin-left:auto}.header-hero-stacked-media{max-width:100%;margin-top:1.5rem}.header-hero-stacked-media--center{max-width:45rem;margin-left:auto;margin-right:auto}.header-hero-subtitle{opacity:.72;max-width:48rem;margin:0;font-size:clamp(.9rem,1.5vw,1.125rem);font-weight:400;line-height:1.5}.header-hero-eyebrow{margin-top:0;margin-bottom:-1rem;display:inline-block}.header-hero-copy{line-height:1.6}.header-hero-copy p{margin:0 0 1rem}.header-hero-copy p:last-of-type{margin-bottom:0}.header-hero-copy a{color:inherit}.header-hero-copy mark{color:inherit;background:#facc15d9;padding:0 .2rem}.header-hero-image-sr{clip:rect(0,0,0,0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}#header.header--hero-sm .header-hero{min-height:300px}#header.header--hero-sm .header-hero-content{min-height:300px;padding-top:7rem;padding-bottom:3rem}#header.header--hero-md .header-hero{min-height:600px}#header.header--hero-md .header-hero-content{min-height:600px;padding:10rem 0}#header.header--hero-fullscreen .header-hero{min-height:100svh}#header.header--hero-fullscreen .header-hero-content{min-height:100svh;padding-top:7rem}#header.header--hero-fullscreen .header-hero-content h1{font-size:clamp(3rem,6vw,4.5rem)}#header.header--hero-xs{background:#26358c;min-height:0;padding:1.5rem 1.75rem}.vitec_productlist__inner{padding:2rem 0}.vitec_productlist__heading{flex-direction:column;gap:.5rem;margin-bottom:2.5rem;display:flex}.vitec_productlist__toolbar{flex-wrap:wrap;align-items:center;gap:1rem;margin-bottom:.875rem;display:flex}.vitec_productlist__filters{flex-wrap:wrap;gap:.5rem;margin-bottom:1.75rem;display:flex}.vitec_productlist__section{margin-bottom:3rem}.vitec_productlist__section:last-child{margin-bottom:0}.vitec_productlist__section-heading{letter-spacing:-.01em;color:#1f2937;border-bottom:2px solid #26358c1f;align-items:center;gap:.625rem;margin:0 0 1.25rem;padding-bottom:.75rem;font-size:1.125rem;font-weight:700;display:flex}.vitec_productlist__section-heading:before{content:"";background:#26358c;border-radius:2px;flex-shrink:0;width:3px;height:1.125em;display:inline-block}.vitec_productlist__grid{grid-template-columns:1fr;gap:1.5rem;margin:0;padding:0;list-style:none;display:grid}@media (min-width:640px){.vitec_productlist__grid{grid-template-columns:repeat(2,1fr)}}@media (min-width:1024px){.vitec_productlist__grid{grid-template-columns:repeat(3,1fr)}}@media (min-width:1200px){.vitec_productlist__grid{gap:2rem}}.vitec_productlist__card{background:#fff;border-radius:12px;transition:box-shadow .22s,transform .22s;overflow:hidden;box-shadow:0 1px 3px #0000000f,0 4px 16px #0000000f}.vitec_productlist__card:has(.vitec_productlist__card-link:hover:not(.vitec_productlist__card-link--static)){transform:translateY(-3px);box-shadow:0 4px 12px #0000001a,0 16px 40px #0000001a}.vitec_productlist__card-link{height:100%;color:inherit;flex-direction:column;text-decoration:none;display:flex}.vitec_productlist__card-link--static{cursor:default}.vitec_productlist__media{aspect-ratio:16/5.5;background:#fff;flex-shrink:0;overflow:hidden}.vitec_productlist__image{object-fit:cover;object-position:center;width:100%;height:100%;transition:transform .35s;display:block}.vitec_productlist__card-link:hover:not(.vitec_productlist__card-link--static) .vitec_productlist__image{transform:scale(1.03)}.vitec_productlist__placeholder{background:linear-gradient(to bottom right,#313131 0%,#313131e6 100%);justify-content:center;align-items:center;width:100%;height:100%;display:flex}.vitec_productlist__placeholder-icon{width:auto;height:65%}.vitec_productlist__body{border-top:1px solid #0000000f;flex-direction:column;flex:1;gap:.5rem;padding:1.5rem 1.75rem;display:flex}.vitec_productlist__tags{flex-wrap:wrap;gap:.375rem;margin-bottom:.25rem;display:flex}.vitec_productlist__tag{letter-spacing:.07em;text-transform:uppercase;color:#313131;background:#31313114;border-radius:100px;padding:.2rem .65rem;font-size:.6875rem;font-weight:600;line-height:1.4;display:inline-block}.vitec_productlist__title{color:#1f2937;letter-spacing:-.01em;margin:0;font-size:1.125rem;font-weight:700;line-height:1.3}.vitec_productlist__subtitle{color:#374151;margin:0;font-size:.9375rem;font-weight:500;line-height:1.45}.vitec_productlist__teaser{color:#6b7280;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:.875rem;line-height:1.6;display:-webkit-box;overflow:hidden}.vitec_productlist__cta{color:#313131;align-items:center;gap:.35rem;margin-top:auto;padding-top:.875rem;font-size:.875rem;font-weight:600;transition:gap .2s;display:inline-flex}.vitec_productlist__card-link:hover:not(.vitec_productlist__card-link--static) .vitec_productlist__cta{gap:.6rem}.vitec_productlist__cta-arrow{font-size:1.05em;display:inline-block}.vitec_productshow__eyebrow,.vitec_solutionshow__eyebrow{letter-spacing:.04em;color:#6b7280cc;font-size:.75rem;font-weight:600;display:block}.vitec_productshow__title,.vitec_solutionshow__title{letter-spacing:-.02em!important;color:#1f2937!important;margin:0!important;font-size:clamp(1.625rem,3.5vw,2.25rem)!important;font-weight:700!important;line-height:1.15!important}.vitec_productshow__subtitle,.vitec_solutionshow__subtitle{color:#6b7280!important;margin:0!important;font-size:clamp(.9375rem,2vw,1.0625rem)!important;font-weight:400!important;line-height:1.5!important}.vitec_productshow__teaser,.vitec_solutionshow__teaser{color:#6b7280d9!important;margin:0!important;font-size:.9375rem!important;line-height:1.65!important}.vitec_productshow__section-label,.vitec_solutionshow__section-label{letter-spacing:.01em;color:#374151a6;margin-bottom:.875rem;font-size:.75rem;font-weight:700}.vitec_productshow__gallery,.vitec_solutionshow__gallery{width:100%}.vitec_productshow__gallery-header,.vitec_solutionshow__gallery-header{justify-content:flex-end;align-items:center;margin-bottom:.75rem;display:flex}.vitec_productshow__gallery-arrows,.vitec_solutionshow__gallery-arrows{gap:.5rem;display:flex}.vitec_productshow__gallery-arrow,.vitec_solutionshow__gallery-arrow{color:#374151;cursor:pointer;background:#fff;border:1px solid #94a3b880;border-radius:50%;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;padding:0;transition:background .18s,border-color .18s,transform .15s;display:inline-flex}.vitec_productshow__gallery-arrow:hover:not(:disabled),.vitec_solutionshow__gallery-arrow:hover:not(:disabled){background:#3741510f;border-color:#37415166}.vitec_productshow__gallery-arrow:active:not(:disabled),.vitec_solutionshow__gallery-arrow:active:not(:disabled){transform:scale(.93)}.vitec_productshow__gallery-arrow:disabled,.vitec_solutionshow__gallery-arrow:disabled{opacity:.35;cursor:default}.vitec_productshow__gallery-track,.vitec_solutionshow__gallery-track{scroll-snap-type:x mandatory;scrollbar-width:none;-webkit-overflow-scrolling:touch;cursor:grab;display:flex;overflow-x:auto}.vitec_productshow__gallery-track::-webkit-scrollbar{display:none}.vitec_solutionshow__gallery-track::-webkit-scrollbar{display:none}.vitec_productshow__gallery-slide,.vitec_solutionshow__gallery-slide{scroll-snap-align:start;background:0 0;flex:0 0 100%}.vitec_productshow__gallery-slide img,.vitec_solutionshow__gallery-slide img{width:100%;height:auto;display:block}.vitec_productshow__gallery-reflect,.vitec_solutionshow__gallery-reflect{height:3.5rem;display:none;overflow:hidden}.vitec_productshow__gallery-reflect img,.vitec_solutionshow__gallery-reflect img{opacity:.55;width:100%;height:auto;display:block;transform:scaleY(-1);-webkit-mask-image:linear-gradient(#00000080 0%,#0000 100%);mask-image:linear-gradient(#00000080 0%,#0000 100%)}.vitec_productshow__gallery-dots,.vitec_solutionshow__gallery-dots{justify-content:center;gap:.5rem;margin-top:.875rem;display:flex}.vitec_productshow__gallery-dot,.vitec_solutionshow__gallery-dot{cursor:pointer;background:#94a3b880;border:none;border-radius:50%;width:.5rem;height:.5rem;padding:0;transition:background .2s,width .2s,border-radius .2s}.vitec_productshow__gallery-dot--active,.vitec_solutionshow__gallery-dot--active{background:#374151;border-radius:.25rem;width:1.25rem}.vitec_productshow__gallery-dot:hover:not(.vitec_productshow__gallery-dot--active,.vitec_solutionshow__gallery-dot--active),.vitec_solutionshow__gallery-dot:hover:not(.vitec_productshow__gallery-dot--active,.vitec_solutionshow__gallery-dot--active){background:#94a3b8}.vitec_productshow__video,.vitec_solutionshow__video{aspect-ratio:16/9;background:#3741510f;border-radius:.5rem;width:100%;overflow:hidden}.vitec_productshow__video iframe,.vitec_solutionshow__video iframe{border:none;width:100%;height:100%;display:block}.vitec_productshow__highlights,.vitec_solutionshow__highlights{background:#3741511a;border:1px solid #94a3b82e;border-radius:.75rem;padding:1.5rem 1.625rem}.vitec_productshow__highlights-list ul,.vitec_solutionshow__highlights-list ul{flex-direction:column;gap:.625rem;margin:0;padding:0;list-style:none;display:flex}.vitec_productshow__highlights-list li,.vitec_solutionshow__highlights-list li{color:#1f2937e6;padding-left:1.75rem;font-size:.9rem;line-height:1.5;position:relative}.vitec_productshow__highlights-list li:before,.vitec_solutionshow__highlights-list li:before{content:"✓";color:#fff;text-align:center;background:#374151;border-radius:.25rem;width:1.25rem;height:1.25rem;font-size:.6875rem;font-weight:700;line-height:1.25rem;position:absolute;top:.05em;left:0}.vitec_productshow__section,.vitec_solutionshow__section{border-top:1px solid #94a3b833;margin-top:2.5rem;padding-top:2rem}.vitec_productshow__applications,.vitec_solutionshow__applications{background:#3741511a;border:1px solid #94a3b82e;border-radius:.75rem;padding:1.5rem 1.625rem}.vitec_productshow__applications-list ul,.vitec_solutionshow__applications-list ul{flex-direction:column;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.vitec_productshow__applications-list li,.vitec_solutionshow__applications-list li{color:#374151e6;padding-left:1rem;font-size:.875rem;line-height:1.5;position:relative}.vitec_productshow__applications-list li:before,.vitec_solutionshow__applications-list li:before{content:"·";color:#6b7280cc;font-weight:700;position:absolute;left:0}.vitec_productshow__download-item,.vitec_solutionshow__download-item{color:#1f2937e6;border:1px solid #94a3b838;border-radius:.5rem;align-items:center;gap:.75rem;padding:.75rem 1rem;transition:background .15s,border-color .15s;display:flex;text-decoration:none!important}.vitec_productshow__download-item:hover,.vitec_solutionshow__download-item:hover{background:#3741510a;border-color:#37415147}.vitec_productshow__download-ext,.vitec_solutionshow__download-ext{letter-spacing:.05em;text-transform:uppercase;color:#374151d9;background:#3741511a;border-radius:.25rem;flex-shrink:0;padding:.2rem .4rem;font-size:.5625rem;font-weight:800;line-height:1}.vitec_productshow__download-title,.vitec_solutionshow__download-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:.875rem;line-height:1.4;overflow:hidden}.vitec_productshow__download-icon,.vitec_solutionshow__download-icon{color:#6b728099;flex-shrink:0;font-size:.875rem}.vitec_productshow__related-card,.vitec_solutionshow__related-card{color:#1f2937e6;border:1px solid #94a3b838;border-radius:.75rem;flex-direction:column;height:100%;transition:box-shadow .18s,border-color .18s;display:flex;overflow:hidden;text-decoration:none!important}.vitec_productshow__related-card:hover,.vitec_solutionshow__related-card:hover{border-color:#37415159;box-shadow:0 4px 16px #3741511f}.vitec_productshow__related-img,.vitec_solutionshow__related-img{background:#3741510a;width:100%;overflow:hidden}.vitec_productshow__related-img img,.vitec_solutionshow__related-img img{width:100%;height:auto;transition:transform .25s;display:block}.vitec_productshow__related-card:hover .vitec_productshow__related-img img,.vitec_productshow__related-card:hover .vitec_solutionshow__related-img img,.vitec_solutionshow__related-card:hover .vitec_productshow__related-img img,.vitec_solutionshow__related-card:hover .vitec_solutionshow__related-img img{transform:scale(1.04)}.vitec_productshow__related-body,.vitec_solutionshow__related-body{flex:1;padding:.875rem 1.125rem}.vitec_productshow__related-title,.vitec_solutionshow__related-title{color:#374151;font-weight:600;line-height:1.35;margin:0 0 .2rem!important;font-size:.875rem!important}.vitec_productshow__related-subtitle,.vitec_solutionshow__related-subtitle{color:#6b7280e6;line-height:1.4;margin:0!important;font-size:.8125rem!important}.vitec_card__link-wrap{color:inherit;text-decoration:none;display:block}.vitec_card__inner{color:#1f2937;background:#fff;border-radius:.75rem;flex-direction:column;height:100%;transition:box-shadow .2s,transform .2s;display:flex;overflow:hidden}.vitec_card__inner--shadow-soft{box-shadow:0 1px 4px #00000012,0 2px 10px #0000000f}.vitec_card__inner--shadow-medium{box-shadow:0 2px 8px #00000017,0 4px 16px #00000014}.vitec_card__inner--shadow-strong{box-shadow:0 4px 14px #0000001f,0 8px 28px #0000001a}.vitec_card__inner:hover,.vitec_card__link-wrap:hover .vitec_card__inner{transform:translateY(-2px)}.vitec_card__inner:hover.vitec_card__inner--shadow-soft,.vitec_card__link-wrap:hover .vitec_card__inner.vitec_card__inner--shadow-soft{box-shadow:0 4px 12px #0000001a,0 6px 18px #00000014}.vitec_card__inner:hover.vitec_card__inner--shadow-medium,.vitec_card__link-wrap:hover .vitec_card__inner.vitec_card__inner--shadow-medium{box-shadow:0 6px 18px #00000021,0 8px 24px #0000001a}.vitec_card__inner:hover.vitec_card__inner--shadow-strong,.vitec_card__link-wrap:hover .vitec_card__inner.vitec_card__inner--shadow-strong{box-shadow:0 8px 24px #00000026,0 14px 36px #0000001f}.vitec_card__inner--border-soft{border:1px solid #6b728066}.vitec_card__inner--border-hard{border:2px solid #374151cc}.vitec_card__inner--border-dashed{border:2px dashed #37415180}.vitec_card__inner--dark-bg .vitec_card__subheader{color:#ffffffb3}.vitec_card__inner--dark-bg .vitec_card__text{color:#ffffffd9}.vitec_card__inner--dark-bg .vitec_card__eyebrow{color:#fff9;opacity:1}.vitec_card__inner--dark-bg.vitec_card__inner--border-soft{border-color:#fff3}.vitec_card__inner--dark-bg.vitec_card__inner--border-hard{border-color:#ffffffa6}.vitec_card__inner--dark-bg.vitec_card__inner--border-dashed{border-color:#fff6}.vitec_card__inner--centered{text-align:center;align-items:center}.vitec_card__inner--feature .vitec_card__body{padding:1.75rem}.vitec_card__inner--feature .vitec_card__header{font-size:1.35rem}.vitec_card__inner--compact{border-radius:.5rem}.vitec_card__inner--compact .vitec_card__body{gap:.25rem;padding:.75rem}.vitec_card__inner--compact .vitec_card__header{font-size:.95rem}.vitec_card__inner--image_overlay{justify-content:flex-end;min-height:280px;position:relative}.vitec_card__inner--image_overlay:before{content:"";border-radius:inherit;pointer-events:none;background:linear-gradient(#0000 35%,#000c 100%);position:absolute;inset:0}.vitec_card__inner--image_overlay .vitec_card__body{z-index:1;background:0 0;flex:none;position:relative}.vitec_card__inner--image_overlay .vitec_card__header{color:#fff}.vitec_card__inner--image_overlay .vitec_card__subheader{color:#ffffffd9}.vitec_card__inner--image_overlay .vitec_card__text{color:#ffffffe6}.vitec_card__inner--image_overlay .vitec_card__eyebrow{color:#ffffffbf;opacity:1}.vitec_card__media{flex-shrink:0;width:100%;overflow:hidden}.vitec_card__media--1_1{aspect-ratio:1}.vitec_card__media--4_3{aspect-ratio:4/3}.vitec_card__media--16_9{aspect-ratio:16/9}.vitec_card__media--3_4{aspect-ratio:3/4}.vitec_card__media--1_1 .vitec_card__image,.vitec_card__media--4_3 .vitec_card__image,.vitec_card__media--16_9 .vitec_card__image,.vitec_card__media--3_4 .vitec_card__image{object-fit:cover;height:100%}.vitec_card__image{width:100%;height:auto;display:block}.vitec_card__body{flex-direction:column;flex:1;gap:.5rem;padding:1.25rem;display:flex}.vitec_card__eyebrow{opacity:.65;letter-spacing:.1em;font-size:.75rem}.vitec_card__header{color:#1f2937;font-size:1.05rem;font-weight:600;line-height:1.3}.vitec_card__subheader{color:#6b7280;font-size:.8125rem}.vitec_card__text{color:#374151;flex:1;font-size:.875rem;line-height:1.55}.vitec_card__text p:first-of-type{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.vitec_card__text p+p{display:none}.vitec_card__footer{margin-top:auto;padding-top:.75rem}.vitec_video__poster{cursor:pointer;border-radius:.5rem;position:relative;overflow:hidden}.vitec_video__poster img{width:100%;height:auto;display:block}.vitec_video__poster:hover .vitec_video__play-btn{transform:scale(1.1)}.vitec_video__play-btn{justify-content:center;align-items:center;transition:transform .15s;display:flex;position:absolute;inset:0}.vitec_usecaseshow__hero{align-items:flex-end;width:100vw;min-height:320px;margin-left:calc(50% - 50vw);display:flex;position:relative;overflow:hidden}.vitec_usecaseshow__hero--sm{min-height:320px}.vitec_usecaseshow__hero--md{min-height:600px}.vitec_usecaseshow__hero--fullscreen{min-height:100svh}.vitec_usecaseshow__hero--light{color:#fff}.vitec_usecaseshow__hero--dark{color:#1a1a2e}.vitec_usecaseshow__hero-bg{object-fit:cover;object-position:center;z-index:0;width:100%;height:100%;position:absolute;inset:0}.vitec_usecaseshow__hero-overlay{z-index:1;position:absolute;inset:0}.vitec_usecaseshow__hero-content{z-index:2;flex-direction:column;gap:.75rem;width:100%;max-width:1280px;margin:0 auto;padding:5rem 1.5rem 3rem;display:flex;position:relative}@media (min-width:600px){.vitec_usecaseshow__hero-content{padding:6rem 2rem 3.5rem}}@media (min-width:900px){.vitec_usecaseshow__hero-content{padding:8rem 3rem 4rem}}.vitec_usecaseshow__logo-wrap{-webkit-backdrop-filter:blur(8px);background:#ffffff26;border-radius:.5rem;align-items:center;width:fit-content;margin-bottom:.5rem;padding:.5rem .875rem;display:inline-flex}.vitec_usecaseshow__logo{object-fit:contain;width:auto;height:36px;display:block}@media (min-width:600px){.vitec_usecaseshow__logo{height:44px}}.vitec_usecaseshow__markets{flex-wrap:wrap;gap:.375rem;display:flex}.vitec_usecaseshow__market-chip{letter-spacing:.08em;text-transform:uppercase;color:inherit;-webkit-backdrop-filter:blur(6px);background:#ffffff1f;border:1px solid #ffffff73;border-radius:999px;padding:.25rem .625rem;font-size:.6875rem;font-weight:600;display:inline-block}.vitec_usecaseshow__hero-title{color:inherit;text-wrap:balance;margin:0;font-size:clamp(1.75rem,4vw,3rem);font-weight:700;line-height:1.15}.vitec_usecaseshow__hero-subtitle{color:inherit;opacity:.88;max-width:52rem;margin:0;font-size:clamp(.9375rem,1.5vw,1.125rem);font-weight:400;line-height:1.55}.vitec_usecaseshow__teaser{max-width:48rem;padding:2.5rem 0 .5rem}.vitec_usecaseshow__teaser-text{color:rgba(var(--vitec-brand),1);margin:0;font-size:clamp(1.0625rem,1.75vw,1.25rem);font-style:italic;font-weight:500;line-height:1.55}.vitec_usecaseshow__body{flex-direction:column;gap:1.5rem;padding-top:1.5rem;display:flex}.vitec_container__content{padding-top:3rem;padding-bottom:3.5rem}#footer{color:#f8fafc;background:#212121;margin-top:5rem;padding:5rem 0}#footer p,#footer li,#footer span,#footer a:not(.vitec-btn),#footer .MuiTypography-root{color:inherit}#footer a:not(.vitec-btn){text-decoration:none}#footer a:not(.vitec-btn):hover{text-decoration:underline}#footer .vitec-btn--outlined{color:#f8fafc;border-color:#f8fafc80}#footer .vitec-btn--outlined:hover{background-color:#ffffff1a;border-color:#f8fafcd9}#footer .vitec-btn--link{color:#f8fafcd9}#footer .vitec-btn--link:hover{color:#f8fafc}#footer .vitec-btn--primary{color:#0f172a;background-color:#f8fafc}#footer .vitec-btn--primary:hover{background-color:#fff;box-shadow:0 4px 12px #0003}#footer>.vitec-element{max-width:1680px;margin-left:auto;margin-right:auto}#footer h2{color:#fff;max-width:650px;margin:0 auto 2rem;font-size:50px;font-weight:700}#footer h2+h3{font-size:22px;font-weight:400}#footer h4{color:var(--vtorange);text-transform:uppercase;font-size:18px;font-weight:300}#footer ul{padding-left:0;padding-right:1rem;list-style:none}#footer ul li{break-inside:avoid;width:100%;display:inline-block}#footer ul li a{color:#fff;font-size:14px;font-weight:400;line-height:1.5rem;text-decoration:none;transition:all .2s;display:block}#footer ul li ul li a{color:#ffffff80!important}#footer ul li ul li ul li a{color:#ffffff40!important}#footer ul#footer-products-nav{columns:2}.vitec-btn{border-radius:var(--radius-md);letter-spacing:.03em;cursor:pointer;border:none;justify-content:center;align-items:center;gap:.5rem;padding:.6rem 1.4rem;font-family:inherit;font-size:.9375rem;font-weight:600;text-decoration:none;transition:background-color .2s,color .25s,box-shadow .2s,transform .1s;display:inline-flex}.vitec-btn:active{transform:translateY(1px)}.vitec-btn--primary{color:#f8fafc;background-color:#26358c}.vitec-btn--primary:hover{background-color:#1e3a8a;box-shadow:0 4px 12px #26358c59}.vitec-btn--orange{color:#fff;background-color:#f47937}.vitec-btn--orange:hover{color:#ffffffbf;background-color:#d9641f;box-shadow:0 4px 12px #f4793759}.vitec-btn--outlined{color:#26358c;background-color:#0000;border:2px solid #26358c}.vitec-btn--outlined:hover{background-color:#26358c0f}.vitec-btn--light{color:#0f172a;background-color:#f8fafc}.vitec-btn--light:hover{background-color:#fff;box-shadow:0 4px 12px #00000026}.vitec-btn--ghost{color:#f8fafc;background-color:#0000;border:1px solid #f8fafc66}.vitec-btn--ghost:hover{background-color:#ffffff1a;border-color:#f8fafcb3}.vitec-btn--graphite{color:#f8fafc;background-color:#313131}.vitec-btn--graphite:hover{background-color:#374151}.vitec-btn--midnight{color:#f8fafc;background-color:#26358c}.vitec-btn--midnight:hover{background-color:#1e3a8a}.vitec-btn--dark{color:#f8fafc;background-color:#0f172a}.vitec-btn--dark:hover{background-color:#1e3a8a}.vitec-btn--link{color:#26358c;text-underline-offset:.2em;background-color:#0000;padding-left:0;padding-right:0;font-weight:500;text-decoration:underline}.vitec-btn--link:hover{color:#1e3a8a;text-decoration:none}.vitec-btn--sm{border-radius:var(--radius-sm);padding:.35rem .9rem;font-size:.8125rem}.vitec-btn--sm.vitec-btn--link{padding-left:0;padding-right:0}.vitec-btn--lg{border-radius:var(--radius-lg);padding:.8rem 2rem;font-size:1.0625rem}.vitec-btn--align-start{align-self:flex-start}.btn-vitec{border-radius:var(--radius-md);letter-spacing:.03em;cursor:pointer;justify-content:center;align-items:center;gap:.5rem;padding:.6rem 1.4rem;font-family:inherit;font-size:.9375rem;font-weight:600;transition:background-color .2s,color .25s,box-shadow .2s,transform .1s;display:inline-flex;text-decoration:none!important}.btn-vitec:active{transform:translateY(1px)}.btn-vitec--primary,.btn-vitec--blue{background-color:#26358c;color:#f8fafc!important}.btn-vitec--primary:hover,.btn-vitec--blue:hover{background-color:#1e3a8a;box-shadow:0 4px 12px #26358c59}.btn-vitec--orange{background-color:#f47937;color:#fff!important}.btn-vitec--orange:hover{background-color:#d9641f;box-shadow:0 4px 12px #f4793759}.btn-vitec--light{background-color:#f8fafc;color:#0f172a!important}.btn-vitec--light:hover{background-color:#fff;box-shadow:0 4px 12px #00000026}.btn-vitec--outline-blue,.btn-vitec--outlined{background-color:#0000;border:2px solid #26358c;color:#26358c!important}.btn-vitec--outline-blue:hover,.btn-vitec--outlined:hover{background-color:#26358c0f}.btn-vitec--ghost{background-color:#0000;border:1px solid #f8fafc66;color:#f8fafc!important}.btn-vitec--ghost:hover{background-color:#ffffff1a;border-color:#f8fafcb3}.btn-vitec--graphite{background-color:#313131;color:#f8fafc!important}.btn-vitec--graphite:hover{background-color:#374151}.btn-vitec--dark{background-color:#0f172a;color:#f8fafc!important}.btn-vitec--dark:hover{background-color:#1e3a8a}#footer .btn-vitec--outline-blue,#footer .btn-vitec--outlined{border-color:#f8fafc80;color:#f8fafc!important}#footer .btn-vitec--outline-blue:hover,#footer .btn-vitec--outlined:hover{background-color:#ffffff1a;border-color:#f8fafcd9}#footer .btn-vitec--primary,#footer .btn-vitec--blue{background-color:#f8fafc;color:#0f172a!important}#footer .btn-vitec--primary:hover,#footer .btn-vitec--blue:hover{background-color:#fff}.vitec_faq__inner{width:100%}.vitec_faq__items{border-top:1px solid #94a3b840}.vitec_faq__item{border-bottom:1px solid #94a3b840}.vitec_faq__item:before{display:none}.vitec_faq__item.Mui-expanded{margin:0}.vitec_faq__question{align-items:center;gap:1.25rem;min-height:unset!important;outline:none!important;padding:1.375rem 0!important}.vitec_faq__question:focus-visible{outline:none!important}.vitec_faq__question .MuiAccordionSummary-content,.vitec_faq__question .MuiAccordionSummary-content.Mui-expanded{margin:0}.vitec_faq__question .MuiAccordionSummary-expandIconWrapper{color:#6b7280;transition:transform .25s}.vitec_faq__question .MuiAccordionSummary-expandIconWrapper.Mui-expanded{color:#374151;transform:rotate(180deg)}.vitec_faq__question-text{color:#1f2937;font-weight:500;transition:color .22s}.Mui-expanded .vitec_faq__question-text{color:#374151;font-weight:600}.vitec_faq__answer{color:#374151;font-size:.9375rem;line-height:1.7;padding:0 0 1.5rem!important}.vitec-bg-midnight .vitec_faq__items,.vitec-bg-graphite .vitec_faq__items,.vitec-bg-blue .vitec_faq__items{border-top-color:#ffffff26}.vitec-bg-midnight .vitec_faq__item,.vitec-bg-graphite .vitec_faq__item,.vitec-bg-blue .vitec_faq__item{border-bottom-color:#ffffff26}.vitec-bg-midnight .vitec_faq__question-text,.vitec-bg-graphite .vitec_faq__question-text,.vitec-bg-blue .vitec_faq__question-text,.Mui-expanded .vitec-bg-midnight .vitec_faq__question-text,.Mui-expanded .vitec-bg-graphite .vitec_faq__question-text,.Mui-expanded .vitec-bg-blue .vitec_faq__question-text{color:#fff}.vitec-bg-midnight .vitec_faq__question .MuiAccordionSummary-expandIconWrapper,.vitec-bg-graphite .vitec_faq__question .MuiAccordionSummary-expandIconWrapper,.vitec-bg-blue .vitec_faq__question .MuiAccordionSummary-expandIconWrapper{color:#ffffffa6}.vitec-bg-midnight .vitec_faq__question .MuiAccordionSummary-expandIconWrapper.Mui-expanded,.vitec-bg-graphite .vitec_faq__question .MuiAccordionSummary-expandIconWrapper.Mui-expanded,.vitec-bg-blue .vitec_faq__question .MuiAccordionSummary-expandIconWrapper.Mui-expanded{color:#ffffffe6}.vitec-bg-midnight .vitec_faq__answer,.vitec-bg-graphite .vitec_faq__answer,.vitec-bg-blue .vitec_faq__answer{color:#f8fafccc}.vitec_eventlist__inner{width:100%}.vitec_eventlist__items{border-top:1px solid #94a3b840;flex-direction:column;display:flex}.vitec_eventlist__item{border-bottom:1px solid #94a3b840;grid-template-columns:3.5rem 1fr 7rem;align-items:center;gap:1.5rem 1rem;padding:1.5rem 0;display:grid}@media (max-width:600px){.vitec_eventlist__item{grid-template-columns:3rem 1fr;gap:1rem}.vitec_eventlist__item .vitec_eventlist__logo-box{display:none}}.vitec_eventlist__date-badge{text-align:center;background:#37415112;border:1px solid #37415124;border-radius:.5rem;flex-direction:column;justify-content:center;align-self:flex-start;align-items:center;width:3.5rem;min-height:3.5rem;margin-top:.1rem;padding:.4rem .5rem;display:flex}.vitec_eventlist__date-day{color:#374151;font-size:1.375rem;font-weight:700;line-height:1;display:block}.vitec_eventlist__date-month{letter-spacing:.07em;text-transform:uppercase;color:#6b7280;margin-top:.2rem;font-size:.5625rem;font-weight:700;display:block}.vitec_eventlist__date-multiday{color:#6b728099;letter-spacing:.04em;margin-top:.15rem;font-size:.5rem;display:block}.vitec_eventlist__content{flex-direction:column;gap:.15rem;min-width:0;display:flex}.vitec_eventlist__title{color:#374151;margin:0!important;font-size:1rem!important;font-weight:600!important;line-height:1.35!important}.vitec_eventlist__teaser{color:#6b7280e6;font-size:.8125rem!important}.vitec_eventlist__meta{flex-wrap:wrap;align-items:center;gap:.3rem;margin-top:.4rem;font-size:.75rem;line-height:1.4;display:flex}.vitec_eventlist__meta-date{color:#374151;font-weight:600}.vitec_eventlist__meta-sep{color:#94a3b8b3;-webkit-user-select:none;user-select:none}.vitec_eventlist__meta-location{color:#6b7280e6}.vitec_eventlist__chip{color:#374151d9!important;border-color:#6b72804d!important;height:1.625rem!important;font-size:.7rem!important}.vitec_eventlist__btn{text-transform:none!important;letter-spacing:0!important;border-radius:.375rem!important;padding:.2rem .875rem!important;font-size:.75rem!important;line-height:1.5!important}.vitec_eventlist__btn--contact{color:#374151!important;border-color:#6b728066!important}.vitec_eventlist__btn--contact:hover{background:#3741510d!important;border-color:#37415180!important}.vitec_eventlist__btn--more{color:#fff!important;box-shadow:none!important;background:#374151!important;border-color:#374151!important}.vitec_eventlist__btn--more:hover{background:#313131!important;border-color:#313131!important}.vitec_eventlist__teaserbar{background:#fff;min-height:3.25rem}.vitec_eventlist__teaserbar:not(.vitec_eventlist__teaserbar--full-width) .vitec_eventlist__teaserbar-inner,.vitec_eventlist__teaserbar.vitec_eventlist__teaserbar--full-width{border-top:1px solid #94a3b833;border-bottom:1px solid #94a3b833}.vitec_eventlist__teaserbar-inner{align-items:center;gap:0;height:100%;min-height:3.25rem;display:flex}.vitec_eventlist__teaserbar-content{flex:1;align-items:center;gap:1rem;min-width:0;padding:.5rem 0;display:flex;overflow:hidden}@media (max-width:768px){.vitec_eventlist__teaserbar-content{gap:.625rem}}.vitec_eventlist__teaserbar-logo{flex-shrink:0;justify-content:center;align-items:center;width:4rem;height:3rem;display:flex}.vitec_eventlist__teaserbar-logo-img{object-fit:contain;max-width:100%;max-height:100%;display:block}.vitec_eventlist__teaserbar-title{color:#374151;white-space:nowrap;text-overflow:ellipsis;flex-shrink:1;min-width:0;font-size:.8125rem;overflow:hidden}.vitec_eventlist__teaserbar-title strong{font-weight:700}@media (max-width:599px){.vitec_eventlist__teaserbar-title{display:none}}.vitec_eventlist__teaserbar-sep{color:#94a3b899;-webkit-user-select:none;user-select:none;flex-shrink:0;padding:0 .125rem;font-size:.75rem}@media (max-width:768px){.vitec_eventlist__teaserbar-sep{display:none}}.vitec_eventlist__teaserbar-date{color:#374151;white-space:nowrap;flex-shrink:0;font-size:.8125rem;font-weight:600}@media (max-width:768px){.vitec_eventlist__teaserbar-date{display:none}}.vitec_eventlist__teaserbar-location{color:#6b7280;white-space:nowrap;text-overflow:ellipsis;flex-shrink:2;font-size:.8125rem;overflow:hidden}@media (max-width:899px){.vitec_eventlist__teaserbar-location{display:none}}.vitec_eventlist__teaserbar-cta.MuiButton-root{flex-shrink:0;margin-left:auto;text-transform:none!important;letter-spacing:0!important;box-shadow:none!important;color:#fff!important;background:#f47937!important;border-radius:.375rem!important;padding:.3rem .875rem!important;font-size:.75rem!important;font-weight:600!important}.vitec_eventlist__teaserbar-cta.MuiButton-root:hover{background:#d9641f!important}.vitec_eventlist__teaserbar-nav{border-left:1px solid #94a3b833;flex-shrink:0;align-items:center;gap:.125rem;margin-left:.5rem;padding-left:.75rem;display:flex}.vitec_eventlist__teaserbar-arrow.MuiIconButton-root{color:#37415199;border-radius:.25rem;width:1.75rem;height:1.75rem;font-size:1.25rem;line-height:1}.vitec_eventlist__teaserbar-arrow.MuiIconButton-root:hover{color:#374151;background:#37415112}.vitec_eventlist__logo-box{background:#374151e0;border-radius:.5rem;justify-content:center;place-self:center end;align-items:center;width:7rem;min-height:3rem;padding:.5rem .75rem;display:flex}.vitec_eventlist__logo-box--empty{background:0 0}.vitec_eventlist__logo-img{object-fit:contain;filter:brightness(1.15);opacity:.9;width:auto;max-width:100%;height:auto;max-height:2.5rem}.vitec_newslist__inner{width:100%}.vitec_newslist__chip{color:#6b7280!important;background:#94a3b812!important;border-color:#94a3b866!important;height:1.375rem!important;font-size:.7rem!important}.vitec_newslist__chip .MuiChip-label{padding:0 .5rem!important}.vitec_newslist__chip--dark{color:#f8fafce6!important;background:#ffffff1a!important;border-color:#f8fafc4d!important}.vitec_newslist__title-link{color:inherit;text-decoration:none}.vitec_newslist__title-link:hover .vitec_newslist__title,.vitec_newslist__title-link:hover .vitec_newslist__grid-title{color:rgba(var(--vitec-brand),1)}.vitec_newslist__items{border-top:1px solid #94a3b840;flex-direction:column;display:flex}.vitec_newslist__item{border-bottom:1px solid #94a3b840;grid-template-columns:3.5rem 1fr 7rem;align-items:start;gap:1.5rem 1rem;padding:1.5rem 0;display:grid}@media (max-width:600px){.vitec_newslist__item{grid-template-columns:3rem 1fr}.vitec_newslist__item .vitec_newslist__thumbnail{display:none}}.vitec_newslist__date-badge{text-align:center;background:#37415112;border:1px solid #37415124;border-radius:.5rem;flex-direction:column;flex-shrink:0;justify-content:center;align-self:flex-start;align-items:center;width:3.5rem;min-height:3.5rem;margin-top:.1rem;padding:.4rem .5rem;display:flex}.vitec_newslist__date-badge--empty{background:0 0;border-color:#0000}.vitec_newslist__date-day{color:#374151;font-size:1.375rem;font-weight:700;line-height:1;display:block}.vitec_newslist__date-month{letter-spacing:.07em;text-transform:uppercase;color:#6b7280;margin-top:.2rem;font-size:.5625rem;font-weight:700;display:block}.vitec_newslist__content{flex-direction:column;gap:.35rem;min-width:0;display:flex}.vitec_newslist__title{-webkit-line-clamp:2;color:#374151;-webkit-box-orient:vertical;font-size:1rem;font-weight:600;line-height:1.35;transition:color .15s;display:-webkit-box;overflow:hidden}.vitec_newslist__teaser{color:#6b7280e6;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:.8125rem;line-height:1.55;display:-webkit-box;overflow:hidden}.vitec_newslist__read-more{color:rgba(var(--vitec-brand),1);margin-top:.1rem;font-size:.8125rem;font-weight:500;text-decoration:none;display:inline-block}.vitec_newslist__read-more:hover{text-decoration:underline}.vitec_newslist__thumbnail{background:#94a3b81a;border-radius:.5rem;flex-shrink:0;place-self:start end;width:7rem;height:5rem;margin-top:.1rem;overflow:hidden}.vitec_newslist__thumbnail--empty{background:0 0}.vitec_newslist__thumbnail-img{object-fit:cover;width:100%;height:100%;display:block}.vitec_newslist__featured{flex-direction:column;gap:2rem;display:flex}.vitec_newslist__featured-hero{background:#0f172a;border-radius:12px;align-items:flex-end;min-height:22rem;display:flex;position:relative;overflow:hidden}@media (max-width:600px){.vitec_newslist__featured-hero{min-height:18rem}}.vitec_newslist__featured-img-wrap{position:absolute;inset:0}.vitec_newslist__featured-img{object-fit:cover;opacity:.55;width:100%;height:100%;display:block}.vitec_newslist__featured-overlay{background:linear-gradient(#0000 0%,#0f172a66 50%,#0f172af2 100%);position:absolute;inset:0}.vitec_newslist__featured-body{z-index:1;color:#f8fafc;flex-direction:column;gap:.625rem;width:100%;padding:2rem;display:flex;position:relative}@media (max-width:600px){.vitec_newslist__featured-body{padding:1.25rem}}.vitec_newslist__featured-date{color:#e2e8f0a6;letter-spacing:.02em;font-size:.8rem}.vitec_newslist__featured-title{color:#f8fafc;max-width:48rem;margin:0;font-size:clamp(1.375rem,3vw,2rem);font-weight:300;line-height:1.25}.vitec_newslist__featured-teaser{color:#e2e8f0cc;-webkit-line-clamp:3;-webkit-box-orient:vertical;max-width:42rem;margin:0;font-size:.9375rem;line-height:1.6;display:-webkit-box;overflow:hidden}.vitec_newslist__grid{grid-template-columns:repeat(3,1fr);gap:1.5rem;display:grid}@media (max-width:900px){.vitec_newslist__grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:560px){.vitec_newslist__grid{grid-template-columns:1fr}}.vitec_newslist__grid-card{background:#f8fafc80;border:1px solid #94a3b833;border-radius:12px;flex-direction:column;transition:box-shadow .2s;display:flex;overflow:hidden}.vitec_newslist__grid-card:hover{box-shadow:0 4px 20px #0f172a17}.vitec_newslist__grid-img-link{display:block;overflow:hidden}.vitec_newslist__grid-img{aspect-ratio:16/9;background:#94a3b81f;overflow:hidden}.vitec_newslist__grid-img img{object-fit:cover;width:100%;height:100%;transition:transform .3s;display:block}.vitec_newslist__grid-img--empty{background:#94a3b81a}.vitec_newslist__grid-card:hover .vitec_newslist__grid-img img{transform:scale(1.04)}.vitec_newslist__grid-body{flex-direction:column;flex:1;padding:1rem 1.25rem 1.25rem;display:flex}.vitec_newslist__grid-date{color:#6b7280bf;font-size:.75rem}.vitec_newslist__grid-title{-webkit-line-clamp:2;color:#374151;-webkit-box-orient:vertical;font-size:.9375rem;font-weight:600;line-height:1.35;transition:color .15s;display:-webkit-box;overflow:hidden}.vitec_newslist__grid-teaser{color:#6b7280e6;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:.8125rem;line-height:1.55;display:-webkit-box;overflow:hidden}.vitec_newslist__spotlight{grid-template-columns:3fr 2fr;align-items:center;gap:2.5rem;display:grid}@media (max-width:768px){.vitec_newslist__spotlight{grid-template-columns:1fr;gap:1.5rem}}.vitec_newslist__spotlight-img-wrap{border-radius:12px;overflow:hidden}.vitec_newslist__spotlight-img-wrap a{display:block}.vitec_newslist__spotlight-img{aspect-ratio:16/9;object-fit:cover;width:100%;display:block}.vitec_newslist__spotlight-body{flex-direction:column;display:flex}.vitec_newslist__spotlight-date{color:#6b7280cc;font-size:.8125rem}.vitec_newslist__spotlight-title{color:#374151;margin:0;font-size:clamp(1.375rem,2.5vw,1.875rem);font-weight:300;line-height:1.2}.vitec_newslist__spotlight-teaser{color:#6b7280e6;margin:0;font-size:.9375rem;line-height:1.65}.vitec_newsdetail{width:100%}.vitec_newsdetail__hero{aspect-ratio:21/8;background:#0f172a0f;border-radius:12px;width:100%;margin-bottom:2rem;position:relative;overflow:hidden}@media (max-width:600px){.vitec_newsdetail__hero{aspect-ratio:16/9;margin-bottom:1.25rem}}.vitec_newsdetail__hero-img{object-fit:cover;object-position:center 60%;width:100%;height:100%;display:block}.vitec_newsdetail__hero-overlay{background:linear-gradient(#0000 50%,#0f172a2e 100%);position:absolute;inset:0}.vitec_newsdetail__body{max-width:48rem}.vitec_newsdetail__meta{margin-bottom:1rem}.vitec_newsdetail__date{color:#6b7280d9;font-size:.8125rem}.vitec_newsdetail__meta-sep{color:#94a3b899;-webkit-user-select:none;user-select:none;font-size:.8125rem}.vitec_newsdetail__author{color:#6b7280d9;font-size:.8125rem}.vitec_newsdetail__title{letter-spacing:-.01em;color:#374151;margin:0 0 1rem;font-size:clamp(1.5rem,3.5vw,2.25rem);font-weight:300;line-height:1.2}.vitec_newsdetail__teaser{color:#374151d9;border-left:3px solid #f47937;margin:0 0 1.5rem;padding-left:1rem;font-size:1.0625rem;font-weight:400;line-height:1.65}.vitec_newsdetail__bodytext{color:#1f2937;font-size:.9375rem;line-height:1.75}.vitec_newsdetail__bodytext p{margin-top:0;margin-bottom:1rem}.vitec_newsdetail__bodytext p:last-of-type{margin-bottom:0}.vitec_newsdetail__bodytext a{color:rgba(var(--vitec-brand),1)}.vitec_newsdetail__bodytext ul,.vitec_newsdetail__bodytext ol{margin-bottom:1rem;padding-left:1.5rem}.vitec_newsdetail__bodytext li{margin-bottom:.35rem}.vitec_newsdetail__files{border-top:1px solid #94a3b840;margin-top:2rem;padding-top:1.5rem}.vitec_newsdetail__files-label{letter-spacing:.08em;text-transform:uppercase;color:#6b7280b3;margin:0 0 .75rem;font-size:.6875rem;font-weight:700}.vitec_newsdetail__files-list{flex-direction:column;gap:.5rem;display:flex}.vitec_newsdetail__file{color:#374151;background:#f8fafc99;border:1px solid #94a3b840;border-radius:.5rem;align-items:center;gap:.75rem;padding:.625rem .875rem;text-decoration:none;transition:border-color .15s,background .15s;display:flex}.vitec_newsdetail__file:hover{background:#f8fafc;border-color:#26358c66}.vitec_newsdetail__file-ext{letter-spacing:.04em;color:#374151;text-align:center;background:#37415114;border-radius:.25rem;flex-shrink:0;min-width:2.5rem;padding:.2rem .4rem;font-size:.625rem;font-weight:700}.vitec_newsdetail__file-name{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.875rem;overflow:hidden}.vitec_newsdetail__file-dl{color:#6b728099;flex-shrink:0;align-items:center;display:flex}.vitec_newsdetail__file:hover .vitec_newsdetail__file-dl{color:rgba(var(--vitec-brand),1)}.vitec_cards_carousel__inner{flex-direction:column;gap:1.25rem;width:100%;display:flex}.vitec_cards_carousel__header{justify-content:space-between;align-items:flex-end;gap:1rem;display:flex}.vitec_cards_carousel__arrows{flex-shrink:0;gap:.5rem;margin-left:auto;display:flex}.vitec_cards_carousel__arrow{color:#374151;cursor:pointer;background:#fff;border:1px solid #94a3b880;border-radius:50%;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;padding:0;transition:background .18s,border-color .18s,color .18s,transform .15s;display:inline-flex}.vitec_cards_carousel__arrow:hover:not(:disabled){color:#374151;background:#3741510f;border-color:#37415166}.vitec_cards_carousel__arrow:active:not(:disabled){transform:scale(.93)}.vitec_cards_carousel__arrow:disabled{opacity:.35;cursor:default}.vitec_cards_carousel__track{scroll-snap-type:x mandatory;scrollbar-width:none;-webkit-overflow-scrolling:touch;cursor:grab;gap:1.5rem;margin-block:-.75rem;margin-inline:-.75rem;padding-block:.75rem;padding-inline:.75rem;scroll-padding-inline-start:.75rem;display:flex;overflow-x:auto}.vitec_cards_carousel__track::-webkit-scrollbar{display:none}.vitec_cards_carousel__track{--slides:3}.vitec_cards_carousel__track--slides-1{--slides:1}.vitec_cards_carousel__track--slides-2{--slides:2}.vitec_cards_carousel__track--slides-3{--slides:3}.vitec_cards_carousel__track--slides-4{--slides:4}.vitec_cards_carousel__track--slides-5{--slides:5}.vitec_cards_carousel__track--slides-6{--slides:6}.vitec_cards_carousel__slide{flex:0 0 max(13rem,(100% - 1.5rem*(var(--slides) - 1))/var(--slides));scroll-snap-align:start;min-width:0}.vitec_cards_carousel__slide .vitec-element{height:100%}.vitec_cards_carousel__slide .vitec_card__inner{transition:box-shadow .2s,transform .2s;box-shadow:0 1px 3px #0000001a,0 2px 8px #00000012}.vitec_cards_carousel__slide .vitec_card__inner:hover{box-shadow:0 4px 12px #00000021,0 2px 4px #00000014}.vitec_cards_carousel__indicators{justify-content:center;gap:.5rem;padding-top:.25rem;display:flex}.vitec_cards_carousel__dot{cursor:pointer;background:#94a3b88c;border:none;border-radius:50%;width:.5rem;height:.5rem;padding:0;transition:background .2s,width .2s,border-radius .2s}.vitec_cards_carousel__dot--active{background:#374151;border-radius:.25rem;width:1.25rem}.vitec_cards_carousel__dot:hover:not(.vitec_cards_carousel__dot--active){background:#94a3b8}.pid-1 .vitecBreadcrumbs__nav{display:none}.vitecBreadcrumbs__nav{align-items:center;padding-top:1.5rem;padding-bottom:.5rem;display:flex}.vitecBreadcrumbs{padding-top:.5rem;padding-bottom:.5rem}.vitecBreadcrumbs .MuiBreadcrumbs-ol{align-items:center}.vitecBreadcrumbs .MuiBreadcrumbs-separator{color:#6b7280;margin-left:.375rem;margin-right:.375rem;font-size:.9rem}.vitecBreadcrumbs__crumb{align-items:center;gap:.375rem;font-size:.875rem;line-height:1.2;display:inline-flex}.vitecBreadcrumbs__item{align-items:center;display:inline-flex}.vitec_usecaselist__inner{padding:2.5rem 0 3rem}.vitec_usecaselist__heading{text-align:center;margin-bottom:2rem!important}.vitec_usecaselist__toolbar{flex-wrap:wrap;align-items:center;gap:1rem;margin-bottom:.875rem;display:flex}.vitec_usecaselist__filters{flex-wrap:wrap;gap:.5rem;margin-bottom:1.75rem;display:flex}.vitec_usecaselist__grid{grid-template-columns:repeat(3,1fr);gap:1.5rem;display:grid}@media (max-width:899px){.vitec_usecaselist__grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:599px){.vitec_usecaselist__grid{grid-template-columns:1fr;gap:1.125rem}}.vitec_usecasecard{color:inherit;background:#fff;border:1px solid #26358c12;border-radius:.875rem;flex-direction:column;text-decoration:none;transition:transform .22s,box-shadow .22s,border-color .22s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0f172a12,0 4px 12px #0f172a0d}.vitec_usecasecard:hover{border-color:#26358c2e;transform:translateY(-3px);box-shadow:0 4px 16px #0f172a1a,0 12px 28px #0f172a12}.vitec_usecasecard:hover .vitec_usecasecard__image{transform:scale(1.04)}.vitec_usecasecard:hover .vitec_usecasecard__cta:after{transform:translate(4px)}.vitec_usecasecard__media{aspect-ratio:16/9;background:#26358c0f;flex-shrink:0;position:relative;overflow:hidden}.vitec_usecasecard__image{object-fit:cover;width:100%;height:100%;transition:transform .35s;display:block}.vitec_usecasecard__image-fallback{background:linear-gradient(135deg,#26358c1a 0%,#f4793712 100%);width:100%;height:100%}.vitec_usecasecard__logo-badge{background:#fff;border-radius:.5rem;justify-content:center;align-items:center;max-width:50%;padding:.3rem .625rem;display:flex;position:absolute;bottom:.75rem;left:.75rem;box-shadow:0 1px 4px #0f172a2e}.vitec_usecasecard__logo{object-fit:contain;width:auto;max-width:100%;height:3rem;display:block}.vitec_usecasecard__body{flex-direction:column;flex:1;gap:.5rem;padding:1.125rem 1.25rem 1.25rem;display:flex}.vitec_usecasecard__markets{flex-wrap:wrap;gap:.375rem;display:flex}.vitec_usecasecard__market-chip{letter-spacing:.04em;text-transform:uppercase;color:#26358cd9;background:#26358c14;border-radius:999px;padding:.2rem .625rem;font-size:.6875rem;font-weight:600;line-height:1.4;display:inline-block}.vitec_usecasecard__title{color:#1f2937;margin:0;font-size:1rem;font-weight:700;line-height:1.35}.vitec_usecasecard__subtitle{color:#6b7280;-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:.8125rem;line-height:1.55;display:-webkit-box;overflow:hidden}.vitec_usecasecard__cta{color:#26358c;align-items:center;gap:.25rem;margin-top:auto;padding-top:.625rem;font-size:.8125rem;font-weight:600;transition:color .2s;display:inline-flex}.vitec_usecasecard__cta:after{content:"→";transition:transform .2s;display:inline-block}.vitec_usecasecard:hover .vitec_usecasecard__cta{color:#f47937}.vitec_locationlist__inner{padding:2.5rem 0 3rem}.vitec_locationlist__heading{text-align:center;margin-bottom:2.5rem!important}.vitec_locationmap{--content-max:1200px;--content-gutter:24px;--edge-inset:calc((100vw - min(100vw,var(--content-max)))/2 + var(--content-gutter));background:linear-gradient(to bottom right,#313131 0%,#374151 100%);grid-template-columns:50% 1fr;align-items:stretch;min-height:560px;display:grid;position:relative;overflow:hidden}@media (max-width:899px){.vitec_locationmap{grid-template-columns:1fr;min-height:0}}.vitec_locationmap__loading{background:linear-gradient(to bottom right,#313131 0%,#374151 100%);height:560px}.vitec_locationmap__globe-col{line-height:0;position:relative;overflow:hidden}@media (max-width:899px){.vitec_locationmap__globe-col{min-height:360px}}.vitec_locationmap__globe-canvas{position:absolute}.vitec_locationmap__tooltip{color:#fff;pointer-events:none;background:#313131f7;border:1px solid #ffffff14;border-left:3px solid #f47937d9;border-radius:0 .5rem .5rem 0;min-width:11.25rem;max-width:15rem;padding:.75rem 1rem .75rem .875rem;font-family:Roboto,system-ui,sans-serif;font-size:.8125rem;line-height:1.55;box-shadow:0 8px 32px #0000008c,0 2px 8px #0000004d}.vitec_locationmap__tooltip-header{align-items:center;gap:.4rem;margin-bottom:.5rem;display:flex}.vitec_locationmap__tooltip-pin-icon{flex-shrink:0;margin-top:-1px}.vitec_locationmap__tooltip-name{color:#fff;letter-spacing:.01em;font-size:.9375rem;font-weight:900}.vitec_locationmap__tooltip-divider{background:#ffffff1f;height:1px;margin-bottom:.5rem}.vitec_locationmap__tooltip-address{flex-direction:column;gap:.1rem;display:flex}.vitec_locationmap__tooltip-line{color:#f8fafcd1;font-weight:400}.vitec_locationmap__tooltip-phone{color:#ffffff61;letter-spacing:.01em;margin-top:.4rem;font-size:.75rem;font-weight:300}.vitec_locationmap__text-col{padding:3.5rem var(--edge-inset)3.5rem 1rem;color:#f8fafc;flex-direction:column;justify-content:center;display:flex}@media (max-width:899px){.vitec_locationmap__text-col{padding:2rem 1.5rem 2.5rem}}.vitec_locationmap__text-col h1{color:#f8fafc;letter-spacing:-.01em;margin:0 0 2rem;font-weight:900;line-height:1.1}.vitec_locationmap__text-col h2{color:#f8fafc;margin:0;font-size:4rem;font-weight:700;line-height:1.3}.vitec_locationmap__text-col h3{color:#f8fafc;margin:.25rem 0 .4rem;font-size:2rem;font-weight:700}.vitec_locationmap__text-col mark{color:#f47937;letter-spacing:.1em;text-transform:uppercase;background:0 0;margin:1.5rem 0 .2rem;padding:0;font-size:.6875rem;font-weight:700;display:block;transform:translateY(1.125rem)}.vitec_locationmap__text-col mark:first-child{margin-top:0}.vitec_locationmap__text-col span[style*=background-color]{color:#f47937;letter-spacing:.1em;text-transform:uppercase;font-size:.6875rem;font-weight:700;background:0 0!important}.vitec_locationmap__text-col p{color:#f8fafcad;margin:0 0 .375rem;font-size:.875rem;line-height:1.65}.vitec_locationmap__text-col a{color:#f47937;text-decoration:none}.vitec_locationmap__text-col a.btn,.vitec_locationmap__text-col a[class*=btn],.vitec_locationmap__text-col a[class*=button],.vitec_locationmap__text-col a[class*=cta]{color:#fff;background:#f47937;border-radius:.375rem;align-items:center;margin-top:1.5rem;padding:.65rem 1.5rem;font-size:.9rem;font-weight:600;transition:background .2s;display:inline-flex}.vitec_locationmap__text-col a.btn:hover,.vitec_locationmap__text-col a[class*=btn]:hover,.vitec_locationmap__text-col a[class*=button]:hover,.vitec_locationmap__text-col a[class*=cta]:hover{background:#26358c}.vitec_locationmap__text-col a:hover{text-decoration:underline}.vitec_locationlist__list{flex-direction:column;display:flex}.vitec_locationrow{border-bottom:1px solid #26358c14;grid-template-columns:14rem 1fr auto;align-items:start;gap:2rem;padding:1.5rem 0;display:grid}.vitec_locationrow:first-child{border-top:1px solid #26358c14}@media (max-width:899px){.vitec_locationrow{grid-template-columns:1fr auto}}@media (max-width:599px){.vitec_locationrow{grid-template-columns:1fr;gap:.75rem}}.vitec_locationrow__identity{flex-direction:column;gap:.25rem;display:flex}.vitec_locationrow__flag{color:#1f2937;letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;background:#fff;border:2.5px solid #1f2937d9;border-radius:999px;flex-shrink:0;justify-content:center;align-self:flex-start;align-items:center;padding:.2rem .8rem;font-size:.8125rem;font-weight:900;display:inline-flex}.vitec_locationrow__name{color:#1f2937;font-size:1rem;font-weight:700;line-height:1.3}.vitec_locationrow__address{color:#6b7280;flex-direction:column;gap:.1rem;font-size:.875rem;font-style:normal;line-height:1.55;display:flex}@media (max-width:899px){.vitec_locationrow__address{display:none}}.vitec_locationrow__right{flex-direction:column;align-items:flex-end;gap:.625rem;display:flex}@media (max-width:599px){.vitec_locationrow__right{align-items:flex-start}}.vitec_locationrow__contact{flex-direction:column;align-items:flex-end;gap:.25rem;display:flex}@media (max-width:599px){.vitec_locationrow__contact{align-items:flex-start}}.vitec_locationrow__contact-line{color:#6b7280;align-items:center;gap:.375rem;font-size:.8125rem;text-decoration:none;display:inline-flex}.vitec_locationrow__contact-line:not(.vitec_locationrow__contact-line--fax):hover{color:#26358c}.vitec_locationrow__contact-line svg{opacity:.6;flex-shrink:0}.vitec_locationrow__cta{color:#26358c;align-items:center;font-size:.8125rem;font-weight:600;text-decoration:none;transition:color .2s;display:inline-flex}.vitec_locationrow__cta:hover{color:#f47937}.vitec_locationlist__grid{grid-template-columns:repeat(3,1fr);gap:1.25rem;display:grid}@media (max-width:899px){.vitec_locationlist__grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:599px){.vitec_locationlist__grid{grid-template-columns:1fr}}.vitec_locationcard{background:#fff;border:1px solid #26358c14;border-radius:.875rem;flex-direction:column;transition:box-shadow .22s,border-color .22s,transform .22s;display:flex;overflow:hidden;box-shadow:0 1px 3px #0f172a0f,0 4px 12px #0f172a0a}.vitec_locationcard:hover{border-color:#26358c29;transform:translateY(-2px);box-shadow:0 4px 16px #0f172a17,0 12px 24px #0f172a0f}.vitec_locationcard__header{background:#26358c0a;border-bottom:1px solid #26358c12;align-items:center;gap:.75rem;padding:1rem 1.25rem .875rem;display:flex}.vitec_locationcard__flag{color:#1f2937;letter-spacing:.14em;text-transform:uppercase;white-space:nowrap;background:#fff;border:2px solid #1f2937d9;border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;padding:.175rem .7rem;font-size:.75rem;font-weight:900;display:inline-flex}.vitec_locationcard__name{color:#1f2937;font-size:.9375rem;font-weight:700;line-height:1.3}.vitec_locationcard__body{flex-direction:column;flex:1;gap:.875rem;padding:1rem 1.25rem;display:flex}.vitec_locationcard__address{color:#6b7280;flex-direction:column;gap:.1rem;font-size:.8125rem;font-style:normal;line-height:1.6;display:flex}.vitec_locationcard__contact{flex-direction:column;gap:.25rem;display:flex}.vitec_locationcard__contact-line{color:#6b7280;align-items:center;gap:.375rem;font-size:.8rem;text-decoration:none;display:inline-flex}.vitec_locationcard__contact-line:not(.vitec_locationcard__contact-line--fax):hover{color:#26358c}.vitec_locationcard__contact-line svg{opacity:.55;flex-shrink:0}.vitec_locationcard__footer{border-top:1px solid #26358c0f;padding:.75rem 1.25rem 1rem}.vitec_locationcard__cta{color:#26358c;align-items:center;gap:.25rem;font-size:.8125rem;font-weight:600;text-decoration:none;transition:color .2s;display:inline-flex}.vitec_locationcard__cta:after{content:"→";transition:transform .2s;display:inline-block}.vitec_locationcard:hover .vitec_locationcard__cta{color:#f47937}.vitec_locationcard:hover .vitec_locationcard__cta:after{transform:translate(3px)}.vitec_customerlogos{width:100%;overflow:hidden}.vitec_customerlogos__header{margin-bottom:1.25rem!important}.vitec_customerlogos__marquee{width:100%;padding:.75rem 0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,#0000 0%,#000 8% 92%,#0000 100%);mask-image:linear-gradient(90deg,#0000 0%,#000 8% 92%,#0000 100%)}.vitec_customerlogos__marquee-track{align-items:center;gap:2.5rem;width:max-content;animation:36s linear infinite vitec-marquee;display:flex}.vitec_customerlogos__marquee-track:hover{animation-play-state:paused}@media (prefers-reduced-motion:reduce){.vitec_customerlogos__marquee-track{flex-wrap:wrap;justify-content:center;width:100%;animation:none}}@keyframes vitec-marquee{0%{transform:translate(0)}to{transform:translate(-50%)}}.vitec_customerlogos__marquee-item{flex-shrink:0;justify-content:center;align-items:center;height:2.25rem;display:flex}.vitec_customerlogos__grid{grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));align-items:center;gap:1.5rem 2rem;margin:0;padding:0;list-style:none;display:grid}.vitec_customerlogos__grid-item{justify-content:center;align-items:center;display:flex}.vitec_customerlogos__list{flex-direction:column;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}.vitec_customerlogos__list-item{align-items:center;gap:.75rem;display:flex}.vitec_customerlogos__list-name{color:#6b7280e6;font-size:.875rem}.vitec_customerlogos__carousel{flex-direction:column;gap:.875rem;display:flex}.vitec_customerlogos__carousel-header{justify-content:flex-end;display:flex}.vitec_customerlogos__carousel-arrows{gap:.375rem;display:flex}.vitec_customerlogos__carousel-arrow{color:#374151;cursor:pointer;background:#fff;border:1px solid #94a3b880;border-radius:50%;justify-content:center;align-items:center;width:2.25rem;height:2.25rem;padding:0;transition:background .18s,border-color .18s,color .18s,transform .15s;display:inline-flex}.vitec_customerlogos__carousel-arrow:hover:not(:disabled){color:#374151;background:#3741510f;border-color:#37415166}.vitec_customerlogos__carousel-arrow:active:not(:disabled){transform:scale(.93)}.vitec_customerlogos__carousel-arrow:disabled{opacity:.35;cursor:default}.vitec_customerlogos__carousel-track{scroll-snap-type:x mandatory;scrollbar-width:none;-webkit-overflow-scrolling:touch;cursor:grab;align-items:center;gap:1.5rem;display:flex;overflow-x:auto}.vitec_customerlogos__carousel-track::-webkit-scrollbar{display:none}.vitec_customerlogos__carousel-slide{scroll-snap-align:start;flex:0 0 max(7rem,20% - 1.2rem);justify-content:center;align-items:center;min-height:2.5rem;display:flex}.vitec_customerlogos__carousel-dots{justify-content:center;gap:.375rem;display:flex}.vitec_customerlogos__carousel-dot{cursor:pointer;background:#94a3b84d;border:none;border-radius:50%;width:.4375rem;height:.4375rem;padding:0;transition:background .2s,transform .2s}.vitec_customerlogos__carousel-dot:hover{background:#94a3b899}.vitec_customerlogos__carousel-dot--active{background:#26358c;transform:scale(1.25)}.vitec_customerlogos__logo-img{object-fit:contain;opacity:.85;width:auto;max-width:8rem;height:auto;max-height:2rem;transition:opacity .2s,filter .2s;display:block}.vitec_customerlogos__logo-img--grey{filter:grayscale();opacity:.5}.vitec_customerlogos__logo-img--grey:hover{filter:grayscale(0);opacity:.85}.vitec_quotation{max-width:52rem;margin:0;padding:2rem 0 1rem}.vitec_quotation__body{border:none;margin:0;padding:0;position:relative}.vitec_quotation__mark{color:#26358c;opacity:.22;-webkit-user-select:none;user-select:none;pointer-events:none;margin-bottom:.75rem;font-family:Georgia,Times New Roman,serif;font-size:4.5rem;line-height:.6;display:block}.vitec_quotation__text{color:#1f2937e0;margin:0;font-size:clamp(1.125rem,2vw,1.375rem);font-style:italic;font-weight:500;line-height:1.65}.vitec_quotation__footer{border-top:2px solid #26358c24;flex-wrap:wrap;align-items:center;gap:1rem;margin-top:1.5rem;padding-top:1.25rem;display:flex}.vitec_quotation__logo{object-fit:contain;flex-shrink:0;width:auto;max-width:100px;height:32px;display:block}.vitec_quotation__attribution{flex-direction:column;gap:.1875rem;display:flex}.vitec_quotation__name{color:#1f2937;font-size:.9375rem;font-weight:600;line-height:1.3;display:block}.vitec_quotation__position{color:#6b7280;font-size:.8125rem;line-height:1.45;display:block}.vitec_columns{grid-template-columns:1fr;gap:2rem;display:grid}@media (min-width:900px){.vitec_columns{grid-template-columns:1fr 1fr;gap:3rem}.vitec_columns--cols-50-50{grid-template-columns:1fr 1fr}.vitec_columns--cols-66-33{grid-template-columns:2fr 1fr}.vitec_columns--cols-33-66{grid-template-columns:1fr 2fr}}.vitec_columns__col{flex-direction:column;gap:1.25rem;display:flex}.vitec_columns__image{object-fit:cover;border-radius:.5rem;width:100%;height:auto;display:block}.vitec_columns__item-caption{color:#6b7280;text-align:center;margin:.5rem 0 0;font-size:.8125rem}.vitec_columns__item-headline{color:#26358c;margin:0 0 .625rem;font-size:clamp(1.0625rem,1.75vw,1.25rem);font-weight:600;line-height:1.3}.vitec_columns__item-body{color:#1f2937d9;font-size:.9375rem;line-height:1.65}.vitec_columns__item-body p{margin:0 0 .75rem}.vitec_columns__item-body p:last-of-type{margin-bottom:0}.vitec_columns__item-body a{color:#26358c;text-decoration:underline}.vitec_columns__item-body strong{font-weight:600}.vitec_columns__item-link{color:#26358c;align-items:center;margin-top:.75rem;font-size:.9375rem;font-weight:500;text-decoration:none;display:inline-flex}.vitec_columns__item-link:hover{text-decoration:underline}*,:before,:after{box-sizing:border-box}:focus,:focus-visible{outline:none!important}.MuiButtonBase-root:focus-visible{box-shadow:none!important}@keyframes vitec-spin-cw{0%{transform:rotate(-90deg)}to{transform:rotate(270deg)}}@keyframes vitec-spin-ccw{0%{transform:rotate(90deg)}to{transform:rotate(-270deg)}}body,html{color:#1f2937;width:100%;min-height:100vh;margin:0;font-family:Roboto,system-ui,-apple-system,sans-serif}main{min-height:100vh}#page{flex-direction:column;width:100%;min-height:100vh;display:flex}#header{color:#f8fafc;flex-direction:column;justify-content:flex-start;gap:0;width:100%;min-height:0;padding:1.65rem 1.75rem 0;display:flex}.header-inner{z-index:2;position:relative}.header-top-row{justify-content:space-between;align-items:center;gap:1rem;width:100%;max-width:1200px;margin:1rem auto 0;display:flex}.header-logo-link{align-items:center;display:inline-flex}.header-logo{object-fit:contain;width:auto;height:50px}.mobile-nav-toggle{color:#f8fafc;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#0f172a33;border:1px solid #f8fafc2e;border-radius:999px;min-width:auto;padding:.6rem;display:none}.mobile-nav-toggle:hover{background:#0f172a52}.mobile-nav-toggle__icon{flex-direction:column;justify-content:space-between;width:1.3rem;height:1rem;display:inline-flex}.mobile-nav-toggle__icon span{transform-origin:50%;background:currentColor;border-radius:999px;width:100%;height:2px;transition:transform .2s,opacity .2s;display:block}.mobile-nav-toggle__icon--open span:first-child{transform:translateY(7px)rotate(45deg)}.mobile-nav-toggle__icon--open span:nth-child(2){opacity:0}.mobile-nav-toggle__icon--open span:nth-child(3){transform:translateY(-7px)rotate(-45deg)}.mobile-nav-drawer{color:#f8fafc;background:linear-gradient(#0f172a 0%,#1e3a8a 100%);border-left:1px solid #f8fafc1f;width:min(24rem,100vw)}.mobile-nav-drawer__inner{min-height:100%;padding:1.25rem}.mobile-nav-drawer__header{justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1.25rem;display:flex}.mobile-nav-close{color:#f8fafc;border:1px solid #f8fafc24;border-radius:999px;min-width:auto;padding:.35rem .85rem}.mobile-nav-section-title{color:#e2e8f0b8;text-transform:uppercase;letter-spacing:.08em;margin-bottom:.6rem}.mobile-nav-item{border:1px solid #0000;border-radius:18px;margin-bottom:.35rem;padding:.75rem .9rem}.mobile-nav-item .MuiListItemText-primary{font-weight:600}.mobile-nav-item .MuiListItemText-secondary{color:#e2e8f0b8}.mobile-nav-item.Mui-selected,.mobile-nav-item:hover{background:#ffffff14;border-color:#f8fafc1f}.mobile-nav-item--secondary .MuiListItemText-primary{font-weight:500}.header-meta-row{justify-content:flex-end;margin-bottom:.75rem;padding:.5rem 0;display:flex}.header-meta-row ul{align-items:center;gap:.125rem;margin:0;padding:0;list-style:none;display:flex}.header-meta-row a{color:#f8fafcb3;letter-spacing:.02em;border-radius:var(--radius-sm);align-items:center;padding:.2rem .6rem;font-size:.8125rem;font-weight:400;text-decoration:none;transition:color .2s,background-color .2s;display:inline-flex}.header-meta-row a:hover{color:#f8fafc;background:#ffffff14}.header-meta-row li.active a{color:#f8fafc;font-weight:500}#meta-menu ul,#main-navigation ul{flex-wrap:wrap;align-items:center;gap:.75rem;margin:0;padding:0;list-style:none;display:flex}#main-navigation{margin-left:auto}#main-navigation ul{justify-content:flex-end}#main-navigation a{color:#f8fafc;border-radius:999px;align-items:center;padding:.35rem .7rem;font-weight:500;text-decoration:none;transition:background-color .2s,color .2s;display:inline-flex}#main-navigation li.active a,#main-navigation a:hover{color:#fff;background-color:#ffffff2e}.main-content{flex:1;overflow-x:clip}.vitecMainContainer{background:#fff}.vitec-page-loader{background:#26358c14;width:100%;height:2px;position:relative;overflow:hidden}.vitec-page-loader:after{content:"";background:linear-gradient(90deg,#26358c00 0%,#26358c 35%,#f47937cc 70%,#26358c00 100%);width:45%;animation:1.25s ease-in-out infinite vitec-loader-sweep;position:absolute;inset:0}@keyframes vitec-loader-sweep{0%{transform:translate(-120%)}to{transform:translate(310%)}}@media (max-width:768px){#header{min-height:130px;padding:.85rem}.header-top-row{align-items:center}.mobile-nav-toggle{display:inline-flex}.header-logo{height:28px}#meta-menu,#main-navigation{display:none}#header.header--with-hero{padding:0}#header.header--with-hero .header-inner{padding:1.15rem .85rem 0}.mobile-nav-drawer{width:min(100vw,22rem)}.header-hero{width:100%;min-height:560px;margin-left:0}.header-hero-content{min-height:560px;padding-top:10rem;padding-bottom:2.5rem}.vitecMainContainer{border-radius:12px;margin-top:-2rem}.vitecMainContainer--withHero{margin-top:0}} diff --git a/public/_frontend/assets/index-CM0zIqrs.js b/public/_frontend/assets/index-CM0zIqrs.js deleted file mode 100644 index 15a1ba3..0000000 --- a/public/_frontend/assets/index-CM0zIqrs.js +++ /dev/null @@ -1,148 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vitec_downloadcardcollection-RsRD4eC3.js","assets/jszip.min-DxLKr7hR.js","assets/vitec_datasheets-Cp-zTFxi.js","assets/vitec_faq-C66INAn2.js","assets/useControlled-CztbT67m.js","assets/VitecDebugToggle-Bp07RQC2.js"])))=>i.map(i=>d[i]); -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=e=>{let n={};for(var r in e)t(n,r,{get:e[r],enumerable:!0});return n},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function.")});(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var d=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function ee(e,t){return E(e.type,t,e.props)}function D(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function te(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ne=/\/+/g;function re(e,t){return typeof e==`object`&&e&&e.key!=null?te(``+e.key):t.toString(36)}function O(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function k(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,k(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+re(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(ne,`$&/`)+`/`),k(o,r,i,``,function(e){return e})):o!=null&&(D(o)&&(o=ee(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ne,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=d()})),p=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,D());else{var t=n(l);t!==null&&re(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&re(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?D():S=!1}}}var D;if(typeof y==`function`)D=function(){y(ee)};else if(typeof MessageChannel<`u`){var te=new MessageChannel,ne=te.port2;te.port1.onmessage=ee,D=function(){ne.postMessage(null)}}else D=function(){_(ee,0)};function re(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,re(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,D()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),m=o(((e,t)=>{t.exports=p()})),h=o((e=>{var t=f();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=o((e=>{var t=m(),n=f(),r=g();function i(e){var t=`https://react.dev/errors/`+e;if(1oe||(e.current=ae[oe],ae[oe]=null,oe--)}function P(e,t){oe++,ae[oe]=e.current,e.current=t}var le=se(null),ue=se(null),de=se(null),fe=se(null);function pe(e,t){switch(P(de,t),P(ue,e),P(le,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Ud(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Ud(t),e=Wd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}ce(le),P(le,e)}function me(){ce(le),ce(ue),ce(de)}function he(e){e.memoizedState!==null&&P(fe,e);var t=le.current,n=Wd(t,e.type);t!==n&&(P(ue,e),P(le,n))}function ge(e){ue.current===e&&(ce(le),ce(ue)),fe.current===e&&(ce(fe),$f._currentValue=ie)}var _e,ve;function ye(e){if(_e===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);_e=t&&t[1]||``,ve=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ye(n):``}function Se(e,t){switch(e.tag){case 26:case 27:case 5:return ye(e.type);case 16:return ye(`Lazy`);case 13:return e.child!==t&&t!==null?ye(`Suspense Fallback`):ye(`Suspense`);case 19:return ye(`SuspenseList`);case 0:case 15:return xe(e.type,!1);case 11:return xe(e.type.render,!1);case 1:return xe(e.type,!0);case 31:return ye(`Activity`);default:return``}}function Ce(e){try{var t=``,n=null;do t+=Se(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var we=Object.prototype.hasOwnProperty,Te=t.unstable_scheduleCallback,Ee=t.unstable_cancelCallback,De=t.unstable_shouldYield,Oe=t.unstable_requestPaint,ke=t.unstable_now,Ae=t.unstable_getCurrentPriorityLevel,je=t.unstable_ImmediatePriority,Me=t.unstable_UserBlockingPriority,Ne=t.unstable_NormalPriority,Pe=t.unstable_LowPriority,Fe=t.unstable_IdlePriority,Ie=t.log,Le=t.unstable_setDisableYieldValue,Re=null,ze=null;function Be(e){if(typeof Ie==`function`&&Le(e),ze&&typeof ze.setStrictMode==`function`)try{ze.setStrictMode(Re,e)}catch{}}var Ve=Math.clz32?Math.clz32:We,He=Math.log,Ue=Math.LN2;function We(e){return e>>>=0,e===0?32:31-(He(e)/Ue|0)|0}var Ge=256,F=262144,Ke=4194304;function qe(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Je(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=qe(n))):i=qe(o):i=qe(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=qe(n))):i=qe(o)):i=qe(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Ye(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Xe(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ze(){var e=Ke;return Ke<<=1,!(Ke&62914560)&&(Ke=4194304),e}function Qe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function $e(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function et(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),pn=!1;if(fn)try{var mn={};Object.defineProperty(mn,`passive`,{get:function(){pn=!0}}),window.addEventListener(`test`,mn,mn),window.removeEventListener(`test`,mn,mn)}catch{pn=!1}var hn=null,gn=null,_n=null;function vn(){if(_n)return _n;var e,t=gn,n=t.length,r,i=`value`in hn?hn.value:hn.textContent,a=i.length;for(e=0;e=Xn),$n=` `,er=!1;function tr(e,t){switch(e){case`keyup`:return Jn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function nr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var rr=!1;function ir(e,t){switch(e){case`compositionend`:return nr(t);case`keypress`:return t.which===32?(er=!0,$n):null;case`textInput`:return e=t.data,e===$n&&er?null:e;default:return null}}function ar(e,t){if(rr)return e===`compositionend`||!Yn&&tr(e,t)?(e=vn(),_n=gn=hn=null,rr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Dr(n)}}function kr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?kr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ar(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=zt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=zt(e.document)}return t}function jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Mr=fn&&`documentMode`in document&&11>=document.documentMode,Nr=null,Pr=null,Fr=null,Ir=!1;function Lr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ir||Nr==null||Nr!==zt(r)||(r=Nr,`selectionStart`in r&&jr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Fr&&Er(Fr,r)||(Fr=r,r=Dd(Pr,`onSelect`),0>=o,i-=o,Di=1<<32-Ve(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),R&&ki(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),R&&ki(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return R&&ki(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),R&&ki(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===D&&ka(l)===r.type){n(e,r.sibling),c=a(r,o.props),Ia(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=mi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=pi(o.type,o.key,o.props,null,e.mode,c),Ia(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=_i(o,e.mode,c),c.return=e,e=c}return s(e);case D:return o=ka(o),b(e,r,o,c)}if(j(o))return h(e,r,o,c);if(O(o)){if(l=O(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Fa(o),c);if(o.$$typeof===C)return b(e,r,ra(e,o),c);La(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=hi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Pa=0;var i=b(e,t,n,r);return Na=null,i}catch(t){if(t===Ca||t===Ta)throw t;var a=ui(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var za=Ra(!0),Ba=Ra(!1),Va=!1;function Ha(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ua(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Wa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ga(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=si(e),oi(e,null,n),t}return ri(e,r,t,n),si(e)}function Ka(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,nt(e,n)}}function qa(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ja=!1;function Ya(){if(Ja){var e=ma;if(e!==null)throw e}}function Xa(e,t,n,r){Ja=!1;var i=e.updateQueue;Va=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,m=f!==s.lane;if(m?(q&f)===f:(r&f)===f){f!==0&&f===pa&&(Ja=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=p({},d,f);break a;case 2:Va=!0}}f=s.callback,f!==null&&(e.flags|=64,m&&(e.flags|=8192),m=i.callbacks,m===null?i.callbacks=[f]:m.push(f))}else m={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=m,c=d):u=u.next=m,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;m=s,s=m.next,m.next=null,i.lastBaseUpdate=m,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),ql|=o,e.lanes=o,e.memoizedState=d}}function Za(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Qa(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=M.T,s={};M.T=s,Is(e,!1,t,n);try{var c=i(),l=M.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Fs(e,t,_a(c,r),hu(e)):Fs(e,t,r,hu(e))}catch(n){Fs(e,t,{then:function(){},status:`rejected`,reason:n},hu())}finally{N.p=a,o!==null&&s.types!==null&&(o.types=s.types),M.T=o}}function Ts(){}function Es(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Ds(e).queue;ws(e,a,t,ie,n===null?Ts:function(){return Os(e),n(r)})}function Ds(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:ie,baseState:ie,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Lo,lastRenderedState:ie},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Lo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Os(e){var t=Ds(e);t.next===null&&(t=e.alternate.memoizedState),Fs(e,t.next.queue,{},hu())}function ks(){return na($f)}function As(){return Mo().memoizedState}function js(){return Mo().memoizedState}function Ms(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=hu();e=Wa(n);var r=Ga(t,e,n);r!==null&&(_u(r,t,n),Ka(r,t,n)),t={cache:la()},e.payload=t;return}t=t.return}}function Ns(e,t,n){var r=hu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Ls(e)?Rs(t,n):(n=ii(e,t,n,r),n!==null&&(_u(n,e,r),zs(n,t,r)))}function Ps(e,t,n){Fs(e,t,n,hu())}function Fs(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ls(e))Rs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Tr(s,o))return ri(e,t,i,0),G===null&&ni(),!1}catch{}if(n=ii(e,t,i,r),n!==null)return _u(n,e,r),zs(n,t,r),!0}return!1}function Is(e,t,n,r){if(r={lane:2,revertLane:pd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Ls(e)){if(t)throw Error(i(479))}else t=ii(e,n,r,2),t!==null&&_u(t,e,2)}function Ls(e){var t=e.alternate;return e===B||t!==null&&t===B}function Rs(e,t){go=ho=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function zs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,nt(e,n)}}var Bs={readContext:na,use:Fo,useCallback:So,useContext:So,useEffect:So,useImperativeHandle:So,useLayoutEffect:So,useInsertionEffect:So,useMemo:So,useReducer:So,useRef:So,useState:So,useDebugValue:So,useDeferredValue:So,useTransition:So,useSyncExternalStore:So,useId:So,useHostTransitionStatus:So,useFormState:So,useActionState:So,useOptimistic:So,useMemoCache:So,useCacheRefresh:So};Bs.useEffectEvent=So;var Vs={readContext:na,use:Fo,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:na,useEffect:ds,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),ls(4194308,4,_s.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ls(4194308,4,e,t)},useInsertionEffect:function(e,t){ls(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(_o){Be(!0);try{e()}finally{Be(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(_o){Be(!0);try{n(t)}finally{Be(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ns.bind(null,B,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=qo(e);var t=e.queue,n=Ps.bind(null,B,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ys,useDeferredValue:function(e,t){return Ss(jo(),e,t)},useTransition:function(){var e=qo(!1);return e=ws.bind(null,B,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=B,a=jo();if(R){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||Ho(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,ds(Wo.bind(null,r,o,e),[e]),r.flags|=2048,ss(9,{destroy:void 0},Uo.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=G.identifierPrefix;if(R){var n=Oi,r=Di;n=(r&~(1<<32-Ve(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=vo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[lt]=t,o[ut]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Id(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=de.current,Hi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Pi,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[lt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Nd(e.nodeValue,n)),e||zi(t,!0)}else e=Hd(e).createTextNode(r),e[lt]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Hi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[lt]=t}else Ui(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Wi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(lo(t),t):(lo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Hi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[lt]=t}else Ui(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Wi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(lo(t),t):(lo(t),null)}return lo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return me(),e===null&&Z(t.stateNode.containerInfo),U(t),null;case 10:return Xi(t.type),U(t),null;case 19:if(ce(uo),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(Kl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=fo(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)fi(n,e),n=n.sibling;return P(uo,uo.current&1|2),R&&ki(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&ke()>ru&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=fo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!R)return U(t),null}else 2*ke()-r.renderingStartTime>ru&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ke(),e.sibling=null,n=uo.current,P(uo,a?n&1|2:n&1),R&&ki(t,r.treeForkCount),e);case 22:case 23:return lo(t),ro(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&ce(ya),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Xi(ca),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Mi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Xi(ca),me(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ge(t),null;case 31:if(t.memoizedState!==null){if(lo(t),t.alternate===null)throw Error(i(340));Ui()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(lo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ui()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ce(uo),null;case 4:return me(),null;case 10:return Xi(t.type),null;case 22:case 23:return lo(t),ro(),e!==null&&ce(ya),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Xi(ca),null;case 25:return null;default:return null}}function Vc(e,t){switch(Mi(t),t.tag){case 3:Xi(ca),me();break;case 26:case 27:case 5:ge(t);break;case 4:me();break;case 31:t.memoizedState!==null&&lo(t);break;case 13:lo(t);break;case 19:ce(uo);break;case 10:Xi(t.type);break;case 22:case 23:lo(t),ro(),e!==null&&ce(ya);break;case 24:Xi(ca)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){qu(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){qu(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){qu(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Qa(t,n)}catch(t){qu(e,e.return,t)}}}function Gc(e,t,n){n.props=Js(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){qu(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){qu(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){qu(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){qu(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){qu(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Ld(r,e.type,n,t),r[ut]=t}catch(t){qu(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&$d(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&$d(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=nn));else if(r!==4&&(r===27&&$d(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&$d(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Id(t,r,n),t[lt]=e,t[ut]=n}catch(t){qu(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Bd=cp,e=Ar(e),jr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Vd={focusedElem:e,selectionRange:n},cp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Id(o,r,n),o[lt]=e,St(o),r=o;break a;case`link`:var s=Hf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Or(s,h),v=Or(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,M.T=null,n=du,du=null;var o=su,s=lu;if(ou=0,cu=su=null,lu=0,W&6)throw Error(i(331));var c=W;if(W|=4,Il(o.current),Ol(o,o.current,s,n),W=c,sd(0,!1),ze&&typeof ze.onPostCommitFiberRoot==`function`)try{ze.onPostCommitFiberRoot(Re,o)}catch{}return!0}finally{N.p=a,M.T=r,Uu(e,t)}}function Ku(e,t,n){t=yi(n,t),t=H(e.stateNode,t,2),e=Ga(e,t,2),e!==null&&($e(e,2),od(e))}function qu(e,t,n){if(e.tag===3)Ku(e,e,n);else for(;t!==null;){if(t.tag===3){Ku(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(au===null||!au.has(r))){e=yi(n,e),n=ec(2),r=Ga(t,n,2),r!==null&&(tc(n,r,t,e),$e(r,2),od(r));break}}t=t.return}}function Ju(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Bl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Wl=!0,i.add(n),e=Yu.bind(null,e,t,n),t.then(e,e))}function Yu(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Kl===4||Kl===3&&(q&62914560)===q&&300>ke()-tu?!(W&2)&&wu(e,0):Yl|=n,Zl===q&&(Zl=0)),od(e)}function Xu(e,t){t===0&&(t=Ze()),e=ai(e,t),e!==null&&($e(e,t),od(e))}function Zu(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Xu(e,n)}function Qu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),Xu(e,n)}function $u(e,t){return Te(e,t)}var ed=null,td=null,nd=!1,rd=!1,id=!1,ad=0;function od(e){e!==td&&e.next===null&&(td===null?ed=td=e:td=td.next=e),rd=!0,nd||(nd=!0,fd())}function sd(e,t){if(!id&&rd){id=!0;do for(var n=!1,r=ed;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Ve(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,dd(r,a))}else a=q,a=Je(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Ye(r,a)||(n=!0,dd(r,a));r=r.next}while(n);id=!1}}function cd(){ld()}function ld(){rd=nd=!1;var e=0;ad!==0&&qd()&&(e=ad);for(var t=ke(),n=null,r=ed;r!==null;){var i=r.next,a=ud(r,t);a===0?(r.next=null,n===null?ed=i:n.next=i,i===null&&(td=n)):(n=r,(e!==0||a&3)&&(rd=!0)),r=i}ou!==0&&ou!==5||sd(e,!1),ad!==0&&(ad=0)}function ud(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Rd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Sf(e,t,n){var r=xf;if(r&&typeof t==`string`&&t){var i=Vt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),gf.has(i)||(gf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Id(t,`link`,e),St(t),r.head.appendChild(t)))}}function Cf(e){vf.D(e),Sf(`dns-prefetch`,e,null)}function wf(e,t){vf.C(e,t),Sf(`preconnect`,e,t)}function Tf(e,t,n){vf.L(e,t,n);var r=xf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Vt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Vt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Vt(n.imageSizes)+`"]`)):i+=`[href="`+Vt(e)+`"]`;var a=i;switch(t){case`style`:a=jf(e);break;case`script`:a=Ff(e)}hf.has(a)||(e=p({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),hf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Mf(a))||t===`script`&&r.querySelector(If(a))||(t=r.createElement(`link`),Id(t,`link`,e),St(t),r.head.appendChild(t)))}}function Ef(e,t){vf.m(e,t);var n=xf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Vt(r)+`"][href="`+Vt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Ff(e)}if(!hf.has(a)&&(e=p({rel:`modulepreload`,href:e},t),hf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(If(a)))return}r=n.createElement(`link`),Id(r,`link`,e),St(r),n.head.appendChild(r)}}}function Df(e,t,n){vf.S(e,t,n);var r=xf;if(r&&e){var i=xt(r).hoistableStyles,a=jf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Mf(a)))s.loading=5;else{e=p({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=hf.get(a))&&zf(e,n);var c=o=r.createElement(`link`);St(c),Id(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Rf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Of(e,t){vf.X(e,t);var n=xf;if(n&&e){var r=xt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=p({src:e,async:!0},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),St(a),Id(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t){vf.M(e,t);var n=xf;if(n&&e){var r=xt(n).hoistableScripts,i=Ff(e),a=r.get(i);a||(a=n.querySelector(If(i)),a||(e=p({src:e,async:!0,type:`module`},t),(t=hf.get(i))&&Bf(e,t),a=n.createElement(`script`),St(a),Id(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Af(e,t,n,r){var a=(a=de.current)?_f(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=jf(n.href),n=xt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=jf(n.href);var o=xt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Mf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),hf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},hf.set(e,n),o||Pf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Ff(n),n=xt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function jf(e){return`href="`+Vt(e)+`"`}function Mf(e){return`link[rel="stylesheet"][`+e+`]`}function Nf(e){return p({},e,{"data-precedence":e.precedence,precedence:null})}function Pf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Id(t,`link`,n),St(t),e.head.appendChild(t))}function Ff(e){return`[src="`+Vt(e)+`"]`}function If(e){return`script[async]`+e}function Lf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Vt(n.href)+`"]`);if(r)return t.instance=r,St(r),r;var a=p({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),St(r),Id(r,`style`,a),Rf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=jf(n.href);var o=e.querySelector(Mf(a));if(o)return t.state.loading|=4,t.instance=o,St(o),o;r=Nf(n),(a=hf.get(a))&&zf(r,a),o=(e.ownerDocument||e).createElement(`link`),St(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Id(o,`link`,r),t.state.loading|=4,Rf(o,n.precedence,e),t.instance=o;case`script`:return o=Ff(n.src),(a=e.querySelector(If(o)))?(t.instance=a,St(a),a):(r=n,(a=hf.get(o))&&(r=p({},n),Bf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),St(a),Id(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Rf(r,n.precedence,e));return t.instance}function Rf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Wf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Gf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Kf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=jf(r.href),a=t.querySelector(Mf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Yf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,St(a);return}a=t.ownerDocument||t,r=Nf(r),(i=hf.get(i))&&zf(r,i),a=a.createElement(`link`),St(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Id(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Yf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var qf=0;function Jf(e,t){return e.stylesheets&&e.count===0&&Zf(e,e.stylesheets),0qf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Yf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Zf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Xf=null;function Zf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Xf=new Map,t.forEach(Qf,e),Xf=null,Yf.call(e))}function Qf(e,t){if(!(t.state.loading&4)){var n=Xf.get(e);if(n)var r=n.get(null);else{n=new Map,Xf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=_()})),y=o(((e,t)=>{var n=typeof Element<`u`,r=typeof Map==`function`,i=typeof Set==`function`,a=typeof ArrayBuffer==`function`&&!!ArrayBuffer.isView;function o(e,t){if(e===t)return!0;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;var s,c,l;if(Array.isArray(e)){if(s=e.length,s!=t.length)return!1;for(c=s;c--!==0;)if(!o(e[c],t[c]))return!1;return!0}var u;if(r&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!t.has(c.value[0]))return!1;for(u=e.entries();!(c=u.next()).done;)if(!o(c.value[1],t.get(c.value[0])))return!1;return!0}if(i&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!t.has(c.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(s=e.length,s!=t.length)return!1;for(c=s;c--!==0;)if(e[c]!==t[c])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf==`function`&&typeof t.valueOf==`function`)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString==`function`&&typeof t.toString==`function`)return e.toString()===t.toString();if(l=Object.keys(e),s=l.length,s!==Object.keys(t).length)return!1;for(c=s;c--!==0;)if(!Object.prototype.hasOwnProperty.call(t,l[c]))return!1;if(n&&e instanceof Element)return!1;for(c=s;c--!==0;)if(!((l[c]===`_owner`||l[c]===`__v`||l[c]===`__o`)&&e.$$typeof)&&!o(e[l[c]],t[l[c]]))return!1;return!0}return e!==e&&t!==t}t.exports=function(e,t){try{return o(e,t)}catch(e){if((e.message||``).match(/stack|recursion/i))return console.warn(`react-fast-compare cannot handle circular refs`),!1;throw e}}})),b=o(((e,t)=>{t.exports=function(e,t,n,r,i,a,o,s){if(!e){var c;if(t===void 0)c=Error(`Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.`);else{var l=[n,r,i,a,o,s],u=0;c=Error(t.replace(/%s/g,function(){return l[u++]})),c.name=`Invariant Violation`}throw c.framesToPop=1,c}}})),x=o(((e,t)=>{t.exports=function(e,t,n,r){var i=n?n.call(r,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!=`object`||!e||typeof t!=`object`||!t)return!1;var a=Object.keys(e),o=Object.keys(t);if(a.length!==o.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),c=0;c(e.BASE=`base`,e.BODY=`body`,e.HEAD=`head`,e.HTML=`html`,e.LINK=`link`,e.META=`meta`,e.NOSCRIPT=`noscript`,e.SCRIPT=`script`,e.STYLE=`style`,e.TITLE=`title`,e.FRAGMENT=`Symbol(react.fragment)`,e))(ee||{}),D={link:{rel:[`amphtml`,`canonical`,`alternate`]},script:{type:[`application/ld+json`]},meta:{charset:``,name:[`generator`,`robots`,`description`],property:[`og:type`,`og:title`,`og:url`,`og:image`,`og:image:alt`,`og:description`,`twitter:url`,`twitter:title`,`twitter:description`,`twitter:image`,`twitter:image:alt`,`twitter:card`,`twitter:site`]}},te=Object.values(ee),ne={accesskey:`accessKey`,charset:`charSet`,class:`className`,contenteditable:`contentEditable`,contextmenu:`contextMenu`,"http-equiv":`httpEquiv`,itemprop:`itemProp`,tabindex:`tabIndex`},re=Object.entries(ne).reduce((e,[t,n])=>(e[n]=t,e),{}),O=`data-rh`,k={DEFAULT_TITLE:`defaultTitle`,DEFER:`defer`,ENCODE_SPECIAL_CHARACTERS:`encodeSpecialCharacters`,ON_CHANGE_CLIENT_STATE:`onChangeClientState`,TITLE_TEMPLATE:`titleTemplate`,PRIORITIZE_SEO_TAGS:`prioritizeSeoTags`},A=(e,t)=>{for(let n=e.length-1;n>=0;--n){let r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},j=e=>{let t=A(e,`title`),n=A(e,k.TITLE_TEMPLATE);if(Array.isArray(t)&&(t=t.join(``)),n&&t)return n.replace(/%s/g,()=>t);let r=A(e,k.DEFAULT_TITLE);return t||r||void 0},M=e=>A(e,k.ON_CHANGE_CLIENT_STATE)||(()=>{}),N=(e,t)=>t.filter(t=>t[e]!==void 0).map(t=>t[e]).reduce((e,t)=>({...e,...t}),{}),ie=(e,t)=>t.filter(e=>e.base!==void 0).map(e=>e.base).reverse().reduce((t,n)=>{if(!t.length){let r=Object.keys(n);for(let i=0;iconsole&&typeof console.warn==`function`&&console.warn(e),oe=(e,t,n)=>{let r={};return n.filter(t=>Array.isArray(t[e])?!0:(t[e]!==void 0&&ae(`Helmet: ${e} should be of type "Array". Instead found type "${typeof t[e]}"`),!1)).map(t=>t[e]).reverse().reduce((e,n)=>{let i={};n.filter(e=>{let n,a=Object.keys(e);for(let r=0;re.push(t));let a=Object.keys(i);for(let e=0;e{if(Array.isArray(e)&&e.length){for(let n=0;n({baseTag:ie([`href`],e),bodyAttributes:N(`bodyAttributes`,e),defer:A(e,k.DEFER),encode:A(e,k.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:N(`htmlAttributes`,e),linkTags:oe(`link`,[`rel`,`href`],e),metaTags:oe(`meta`,[`name`,`charset`,`http-equiv`,`property`,`itemprop`],e),noscriptTags:oe(`noscript`,[`innerHTML`],e),onChangeClientState:M(e),scriptTags:oe(`script`,[`src`,`innerHTML`],e),styleTags:oe(`style`,[`cssText`],e),title:j(e),titleAttributes:N(`titleAttributes`,e),prioritizeSeoTags:se(e,k.PRIORITIZE_SEO_TAGS)}),P=e=>Array.isArray(e)?e.join(``):e,le=(e,t)=>{let n=Object.keys(e);for(let r=0;rArray.isArray(e)?e.reduce((e,n)=>(le(n,t)?e.priority.push(n):e.default.push(n),e),{priority:[],default:[]}):{default:e,priority:[]},de=(e,t)=>({...e,[t]:void 0}),fe=[`noscript`,`script`,`style`],pe=(e,t=!0)=>t===!1?String(e):String(e).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),me=e=>Object.keys(e).reduce((t,n)=>{let r=e[n]===void 0?`${n}`:`${n}="${e[n]}"`;return t?`${t} ${r}`:r},``),he=(e,t,n,r)=>{let i=me(n),a=P(t);return i?`<${e} ${O}="true" ${i}>${pe(a,r)}`:`<${e} ${O}="true">${pe(a,r)}`},ge=(e,t,n=!0)=>t.reduce((t,r)=>{let i=r,a=Object.keys(i).filter(e=>!(e===`innerHTML`||e===`cssText`)).reduce((e,t)=>{let r=i[t]===void 0?t:`${t}="${pe(i[t],n)}"`;return e?`${e} ${r}`:r},``),o=i.innerHTML||i.cssText||``;return`${t}<${e} ${O}="true" ${a}${fe.indexOf(e)===-1?`/>`:`>${o}`}`},``),_e=(e,t={})=>Object.keys(e).reduce((t,n)=>{let r=ne[n];return t[r||n]=e[n],t},t),ve=(e,t,n)=>{let r=_e(n,{key:t,[O]:!0});return[C.createElement(`title`,r,t)]},ye=(e,t)=>t.map((t,n)=>{let r={key:n,[O]:!0};return Object.keys(t).forEach(e=>{let n=ne[e]||e;n===`innerHTML`||n===`cssText`?r.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:r[n]=t[e]}),C.createElement(e,r)}),be=(e,t,n=!0)=>{switch(e){case`title`:return{toComponent:()=>ve(e,t.title,t.titleAttributes),toString:()=>he(e,t.title,t.titleAttributes,n)};case`bodyAttributes`:case`htmlAttributes`:return{toComponent:()=>_e(t),toString:()=>me(t)};default:return{toComponent:()=>ye(e,t),toString:()=>ge(e,t,n)}}},xe=({metaTags:e,linkTags:t,scriptTags:n,encode:r})=>{let i=ue(e,D.meta),a=ue(t,D.link),o=ue(n,D.script);return{priorityMethods:{toComponent:()=>[...ye(`meta`,i.priority),...ye(`link`,a.priority),...ye(`script`,o.priority)],toString:()=>`${be(`meta`,i.priority,r)} ${be(`link`,a.priority,r)} ${be(`script`,o.priority,r)}`},metaTags:i.default,linkTags:a.default,scriptTags:o.default}},Se=e=>{let{baseTag:t,bodyAttributes:n,encode:r=!0,htmlAttributes:i,noscriptTags:a,styleTags:o,title:s=``,titleAttributes:c,prioritizeSeoTags:l}=e,{linkTags:u,metaTags:d,scriptTags:f}=e,p={toComponent:()=>[],toString:()=>``};return l&&({priorityMethods:p,linkTags:u,metaTags:d,scriptTags:f}=xe(e)),{priority:p,base:be(`base`,t,r),bodyAttributes:be(`bodyAttributes`,n,r),htmlAttributes:be(`htmlAttributes`,i,r),link:be(`link`,u,r),meta:be(`meta`,d,r),noscript:be(`noscript`,a,r),script:be(`script`,f,r),style:be(`style`,o,r),title:be(`title`,{title:s,titleAttributes:c},r)}},Ce=[],we=!!(typeof window<`u`&&window.document&&window.document.createElement),Te=class{instances=[];canUseDOM=we;context;value={setHelmet:e=>{this.context.helmet=e},helmetInstances:{get:()=>this.canUseDOM?Ce:this.instances,add:e=>{(this.canUseDOM?Ce:this.instances).push(e)},remove:e=>{let t=(this.canUseDOM?Ce:this.instances).indexOf(e);(this.canUseDOM?Ce:this.instances).splice(t,1)}}};constructor(e,t){this.context=e,this.canUseDOM=t||!1,t||(e.helmet=Se({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:``,titleAttributes:{}}))}},Ee=parseInt(`19.2.0`.split(`.`)[0],10)>=19,De=C.createContext({}),Oe=class e extends C.Component{static canUseDOM=we;helmetData;constructor(t){super(t),Ee?this.helmetData=null:this.helmetData=new Te(this.props.context||{},e.canUseDOM)}render(){return Ee?C.createElement(C.Fragment,null,this.props.children):C.createElement(De.Provider,{value:this.helmetData.value},this.props.children)}},ke=(e,t)=>{let n=document.head||document.querySelector(`head`),r=n.querySelectorAll(`${e}[${O}]`),i=[].slice.call(r),a=[],o;return t&&t.length&&t.forEach(t=>{let n=document.createElement(e);for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e))if(e===`innerHTML`)n.innerHTML=t.innerHTML;else if(e===`cssText`){let e=t.cssText;n.appendChild(document.createTextNode(e))}else{let r=e,i=t[r]===void 0?``:t[r];n.setAttribute(e,i)}n.setAttribute(O,`true`),i.some((e,t)=>(o=t,n.isEqualNode(e)))?i.splice(o,1):a.push(n)}),i.forEach(e=>e.parentNode?.removeChild(e)),a.forEach(e=>n.appendChild(e)),{oldTags:i,newTags:a}},Ae=(e,t)=>{let n=document.getElementsByTagName(e)[0];if(!n)return;let r=n.getAttribute(O),i=r?r.split(`,`):[],a=[...i],o=Object.keys(t);for(let e of o){let r=t[e]||``;n.getAttribute(e)!==r&&n.setAttribute(e,r),i.indexOf(e)===-1&&i.push(e);let o=a.indexOf(e);o!==-1&&a.splice(o,1)}for(let e=a.length-1;e>=0;--e)n.removeAttribute(a[e]);i.length===a.length?n.removeAttribute(O):n.getAttribute(O)!==o.join(`,`)&&n.setAttribute(O,o.join(`,`))},je=(e,t)=>{e!==void 0&&document.title!==e&&(document.title=P(e)),Ae(`title`,t)},Me=(e,t)=>{let{baseTag:n,bodyAttributes:r,htmlAttributes:i,linkTags:a,metaTags:o,noscriptTags:s,onChangeClientState:c,scriptTags:l,styleTags:u,title:d,titleAttributes:f}=e;Ae(`body`,r),Ae(`html`,i),je(d,f);let p={baseTag:ke(`base`,n),linkTags:ke(`link`,a),metaTags:ke(`meta`,o),noscriptTags:ke(`noscript`,s),scriptTags:ke(`script`,l),styleTags:ke(`style`,u)},m={},h={};Object.keys(p).forEach(e=>{let{newTags:t,oldTags:n}=p[e];t.length&&(m[e]=t),n.length&&(h[e]=p[e].oldTags)}),t&&t(),c(e,m,h)},Ne=null,Pe=e=>{Ne&&cancelAnimationFrame(Ne),e.defer?Ne=requestAnimationFrame(()=>{Me(e,()=>{Ne=null})}):(Me(e),Ne=null)},Fe=class extends C.Component{rendered=!1;shouldComponentUpdate(e){return!(0,E.default)(e,this.props)}componentDidUpdate(){this.emitChange()}componentWillUnmount(){let{helmetInstances:e}=this.props.context;e.remove(this),this.emitChange()}emitChange(){let{helmetInstances:e,setHelmet:t}=this.props.context,n=null,r=ce(e.get().map(e=>{let{context:t,...n}=e.props;return n}));Oe.canUseDOM?Pe(r):Se&&(n=Se(r)),t(n)}init(){if(this.rendered)return;this.rendered=!0;let{helmetInstances:e}=this.props.context;e.add(this),this.emitChange()}render(){return this.init(),null}},Ie=[],Le=e=>{let t={};for(let n of Object.keys(e))t[re[n]||n]=e[n];return t},Re=e=>{let t={};for(let n of Object.keys(e)){let r=ne[n];t[r||n]=e[n]}return t},ze=(e,t)=>{if(!we)return;let n=document.getElementsByTagName(e)[0];if(!n)return;let r=`data-rh-managed`,i=n.getAttribute(r),a=i?i.split(`,`):[],o=Object.keys(t);for(let e of a)o.includes(e)||n.removeAttribute(e);for(let e of o){let r=t[e];r==null||r===!1?n.removeAttribute(e):r===!0?n.setAttribute(e,``):n.setAttribute(e,String(r))}o.length>0?n.setAttribute(r,o.join(`,`)):n.removeAttribute(r)},Be=()=>{let e={},t={};for(let n of Ie){let{htmlAttributes:r,bodyAttributes:i}=n.props;r&&Object.assign(e,Le(r)),i&&Object.assign(t,Le(i))}ze(`html`,e),ze(`body`,t)},Ve=class extends C.Component{componentDidMount(){Ie.push(this),Be()}componentDidUpdate(){Be()}componentWillUnmount(){let e=Ie.indexOf(this);e!==-1&&Ie.splice(e,1),Be()}resolveTitle(){let{title:e,titleTemplate:t,defaultTitle:n}=this.props;return e&&t?t.replace(/%s/g,()=>Array.isArray(e)?e.join(``):e):e||n||void 0}renderTitle(){let e=this.resolveTitle();if(e===void 0)return null;let t=this.props.titleAttributes||{};return C.createElement(`title`,Re(t),e)}renderBase(){let{base:e}=this.props;return e?C.createElement(`base`,Re(e)):null}renderMeta(){let{meta:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>C.createElement(`meta`,{key:t,...Re(e)}))}renderLink(){let{link:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>C.createElement(`link`,{key:t,...Re(e)}))}renderScript(){let{script:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{innerHTML:n,...r}=e,i=Re(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),C.createElement(`script`,{key:t,...i})})}renderStyle(){let{style:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{cssText:n,...r}=e,i=Re(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),C.createElement(`style`,{key:t,...i})})}renderNoscript(){let{noscript:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{innerHTML:n,...r}=e,i=Re(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),C.createElement(`noscript`,{key:t,...i})})}render(){return C.createElement(C.Fragment,null,this.renderTitle(),this.renderBase(),this.renderMeta(),this.renderLink(),this.renderScript(),this.renderStyle(),this.renderNoscript())}},He=class extends C.Component{static defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1};shouldComponentUpdate(e){return!(0,w.default)(de(this.props,`helmetData`),de(e,`helmetData`))}mapNestedChildrenToProps(e,t){if(!t)return null;switch(e.type){case`script`:case`noscript`:return{innerHTML:t};case`style`:return{cssText:t};default:throw Error(`<${e.type} /> elements are self-closing and can not contain children. Refer to our API for more information.`)}}flattenArrayTypeChildren(e,t,n,r){return{...t,[e.type]:[...t[e.type]||[],{...n,...this.mapNestedChildrenToProps(e,r)}]}}mapObjectTypeChildren(e,t,n,r){switch(e.type){case`title`:return{...t,[e.type]:r,titleAttributes:{...n}};case`body`:return{...t,bodyAttributes:{...n}};case`html`:return{...t,htmlAttributes:{...n}};default:return{...t,[e.type]:{...n}}}}mapArrayTypeChildrenToProps(e,t){let n={...t};return Object.keys(e).forEach(t=>{n={...n,[t]:e[t]}}),n}warnOnInvalidChildren(e,t){return(0,T.default)(te.some(t=>e.type===t),typeof e.type==`function`?`You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.`:`Only elements types ${te.join(`, `)} are allowed. Helmet does not support rendering <${e.type}> elements. Refer to our API for more information.`),(0,T.default)(!t||typeof t==`string`||Array.isArray(t)&&!t.some(e=>typeof e!=`string`),`Helmet expects a string as a child of <${e.type}>. Did you forget to wrap your children in braces? ( <${e.type}>{\`\`} ) Refer to our API for more information.`),!0}mapChildrenToProps(e,t){let n={};return C.Children.forEach(e,e=>{if(!e||!e.props)return;let{children:r,...i}=e.props,a=Object.keys(i).reduce((e,t)=>(e[re[t]||t]=i[t],e),{}),{type:o}=e;switch(typeof o==`symbol`?o=o.toString():this.warnOnInvalidChildren(e,r),o){case`Symbol(react.fragment)`:t=this.mapChildrenToProps(r,t);break;case`link`:case`meta`:case`noscript`:case`script`:case`style`:n=this.flattenArrayTypeChildren(e,n,a,r);break;default:t=this.mapObjectTypeChildren(e,t,a,r);break}}),this.mapArrayTypeChildrenToProps(n,t)}render(){let{children:e,...t}=this.props,n={...t},{helmetData:r}=t;return e&&(n=this.mapChildrenToProps(e,n)),r&&!(r instanceof Te)&&(r=new Te(r.context,!0),delete n.helmetData),Ee?C.createElement(Ve,{...n}):r?C.createElement(Fe,{...n,context:r.value}):C.createElement(De.Consumer,null,e=>C.createElement(Fe,{...n,context:e}))}},Ue=`modulepreload`,We=function(e){return`/_frontend/`+e},Ge={};const F=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=We(t,n),t in Ge)return;Ge[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Ue,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};var Ke=`popstate`;function qe(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function Je(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return et(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:tt(t)}return rt(t,n,null,e)}function Ye(e={}){function t(e,t){let{pathname:n=`/`,search:r=``,hash:i=``}=nt(e.location.hash.substring(1));return!n.startsWith(`/`)&&!n.startsWith(`.`)&&(n=`/`+n),et(``,{pathname:n,search:r,hash:i},t.state&&t.state.usr||null,t.state&&t.state.key||`default`)}function n(e,t){let n=e.document.querySelector(`base`),r=``;if(n&&n.getAttribute(`href`)){let t=e.location.href,n=t.indexOf(`#`);r=n===-1?t:t.slice(0,n)}return r+`#`+(typeof t==`string`?t:tt(t))}function r(e,t){Ze(e.pathname.charAt(0)===`/`,`relative pathnames are not supported in hash history.push(${JSON.stringify(t)})`)}return rt(t,n,r,e)}function Xe(e,t){if(e===!1||e==null)throw Error(t)}function Ze(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function Qe(){return Math.random().toString(36).substring(2,10)}function $e(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function et(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?nt(t):t,state:n,key:t&&t.key||r||Qe(),mask:i}}function tt({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function nt(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function rt(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=qe(e)?e:et(h.location,e,t);n&&n(r,e),l=u()+1;let d=$e(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=qe(e)?e:et(h.location,e,t);n&&n(r,e),l=u();let i=$e(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return it(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(Ke,d),c=e,()=>{i.removeEventListener(Ke,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function it(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),Xe(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:tt(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function at(e,t,n=`/`){return ot(e,t,n,!1)}function ot(e,t,n,r,i){let a=Tt((typeof t==`string`?nt(t):t).pathname||`/`,n);if(a==null)return null;let o=i??ct(e),s=null,c=wt(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;Xe(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=Pt([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(Xe(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),lt(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:yt(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of ut(e.path))a(e,t,!0,n)}),t}function ut(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=ut(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function dt(e){e.sort((e,t)=>e.score===t.score?bt(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var ft=/^:[\w-]+$/,pt=3,mt=2,ht=1,gt=10,_t=-2,vt=e=>e===`*`;function yt(e,t){let n=e.split(`/`),r=n.length;return n.some(vt)&&(r+=_t),t&&(r+=mt),n.filter(e=>!vt(e)).reduce((e,t)=>e+(ft.test(t)?pt:t===``?ht:gt),r)}function bt(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function xt(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function Ct(e,t=!1,n=!0){Ze(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function wt(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return Ze(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function Tt(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var Et=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Dt(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?nt(e):e,a;return n?(n=Nt(n),a=n.startsWith(`/`)?Ot(n.substring(1),`/`):Ot(n,t)):a=t,{pathname:a,search:Lt(r),hash:Rt(i)}}function Ot(e,t){let n=Ft(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function kt(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function At(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function jt(e){let t=At(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Mt(e,t,n,r=!1){let i;typeof e==`string`?i=nt(e):(i={...e},Xe(!i.pathname||!i.pathname.includes(`?`),kt(`?`,`pathname`,`search`,i)),Xe(!i.pathname||!i.pathname.includes(`#`),kt(`#`,`pathname`,`hash`,i)),Xe(!i.search||!i.search.includes(`#`),kt(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=Dt(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Nt=e=>e.replace(/\/\/+/g,`/`),Pt=e=>Nt(e.join(`/`)),Ft=e=>e.replace(/\/+$/,``),It=e=>Ft(e).replace(/^\/*/,`/`),Lt=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Rt=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,zt=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Bt(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Vt(e){return Pt(e.map(e=>e.route.path).filter(Boolean))||`/`}var Ht=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Ut(e,t){let n=e;if(typeof n!=`string`||!Et.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ht)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=Tt(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{Ze(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Wt=C.createContext(null);Wt.displayName=`DataRouter`;var Gt=C.createContext(null);Gt.displayName=`DataRouterState`;var Kt=C.createContext(!1);function qt(){return C.useContext(Kt)}var Jt=C.createContext({isTransitioning:!1});Jt.displayName=`ViewTransition`;var Yt=C.createContext(new Map);Yt.displayName=`Fetchers`;var Xt=C.createContext(null);Xt.displayName=`Await`;var Zt=C.createContext(null);Zt.displayName=`Navigation`;var Qt=C.createContext(null);Qt.displayName=`Location`;var $t=C.createContext({outlet:null,matches:[],isDataRoute:!1});$t.displayName=`Route`;var en=C.createContext(null);en.displayName=`RouteError`;var tn=`REACT_ROUTER_ERROR`,nn=`REDIRECT`,rn=`ROUTE_ERROR_RESPONSE`;function an(e){if(e.startsWith(`${tn}:${nn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function on(e){if(e.startsWith(`${tn}:${rn}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new zt(t.status,t.statusText,t.data)}catch{}}function sn(e,{relative:t}={}){Xe(cn(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=C.useContext(Zt),{hash:i,pathname:a,search:o}=mn(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:Pt([n,a])),r.createHref({pathname:s,search:o,hash:i})}function cn(){return C.useContext(Qt)!=null}function ln(){return Xe(cn(),`useLocation() may be used only in the context of a component.`),C.useContext(Qt).location}var un=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function dn(e){C.useContext(Zt).static||C.useLayoutEffect(e)}function fn(){let{isDataRoute:e}=C.useContext($t);return e?Mn():pn()}function pn(){Xe(cn(),`useNavigate() may be used only in the context of a component.`);let e=C.useContext(Wt),{basename:t,navigator:n}=C.useContext(Zt),{matches:r}=C.useContext($t),{pathname:i}=ln(),a=JSON.stringify(jt(r)),o=C.useRef(!1);return dn(()=>{o.current=!0}),C.useCallback((r,s={})=>{if(Ze(o.current,un),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Mt(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:Pt([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}C.createContext(null);function mn(e,{relative:t}={}){let{matches:n}=C.useContext($t),{pathname:r}=ln(),i=JSON.stringify(jt(n));return C.useMemo(()=>Mt(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function hn(e,t,n){Xe(cn(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=C.useContext(Zt),{matches:i}=C.useContext($t),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;Pn(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let u=ln(),d;if(t){let e=typeof t==`string`?nt(t):t;Xe(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):at(e,{pathname:p});Ze(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),Ze(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=Sn(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:Pt([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:Pt([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?C.createElement(Qt.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function gn(){let e=jn(),t=Bt(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=C.createElement(C.Fragment,null,C.createElement(`p`,null,`💿 Hey developer 👋`),C.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,C.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,C.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),C.createElement(C.Fragment,null,C.createElement(`h2`,null,`Unexpected Application Error!`),C.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?C.createElement(`pre`,{style:i},n):null,o)}var _n=C.createElement(gn,null),vn=class extends C.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=on(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:C.createElement($t.Provider,{value:this.props.routeContext},C.createElement(en.Provider,{value:e,children:this.props.component}));return this.context?C.createElement(bn,{error:e},t):t}};vn.contextType=Kt;var yn=new WeakMap;function bn({children:e,error:t}){let{basename:n}=C.useContext(Zt);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=an(t.digest);if(e){let r=yn.get(t);if(r)throw r;let i=Ut(e.location,n);if(Ht&&!yn.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw yn.set(t,n),n}return C.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function xn({routeContext:e,match:t,children:n}){let r=C.useContext(Wt);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),C.createElement($t.Provider,{value:e},n)}function Sn(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);Xe(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Vt(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||_n,o&&(s<0&&c===0?(Pn(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?C.createElement(n.route.Component,null):n.route.element?n.route.element:e,C.createElement(xn,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?C.createElement(vn,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function Cn(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function wn(e){let t=C.useContext(Wt);return Xe(t,Cn(e)),t}function Tn(e){let t=C.useContext(Gt);return Xe(t,Cn(e)),t}function En(e){let t=C.useContext($t);return Xe(t,Cn(e)),t}function Dn(e){let t=En(e),n=t.matches[t.matches.length-1];return Xe(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function On(){return Dn(`useRouteId`)}function kn(){return Tn(`useNavigation`).navigation}function An(){let{matches:e,loaderData:t}=Tn(`useMatches`);return C.useMemo(()=>e.map(e=>st(e,t)),[e,t])}function jn(){let e=C.useContext(en),t=Tn(`useRouteError`),n=Dn(`useRouteError`);return e===void 0?t.errors?.[n]:e}function Mn(){let{router:e}=wn(`useNavigate`),t=Dn(`useNavigate`),n=C.useRef(!1);return dn(()=>{n.current=!0}),C.useCallback(async(r,i={})=>{Ze(n.current,un),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var Nn={};function Pn(e,t,n){!t&&!Nn[e]&&(Nn[e]=!0,Ze(!1,n))}C.useOptimistic,C.memo(Fn);function Fn({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return hn(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function In({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){Xe(!cn(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=C.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=nt(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=C.useMemo(()=>{let e=Tt(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return Ze(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:C.createElement(Zt.Provider,{value:c},C.createElement(Qt.Provider,{children:t,value:h}))}var Ln=`get`,Rn=`application/x-www-form-urlencoded`;function zn(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Bn(e){return zn(e)&&e.tagName.toLowerCase()===`button`}function Vn(e){return zn(e)&&e.tagName.toLowerCase()===`form`}function Hn(e){return zn(e)&&e.tagName.toLowerCase()===`input`}function Un(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Wn(e,t){return e.button===0&&(!t||t===`_self`)&&!Un(e)}var Gn=null;function Kn(){if(Gn===null)try{new FormData(document.createElement(`form`),0),Gn=!1}catch{Gn=!0}return Gn}var qn=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Jn(e){return e!=null&&!qn.has(e)?(Ze(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Rn}"`),null):e}function Yn(e,t){let n,r,i,a,o;if(Vn(e)){let o=e.getAttribute(`action`);r=o?Tt(o,t):null,n=e.getAttribute(`method`)||Ln,i=Jn(e.getAttribute(`enctype`))||Rn,a=new FormData(e)}else if(Bn(e)||Hn(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a